summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Script.c110
1 files changed, 75 insertions, 35 deletions
diff --git a/Script.c b/Script.c
index 4e12488..31e788b 100644
--- a/Script.c
+++ b/Script.c
@@ -21,8 +21,6 @@ static const DT_Menu_Action_Normal = 0;
static const DT_Menu_Action_Special2 = 1;
static const DT_Menu_Action_Close = 2;
-static const Menu_React_OverrideReaction = -1;
-static const Menu_React_None = 0;
static const Menu_React_Close = 1;
static const Menu_React_Refresh = 2;
static const Menu_React_KeepOpen = 3;
@@ -30,6 +28,8 @@ static const Menu_React_Back = 4;
static const Menu_React_SelectionOffset = 5;
static const Menu_React_SelectionChange = 6;
static const Menu_React_ShowSubMenu = 7;
+static const Menu_React_OverrideReaction = -1;
+static const Menu_React_None = nil;
global func Menu_React_OffsetSelection(int offset) { return [Menu_React_SelectionOffset, offset]; }
global func Menu_React_OverrideSelection(int override) { return [Menu_React_SelectionChange, override]; }
@@ -112,6 +112,7 @@ local columnCount;
local columnEntries;
local columnOffsets;
local currentColumnSelections;
+local shouldChangeColumn;
local suspended;
local closing;
local refreshing;
@@ -128,6 +129,7 @@ func Initialize()
columnEntries = [];
msgBoardEntry = [];
vars = [];
+ currentColumn = 0;
}
func Destruction()
@@ -142,7 +144,13 @@ func Create(map cSettings)
multiColumnMode = false;
columnCount = 0;
- columnOffsets = [];
+
+ var actualColumnCount = GetLength(currentColumnSelections);
+ columnOffsets = CreateArray(actualColumnCount);
+ for(var i = 0; i < actualColumnCount; ++i)
+ {
+ columnOffsets[i] = 0;
+ }
if(settings.Vars)
{
@@ -178,8 +186,13 @@ func Create(map cSettings)
for(var i = 0; i < GetLength(currentColumnSelections); ++i)
{
// TODO: cascade? then remove the columnSelection == -1 check; and check if shrinking menus still work correctly
+ if(!columnEntries[i])
+ {
+ currentColumnSelections[i] = -1;
+ break;
+ }
var columnSelection = currentColumnSelections[i];
- if((columnSelection == -1) || !columnEntries[i] || columnSelection >= GetLength(columnEntries[i]))
+ if((columnSelection == -1) || columnSelection >= GetLength(columnEntries[i]))
{
currentColumnSelections[i] = GetLength(columnEntries[i]) - 1;
break;
@@ -247,9 +260,13 @@ func SelectEntry(indexOrChain, int column)
}
else if(!indexOrChain || GetType(indexOrChain) == C4V_Int)
{
+ column ??= 0;
+ indexOrChain ??= 0;
var entryCount = GetLength(columnEntries[column]);
if(indexOrChain < 0) indexOrChain = entryCount + indexOrChain;
+ shouldChangeColumn = true;
SelectMenuItem(EncodeSelection(indexOrChain, column), settings.Object);
+ shouldChangeColumn = false;
}
else
{
@@ -332,16 +349,16 @@ func FxMenuTimer(object target, int effectNumber, int effectTime)
if(suspended) return;
- if(msgBoardMode != 0 && !TestMessageBoard(GetOwner(settings.Object), true))
+ if(msgBoardMode && !TestMessageBoard(GetOwner(settings.Object), true))
{
var entry = columnEntries[msgBoardEntry[1]][msgBoardEntry[0]];
var args = entry.Args;
- var reaction = CallCallbacks(args.Callbacks, Menu_CallbackType_InputAborted, [Menu_CallbackType_InputAborted, entry.Icon, settings.Object, entry.Args]);
+ var reaction = CallCallbacks(args?.Callbacks, Menu_CallbackType_InputAborted, [Menu_CallbackType_InputAborted, entry.Icon, settings.Object, entry.Args]);
if(reaction != Menu_React_None)
{
React(reaction, msgBoardEntry);
}
- msgBoardMode = 0;
+ msgBoardMode = nil;
}
if(!GetMenu(settings.Object))
@@ -600,6 +617,7 @@ func AddEntries()
{
for(var j = 0; j < columnCount; ++j)
{
+ columnOffsets[j] ??= 0;
var rowIndex = i - columnOffsets[j];
var entries = columnEntries[j];
if(entries && rowIndex >= 0 && rowIndex < GetLength(entries))
@@ -691,7 +709,7 @@ func AddEntries()
text = Format("%s {{MN7I:7}}", text);
}
- AddMenuItem(text, !noCommand && "MenuItemCommand", iconID, settings.Object, entry.Count, entryIndex, showDesc && entry.Description, entry.Extra, entry.XPar1, entry.XPar2);
+ AddMenuItem(text, !noCommand && "MenuItemCommand", iconID, settings.Object, entry.Count, entryIndex, showDesc && entry.Description || nil, entry.Extra, entry.XPar1, entry.XPar2);
if(deleteIcon)
{
@@ -700,7 +718,7 @@ func AddEntries()
}
else
{
- AddMenuItem("", "DummyItemCommand", 0, settings.Object, 0, entryIndex, 0, C4MN_Add_ForceNoDesc);
+ AddMenuItem("", "DummyItemCommand", nil, settings.Object, nil, entryIndex, nil, C4MN_Add_ForceNoDesc);
}
++entryIndex;
}
@@ -969,30 +987,40 @@ func OnMenuSelection(int selection, object menuObject)
}
// navigating between submenu columns; not in multiColumnMode
- if(!multiColumnMode && (selection + columnOffsets[currentColumn] == oldColumnOldSelection + columnOffsets[oldColumn]))
+ if(!multiColumnMode)
{
- if(currentColumn == oldColumn + 1 && oldIsColumnSubMenu)
+ // navigated from one column to another without going over the left/right border
+ if(selection + columnOffsets[currentColumn] == oldColumnOldSelection + columnOffsets[oldColumn])
{
- var targetSelection = columnEntries[currentColumn - 1][oldColumnOldSelection].SubMenuInitColumnData.Settings.Selection;
- targetSelection = targetSelection && targetSelection[0];
- // column submenu was entered through pressing right; select the first entry
- // but only if it's not there yet
- if(selection != targetSelection)
+ if(currentColumn == oldColumn + 1 && oldIsColumnSubMenu)
{
- SelectEntry(targetSelection, currentColumn);
- return;
+ var targetSelection = columnEntries[currentColumn - 1][oldColumnOldSelection].SubMenuInitColumnData.Settings.Selection;
+ targetSelection = targetSelection && targetSelection[0];
+ // column submenu was entered through pressing right; select the first entry
+ // but only if it's not there yet
+ if(selection != targetSelection)
+ {
+ SelectEntry(targetSelection, currentColumn);
+ return;
+ }
}
- }
- else if(currentColumn == oldColumn - 1)
- {
- // column submenu was left through pressing left; select the submenu entry
- // but only if it's not there yet
- if(selection != oldColumnSelection)
+ else if(currentColumn == oldColumn - 1)
{
- SelectEntry(oldColumnSelection, currentColumn);
- return;
+ // column submenu was left through pressing left; select the submenu entry
+ // but only if it's not there yet
+ if(selection != oldColumnSelection)
+ {
+ SelectEntry(oldColumnSelection, currentColumn);
+ return;
+ }
}
}
+ else if(currentColumn != oldColumn && !shouldChangeColumn) // with going over the left/right border; we don’t want that
+ {
+ currentColumn = oldColumn;
+ SelectEntry(oldColumnOldSelection, oldColumn);
+ return;
+ }
}
if(skipHandling)
@@ -1024,12 +1052,15 @@ func OnMenuSelection(int selection, object menuObject)
else
{
var oldEntries = columnEntries[column + 1];
- SetLength(columnEntries, column + 1);
- currentColumnSelections[column + 1] = -1;
- if(oldEntries)
+ if (oldEntries != nil)
{
- Refresh([selection, column]);
- return;
+ SetLength(columnEntries, column + 1);
+ currentColumnSelections[column + 1] = -1;
+ if(oldEntries)
+ {
+ Refresh([selection, column]);
+ return;
+ }
}
}
}
@@ -1107,8 +1138,9 @@ func HideInstantDescription()
global func Menu_Callback(array callback, int types, array argBinding)
{
+ types ??= Menu_CallbackType_Defaults;
argBinding = argBinding || [Menu_CallbackArg_Action, Menu_CallbackArg_Icon, Menu_CallbackArg_MenuObject, Menu_CallbackArg_Args, Menu_CallbackArg_NewSelection, Menu_CallbackArg_OldSelection, Menu_CallbackArg_NewValue, Menu_CallbackArg_OldValue, Menu_CallbackArg_FromSubMenu];
- return [callback, types || Menu_CallbackType_Defaults, argBinding];
+ return [callback, types, argBinding];
}
global func Menu_Entry_VariableCondition(array scopedVar, compare, int disableMode, bool invert, int allowDisabledSelection)
@@ -1165,7 +1197,8 @@ global func Menu_Entry(map entry)
{
entry = Extend({
Text = "",
- Placeholder = -1
+ Placeholder = -1,
+ Extra = 0,
}, entry, true);
}
@@ -1552,6 +1585,7 @@ func AdaptorFactory(args, int entryIndex, int entryColumn)
}
else if(args.Type == Menu_AdaptorType_Integer)
{
+ val ??= 0;
var limits = AdaptorGetLimits(args.Limits), max, min;
var wrapAround = args.WrapAround;
if(limits && !wrapAround)
@@ -1621,7 +1655,7 @@ func AdaptorFactory(args, int entryIndex, int entryColumn)
}
else
{
- return [Menu_SubMenu({ Entry = Extend(entrySettings, { Text = text, Callbacks = [Menu_Callback(MenuObjectCallback("AdaptorCommand"), Menu_CallbackType_All, [Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject, Menu_CallbackArg_Args, Menu_CallbackArg_All])], Icon = icon, Description = description, Args = args }, true), Entries = retSubMenu }, GetType(args.Enum.SubMenu.On) == C4V_Bool) && args.Enum.SubMenu.On];
+ return [Menu_SubMenu({ Entry = Extend(entrySettings, { Text = text, Callbacks = [Menu_Callback(MenuObjectCallback("AdaptorCommand"), Menu_CallbackType_All, [Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject, Menu_CallbackArg_Args, Menu_CallbackArg_All])], Icon = icon, Description = description, Args = args }, true), Entries = retSubMenu }, GetType(args.Enum.SubMenu.On) == C4V_Bool && args.Enum.SubMenu.On)];
}
}
@@ -1691,6 +1725,10 @@ func AdaptorEnumSubMenuFactory(map args)
{
BooleanToggleText(i == index, text, icon);
}
+ else if(i == index)
+ {
+ ExtraIcon(text, icon, [MN7I, 1]);
+ }
ret.Entries[] = Menu_Entry({
Text = text,
Icon = icon,
@@ -2129,7 +2167,8 @@ global func CreateNewMenu(map settings, map inheritSettings, object parentMenu)
Decoration = DT_Menu_DefaultInstantDescriptionDecoration,
Flags = MSG_Left | MSG_Bottom,
Position = [40, -60]
- }
+ },
+ KeepOpen = Menu_KeepOpen_Not,
}
}, { Settings = inheritSettings }, true), {
Settings = {
@@ -2236,6 +2275,7 @@ func Update()
func GetSelection(int mode)
{
+ mode ??= Menu_Selection_Simple;
if(mode == Menu_Selection_Simple)
{
return currentColumnSelections[currentColumn];