material-maker/material_maker/globals_menu_manager.gd

134 lines
5.0 KiB
GDScript

extends Node
func _ready():
pass
func create_menus(menu_def, object, menu_bar) -> void:
for md in menu_def:
var menu_name : String = md.menu.split("/")[0]
if ! menu_bar.has_node(menu_name):
var menu_button = MenuButton.new()
menu_button.name = menu_name
menu_button.text = menu_name
menu_button.switch_on_hover = true
menu_bar.add_child(menu_button)
for m in menu_bar.get_children():
if ! m is MenuButton:
continue
var menu = m.get_popup()
menu.connect("about_to_show", self, "create_menu", [ menu_def, object, menu, m.name+"/" ])
create_menu(menu_def, object, menu, m.name+"/")
func create_menu(menu_def : Array, object : Object, menu : PopupMenu, menu_name : String) -> PopupMenu:
var mode = ""
if object.has_method("get_current_mode"):
mode = object.get_current_mode()
var is_mac : bool = OS.get_name() == "OSX"
var submenus = {}
var menu_name_length = menu_name.length()
menu.clear()
if !menu.is_connected("id_pressed", self, "on_menu_id_pressed"):
menu.connect("id_pressed", self, "on_menu_id_pressed", [ menu_def, object ])
var last_is_separator : bool = false
for i in menu_def.size():
if menu_def[i].has("not_in_ports") and menu_def[i].not_in_ports.find(OS.get_name()) != -1:
continue
if menu_def[i].has("not_in_ports") and menu_def[i].not_in_ports.find(OS.get_name()) != -1:
continue
if menu_def[i].has("standalone_only") and menu_def[i].standalone_only and Engine.editor_hint:
continue
if menu_def[i].has("editor_only") and menu_def[i].editor_only and !Engine.editor_hint:
continue
if menu_def[i].has("mode") and menu_def[i].mode != mode:
continue
if ! menu_def[i].menu.begins_with(menu_name):
continue
var menu_item_name = menu_def[i].menu.right(menu_name_length)
var is_separator = false
if menu_item_name.find("/") != -1:
var submenu_name = menu_item_name.split("/")[0]
if ! submenus.has(submenu_name):
var submenu : PopupMenu
if menu.has_node(submenu_name):
submenu = menu.get_node(submenu_name)
else:
submenu = PopupMenu.new()
submenu.name = submenu_name
menu.add_child(submenu)
create_menu(menu_def, object, submenu, menu_name+submenu_name+"/")
menu.add_submenu_item(submenu_name, submenu.get_name())
submenus[submenu_name] = submenu
elif menu_def[i].has("submenu"):
var submenu_name = "submenu_"+menu_def[i].submenu
if ! menu.has_node(submenu_name):
var submenu = PopupMenu.new()
submenu.name = submenu_name
var submenu_function = "create_menu_"+menu_def[i].submenu
if object.has_method(submenu_function):
submenu.connect("about_to_show", object, submenu_function, [ submenu ]);
else:
submenu.connect("about_to_show", self, "create_menu", [ menu_def, object, submenu, menu_def[i].submenu ])
menu.add_child(submenu)
menu.add_submenu_item(menu_item_name, submenu_name)
elif menu_item_name == "" or menu_item_name == "-":
if !last_is_separator:
menu.add_separator()
is_separator = true
else:
var shortcut = 0
if menu_def[i].has("shortcut"):
for s in menu_def[i].shortcut.split("+"):
if s == "Alt":
shortcut |= KEY_MASK_ALT
elif s == "Control":
shortcut |= KEY_MASK_CMD if is_mac else KEY_MASK_CTRL
elif s == "Shift":
shortcut |= KEY_MASK_SHIFT
else:
shortcut |= OS.find_scancode_from_string(s)
if menu_def[i].has("toggle") and menu_def[i].toggle:
menu.add_check_item(menu_item_name, i, shortcut)
else:
menu.add_item(menu_item_name, i, shortcut)
last_is_separator = is_separator
if last_is_separator:
menu.remove_item(menu.get_item_count()-1)
on_menu_about_to_show(menu_def, object, menu_name, menu)
return menu
func on_menu_id_pressed(id, menu_def, object) -> void:
if menu_def[id].has("command"):
var command = menu_def[id].command
if object.has_method(command):
var parameters = []
if menu_def[id].has("command_parameter"):
parameters.append(menu_def[id].command_parameter)
if menu_def[id].has("toggle") and menu_def[id].toggle:
parameters.append(!object.callv(command, parameters))
object.callv(command, parameters)
func on_menu_about_to_show(menu_def, object, name : String, menu : PopupMenu) -> void:
var mode = ""
if object.has_method("get_current_mode"):
mode = object.get_current_mode()
for i in menu_def.size():
if menu_def[i].menu != name:
continue
if menu_def[i].has("submenu"):
pass
elif menu_def[i].has("command"):
var item : int = menu.get_item_index(i)
var command = menu_def[i].command+"_is_disabled"
if object.has_method(command):
var is_disabled = object.call(command)
menu.set_item_disabled(item, is_disabled)
if menu_def[i].has("mode"):
menu.set_item_disabled(item, menu_def[i].mode != mode)
if menu_def[i].has("toggle") and menu_def[i].toggle:
command = menu_def[i].command
var parameters = []
if menu_def[i].has("command_parameter"):
parameters.append(menu_def[i].command_parameter)
if object.has_method(command):
menu.set_item_checked(item, object.callv(command, parameters))