diff --git a/gui_handler.py b/gui_handler.py index 72b8a30..9ef2cb5 100644 --- a/gui_handler.py +++ b/gui_handler.py @@ -26,32 +26,30 @@ class Window(QtWidgets.QMainWindow): def set_size(self, size_x, size_y): self.resize(size_x, size_y) - def update_menus(self, menu_dict): - menu = self.menuBar() + def update_menus(self, menu_dict, menu=None): + # if not a sub menu + if menu == None: + menu = self.menuBar() + #Looping through entire menu_dict - for topmenu, submenu in menu_dict.items(): - #making top level menu - menu_item = menu.addMenu(topmenu) - - #adding menu items (populating menu) - for inner, data in submenu.items(): - #Adding submenu and populating it - if type(data) == dict: - sub = menu_item.addMenu(inner) - for label, func in data.items(): - sub.addAction(label) - - if func == None: - sub.triggered.connect(lambda x: None) - else: - sub.triggered.connect(func) - #Adding separators - elif inner == None: - menu_item.addSeparator() - else: - item = menu_item.addAction(inner) - item.triggered.connect(data) - + for entry in menu_dict: + # inactive or separator + if menu_dict[entry] == None: + # determine if entry is a separator or an inactive menu item + if type(entry) == int: + menu.addSeparator() + else: + menu_item = menu.addAction(entry) + menu_item.setEnabled(False) + # sub menus + if type(menu_dict[entry]) == dict: + submenu = menu.addMenu(entry) + # recurse because sub menus may have sub menus + self.update_menus(menu_dict[entry], menu=submenu) + # ordinary menu entries + if callable(menu_dict[entry]): + menu_item = menu.addAction(entry) + menu_item.triggered.connect(menu_dict[entry]) #TODO: This needs to run in a thread but Qt really doesn't want it to. There are two ways around this: # - create the QtWidgets.QApplication inside a thread and run all QT stuff inside that thread diff --git a/gui_helper.py b/gui_helper.py index c961fa8..43a5885 100644 --- a/gui_helper.py +++ b/gui_helper.py @@ -8,13 +8,13 @@ def not_implemented(): # "":{} -> menu or submenu # "":function -> menu entry # "":None -> disabled menu entry -# None:None -> separator +# int:None -> separator # # Entries with ... at the end are supposed to open dialogs whereas entries without dots are supposed to take effect immediately menu_structure = { "IDE": { "Preferences...": not_implemented, - None: None, + 0: None, "Quit": not_implemented }, "Project": { @@ -25,7 +25,7 @@ menu_structure = { "Close": { "No open projects": None }, - None: None, + 0: None, "Preferences...": not_implemented, "Search...": not_implemented, "Build": not_implemented @@ -35,7 +35,7 @@ menu_structure = { "Open...": not_implemented, "Save": not_implemented, "Close": not_implemented, - None: None, + 0: None, "Rename...": not_implemented, "Move...": not_implemented, "View in File Explorer...": not_implemented @@ -45,9 +45,9 @@ menu_structure = { "Copy": not_implemented, "Paste": not_implemented, "Move code...": not_implemented, - None: None, + 0: None, "Search and Replace...": not_implemented, - None: None, + 1: None, "Format": not_implemented, "Indent": not_implemented, "Unindent": not_implemented, @@ -63,6 +63,3 @@ menu_structure = { "About IDE...": not_implemented, } } - -#FIXME: come up with a way to uniquely declare separators so they don't become the same element of a dict -