summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Script.c402
1 files changed, 208 insertions, 194 deletions
diff --git a/Script.c b/Script.c
index b052bc8..76d63b1 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,74 +23,30 @@ 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;
@@ -118,14 +55,6 @@ global func Menu_React_OffsetSelection(int offset) { return [Menu_React_Selectio
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;
@@ -135,30 +64,10 @@ static const Menu_ConditionReact_CustomFormat = 4;
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 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 DT_Menu_Entry_Caption = 0;
static const DT_Menu_Entry_Callbacks = 1;
static const DT_Menu_Entry_Symbol = 2;
@@ -171,19 +80,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;
@@ -195,16 +91,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;
@@ -212,26 +98,23 @@ 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 DT_Menu_Adaptor_Type = 0;
static const DT_Menu_Adaptor_Variable = 1;
@@ -248,7 +131,8 @@ static const DT_Menu_Adaptor_Args = 11;
static const DT_Menu_Adaptor_EnumSubmenu = 12;
static const DT_Menu_Adaptor_EnumSubmenuCaption = 13;
static const DT_Menu_Adaptor_EnumSubmenuSymbol = 14;
-
+static const DT_Menu_Adaptor_EnumAllowUnknown = 15;
+static const DT_Menu_Adaptor_EnumInline = 16;
static const Menu_Layout_Symbol = 1;
static const Menu_Layout_InfoCaption = 2;
@@ -264,7 +148,6 @@ static const Menu_Layout__NoFlagMask = 3;
// ----------------------------------------------------------------------------
-
local settings;
local entries;
local createEntries;
@@ -276,10 +159,11 @@ local msgBoardMode;
local msgBoardEntry;
local noSelectionCallbacks;
local subMenu;
+local vars;
func Initialize()
{
-
+ vars = [];
}
func Destruction()
@@ -296,7 +180,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();
@@ -306,7 +208,10 @@ func Create(array cSettings, array cEntries)
AddEntries(entries);
- SelectEntry(settings[DT_Menu_Settings_Selection]);
+ if(entryCount > 0)
+ {
+ SelectEntry(settings[DT_Menu_Settings_Selection]);
+ }
if(settings[DT_Menu_Settings_Decoration])
{
@@ -336,6 +241,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)
{
@@ -400,16 +315,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;
}
}
@@ -418,7 +356,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];
@@ -452,7 +391,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)
{
@@ -462,14 +401,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)
{
@@ -618,9 +560,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)
{
@@ -663,7 +606,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];
@@ -758,10 +701,12 @@ global func Menu_Decoration(id decoration) { return Menu__Setting([DT_Menu_Setti
global func Menu_RequireAction(string action, object target) { 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) { 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)
{
- 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];
+ return [callback, types || Menu_CallbackType_Defaults, argBinding];
}
global func Menu_Entry_Caption(string Caption) { return [DT_Menu_Entry_Caption, Caption]; }
@@ -833,13 +778,13 @@ global func Menu_SubMenu(array entrySettings, array menuEntry_Settings)
{
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)
{
- 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)
@@ -856,7 +801,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;
}
@@ -882,6 +827,8 @@ global func Menu_Adaptor_Callbacks(array Callbacks) { return [DT_Menu_Adaptor_Ca
global func Menu_Adaptor_MessageBoardText(string MessageBoardText) { return [DT_Menu_Adaptor_MessageBoardText, MessageBoardText]; }
global func Menu_Adaptor_WrapAround(bool WrapAround) { return [DT_Menu_Adaptor_WrapAround, WrapAround]; }
global func Menu_Adaptor_EnumSubmenuSymbol(id EnumSubmenuSymbol) { return [DT_Menu_Adaptor_EnumSubmenuSymbol, EnumSubmenuSymbol]; }
+global func Menu_Adaptor_EnumAllowUnknown(bool EnumAllowUnknown) { return [DT_Menu_Adaptor_EnumAllowUnknown, EnumAllowUnknown]; }
+global func Menu_Adaptor_EnumInline(bool EnumInline) { return [DT_Menu_Adaptor_EnumInline, EnumInline]; }
global func Menu_Adaptor_EnumSubmenu(int callbackType) { return [DT_Menu_Adaptor_EnumSubmenu, callbackType]; }
global func Menu_Adaptor_Limits(int min, int max) { return [DT_Menu_Adaptor_Limits, [min, max]]; }
global func Menu_Adaptor_StepSize(int step, force) { return [DT_Menu_Adaptor_StepSize, [step, force]]; }
@@ -988,7 +935,7 @@ global func Menu_Adaptor(array entrySettings, array adaptorSettings)
return Menu_Factory([MN7I->MenuObjectCallback("AdaptorFactory")], [Menu_Entry(entrySettings)[1], adaptorArgs, entrySettings]);
}
-func EnumValPos(array enumVals, array layout, val)
+func EnumValPos(array enumVals, array layout, val, bool allowUnknown)
{
for(var i = 0; i < GetLength(enumVals); ++i)
{
@@ -1114,15 +1061,23 @@ func AdaptorFactory(args, int entryIndex)
}
else if(args[DT_Menu_Adaptor_Type] == Menu_AdaptorType_Enum)
{
+ if(args[DT_Menu_Adaptor_EnumInline])
+ {
+ return AdaptorEnumSubmenuFactory([args, entry]);
+ }
+
var layoutVals = args[DT_Menu_Adaptor_LayoutVals];
var layout = layoutVals[1];
layoutVals = layoutVals[0];
- var index = EnumValPos(layoutVals, layout, val);
+ var index = EnumValPos(layoutVals, layout, val, args[DT_Menu_Adaptor_EnumAllowUnknown]);
if(index == -1)
{
- ScopedVar(args[DT_Menu_Adaptor_Variable]) = layoutVals[0][layout[Menu_Layout__ValuePos] - 1];
+ if(!args[DT_Menu_Adaptor_EnumAllowUnknown])
+ {
+ ScopedVar(args[DT_Menu_Adaptor_Variable]) = layoutVals[0][layout[Menu_Layout__ValuePos] - 1];
+ }
index = 0;
}
@@ -1144,11 +1099,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)];
}
}
@@ -1163,21 +1118,29 @@ func AdaptorEnumSubmenuFactory(array args)
var submenuCaption = args[DT_Menu_Adaptor_EnumSubmenuCaption];
var submenuSymbol = [];
- var index = EnumValPos(layoutVals, layout, ScopedVar(args[DT_Menu_Adaptor_Variable]));
+ if(submenuCaption && submenuCaption[0])
+ {
+ entry[DT_Menu_Entry_Caption] = submenuCaption[0];
+ }
+
+ var index = EnumValPos(layoutVals, layout, ScopedVar(args[DT_Menu_Adaptor_Variable]), args[DT_Menu_Adaptor_EnumAllowUnknown]);
var symbol, infoCaption;
EnumEntrySettings(submenuCaption, symbol, infoCaption, index, args, entry);
- if(submenuCaption && submenuCaption[0])
+ var ret;
+ if(args[DT_Menu_Adaptor_EnumInline])
{
- submenuCaption = submenuCaption[0];
+ ret = [];
+ }
+ else
+ {
+ ret = [
+ Menu_Selection(index),
+ Menu_KeepParentOnClose(),
+ Menu_DontKeepOpen(),
+ Menu_Caption(submenuCaption)
+ ];
}
-
- var ret = [
- Menu_Selection(index),
- Menu_KeepParentOnClose(),
- Menu_DontKeepOpen(),
- Menu_Caption(submenuCaption)
- ];
if(args[DT_Menu_Adaptor_EnumSubmenuSymbol])
{
@@ -1205,13 +1168,17 @@ 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])]));
+ if(args[DT_Menu_Adaptor_EnumInline])
+ {
+ BooleanToggleCaption(i == index, caption, symbol);
+ }
+ 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];
@@ -1224,12 +1191,21 @@ 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;
}
+ if(args[DT_Menu_Adaptor_EnumInline])
+ {
+ return Menu_React_Refresh;
+ }
+
return Menu_React_Back;
}
@@ -1273,7 +1249,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;
@@ -1317,12 +1293,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;
@@ -1332,7 +1321,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;
@@ -1381,7 +1370,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;
@@ -1444,7 +1433,7 @@ func AdaptorCommand(int action, id ID, object obj, args)
var layout = enumVals[1];
enumVals = enumVals[0];
- var index = EnumValPos(enumVals, layout, val);
+ var index = EnumValPos(enumVals, layout, val, args[DT_Menu_Adaptor_EnumAllowUnknown]);
var wrapAround = args[DT_Menu_Adaptor_WrapAround];
if(action & (Menu_CallbackType_Normal | Menu_CallbackType_Special2))
@@ -1463,7 +1452,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;
@@ -1484,7 +1473,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;
@@ -1554,7 +1543,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);
@@ -1633,11 +1622,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;
@@ -1654,14 +1644,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)
@@ -1681,6 +1671,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);
@@ -1699,4 +1713,4 @@ func GetObject()
func CreateSymbolDummy()
{
return CreateContents(DT_Menu_SymbolDummy);
-}
+} \ No newline at end of file