diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index a1b8e77ccc..bb8f71c618 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -25,17 +25,22 @@ from calibre.utils.filenames import expanduser gprefs = JSONConfig('gui') defs = gprefs.defaults -if isosx: - defs['action-layout-menubar'] = ( +native_menubar_defaults = { + 'action-layout-menubar': ( 'Add Books', 'Edit Metadata', 'Convert Books', 'Choose Library', 'Save To Disk', 'Preferences', 'Help', - ) - defs['action-layout-menubar-device'] = ( + ), + 'action-layout-menubar-device': ( 'Add Books', 'Edit Metadata', 'Convert Books', 'Location Manager', 'Send To Device', 'Save To Disk', 'Preferences', 'Help', ) +} + +if isosx: + defs['action-layout-menubar'] = native_menubar_defaults['action-layout-menubar'] + defs['action-layout-menubar-device'] = native_menubar_defaults['action-layout-menubar-device'] defs['action-layout-toolbar'] = ( 'Add Books', 'Edit Metadata', None, 'Convert Books', 'View', None, 'Choose Library', 'Donate', None, 'Fetch News', 'Store', 'Save To Disk', diff --git a/src/calibre/gui2/bars.py b/src/calibre/gui2/bars.py index 9fbf6a088a..889059c81f 100644 --- a/src/calibre/gui2/bars.py +++ b/src/calibre/gui2/bars.py @@ -10,12 +10,12 @@ __docformat__ = 'restructuredtext en' from functools import partial import sip -from PyQt5.Qt import (Qt, QAction, QMenu, QMenuBar, QObject, - QToolBar, QToolButton, QSize, pyqtSignal, QTimer) +from PyQt5.Qt import ( + Qt, QAction, QMenu, QObject, QToolBar, QToolButton, QSize, pyqtSignal, QTimer) from calibre.constants import isosx from calibre.gui2.throbber import create_donate_widget -from calibre.gui2 import gprefs, workaround_broken_under_mouse +from calibre.gui2 import gprefs, workaround_broken_under_mouse, native_menubar_defaults class ToolBar(QToolBar): # {{{ @@ -273,6 +273,8 @@ if isosx: class MenuBar(QObject): + is_native_menubar = True + @property def native_menubar(self): return self.gui.native_menubar @@ -353,11 +355,17 @@ else: elif what in iactions: m.addAction(iactions[what].qaction) - class MenuBar(QMenuBar): + from calibre.gui2.dbus_export.widgets import factory + + class MenuBar(QObject): + + is_native_menubar = False def __init__(self, location_manager, parent): - QMenuBar.__init__(self, parent) - parent.setMenuBar(self) + QObject.__init__(self, parent) + f = factory(app_id='com.calibre-ebook.gui') + self.menu_bar = f.create_window_menubar(parent) + self.is_native_menubar = self.menu_bar.is_native_menubar self.gui = parent self.location_manager = location_manager @@ -368,6 +376,15 @@ else: self.donate_menu.addAction(self.gui.donate_action) self.donate_action.setMenu(self.donate_menu) + def addAction(self, *args): + self.menu_bar.addAction(*args) + + def setVisible(self, visible): + self.menu_bar.setVisible(visible) + + def clear(self): + self.menu_bar.clear() + def init_bar(self, actions): for ac in self.added_actions: m = ac.menu() @@ -424,6 +441,9 @@ class BarsManager(QObject): self.child_bars = tuple(bars[2:]) self.menu_bar = MenuBar(self.location_manager, self.parent()) + is_native_menubar = self.menu_bar.is_native_menubar + self.menubar_fallback = native_menubar_defaults['action-layout-menubar'] if is_native_menubar else () + self.menubar_device_fallback = native_menubar_defaults['action-layout-menubar-device'] if is_native_menubar else () self.apply_settings() self.init_bars() @@ -447,8 +467,8 @@ class BarsManager(QObject): self.bar_actions = tuple( [gprefs['action-layout-toolbar'+x] for x in ('', '-device')] + [gprefs['action-layout-toolbar-child']] + - [gprefs['action-layout-menubar']] + - [gprefs['action-layout-menubar-device']] + [gprefs['action-layout-menubar'] or self.menubar_fallback] + + [gprefs['action-layout-menubar-device'] or self.menubar_device_fallback] ) for bar, actions in zip(self.bars, self.bar_actions[:3]): diff --git a/src/calibre/gui2/dbus_export/widgets.py b/src/calibre/gui2/dbus_export/widgets.py index da41a294e3..71adac35d5 100644 --- a/src/calibre/gui2/dbus_export/widgets.py +++ b/src/calibre/gui2/dbus_export/widgets.py @@ -33,6 +33,8 @@ menu_counter = 0 class ExportedMenuBar(QMenuBar): # {{{ + is_native_menubar = True + def __init__(self, parent, menu_registrar, bus): global menu_counter if not parent.isWindow(): @@ -109,6 +111,7 @@ class ExportedMenuBar(QMenuBar): # {{{ self.unregister() self.register() return False + # }}} class Factory(QObject): @@ -212,6 +215,7 @@ class Factory(QObject): return ans ans = QMenuBar(parent) parent.setMenuBar(ans) + ans.is_native_menubar = False return ans def register_status_notifier(self, item): diff --git a/src/calibre/gui2/device.py b/src/calibre/gui2/device.py index cdb9b195ef..b1381f3eaa 100644 --- a/src/calibre/gui2/device.py +++ b/src/calibre/gui2/device.py @@ -712,7 +712,7 @@ class DeviceMenu(QMenu): # {{{ def __init__(self, parent=None): QMenu.__init__(self, parent) self.group = QActionGroup(self) - self.actions = [] + self._actions = [] self._memory = [] self.set_default_menu = QMenu(_('Set default send to device action')) @@ -771,7 +771,7 @@ class DeviceMenu(QMenu): # {{{ self.group.addAction(action) else: action.a_s.connect(self.action_triggered) - self.actions.append(action) + self._actions.append(action) mdest.addAction(action) if actions is basic_actions: menu.addSeparator() @@ -822,14 +822,14 @@ class DeviceMenu(QMenu): # {{{ def trigger_default(self, *args): r = config['default_send_to_device_action'] - for action in self.actions: + for action in self._actions: if repr(action) == r: self.action_triggered(action) break def enable_device_actions(self, enable, card_prefix=(None, None), device=None): - for action in self.actions: + for action in self._actions: if action.dest in ('main:', 'carda:0', 'cardb:0'): if not enable: action.setEnabled(False) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 8c9160bb9d..8eb6804fb7 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -333,7 +333,10 @@ def run_gui(opts, args, listener, app, gui_debug=None): wizard().exec_() dynamic.set('welcome_wizard_was_run', True) from calibre.gui2.ui import Main - actions = tuple(Main.create_application_menubar()) + if isosx: + actions = tuple(Main.create_application_menubar()) + else: + actions = tuple(Main.get_menubar_actions()) runner = GuiRunner(opts, args, actions, listener, app, gui_debug=gui_debug) ret = app.exec_() if getattr(runner.main, 'run_wizard_b4_shutdown', False):