summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Script.c388
1 files changed, 196 insertions, 192 deletions
diff --git a/Script.c b/Script.c
index 0a6bf29..86f7da6 100644
--- a/Script.c
+++ b/Script.c
@@ -2,29 +2,10 @@
static const DT_Menu = MN7I;
static const DT_Menu_Combined = -1;
+static const DT_Menu_MenuVar = -1;
// Enums and bitfields
-/*
-static const DT_Menu_Settings_Symbol = 0;
-static const DT_Menu_Settings_Object = 0 + 1;
-static const DT_Menu_Settings_Extra = 0 + 1 + 1;
-static const DT_Menu_Settings_Caption = 0 + 1 + 1 + 1;
-static const DT_Menu_Settings_ExtraData = 0 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_Style = 0 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_KeepOpen = 0 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_Parent = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_Size = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_RefreshInterval = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_Selection = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_ConditionDisableMode = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_ConditionAllowSelection = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_Callbacks = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_Decoration = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_RequireAction = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Settings_KeepParentOnClose = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-*/
-
static const DT_Menu_Settings_Symbol = 0;
static const DT_Menu_Settings_Object = 1;
static const DT_Menu_Settings_Extra = 2;
@@ -42,125 +23,53 @@ static const DT_Menu_Settings_Callbacks = 13;
static const DT_Menu_Settings_Decoration = 14;
static const DT_Menu_Settings_RequireAction = 15;
static const DT_Menu_Settings_KeepParentOnClose = 16;
+static const DT_Menu_Settings_Vars = 17;
-/*
static const DT_Menu_KeepOpen_Not = 0x0;
static const DT_Menu_KeepOpen_Keep = 0x1;
static const DT_Menu_KeepOpen_Force = 0x2;
-static const DT_Menu_KeepOpen_Permanent = 0x2 << 1;
-static const DT_Menu_KeepOpen_Refresh = 0x2 << 1 << 1;
-static const DT_Menu_KeepOpen_RefreshContinuously = 0x2 << 1 << 1 << 1;
-static const DT_Menu_KeepOpen_Refresh_Mask = 24; // DT_Menu_KeepOpen_Refresh | DT_Menu_KeepOpen_RefreshContinuously
-*/
-
-static const DT_Menu_KeepOpen_Not = 0;
-static const DT_Menu_KeepOpen_Keep = 1;
-static const DT_Menu_KeepOpen_Force = 2;
-static const DT_Menu_KeepOpen_Permanent = 4;
-static const DT_Menu_KeepOpen_Refresh = 8;
-static const DT_Menu_KeepOpen_RefreshContinuously = 16;
-static const DT_Menu_KeepOpen_Refresh_Mask = 24; // DT_Menu_KeepOpen_Refresh | DT_Menu_KeepOpen_RefreshContinuously
-
-/*
-static const DT_Menu_Type_Setting = 0;
-static const DT_Menu_Type_Entry = 0 + 1;
-static const DT_Menu_Type_Factory = 0 + 1 + 1;
-*/
+static const DT_Menu_KeepOpen_Permanent = 0x4;
+static const DT_Menu_KeepOpen_Refresh = 0x8;
+static const DT_Menu_KeepOpen_RefreshContinuously = 0x10;
+static const DT_Menu_KeepOpen_Refresh_Mask = 0x18; // DT_Menu_KeepOpen_Refresh | DT_Menu_KeepOpen_RefreshContinuously
-//static const DT_Menu_Type_Combined = -1;
static const DT_Menu_Type_Setting = 0;
static const DT_Menu_Type_Entry = 1;
static const DT_Menu_Type_Factory = 2;
-/*
-static const DT_Menu_Action_Normal = 0;
-static const DT_Menu_Action_Special2 = 0 + 1;
-static const DT_Menu_Action_Close = 0 + 1 + 1;
-*/
-
static const DT_Menu_Action_Normal = 0;
static const DT_Menu_Action_Special2 = 1;
static const DT_Menu_Action_Close = 2;
-/*
-static const DT_Menu_Callback_MenuObject = -3;
-static const DT_Menu_Callback_Global = -3 + 1;
-static const DT_Menu_Callback_Scenario = -3 + 1 + 1;
-*/
-
-static const DT_Menu_Callback_MenuObject = -3;
-static const DT_Menu_Callback_Scenario = -2;
-static const DT_Menu_Callback_Global = -1;
-
-/*
-static const Menu_React_Menu_React_Override = -1;
-static const Menu_React_None = -1 + 1;
-static const Menu_React_Close = -1 + 1 + 1;
-static const Menu_React_Refresh = -1 + 1 + 1 + 1;
-static const Menu_React_KeepOpen = -1 + 1 + 1 + 1 + 1;
-static const Menu_React_Back = -1 + 1 + 1 + 1 + 1 + 1;
-static const Menu_React_SelectionOffset = -1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const Menu_React_SelectionChange = -1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const Menu_React_ShowSubmenu = -1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-*/
-
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;
-static const Menu_React_Back= 4;
+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_Max = Menu_React_ShowSubmenu;
+static const Menu_React_Max = Menu_React_ShowSubmenu;
global func Menu_React_OffsetSelection(int offset) { return [Menu_React_SelectionOffset, offset]; }
global func Menu_React_OverrideSelection(int override) { return [Menu_React_SelectionChange, override]; }
global func Menu_React_Override(override) { return [Menu_React_OverrideReaction, override]; }
-/*
-static const Menu_ConditionReact_Default = 0;
-static const Menu_ConditionReact_Show = 0 + 1;
-static const Menu_ConditionReact_Hide = 0 + 1 + 1;
-static const Menu_ConditionReact_GrayOut = 0 + 1 + 1 + 1;
-static const Menu_ConditionReact_CustomFormat = 0 + 1 + 1 + 1 + 1;
-*/
-
static const Menu_ConditionReact_Default = 0;
static const Menu_ConditionReact_Show = 1;
static const Menu_ConditionReact_Hide = 2;
static const Menu_ConditionReact_GrayOut = 3;
static const Menu_ConditionReact_CustomFormat = 4;
- static const Menu_ConditionReact_Max = Menu_ConditionReact_GrayOut;
+static const Menu_ConditionReact_Max = Menu_ConditionReact_GrayOut;
global func Menu_ConditionReact_CustomColor(int color) { return [Menu_ConditionReact_CustomFormat, Format("<c %x>%%s</c>", color)]; }
global func Menu_ConditionReact_Format(string format) { return [Menu_ConditionReact_CustomFormat, format]; }
-/*
-static const Menu_Condition_Default = 0;
-static const Menu_Condition_AllowSelection = 0 + 1;
-static const Menu_Condition_DenySelection = 0 + 1 + 1;
-*/
-
static const Menu_Condition_Default = 0;
static const Menu_Condition_AllowSelection = 1;
static const Menu_Condition_DenySelection = 2;
- static const Menu_Condition_Max = 2;
-
-/*
-static const DT_Menu_Entry_Caption = 0;
-static const DT_Menu_Entry_Callbacks = 0 + 1;
-static const DT_Menu_Entry_Symbol = 0 + 1 + 1;
-static const DT_Menu_Entry_Count = 0 + 1 + 1 + 1;
-static const DT_Menu_Entry_InfoCaption = 0 + 1 + 1 + 1 + 1;
-static const DT_Menu_Entry_Extra = 0 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Entry_XPar1 = 0 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Entry_XPar2 = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Entry_Args = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Entry_Condition = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Entry_Placeholder = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-*/
+static const Menu_Condition_Max = Menu_Condition_DenySelection;
static const DT_Menu_Entry_Caption = 0;
static const DT_Menu_Entry_Callbacks = 1;
@@ -174,19 +83,6 @@ static const DT_Menu_Entry_Args = 8;
static const DT_Menu_Entry_Condition = 9;
static const DT_Menu_Entry_Placeholder = 10;
-/*
- static const Menu_CallbackType_None = 0x0;
-static const Menu_CallbackType_Special2 = 0x1;
-static const Menu_CallbackType_Normal = 0x2;
-static const Menu_CallbackType_Close = 0x2 << 1;
-static const Menu_CallbackType_Selection = 0x2 << 1 << 1;
-static const Menu_CallbackType_Deselection = 0x2 << 1 << 1 << 1;
-static const Menu_CallbackType_ValueChanged = 0x2 << 1 << 1 << 1 << 1;
-static const Menu_CallbackType_InputAborted = 0x2 << 1 << 1 << 1 << 1 << 1;
-static const Menu_CallbackType_Defaults = 0x3; // Menu_CallbackType_Normal | Menu_CallbackType_Special2
-static const Menu_CallbackType_All = 0x7f; // Menu_CallbackType_Normal | Menu_CallbackType_Special2 | Menu_CallbackType_Close | Menu_CallbackType_Selection | Menu_CallbackType_Deselection | Menu_CallbackType_ValueChanged | Menu_CallbackType_InputAborted
-*/
-
static const Menu_CallbackType_None = 0x0;
static const Menu_CallbackType_Special2 = 0x1;
static const Menu_CallbackType_Normal = 0x2;
@@ -198,16 +94,6 @@ static const Menu_CallbackType_InputAborted = 0x40;
static const Menu_CallbackType_Defaults = 0x3; // Menu_CallbackType_Normal | Menu_CallbackType_Special2
static const Menu_CallbackType_All = 0x7f; // Menu_CallbackType_Normal | Menu_CallbackType_Special2 | Menu_CallbackType_Close | Menu_CallbackType_Selection | Menu_CallbackType_Deselection | Menu_CallbackType_ValueChanged | Menu_CallbackType_InputAborted
-
-/*
-static const Menu_AdaptorType_Boolean = 0;
-static const Menu_AdaptorType_Integer = 0 + 1;
-static const Menu_AdaptorType_String = 0 + 1 + 1;
-static const Menu_AdaptorType_ID = 0 + 1 + 1 + 1;
-static const Menu_AdaptorType_Enum = 0 + 1 + 1 + 1 + 1;
-static const Menu_AdaptorType_BitField = 0 + 1 + 1 + 1 + 1 + 1;
-*/
-
static const Menu_AdaptorType_Boolean = 0;
static const Menu_AdaptorType_Integer = 1;
static const Menu_AdaptorType_String = 2;
@@ -215,26 +101,25 @@ static const Menu_AdaptorType_ID = 3;
static const Menu_AdaptorType_Enum = 4;
static const Menu_AdaptorType_BitField = 5;
-static const Menu_Adaptor_Limits_Max = 0x7FFFFFFF;
+static const Menu_Adaptor_Limits_Max = 0x7fffffff;
static const Menu_Adaptor_Limits_Min = 0x80000000;
-/*
-static const DT_Menu_Adaptor_Type = 0;
-static const DT_Menu_Adaptor_Variable = 0 + 1;
-static const DT_Menu_Adaptor_Callbacks = 0 + 1 + 1;
-static const DT_Menu_Adaptor_MessageBoardText = 0 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_Limits = 0 + 1 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_StepSize = 0 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_LayoutVals = 0 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_NoEmptyString = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_EntryIndex = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_Mask = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_WrapAround = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_Args = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_EnumSubmenu = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_EnumSubmenuCaption = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-static const DT_Menu_Adaptor_EnumSubmenuSymbol = 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1;
-*/
+static const Menu_CallbackArg_All = -1;
+static const Menu_CallbackArg_Action = 0;
+static const Menu_CallbackArg_Symbol = 1;
+static const Menu_CallbackArg_MenuObject = 2;
+static const Menu_CallbackArg_Args = 3;
+static const Menu_CallbackArg_NewSelection = 4;
+static const Menu_CallbackArg_OldSelection = 5;
+static const Menu_CallbackArg_NewValue = 6;
+static const Menu_CallbackArg_OldValue = 7;
+static const Menu_CallbackArg_FromSubmenu = 8;
+static const Menu_CallbackArg_Menu = 9;
+static const Menu_CallbackArg_Returned = 10;
+static const Menu_CallbackArg_Menu = 11;
+static const Menu_CallbackArg_EntryNumber = 12;
+static const Menu_CallbackArg_Min = Menu_CallbackArg_All;
+static const Menu_CallbackArg_Max = Menu_CallbackArg_EntryNumber;
static const DT_Menu_Adaptor_Type = 0;
static const DT_Menu_Adaptor_Variable = 1;
@@ -252,7 +137,6 @@ static const DT_Menu_Adaptor_EnumSubmenu = 12;
static const DT_Menu_Adaptor_EnumSubmenuCaption = 13;
static const DT_Menu_Adaptor_EnumSubmenuSymbol = 14;
-
static const Menu_Layout_Symbol = 1;
static const Menu_Layout_InfoCaption = 2;
@@ -267,7 +151,6 @@ static const Menu_Layout__NoFlagMask = 3;
// ----------------------------------------------------------------------------
-
local settings;
local entries;
local createEntries;
@@ -279,10 +162,11 @@ local msgBoardMode;
local msgBoardEntry;
local noSelectionCallbacks;
local subMenu;
+local vars;
func Initialize()
{
-
+ vars = [];
}
func Destruction()
@@ -299,7 +183,25 @@ func Create(array cSettings, array cEntries)
settings[DT_Menu_Settings_ConditionDisableMode] = settings[DT_Menu_Settings_ConditionDisableMode] || Menu_ConditionReact_Hide;
entryCount = 0;
- HandleEntries(createEntries, entryCount, entries);
+ if(settings[DT_Menu_Settings_Vars])
+ {
+ var settingVars = settings[DT_Menu_Settings_Vars];
+
+ for(var i = 0; i < GetLength(settingVars); ++i)
+ {
+ if(settingVars[i])
+ {
+ vars[i] = settingVars[i];
+ }
+ }
+ settings[DT_Menu_Settings_Vars] = 0;
+ }
+
+ var factoryArgs = [];
+ factoryArgs[Menu_CallbackArg_Menu] = this;
+ factoryArgs[Menu_CallbackArg_MenuObject] = settings[DT_Menu_Settings_Object];
+
+ HandleEntries(createEntries, entryCount, entries, factoryArgs);
if(settings[DT_Menu_Settings_Parent]) settings[DT_Menu_Settings_Parent]->Suspend();
@@ -310,7 +212,14 @@ func Create(array cSettings, array cEntries)
AddEntries(entries);
- SelectEntry(settings[DT_Menu_Settings_Selection]);
+ if(entryCount > 0)
+ {
+ SelectEntry(settings[DT_Menu_Settings_Selection]);
+ }
+ else
+ {
+ Log("WARNING: DT_Menu::Create: Created an empty menu");
+ }
if(settings[DT_Menu_Settings_Decoration])
{
@@ -332,7 +241,7 @@ func ActivateEntry(int index, int action)
if(index < 0) index = entryCount + index;
if(index >= entryCount || index < 0)
{
- Log("WARNING: ActivateEntry: index out of range: %d", index);
+ Log("WARNING: DT_Menu::ActivateEntry: index out of range: %d", index);
return;
}
@@ -342,6 +251,16 @@ func ActivateEntry(int index, int action)
MenuItemCommand(entry[DT_Menu_Entry_Symbol], index, action);
}
+func &Var(int index)
+{
+ return vars[index];
+}
+
+global func MenuVar(int index)
+{
+ return [DT_Menu_MenuVar, index];
+}
+
/*func FxMenuStart(object target, int effectNumber, int temp)
{
@@ -406,16 +325,39 @@ func FxMenuStop(object target, int effectNumber, int reason, bool temp)
RemoveObject(this);
}
-func CallCallbacks(array callbacks, int type, args, defaultRet, bool noGlobalCallbacks)
+func BindCallbackArgs(array args, array binding)
+{
+ var ret = CreateArray(GetLength(binding));
+ var i = 0;
+ for(var arg in binding)
+ {
+ if(arg == Menu_CallbackArg_All)
+ {
+ ret[i] = args;
+ }
+ else
+ {
+ ret[i] = args[arg];
+ }
+ ++i;
+ }
+
+ return ret;
+}
+
+func CallCallbacks(array callbacks, int type, array args, defaultRet, bool noGlobalCallbacks)
{
var ret = defaultRet;
+
+ args[Menu_CallbackArg_Menu] = this;
+
if(callbacks)
{
for(var callback in callbacks)
{
if(callback[1] & type)
{
- ret = CallA(callback[0], args);
+ ret = CallA(callback[0], BindCallbackArgs(args, callback[2]));
break;
}
}
@@ -425,7 +367,8 @@ func CallCallbacks(array callbacks, int type, args, defaultRet, bool noGlobalCal
if(!noGlobalCallbacks)
{
- var globalRet = CallCallbacks(settings[DT_Menu_Settings_Callbacks], type, [ret, args], defaultRet, true);
+ args[Menu_CallbackArg_Returned] = ret;
+ var globalRet = CallCallbacks(settings[DT_Menu_Settings_Callbacks], type, args, defaultRet, true);
if(GetType(globalRet) == C4V_Array && globalRet[0] == Menu_React_OverrideReaction)
{
ret = globalRet[1];
@@ -433,7 +376,7 @@ func CallCallbacks(array callbacks, int type, args, defaultRet, bool noGlobalCal
}
else if(globalRet)
{
- Log("WARNING: CallCallbacks: ignoring non-zero return value of global callback because override is not specified: %v", globalRet);
+ Log("WARNING: DT_Menu::CallCallbacks: ignoring non-zero return value of global callback because override is not specified: %v", globalRet);
}
}
@@ -464,7 +407,7 @@ func Suspend(bool cont)
}
}
-func HandleEntries(array factoryEntries, int& i, array& ret)
+func HandleEntries(array factoryEntries, int& i, array& ret, array& factoryArgs)
{
for(var entry in factoryEntries)
{
@@ -474,14 +417,17 @@ func HandleEntries(array factoryEntries, int& i, array& ret)
}
else if(entry[0] == DT_Menu_Type_Factory)
{
+ factoryArgs[Menu_CallbackArg_Args] = entry[1][1];
+
for(var callback in entry[1][0])
{
- var factoryResult = CallA(callback, [entry[1][1], i]);
+ factoryArgs[Menu_CallbackArg_EntryNumber] = i;
+ var factoryResult = CallA(callback, BindCallbackArgs(factoryArgs, entry[1][2]));
if(GetType(factoryResult) == C4V_Array)
{
var newEntries = [];
UncombineAndDistinguish(factoryResult, settings, newEntries);
- HandleEntries(newEntries, i, ret);
+ HandleEntries(newEntries, i, ret, factoryArgs);
}
else if(factoryResult == Menu_React_Close)
{
@@ -489,13 +435,13 @@ func HandleEntries(array factoryEntries, int& i, array& ret)
}
else
{
- Log("WARNING: HandleEntries: ignoring invalid return value of Factory: %v (%v)", factoryResult, callback);
+ Log("WARNING: DT_Menu::HandleEntries: ignoring invalid return value of Factory: %v (%v)", factoryResult, callback);
}
}
}
else
{
- Log("WARNING: HandleEntries: ignoring invalid Non-Entry/Factory: %v", entry);
+ Log("WARNING: DT_Menu::HandleEntries: ignoring invalid Non-Entry/Factory: %v", entry);
}
}
}
@@ -638,9 +584,10 @@ func MenuItemCommand(id ID, int itemNumber, int action)
React(reaction, itemNumber);
}
-func SubmenuItemCallback(int action, id ID, object menuObject, args)
+func SubmenuItemCallback(int action, object menuObject, args, array allArgs)
{
- var reaction = CallCallbacks(args[0], action, CreateFilledArray(action, ID, menuObject, args[1], ...), Menu_React_None);
+ allArgs[Menu_CallbackArg_Args] = args[1];
+ var reaction = CallCallbacks(args[0], action, allArgs, Menu_React_None);
if(((action & Menu_CallbackType_Defaults) && reaction == Menu_React_None) || reaction == Menu_React_ShowSubmenu)
{
@@ -684,7 +631,7 @@ func OnMenuSelection(int selection, object menuObject)
var selectReaction = Menu_React_None;
if(!noSelectionCallbacks && CheckCondition(entry) && currentSelection != -1)
{
- deselectReaction = CallCallbacks(entry[DT_Menu_Entry_Callbacks], Menu_CallbackType_Deselection, [Menu_CallbackType_Deselection, entry[DT_Menu_Entry_Symbol], settings[DT_Menu_Settings_Object], entry[DT_Menu_Entry_Args], oldSelection, selection]);
+ deselectReaction = CallCallbacks(entry[DT_Menu_Entry_Callbacks], Menu_CallbackType_Deselection, [Menu_CallbackType_Deselection, entry[DT_Menu_Entry_Symbol], settings[DT_Menu_Settings_Object], entry[DT_Menu_Entry_Args], selection, oldSelection]);
}
entry = entries[currentSelection = selection];
@@ -779,12 +726,15 @@ global func Menu_Decoration(id decoration) { MN7I->ValidateDeco(decoration); re
global func Menu_RequireAction(string action, object target) { if(!(action)) { FatalError("Assertion failed: Menu_RequireAction: action is mandatory; assertion code: action"); }return Menu__Setting([DT_Menu_Settings_RequireAction, [action, target]]); }
global func Menu_KeepParentOnClose(bool dontKeep) { return Menu__Setting([DT_Menu_Settings_KeepParentOnClose, !dontKeep]); }
global func Menu_ConditionDisableMode(mode) { if(!(!mode || (GetType(mode) == C4V_Int && mode >= 0 && mode <= Menu_ConditionReact_Max) || (GetType(mode) == C4V_Array && mode[0] == Menu_ConditionReact_CustomFormat && GetType(mode[1]) == C4V_String))) { FatalError("Assertion failed: Menu_ConditionDisableMode: invalid mode; assertion code: !mode || (GetType(mode) == C4V_Int && mode >= 0 && mode <= Menu_ConditionReact_Max) || (GetType(mode) == C4V_Array && mode[0] == Menu_ConditionReact_CustomFormat && GetType(mode[1]) == C4V_String)"); }return Menu__Setting([DT_Menu_Settings_ConditionDisableMode, mode]);}
+global func Menu_Vars(array vars) { return Menu__Setting([DT_Menu_Settings_Vars, vars]); }
-global func Menu_Callback(array callback, int types)
+global func Menu_Callback(array callback, int types, array argBinding)
{
- MN7I->ValidateMenuCallback(callback);
+ if(!(MN7I->CheckCallback(callback))) { FatalError("Assertion failed: Menu_Callback invalid callback used; assertion code: MN7I->CheckCallback(callback)"); }
if(!((types & ~Menu_CallbackType_All) == 0)) { FatalError("Assertion failed: Menu_Callback: invalid callback type(s) used; assertion code: (types & ~Menu_CallbackType_All) == 0"); }
- return [callback, types || Menu_CallbackType_Defaults];
+ argBinding = argBinding || [Menu_CallbackArg_Action, Menu_CallbackArg_Symbol, Menu_CallbackArg_MenuObject, Menu_CallbackArg_Args, Menu_CallbackArg_NewSelection, Menu_CallbackArg_OldSelection, Menu_CallbackArg_NewValue, Menu_CallbackArg_OldValue, Menu_CallbackArg_FromSubmenu];
+ if(!(MN7I->ValidateMenuCallbackArgBinding(argBinding))) { FatalError("Assertion failed: Menu_Callback: invalid argBinding used; assertion code: MN7I->ValidateMenuCallbackArgBinding(argBinding)"); }
+ return [callback, types || Menu_CallbackType_Defaults, argBinding];
}
global func Menu_Entry_Caption(string Caption) { return [DT_Menu_Entry_Caption, Caption]; }
@@ -895,14 +845,14 @@ global func Menu_SubMenu(array entrySettings, array menuEntry_Settings)
if(!(menuEntry_Settings && GetLength(menuEntry_Settings) > 0)) { FatalError("Assertion failed: Menu_SubMenu: Empty submenu doesn't make sense; assertion code: menuEntry_Settings && GetLength(menuEntry_Settings) > 0"); }
var ret = Menu_Entry(entrySettings);
ret[1][DT_Menu_Entry_Args] = [ret[1][DT_Menu_Entry_Callbacks], ret[1][DT_Menu_Entry_Args], menuEntry_Settings];
- ret[1][DT_Menu_Entry_Callbacks] = [Menu_Callback(MN7I->MenuObjectCallback("SubmenuItemCallback"), Menu_CallbackType_All)];
+ ret[1][DT_Menu_Entry_Callbacks] = [Menu_Callback(MN7I->MenuObjectCallback("SubmenuItemCallback"), Menu_CallbackType_All, [Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject, Menu_CallbackArg_Args, Menu_CallbackArg_All])];
return ret;
}
-global func Menu_Factory(array callbacks, args)
+global func Menu_Factory(array callbacks, args, array binding)
{
if(!(callbacks)) { FatalError("Assertion failed: Menu_Factory: callbacks are mandatory; assertion code: callbacks"); }
- return [DT_Menu_Type_Factory, [callbacks, args]];
+ return [DT_Menu_Type_Factory, [callbacks, args, binding || [Menu_CallbackArg_Args, Menu_CallbackArg_EntryNumber, Menu_CallbackArg_Menu]]];
}
global func Menu_Text(string text, bool allowSelection)
@@ -919,7 +869,7 @@ func DeclineAcceptBack(string caption, symbol, string callback, array settings)
{
var ret = Menu_Entry([Menu_Entry_Caption(caption), Menu_Combined(settings || [])]);
ret[1][DT_Menu_Entry_Args] = [ret[1][DT_Menu_Entry_Callbacks], ret[1][DT_Menu_Entry_Args]];
- ret[1][DT_Menu_Entry_Callbacks] = Menu_Entry_Callbacks([Menu_Callback(MN7I->MenuObjectCallback(callback), Menu_CallbackType_All)])[1];
+ ret[1][DT_Menu_Entry_Callbacks] = Menu_Entry_Callbacks([Menu_Callback(MN7I->MenuObjectCallback(callback), Menu_CallbackType_All, [Menu_CallbackArg_Action, Menu_CallbackArg_Args, Menu_CallbackArg_All])])[1];
ExtraSymbol(ret[1][DT_Menu_Entry_Caption], ret[1][DT_Menu_Entry_Symbol], symbol);
return ret;
}
@@ -1079,7 +1029,7 @@ func EnumValPos(array enumVals, array layout, val)
return i;
}
}
- Log("WARNING: EnumValPos: Current value %v is not in enum: %v", val, enumVals);
+ Log("WARNING: DT_Menu::EnumValPos: Current value %v is not in enum: %v", val, enumVals);
return -1;
}
@@ -1231,11 +1181,11 @@ func AdaptorFactory(args, int entryIndex)
args[DT_Menu_Adaptor_MessageBoardText] = args[DT_Menu_Adaptor_MessageBoardText] || defaultMsgboardText;
if(!retSubmenu)
{
- return [Menu_Entry([Menu_Combined(entrySettings), Menu_Entry_Caption(caption), Menu_Entry_Callbacks([Menu_Callback(MenuObjectCallback("AdaptorCommand"), Menu_CallbackType_All)]), Menu_Entry_Symbol(symbol), Menu_Entry_InfoCaption(infoCaption), Menu_Entry_Args(args)])];
+ return [Menu_Entry([Menu_Combined(entrySettings), Menu_Entry_Caption(caption), Menu_Entry_Callbacks([Menu_Callback(MenuObjectCallback("AdaptorCommand"), Menu_CallbackType_All, [Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject, Menu_CallbackArg_Args, Menu_CallbackArg_All])]), Menu_Entry_Symbol(symbol), Menu_Entry_InfoCaption(infoCaption), Menu_Entry_Args(args)])];
}
else
{
- return [Menu_SubMenu([Menu_Combined(entrySettings), Menu_Entry_Caption(caption), Menu_Entry_Callbacks([Menu_Callback(MenuObjectCallback("AdaptorCommand"), Menu_CallbackType_All)]), Menu_Entry_Symbol(symbol), Menu_Entry_InfoCaption(infoCaption), Menu_Entry_Args(args)], retSubmenu)];
+ return [Menu_SubMenu([Menu_Combined(entrySettings), Menu_Entry_Caption(caption), Menu_Entry_Callbacks([Menu_Callback(MenuObjectCallback("AdaptorCommand"), Menu_CallbackType_All, [Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject, Menu_CallbackArg_Args, Menu_CallbackArg_All])]), Menu_Entry_Symbol(symbol), Menu_Entry_InfoCaption(infoCaption), Menu_Entry_Args(args)], retSubmenu)];
}
}
@@ -1292,13 +1242,13 @@ func AdaptorEnumSubmenuFactory(array args)
{
symbol = 0;
EnumEntrySettings(caption, symbol, infoCaption, i, args, entry);
- ArrayAppend(ret, Menu_Entry([Menu_Entry_Caption(caption), Menu_Entry_Symbol(symbol), Menu_Entry_InfoCaption(infoCaption), Menu_Entry_Callbacks([Menu_Callback(MenuObjectCallback("AdaptorEnumSubmenuItem"))]), Menu_Entry_Args([i, args])]));
+ ArrayAppend(ret, Menu_Entry([Menu_Entry_Caption(caption), Menu_Entry_Symbol(symbol), Menu_Entry_InfoCaption(infoCaption), Menu_Entry_Callbacks([Menu_Callback(MenuObjectCallback("AdaptorEnumSubmenuItem"), Menu_CallbackType_Defaults, [Menu_CallbackArg_Args, Menu_CallbackArg_All])]), Menu_Entry_Args([i, args])]));
}
return ret;
}
-func AdaptorEnumSubmenuItem(int action, id ID, object obj, args)
+func AdaptorEnumSubmenuItem(args, array allArgs)
{
var index = args[0];
args = args[1];
@@ -1311,7 +1261,11 @@ func AdaptorEnumSubmenuItem(int action, id ID, object obj, args)
enumVals = enumVals[0];
ScopedVar(args[DT_Menu_Adaptor_Variable]) = val = enumVals[index][layout[Menu_Layout__ValuePos] - 1];
- var reaction = CallCallbacks(args[DT_Menu_Adaptor_Callbacks], Menu_CallbackType_ValueChanged, [Menu_CallbackType_ValueChanged, ID, obj, args[DT_Menu_Adaptor_Args], val, oldVal, true]);
+
+ allArgs[Menu_CallbackArg_Args] = args[DT_Menu_Adaptor_Args];
+ allArgs[Menu_CallbackArg_FromSubmenu] = true;
+
+ var reaction = AdaptorCommandCallChangedCallback(args[DT_Menu_Adaptor_Callbacks], val, oldVal, allArgs);
if(reaction != Menu_React_None)
{
return reaction;
@@ -1361,7 +1315,7 @@ func AdaptorBitFieldItemsFactory(args)
args[DT_Menu_Adaptor_Mask] = mask;
- ArrayAppend(ret, Menu_Entry([Menu_Combined(entrySettings), Menu_Entry_Caption(caption), Menu_Entry_Callbacks([Menu_Callback(MenuObjectCallback("AdaptorCommand"), Menu_CallbackType_All)]), Menu_Entry_Symbol(symbol), Menu_Entry_InfoCaption(infoCaption), Menu_Entry_Args(args)]));
+ ArrayAppend(ret, Menu_Entry([Menu_Combined(entrySettings), Menu_Entry_Caption(caption), Menu_Entry_Callbacks([Menu_Callback(MenuObjectCallback("AdaptorCommand"), Menu_CallbackType_All, [Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject, Menu_CallbackArg_Args, Menu_CallbackArg_All])]), Menu_Entry_Symbol(symbol), Menu_Entry_InfoCaption(infoCaption), Menu_Entry_Args(args)]));
}
return ret;
@@ -1405,12 +1359,25 @@ func WrapOrBind(int val, array limits, bool wrap)
}
}
-func AdaptorCommand(int action, id ID, object obj, args)
+func AdaptorCommandCallChangedCallback(callbacks, val, oldVal, array allArgs)
+{
+ allArgs[Menu_CallbackArg_Action] = Menu_CallbackType_ValueChanged;
+ allArgs[Menu_CallbackArg_NewValue] = val;
+ allArgs[Menu_CallbackArg_OldValue] = oldVal;
+
+ return CallCallbacks(callbacks, Menu_CallbackType_ValueChanged, allArgs, ...);
+}
+
+func AdaptorCommand(int action, object obj, args, array allArgs)
{
- var callbackArgs = args[DT_Menu_Adaptor_Args];
var val = ScopedVar(args[DT_Menu_Adaptor_Variable]);
var oldVal = val;
- var reaction = CallCallbacks(args[DT_Menu_Adaptor_Callbacks], action, CreateFilledArray(action, ID, obj, callbackArgs, ...), Menu_React_Refresh, true);
+
+ allArgs[Menu_CallbackArg_Args] = args[DT_Menu_Adaptor_Args];
+
+ var reaction = CallCallbacks(args[DT_Menu_Adaptor_Callbacks], action, allArgs, Menu_React_Refresh, true);
+
+
if(reaction != Menu_React_Refresh)
{
return reaction;
@@ -1420,7 +1387,7 @@ func AdaptorCommand(int action, id ID, object obj, args)
if(action & (Menu_CallbackType_Normal | Menu_CallbackType_Special2))
{
ScopedVar(args[DT_Menu_Adaptor_Variable]) = val = !val;
- reaction = CallCallbacks(args[DT_Menu_Adaptor_Callbacks], Menu_CallbackType_ValueChanged, [Menu_CallbackType_ValueChanged, ID, obj, callbackArgs, val, oldVal]);
+ reaction = AdaptorCommandCallChangedCallback(args[DT_Menu_Adaptor_Callbacks], val, oldVal, allArgs);
if(reaction != Menu_React_None)
{
return reaction;
@@ -1469,7 +1436,7 @@ func AdaptorCommand(int action, id ID, object obj, args)
if(val != oldVal)
{
ScopedVar(args[DT_Menu_Adaptor_Variable]) = val;
- reaction = CallCallbacks(args[DT_Menu_Adaptor_Callbacks], Menu_CallbackType_ValueChanged, [Menu_CallbackType_ValueChanged, ID, obj, callbackArgs, val, oldVal]);
+ reaction = AdaptorCommandCallChangedCallback(args[DT_Menu_Adaptor_Callbacks], val, oldVal, allArgs);
if(reaction != Menu_React_None)
{
return reaction;
@@ -1551,7 +1518,7 @@ func AdaptorCommand(int action, id ID, object obj, args)
index = WrapOrBind(index, [0, GetLength(enumVals) - 1], wrapAround);
ScopedVar(args[DT_Menu_Adaptor_Variable]) = val = enumVals[index][layout[Menu_Layout__ValuePos] - 1];
- reaction = CallCallbacks(args[DT_Menu_Adaptor_Callbacks], Menu_CallbackType_ValueChanged, [Menu_CallbackType_ValueChanged, ID, obj, callbackArgs, val, oldVal]);
+ reaction = AdaptorCommandCallChangedCallback(args[DT_Menu_Adaptor_Callbacks], val, oldVal, allArgs);
if(reaction != Menu_React_None)
{
return reaction;
@@ -1572,7 +1539,7 @@ func AdaptorCommand(int action, id ID, object obj, args)
}
ScopedVar(args[DT_Menu_Adaptor_Variable]) = val;
- reaction = CallCallbacks(args[DT_Menu_Adaptor_Callbacks], Menu_CallbackType_ValueChanged, [Menu_CallbackType_ValueChanged, ID, obj, callbackArgs, val, oldVal]);
+ reaction = AdaptorCommandCallChangedCallback(args[DT_Menu_Adaptor_Callbacks], val, oldVal, allArgs);
if(reaction != Menu_React_None)
{
return reaction;
@@ -1642,7 +1609,7 @@ func InputCallback(string input, int plr)
msgBoardMode = 0;
if(val != oldVal)
{
- var reaction = CallCallbacks(args[DT_Menu_Adaptor_Callbacks], Menu_CallbackType_ValueChanged, [Menu_CallbackType_ValueChanged, entry[DT_Menu_Entry_Symbol], settings[DT_Menu_Settings_Object], callbackArgs, val, oldVal]);
+ var reaction = CallCallbacks(args[DT_Menu_Adaptor_Callbacks], Menu_CallbackType_ValueChanged, [Menu_CallbackType_ValueChanged, entry[DT_Menu_Entry_Symbol], settings[DT_Menu_Settings_Object], callbackArgs, 0, 0, val, oldVal]);
if(reaction != Menu_React_None)
{
return React(reaction, msgBoardEntry);
@@ -1707,7 +1674,7 @@ func UncombineAndDistinguish(array combined, array &settings, array &entries)
}
else
{
- Log("WARNING: UncombineAndDistinguish: Unknown entry/settings type %v with value %v", val[0], val[1]);
+ Log("WARNING: DT_Menu::UncombineAndDistinguish: Unknown entry/settings type %v with value %v", val[0], val[1]);
}
++line;
@@ -1729,11 +1696,12 @@ func NamedArgs(array namedArgs, array& args)
}
}
-func DeclineAcceptBackCommand(int action, id ID, object obj, args, int defaultAction)
+func DeclineAcceptBackCommand(int action, args, int defaultAction, array allArgs)
{
if(args[0])
{
- var reaction = CallCallbacks(args[0], action, [action, ID, obj, args[1]]);
+ allArgs[Menu_CallbackArg_Args] = args[1];
+ var reaction = CallCallbacks(args[0], action, allArgs);
if(reaction != Menu_React_None)
{
return reaction;
@@ -1750,14 +1718,14 @@ func DeclineAcceptBackCommand(int action, id ID, object obj, args, int defaultAc
}
}
-func DeclineAcceptCommand(int action, id ID, object obj, args)
+func DeclineAcceptCommand(int action, args, array allArgs)
{
- return DeclineAcceptBackCommand(action, ID, obj, args, Menu_React_Close);
+ return DeclineAcceptBackCommand(action, args, Menu_React_Close, allArgs);
}
-func BackCommand(int action, id ID, object obj, args)
+func BackCommand(int action, args, array allArgs)
{
- return DeclineAcceptBackCommand(action, ID, obj, args, Menu_React_Back);
+ return DeclineAcceptBackCommand(action, args, Menu_React_Back, allArgs);
}
func MenuObjectCallback(string name)
@@ -1777,6 +1745,30 @@ func CallCustom(callback, args)
}
}
+func CustomScopedVar(array variable)
+{
+ if(variable && variable[0] == DT_Menu_MenuVar)
+ {
+ return ArrayVar(variable[1], LocalVar("vars"));
+ }
+ else
+ {
+ return _inherited(variable, ...);
+ }
+}
+
+func CheckCustomScopedVar(array variable)
+{
+ if(variable && variable[0] == DT_Menu_MenuVar && ((GetType(variable[1]) == C4V_Int && variable[1] > 0) || variable[1] == 0))
+ {
+ return true;
+ }
+ else
+ {
+ return _inherited(variable, ...);
+ }
+}
+
func Update()
{
return Refresh(currentSelection);
@@ -1820,6 +1812,19 @@ func ValidateMenuCallbacks(array callbacks)
return true;
}
+func ValidateMenuCallbackArgBinding(array binding)
+{
+ for(var arg in binding)
+ {
+ if(arg > Menu_CallbackArg_Max || arg < Menu_CallbackArg_Min)
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+
func ValidateMenuCallback(array callback)
{
if(!callback)
@@ -1827,7 +1832,7 @@ func ValidateMenuCallback(array callback)
return false;
}
- return GetLength(callback) == 2 && GetType(callback[1]) == C4V_Int && (callback[1] & ~Menu_CallbackType_All) == 0 && CheckCallback(callback[0]);
+ return GetLength(callback) == 3 && GetType(callback[1]) == C4V_Int && (callback[1] & ~Menu_CallbackType_All) == 0 && CheckCallback(callback[0]) && ValidateMenuCallbackArgBinding(callback[2]);
}
func CheckCallback(callback)
@@ -1835,7 +1840,7 @@ func CheckCallback(callback)
var ret = _inherited(callback, ...);
if(ret && GetType(callback) == C4V_String)
{
- Log("WARNING: DT_Menu::CheckCallback: A string only callback will not work as expected (yet): \"%s\"", callback[0]);
+ Log("WARNING: DT_Menu::CheckCallback: A string only callback will not work as expected (yet): \"%s\"", callback);
}
return ret;
}
@@ -1849,4 +1854,3 @@ func CheckCustomCallback(callback)
return _inherited(callback, ...);
}
-