From 684ad14dee5e812ffe0fc272680071841cbd7c50 Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Thu, 18 May 2017 01:13:09 +0200 Subject: Fix AdaptorEnumSubmenuFactory; Add Menu_Adaptor_EnumAllowUnknown and Menu_Adaptor_EnumInline --- Script.c | 402 +++++++++++++++++++++++++++++++++------------------------------ 1 file 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("%%s", 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 -- cgit v1.2.3-54-g00ecf