2 * This class sets up the main menu buttons, animates submenu that opens when
3 * clicking on category buttons, assigns the defined actions and hotkeys to every button.
5 class MainMenuItemHandler
9 this.menuItems = menuItems;
10 this.lastTickTime = Date.now();
12 this.mainMenu = Engine.GetGUIObjectByName("mainMenu");
13 this.mainMenuButtons = Engine.GetGUIObjectByName("mainMenuButtons");
14 this.submenu = Engine.GetGUIObjectByName("submenu");
15 this.submenuButtons = Engine.GetGUIObjectByName("submenuButtons");
16 this.MainMenuPanelRightBorderTop = Engine.GetGUIObjectByName("MainMenuPanelRightBorderTop");
17 this.MainMenuPanelRightBorderBottom = Engine.GetGUIObjectByName("MainMenuPanelRightBorderBottom");
19 this.setupMenuButtons(this.mainMenuButtons.children, this.menuItems);
20 this.setupHotkeys(this.menuItems);
22 Engine.GetGUIObjectByName("closeMenuButton").onPress = this.closeSubmenu.bind(this);
25 setupMenuButtons(buttons, menuItems)
27 buttons.forEach((button, i) => {
28 let item = menuItems[i];
29 button.hidden = !item;
33 button.size = new GUISize(
34 0, (this.ButtonHeight + this.Margin) * i,
35 0, (this.ButtonHeight + this.Margin) * i + this.ButtonHeight,
37 button.caption = item.caption;
38 button.tooltip = item.tooltip;
39 button.enabled = item.enabled === undefined || item.enabled;
40 button.onPress = () => {
48 button.hidden = false;
51 if (buttons.length < menuItems.length)
52 error("GUI page has space for " + buttons.length + " menu buttons, but " + menuItems.length + " items are provided!");
55 setupHotkeys(menuItems)
57 for (let i in menuItems)
59 let item = menuItems[i];
60 if (item.onPress && item.hotkey)
61 Engine.SetGlobalHotkey(item.hotkey, () => {
67 this.setupHotkeys(item.submenu);
73 this.setupMenuButtons(this.submenuButtons.children, this.menuItems[i].submenu);
75 let top = this.mainMenuButtons.size.top + this.mainMenuButtons.children[i].size.top;
77 this.submenu.size = new GUISize(
78 this.submenu.size.left, top - this.Margin,
79 this.submenu.size.right, top + (this.ButtonHeight + this.Margin) * this.menuItems[i].submenu.length);
81 this.submenu.hidden = false;
84 let size = this.MainMenuPanelRightBorderTop.size;
85 size.bottom = this.submenu.size.top + this.Margin;
87 this.MainMenuPanelRightBorderTop.size = size;
91 let size = this.MainMenuPanelRightBorderBottom.size;
92 size.top = this.submenu.size.bottom;
93 this.MainMenuPanelRightBorderBottom.size = size;
97 this.lastTickTime = Date.now();
98 this.mainMenu.onTick = this.onTick.bind(this);
103 this.submenu.hidden = true;
104 this.submenu.size = this.mainMenu.size;
106 let size = this.MainMenuPanelRightBorderTop.size;
110 this.MainMenuPanelRightBorderTop.size = size;
115 let now = Date.now();
116 if (now == this.lastTickTime)
119 let maxOffset = this.mainMenu.size.right - this.submenu.size.left;
120 let offset = Math.min(this.MenuSpeed * (now - this.lastTickTime), maxOffset);
122 this.lastTickTime = now;
124 if (this.submenu.hidden || !offset)
126 delete this.mainMenu.onTick;
130 let size = this.submenu.size;
132 size.right += offset;
133 this.submenu.size = size;
138 * Vertical size per button.
140 MainMenuItemHandler.prototype.ButtonHeight = 28;
143 * Distance between consecutive buttons.
145 MainMenuItemHandler.prototype.Margin = 4;
148 * Collapse / expansion speed in pixels per milliseconds used when animating the button menu size.
150 MainMenuItemHandler.prototype.MenuSpeed = 1.2;