diff options
| author | Markus Mittendrein <git@maxmitti.tk> | 2018-11-05 20:05:51 +0100 |
|---|---|---|
| committer | Markus Mittendrein <git@maxmitti.tk> | 2018-11-05 20:05:51 +0100 |
| commit | 91056c65c208eb85fa9d860a21c0cf823fb82a62 (patch) | |
| tree | 0f9200d3dda8ff7f81af3aad0b1666eb5955e53e /Script.c | |
| parent | 8088d0e0e3bb948d950e55a3452b39226e6750dd (diff) | |
| download | DTMenuDebug.c4d-91056c65c208eb85fa9d860a21c0cf823fb82a62.tar.gz DTMenuDebug.c4d-91056c65c208eb85fa9d860a21c0cf823fb82a62.zip | |
Submenu column fixes
Make Menu_React_Back only leave submenu columns instead of closing the whole menu
Fix falling back to the currently selected enum value icon as Menu_Icon() in Menu_Adaptor_Enum submenu
Add Menu_Adaptor_EnumColumnSubmenu() to show enum values of adaptors as submenu column
Implement Menu_Title, Menu_Icon and Menu_Selection for column submenus
Diffstat (limited to 'Script.c')
| -rw-r--r-- | Script.c | 75 |
1 files changed, 54 insertions, 21 deletions
@@ -231,7 +231,7 @@ 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(columnCount > 1 && settings[DT_Menu_Settings_Style] != C4MN_Style_Context) { @@ -241,11 +241,9 @@ func Create(array cSettings, array cEntries) if(settings[DT_Menu_Settings_Parent]) settings[DT_Menu_Settings_Parent]->Suspend(); if(!(settings[DT_Menu_Settings_Object])) { FatalError("Assertion failed: CreateNewMenu: menu object is missing; assertion code: settings[DT_Menu_Settings_Object]"); } - 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 @@ -255,12 +253,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) @@ -283,6 +301,13 @@ func Create(array cSettings, array cEntries) if(!GetEffect("Menu", this)) AddEffect("Menu", this, 1, 1, this, 0); } +func LeaveSubMenuColumn() +{ + if(!(currentColumn > 0)) { FatalError("Assertion failed: LeaveSubMenuColumn: currentColumn is not a submenu; can't leave; assertion code: currentColumn > 0"); } + SelectEntry(currentColumnSelections[currentColumn - 1], currentColumn - 1); + Refresh(GetSelection(Menu_Selection_WithColumn)); +} + func SelectEntry(indexOrChain, int column) { if(GetType(indexOrChain) == C4V_Array) @@ -484,7 +509,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) { @@ -499,7 +524,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]; } @@ -517,8 +542,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) { @@ -683,7 +708,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)) { @@ -758,7 +790,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 { @@ -926,11 +958,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; } } @@ -1230,7 +1263,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; @@ -1288,6 +1321,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) { if(!((callbackType & ~Menu_CallbackType_All) == 0)) { FatalError("Assertion failed: Menu_Adaptor_EnumSubmenu: invalid callback type(s) used; assertion code: (callbackType & ~Menu_CallbackType_All) == 0"); }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) { if((!min || GetType(min) == C4V_Int) && (!max || GetType(max) == C4V_Int)) @@ -1632,7 +1666,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)]; } } @@ -1675,7 +1709,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; } @@ -1956,8 +1990,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; } |
