From daf3cf390f704b1bb76fb703fb7d653dee994e4a Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Mon, 6 Nov 2023 07:42:41 +0800 Subject: [PATCH 1/4] Correct the creation of menubars in the web backend. --- changes/2194.bugfix.rst | 1 + web/src/toga_web/app.py | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 changes/2194.bugfix.rst diff --git a/changes/2194.bugfix.rst b/changes/2194.bugfix.rst new file mode 100644 index 0000000000..5e064641e3 --- /dev/null +++ b/changes/2194.bugfix.rst @@ -0,0 +1 @@ +The web backend no longer generates a duplicate titlebar. diff --git a/web/src/toga_web/app.py b/web/src/toga_web/app.py index 839892acc1..4706ea3e35 100644 --- a/web/src/toga_web/app.py +++ b/web/src/toga_web/app.py @@ -23,7 +23,7 @@ def create(self): self.interface.commands.add( # ---- Help menu ---------------------------------- toga.Command( - lambda _: self.interface.about(), + self._menu_about, "About " + formal_name, group=toga.Group.HELP, ), @@ -34,7 +34,9 @@ def create(self): ), ) - # Create the menus. + # Create the menus. This is done before main window content to ensure + # the
for the menubar is inserted before the
for the + # main window. self.create_menus() # Call user code to populate the main window @@ -103,8 +105,10 @@ def create_menus(self): else: help_menu_container.appendChild(submenu) + menubar_id = f"{self.interface.app_id}-header" self.menubar = create_element( "header", + id=menubar_id, classes=["toga"], children=[ create_element( @@ -124,8 +128,15 @@ def create_menus(self): ], ) - # Menubar exists at the app level. - self.native.appendChild(self.menubar) + # If there's an existing menubar, replace it. + old_menubar = js.document.getElementById(menubar_id) + if old_menubar: + old_menubar.replaceWith(self.menubar) + else: + self.native.append(self.menubar) + + def _menu_about(self, event, widget, **kwargs): + self.interface.about() def main_loop(self): self.create() From 14b860ec65d8dc9cb0334281f946a524ed766969 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Mon, 6 Nov 2023 07:46:42 +0800 Subject: [PATCH 2/4] Add changenote for about dialog fix. --- changes/2103.docs.rst | 1 - changes/2195.bugfix.rst | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 changes/2103.docs.rst create mode 100644 changes/2195.bugfix.rst diff --git a/changes/2103.docs.rst b/changes/2103.docs.rst deleted file mode 100644 index b57a159b25..0000000000 --- a/changes/2103.docs.rst +++ /dev/null @@ -1 +0,0 @@ -The widget screenshots were updated to provide examples of widgets on every platform. diff --git a/changes/2195.bugfix.rst b/changes/2195.bugfix.rst new file mode 100644 index 0000000000..4fb4695357 --- /dev/null +++ b/changes/2195.bugfix.rst @@ -0,0 +1 @@ +An issue with the display of the About dialog on the web backend was corrected. From f8fa58c68a5df639cd3e21bccd58e827cab362b1 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Tue, 7 Nov 2023 07:41:37 +0800 Subject: [PATCH 3/4] Correct handling of DOM click events on menu items. --- web/src/toga_web/app.py | 4 ++-- web/src/toga_web/command.py | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/web/src/toga_web/app.py b/web/src/toga_web/app.py index 4706ea3e35..4d8090c05d 100644 --- a/web/src/toga_web/app.py +++ b/web/src/toga_web/app.py @@ -81,7 +81,7 @@ def create_menus(self): content=cmd.text, disabled=not cmd.enabled, ) - menu_item.onclick = cmd.action + menu_item.onclick = cmd._impl.dom_click submenu.append(menu_item) @@ -135,7 +135,7 @@ def create_menus(self): else: self.native.append(self.menubar) - def _menu_about(self, event, widget, **kwargs): + def _menu_about(self, widget, **kwargs): self.interface.about() def main_loop(self): diff --git a/web/src/toga_web/command.py b/web/src/toga_web/command.py index 43dc630c02..3378a4e760 100644 --- a/web/src/toga_web/command.py +++ b/web/src/toga_web/command.py @@ -6,6 +6,9 @@ def __init__(self, interface): self.interface = interface self.native = [] + def dom_click(self, event): + self.interface.action() + def set_enabled(self, value): pass # enabled = self.interface.enabled From cf9eee3d229efd9ea794a47b1a04073a20210383 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Tue, 7 Nov 2023 08:04:29 +0800 Subject: [PATCH 4/4] Use a consistent pattern on backends that use the same menu activation approach. --- gtk/src/toga_gtk/app.py | 11 +---------- gtk/src/toga_gtk/command.py | 6 ++++++ gtk/src/toga_gtk/window.py | 11 +---------- winforms/src/toga_winforms/app.py | 2 +- winforms/src/toga_winforms/command.py | 6 +++--- winforms/src/toga_winforms/window.py | 2 +- 6 files changed, 13 insertions(+), 25 deletions(-) diff --git a/gtk/src/toga_gtk/app.py b/gtk/src/toga_gtk/app.py index 80cf53d819..6fdf4adc02 100644 --- a/gtk/src/toga_gtk/app.py +++ b/gtk/src/toga_gtk/app.py @@ -14,15 +14,6 @@ from .window import Window -def gtk_menu_item_activate(cmd): - """Convert a GTK menu item activation into a command invocation.""" - - def _handler(action, data): - cmd.action() - - return _handler - - class MainWindow(Window): def create(self): self.native = Gtk.ApplicationWindow() @@ -151,7 +142,7 @@ def create_menus(self): cmd_id = "command-%s" % id(cmd) action = Gio.SimpleAction.new(cmd_id, None) - action.connect("activate", gtk_menu_item_activate(cmd)) + action.connect("activate", cmd._impl.gtk_activate) cmd._impl.native.append(action) cmd._impl.set_enabled(cmd.enabled) diff --git a/gtk/src/toga_gtk/command.py b/gtk/src/toga_gtk/command.py index c8cec0cca7..95d4e0e3e4 100644 --- a/gtk/src/toga_gtk/command.py +++ b/gtk/src/toga_gtk/command.py @@ -9,6 +9,12 @@ def __init__(self, interface): self.interface = interface self.native = [] + def gtk_activate(self, action, data): + self.interface.action() + + def gtk_clicked(self, action): + self.interface.action() + def set_enabled(self, value): enabled = self.interface.enabled for widget in self.native: diff --git a/gtk/src/toga_gtk/window.py b/gtk/src/toga_gtk/window.py index 32589bebfd..0bcea2d8a0 100644 --- a/gtk/src/toga_gtk/window.py +++ b/gtk/src/toga_gtk/window.py @@ -4,15 +4,6 @@ from .libs import Gdk, Gtk -def gtk_toolbar_item_clicked(cmd): - """Convert a GTK toolbar item click into a command invocation.""" - - def _handler(widget): - cmd.action() - - return _handler - - class Window: def __init__(self, interface, title, position, size): self.interface = interface @@ -100,7 +91,7 @@ def create_toolbar(self): item_impl.set_label(cmd.text) if cmd.tooltip: item_impl.set_tooltip_text(cmd.tooltip) - item_impl.connect("clicked", gtk_toolbar_item_clicked(cmd)) + item_impl.connect("clicked", cmd._impl.gtk_clicked) cmd._impl.native.append(item_impl) self.toolbar_items[cmd] = item_impl self.native_toolbar.insert(item_impl, -1) diff --git a/winforms/src/toga_winforms/app.py b/winforms/src/toga_winforms/app.py index 94486b38fc..9bca588af9 100644 --- a/winforms/src/toga_winforms/app.py +++ b/winforms/src/toga_winforms/app.py @@ -146,7 +146,7 @@ def create_menus(self): else: submenu = self._submenu(cmd.group, menubar) item = WinForms.ToolStripMenuItem(cmd.text) - item.Click += WeakrefCallable(cmd._impl.winforms_handler) + item.Click += WeakrefCallable(cmd._impl.winforms_Click) if cmd.shortcut is not None: try: item.ShortcutKeys = toga_to_winforms_key(cmd.shortcut) diff --git a/winforms/src/toga_winforms/command.py b/winforms/src/toga_winforms/command.py index 30b2ac712b..562eb7fb2e 100644 --- a/winforms/src/toga_winforms/command.py +++ b/winforms/src/toga_winforms/command.py @@ -3,10 +3,10 @@ def __init__(self, interface): self.interface = interface self.native = [] + def winforms_Click(self, sender, event): + return self.interface.action() + def set_enabled(self, value): if self.native: for widget in self.native: widget.Enabled = self.interface.enabled - - def winforms_handler(self, sender, event): - return self.interface.action() diff --git a/winforms/src/toga_winforms/window.py b/winforms/src/toga_winforms/window.py index 2eec14647e..b76b36a66a 100644 --- a/winforms/src/toga_winforms/window.py +++ b/winforms/src/toga_winforms/window.py @@ -63,7 +63,7 @@ def create_toolbar(self): if cmd.icon is not None: item.Image = cmd.icon._impl.native.ToBitmap() item.Enabled = cmd.enabled - item.Click += WeakrefCallable(cmd._impl.winforms_handler) + item.Click += WeakrefCallable(cmd._impl.winforms_Click) cmd._impl.native.append(item) self.toolbar_native.Items.Add(item)