Compare commits
	
		
			No commits in common. "7d3f60630430e3d3320ee2309e0364b1cb7ebe2d" and "603acb60f6fcfd89b06147f45b33f334bc2bac67" have entirely different histories. 
		
	
	
		
			7d3f606304
			...
			603acb60f6
		
	
		|  | @ -26,30 +26,32 @@ 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=None): | ||||
|         # if not a sub menu | ||||
|         if menu == None: | ||||
|             menu = self.menuBar() | ||||
| 
 | ||||
|     def update_menus(self, menu_dict): | ||||
|         menu = self.menuBar() | ||||
|         #Looping through entire menu_dict | ||||
|         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]) | ||||
|         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) | ||||
|      | ||||
| 
 | ||||
| #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 | ||||
|  |  | |||
|  | @ -1,3 +1,4 @@ | |||
| import tkinter as tk | ||||
| import util | ||||
| 
 | ||||
| 
 | ||||
|  | @ -8,13 +9,13 @@ def not_implemented(): | |||
| #   "":{} -> menu or submenu | ||||
| #   "":function -> menu entry | ||||
| #   "":None -> disabled menu entry | ||||
| #   int:None -> separator | ||||
| #   None: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, | ||||
|         0: None, | ||||
|         None: None, | ||||
|         "Quit": not_implemented | ||||
|     }, | ||||
|     "Project": { | ||||
|  | @ -25,7 +26,7 @@ menu_structure = { | |||
|         "Close": { | ||||
|             "No open projects": None | ||||
|         }, | ||||
|         0: None, | ||||
|         None: None, | ||||
|         "Preferences...": not_implemented, | ||||
|         "Search...": not_implemented, | ||||
|         "Build": not_implemented | ||||
|  | @ -35,7 +36,7 @@ menu_structure = { | |||
|         "Open...": not_implemented, | ||||
|         "Save": not_implemented, | ||||
|         "Close": not_implemented, | ||||
|         0: None, | ||||
|         None: None, | ||||
|         "Rename...": not_implemented, | ||||
|         "Move...": not_implemented, | ||||
|         "View in File Explorer...": not_implemented | ||||
|  | @ -45,9 +46,9 @@ menu_structure = { | |||
|         "Copy": not_implemented, | ||||
|         "Paste": not_implemented, | ||||
|         "Move code...": not_implemented, | ||||
|         0: None, | ||||
|         None: None, | ||||
|         "Search and Replace...": not_implemented, | ||||
|         1: None, | ||||
|         None: None, | ||||
|         "Format": not_implemented, | ||||
|         "Indent": not_implemented, | ||||
|         "Unindent": not_implemented, | ||||
|  | @ -63,3 +64,21 @@ 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 | ||||
| 
 | ||||
| def build_menu(structure_dict, menu): | ||||
|     for entry in structure_dict: | ||||
|         if structure_dict[entry]==None: | ||||
|             if entry==None: | ||||
|                 menu.add_separator() | ||||
|             else: | ||||
|                 menu.add_command(label=entry) | ||||
|                 menu.entryconfig(entry, state="disabled") | ||||
|         if isinstance(structure_dict[entry], dict): | ||||
|             submenu = tk.Menu(menu, tearoff=False) | ||||
|             build_menu(structure_dict[entry], submenu) | ||||
|             menu.add_cascade(label=entry, menu=submenu) | ||||
|         if callable(structure_dict[entry]): | ||||
|             menu.add_command(label=entry, command=structure_dict[entry]) | ||||
| 
 | ||||
|  |  | |||
		Reference in New Issue