diff options
| -rw-r--r-- | Script.c | 74 |
1 files changed, 53 insertions, 21 deletions
@@ -226,16 +226,14 @@ func Create(array cSettings, array cEntries) factoryArgs[Menu_CallbackArg_Menu] = this; factoryArgs[Menu_CallbackArg_MenuObject] = settings[DT_Menu_Settings_Object]; - HandleEntries(createEntries, entryCount, columnEntries[0], factoryArgs, 0); + HandleEntries(createEntries, entryCount, columnEntries[0], settings, factoryArgs, 0); if(settings[DT_Menu_Settings_Parent]) settings[DT_Menu_Settings_Parent]->Suspend(); - CreateMenu(settings[DT_Menu_Settings_Icon], settings[DT_Menu_Settings_Object], this, settings[DT_Menu_Settings_Extra], settings[DT_Menu_Settings_Title], settings[DT_Menu_Settings_ExtraData], settings[DT_Menu_Settings_Style], true, MN7I); - - if(GetType(settings[DT_Menu_Settings_Size]) == C4V_Array) SetMenuSize(settings[DT_Menu_Settings_Size][0], settings[DT_Menu_Settings_Size][1], settings[DT_Menu_Settings_Object]); - - // update submenu columns if necessary + var title = settings[DT_Menu_Settings_Title]; + var submenuTitle; + // update submenu columns if necessary and build title for(var i = 0; i < GetLength(currentColumnSelections); ++i) { // TODO: cascade? then remove the columnSelection == -1 check @@ -245,12 +243,32 @@ func Create(array cSettings, array cEntries) break; } - if(columnEntries[i][columnSelection][DT_Menu_Entry_SubMenuColumnData]) + var submenuData = columnEntries[i][columnSelection][DT_Menu_Entry_SubMenuColumnData]; + if(submenuData) { - columnEntries[i + 1] = columnEntries[i][columnSelection][DT_Menu_Entry_SubMenuColumnData][2]; + columnEntries[i + 1] = submenuData[2]; + + var submenuSettings = submenuData[0]; + /*var */submenuTitle = submenuSettings[DT_Menu_Settings_Title] || ""; + if(submenuSettings[DT_Menu_Settings_Icon]) + { + submenuTitle = Format("{{%i}} %s", submenuSettings[DT_Menu_Settings_Icon], submenuTitle); + } + + // because of the engine such long titles are not nice; maybe do "... > last Submenu Title" + // the engine makes entry columns at least as long as the title is... + // title = Format("%s {{MN7I:6}} %s", title, submenuTitle); } } + if(submenuTitle) + { + title = Format("... {{MN7I:6}} %s", submenuTitle); + } + + CreateMenu(settings[DT_Menu_Settings_Icon], settings[DT_Menu_Settings_Object], this, settings[DT_Menu_Settings_Extra], title, settings[DT_Menu_Settings_ExtraData], settings[DT_Menu_Settings_Style], true, MN7I); + if(GetType(settings[DT_Menu_Settings_Size]) == C4V_Array) SetMenuSize(settings[DT_Menu_Settings_Size][0], settings[DT_Menu_Settings_Size][1], settings[DT_Menu_Settings_Object]); + AddEntries(); if(entryCount > 0) @@ -269,6 +287,12 @@ func Create(array cSettings, array cEntries) if(!GetEffect("Menu", this)) AddEffect("Menu", this, 1, 1, this, 0); } +func LeaveSubMenuColumn() +{ + SelectEntry(currentColumnSelections[currentColumn - 1], currentColumn - 1); + Refresh(GetSelection(Menu_Selection_WithColumn)); +} + func SelectEntry(indexOrChain, int column) { if(GetType(indexOrChain) == C4V_Array) @@ -461,7 +485,7 @@ func Suspend(bool cont) } } -func HandleEntries(array factoryEntries, int& i, array& ret, array& factoryArgs, int column) +func HandleEntries(array factoryEntries, int& i, array& ret, array& retSettings, array& factoryArgs, int column) { if(column >= columnCount) { @@ -476,7 +500,7 @@ func HandleEntries(array factoryEntries, int& i, array& ret, array& factoryArgs, if(entry[2]) { var index = 0; - HandleEntries(entry[2][1], index, entry[2][2], factoryArgs, column + 1); + HandleEntries(entry[2][1], index, entry[2][2], entry[2][0], factoryArgs, column + 1); entry[1][DT_Menu_Entry_SubMenuColumnData] = entry[2]; } @@ -494,8 +518,8 @@ func HandleEntries(array factoryEntries, int& i, array& ret, array& factoryArgs, if(GetType(factoryResult) == C4V_Array) { var newEntries = []; - UncombineAndDistinguish(factoryResult, settings, newEntries); - HandleEntries(newEntries, i, ret, factoryArgs); + UncombineAndDistinguish(factoryResult, retSettings, newEntries); + HandleEntries(newEntries, i, ret, retSettings, factoryArgs); } else if(factoryResult == Menu_React_Close) { @@ -652,7 +676,14 @@ func React(reaction, array entryIndex, int refreshDelayed) } else if(reaction == Menu_React_Back) { - Close(); + if(currentColumn > 0) + { + LeaveSubMenuColumn(); + } + else + { + Close(); + } } else if(reaction == Menu_React_Refresh || (settings[DT_Menu_Settings_KeepOpen] & DT_Menu_KeepOpen_Refresh)) { @@ -727,7 +758,7 @@ func SubmenuItemCallback(int action, object menuObject, args, array allArgs) { if(args[3]) { - SelectEntry(0, currentColumn + 1); + SelectEntry(columnEntries[currentColumn][currentColumnSelections[currentColumn]][DT_Menu_Entry_SubMenuColumnData][0][DT_Menu_Settings_Selection], currentColumn + 1); } else { @@ -895,11 +926,12 @@ func OnMenuSelection(int selection, object menuObject) { if(currentColumn == oldColumn + 1 && oldIsColumnSubmenu) { + var targetSelection = columnEntries[currentColumn - 1][oldColumnOldSelection][DT_Menu_Entry_SubMenuColumnData][0][DT_Menu_Settings_Selection]; // column submenu was entered through pressing right; select the first entry // but only if it's not there yet - if(selection != 0) + if(selection != targetSelection) { - SelectEntry(0, currentColumn); + SelectEntry(targetSelection, currentColumn); return; } } @@ -1154,7 +1186,7 @@ global func Menu_SubMenu(array entrySettings, array menuEntry_Settings, bool asC if(asColumn) { - // [menu settings (currently ignored), menu entries, readily populated entries (later in HandleEntries)] + // [menu settings (only a few settings are used), menu entries, readily populated entries (later in HandleEntries)] var menuData = [[], [], []]; MN7I->UncombineAndDistinguish(menuEntry_Settings, menuData[0], menuData[1]); ret[2] = menuData; @@ -1211,6 +1243,7 @@ global func Menu_Adaptor_EnumSubmenuIcon(id EnumSubmenuIcon) { return [DT_Menu_A 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_EnumColumnSubmenu() { return [DT_Menu_Adaptor_EnumSubmenu, true]; } global func Menu_Adaptor_Limits(min, max, args) { return [DT_Menu_Adaptor_Limits, [min, max, args]]; @@ -1510,7 +1543,7 @@ func AdaptorFactory(args, int entryIndex, int entryColumn) } else { - return [Menu_SubMenu([Menu_Combined(entrySettings), Menu_Entry_Text(text), Menu_Entry_Callbacks([Menu_Callback(MenuObjectCallback("AdaptorCommand"), Menu_CallbackType_All, [Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject, Menu_CallbackArg_Args, Menu_CallbackArg_All])]), Menu_Entry_Icon(icon), Menu_Entry_Description(description), Menu_Entry_Args(args)], retSubmenu)]; + return [Menu_SubMenu([Menu_Combined(entrySettings), Menu_Entry_Text(text), Menu_Entry_Callbacks([Menu_Callback(MenuObjectCallback("AdaptorCommand"), Menu_CallbackType_All, [Menu_CallbackArg_Action, Menu_CallbackArg_MenuObject, Menu_CallbackArg_Args, Menu_CallbackArg_All])]), Menu_Entry_Icon(icon), Menu_Entry_Description(description), Menu_Entry_Args(args)], retSubmenu, GetType(args[DT_Menu_Adaptor_EnumSubmenu]) == C4V_Bool)]; } } @@ -1553,7 +1586,7 @@ func AdaptorEnumSubmenuFactory(array args) { submenuIcon = [args[DT_Menu_Adaptor_EnumSubmenuIcon]]; } - else if(!submenuIcon && icon && GetType(icon[0]) == C4V_C4ID) + else if(icon && GetType(icon[0]) == C4V_C4ID) { submenuIcon = icon; } @@ -1833,8 +1866,7 @@ func AdaptorCommand(int action, object obj, args, array allArgs) return Menu_React_None; } } - - if(args[DT_Menu_Adaptor_EnumSubmenu] & action) + else if(args[DT_Menu_Adaptor_EnumSubmenu] & action) { return Menu_React_ShowSubmenu; } |
