summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Script.c75
1 files changed, 54 insertions, 21 deletions
diff --git a/Script.c b/Script.c
index 82824e7..029e1c7 100644
--- a/Script.c
+++ b/Script.c
@@ -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;
}