From 547b733465118de2ab6856021606573eea885449 Mon Sep 17 00:00:00 2001 From: Sthornberry9 <46094434+Sthornberry9@users.noreply.github.com> Date: Sun, 9 Aug 2026 02:52:11 -0400 Subject: [PATCH] Fix desktop toolbar dropdowns --- modern_gui.py | 65 ++++++++++++++++++++++++++++++--------------------- tests.py | 25 +++++++++++++++++++- 2 files changed, 62 insertions(+), 28 deletions(-) diff --git a/modern_gui.py b/modern_gui.py index ac988da..d28d037 100644 --- a/modern_gui.py +++ b/modern_gui.py @@ -398,36 +398,39 @@ def _build_menubar(self) -> None: bar = ttk.Frame(self.root, style="Toolbar.TFrame", padding=(5, 1)) bar.pack(side=tk.TOP, fill=tk.X) - file_menu = tk.Menu(self.root, tearoff=False, **menu_options) - file_menu.add_command(label="Add Games...", command=self.show_add_games) - file_menu.add_command(label="Open Application Data", command=lambda: _open_path(BASE_DIR)) - file_menu.add_separator() - file_menu.add_command(label="Exit", command=self.root.destroy) - view_menu = tk.Menu(self.root, tearoff=False, **menu_options) - view_menu.add_command(label="Library", command=self.show_library) - view_menu.add_command(label="Downloads", command=self.show_downloads) - view_menu.add_command(label="Profiles & Saves", command=self.show_profiles) - view_menu.add_command(label="Knowledge", command=self.show_knowledge) - view_menu.add_command(label="Community Hub", command=self.show_community_hub) - tools_menu = tk.Menu(self.root, tearoff=False, **menu_options) - tools_menu.add_command(label="Backup Manager", command=self.show_backups) - tools_menu.add_command(label="Tool Center", command=self.show_external_tools) - tools_menu.add_command(label="Archive Health", command=self.show_health) - tools_menu.add_command(label="Settings", command=self.show_settings) - help_menu = tk.Menu(self.root, tearoff=False, **menu_options) - help_menu.add_command(label="Help & About", command=self.show_about) - help_menu.add_command(label="Check for Updates", command=self._check_updates) - - for label, submenu in ( - ("File", file_menu), - ("View", view_menu), - ("Tools", tools_menu), - ("Help", help_menu), - ): + menu_definitions: tuple[ + tuple[str, tuple[tuple[str | None, Callable[[], Any] | None], ...]], ... + ] = ( + ("File", ( + ("Add Games...", self.show_add_games), + ("Open Application Data", lambda: _open_path(BASE_DIR)), + (None, None), + ("Exit", self.root.destroy), + )), + ("View", ( + ("Library", self.show_library), + ("Downloads", self.show_downloads), + ("Profiles & Saves", self.show_profiles), + ("Knowledge", self.show_knowledge), + ("Community Hub", self.show_community_hub), + )), + ("Tools", ( + ("Backup Manager", self.show_backups), + ("Tool Center", self.show_external_tools), + ("Archive Health", self.show_health), + ("Settings", self.show_settings), + )), + ("Help", ( + ("Help & About", self.show_about), + ("Check for Updates", self._check_updates), + )), + ) + + self._dropdown_menus: list[tk.Menu] = [] + for label, entries in menu_definitions: button = tk.Menubutton( bar, text=label, - menu=submenu, background=PALETTE.chrome, foreground=PALETTE.text, activebackground=PALETTE.accent, @@ -438,7 +441,15 @@ def _build_menubar(self) -> None: padx=7, pady=3, ) + submenu = tk.Menu(button, tearoff=False, **menu_options) + for entry_label, command in entries: + if entry_label is None: + submenu.add_separator() + else: + submenu.add_command(label=entry_label, command=command) + button.configure(menu=submenu) button.pack(side=tk.LEFT) + self._dropdown_menus.append(submenu) self._menu = bar def _build_shell(self) -> None: diff --git a/tests.py b/tests.py index 032adb7..bf08446 100644 --- a/tests.py +++ b/tests.py @@ -45,7 +45,12 @@ ) from offline_knowledge import OfflineKnowledgeArchive from library_service import GameSummary, LibraryService -from modern_gui import LE_FLUFFIE_CREATOR, XEXTOOL_CREATOR, navigation_shortcut +from modern_gui import ( + LE_FLUFFIE_CREATOR, + XEXTOOL_CREATOR, + UnityScraperDesktop, + navigation_shortcut, +) from title_catalog import XboxUnityTitleCatalog from wiki_adapters import extract_article_text, parse_sitemap from backup_manager import ( @@ -1029,6 +1034,24 @@ def test_tenth_navigation_page_uses_alt_zero(self): self.assertEqual(navigation_shortcut(10), "0") self.assertIsNone(navigation_shortcut(11)) + @patch("modern_gui.tk.Menu") + @patch("modern_gui.tk.Menubutton") + @patch("modern_gui.ttk.Frame") + def test_toolbar_dropdowns_belong_to_their_buttons(self, frame, menubutton, menu): + app = UnityScraperDesktop.__new__(UnityScraperDesktop) + app.root = MagicMock() + buttons = [MagicMock() for _ in range(4)] + submenus = [MagicMock() for _ in range(4)] + menubutton.side_effect = buttons + menu.side_effect = submenus + + app._build_menubar() + + self.assertEqual(frame.call_args.args[0], app.root) + self.assertEqual([call.args[0] for call in menu.call_args_list], buttons) + for button, submenu in zip(buttons, submenus): + button.configure.assert_called_once_with(menu=submenu) + def test_bundled_xextool_has_documented_binary(self): binary = ( Path(__file__).resolve().parent