Skip to content

Commit 384296f

Browse files
committed
Fixes #15 (Part 2): support for dynamic menus on MacOS
1 parent e8d754e commit 384296f

File tree

2 files changed

+25
-7
lines changed

2 files changed

+25
-7
lines changed

cdl/core/gui/main.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
from cdl.utils import dephash
6060
from cdl.utils import qthelpers as qth
6161
from cdl.utils.misc import go_to_error
62-
from cdl.utils.qthelpers import bring_to_front
62+
from cdl.utils.qthelpers import bring_to_front, configure_menu_about_to_show
6363
from cdl.widgets import instconfviewer, logviewer, status
6464

6565
if TYPE_CHECKING: # pragma: no cover
@@ -722,7 +722,7 @@ def __setup_global_actions(self) -> None:
722722
else:
723723
quit_text = _("Quit")
724724
quit_tip = _("Quit application")
725-
if sys.platform != 'darwin':
725+
if sys.platform != "darwin":
726726
# On macOS, the "Quit" action is automatically added to the application menu
727727
self.quit_action = create_action(
728728
self,
@@ -817,14 +817,14 @@ def __get_local_doc_path() -> str | None:
817817
def __add_menus(self) -> None:
818818
"""Adding menus"""
819819
self.file_menu = self.menuBar().addMenu(_("File"))
820-
self.file_menu.aboutToShow.connect(self.__update_file_menu)
820+
configure_menu_about_to_show(self.file_menu, self.__update_file_menu)
821821
self.edit_menu = self.menuBar().addMenu(_("&Edit"))
822822
self.operation_menu = self.menuBar().addMenu(_("Operations"))
823823
self.processing_menu = self.menuBar().addMenu(_("Processing"))
824824
self.computing_menu = self.menuBar().addMenu(_("Computing"))
825825
self.plugins_menu = self.menuBar().addMenu(_("Plugins"))
826826
self.view_menu = self.menuBar().addMenu(_("&View"))
827-
self.view_menu.aboutToShow.connect(self.__update_view_menu)
827+
configure_menu_about_to_show(self.view_menu, self.__update_view_menu)
828828
self.help_menu = self.menuBar().addMenu("?")
829829
for menu in (
830830
self.edit_menu,
@@ -833,7 +833,7 @@ def __add_menus(self) -> None:
833833
self.computing_menu,
834834
self.plugins_menu,
835835
):
836-
menu.aboutToShow.connect(self.__update_generic_menu)
836+
configure_menu_about_to_show(menu, self.__update_generic_menu)
837837
help_menu_actions = [
838838
create_action(
839839
self,
@@ -1106,7 +1106,7 @@ def __update_file_menu(self) -> None:
11061106
self.browseh5_action,
11071107
None,
11081108
self.settings_action,
1109-
]
1109+
],
11101110
)
11111111
if self.quit_action is not None:
11121112
add_actions(self.file_menu, [None, self.quit_action])

cdl/utils/qthelpers.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import shutil
1818
import sys
1919
import traceback
20-
from collections.abc import Generator
20+
from collections.abc import Callable, Generator
2121
from contextlib import contextmanager
2222
from datetime import datetime
2323

@@ -323,3 +323,21 @@ def bring_to_front(window: QW.QWidget) -> None:
323323
# If window is minimized, restore it
324324
if window.isMinimized():
325325
window.showNormal()
326+
327+
328+
def configure_menu_about_to_show(menu: QW.QMenu, slot: Callable) -> None:
329+
"""Configure menu about to show.
330+
This method is only used to connect the "aboutToShow" signal of menus,
331+
and more importantly to fix Issue #15 (Part 2) which is the fact that
332+
dynamic menus are not supported on MacOS unless an action is added to
333+
the menu before it is displayed.
334+
335+
Args:
336+
menu: menu
337+
slot: slot
338+
"""
339+
# On MacOS, add an empty action to the menu before connecting the
340+
# "aboutToShow" signal to the slot. This is required to fix Issue #15 (Part 2)
341+
if sys.platform == "darwin":
342+
menu.addAction(QW.QAction(menu))
343+
menu.aboutToShow.connect(slot)

0 commit comments

Comments
 (0)