From ff319ccc4daae0b1d01ccab78733412fb4edb53f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Sep 2010 14:05:47 -0600 Subject: [PATCH] Add an option to split the toolbar into two toolbars --- src/calibre/gui2/__init__.py | 1 + src/calibre/gui2/actions/__init__.py | 6 +++ src/calibre/gui2/actions/add.py | 1 + src/calibre/gui2/actions/add_to_library.py | 1 + src/calibre/gui2/actions/annotate.py | 1 + src/calibre/gui2/actions/convert.py | 1 + src/calibre/gui2/actions/copy_to_library.py | 1 + src/calibre/gui2/actions/delete.py | 1 + src/calibre/gui2/actions/edit_collections.py | 1 + src/calibre/gui2/actions/edit_metadata.py | 1 + src/calibre/gui2/actions/open.py | 1 + src/calibre/gui2/actions/save_to_disk.py | 1 + src/calibre/gui2/actions/show_book_details.py | 1 + src/calibre/gui2/actions/similar_books.py | 1 + src/calibre/gui2/actions/view.py | 1 + src/calibre/gui2/layout.py | 43 ++++++++++++++++--- src/calibre/gui2/preferences/look_feel.py | 1 + src/calibre/gui2/preferences/look_feel.ui | 7 +++ 18 files changed, 65 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 1b61404589..e58dce5559 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -50,6 +50,7 @@ gprefs.defaults['action-layout-context-menu-device'] = ( gprefs.defaults['show_splash_screen'] = True gprefs.defaults['toolbar_icon_size'] = 'medium' gprefs.defaults['toolbar_text'] = 'auto' +gprefs.defaults['show_child_bar'] = False # }}} diff --git a/src/calibre/gui2/actions/__init__.py b/src/calibre/gui2/actions/__init__.py index 57ad900fba..b2d1656367 100644 --- a/src/calibre/gui2/actions/__init__.py +++ b/src/calibre/gui2/actions/__init__.py @@ -71,6 +71,12 @@ class InterfaceAction(QObject): all_locations = frozenset(['toolbar', 'toolbar-device', 'context-menu', 'context-menu-device']) + #: Type of action + #: 'current' means acts on the current view + #: 'global' means an action that does not act on the current view, but rather + #: on calibre as a whole + action_type = 'global' + def __init__(self, parent, site_customization): QObject.__init__(self, parent) self.setObjectName(self.name) diff --git a/src/calibre/gui2/actions/add.py b/src/calibre/gui2/actions/add.py index f0ff794fab..add7bf1d5b 100644 --- a/src/calibre/gui2/actions/add.py +++ b/src/calibre/gui2/actions/add.py @@ -25,6 +25,7 @@ class AddAction(InterfaceAction): action_spec = (_('Add books'), 'add_book.png', _('Add books to the calibre library/device from files on your computer') , _('A')) + action_type = 'current' def genesis(self): self._add_filesystem_book = self.Dispatcher(self.__add_filesystem_book) diff --git a/src/calibre/gui2/actions/add_to_library.py b/src/calibre/gui2/actions/add_to_library.py index 6fc0d5fb1f..05aea8f1dd 100644 --- a/src/calibre/gui2/actions/add_to_library.py +++ b/src/calibre/gui2/actions/add_to_library.py @@ -13,6 +13,7 @@ class AddToLibraryAction(InterfaceAction): action_spec = (_('Add books to library'), 'add_book.png', _('Add books to your calibre library from the connected device'), None) dont_add_to = frozenset(['toolbar', 'context-menu']) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.add_books_to_library) diff --git a/src/calibre/gui2/actions/annotate.py b/src/calibre/gui2/actions/annotate.py index 5356d63e98..dfafcd1a39 100644 --- a/src/calibre/gui2/actions/annotate.py +++ b/src/calibre/gui2/actions/annotate.py @@ -18,6 +18,7 @@ class FetchAnnotationsAction(InterfaceAction): name = 'Fetch Annotations' action_spec = (_('Fetch annotations (experimental)'), None, None, None) + action_type = 'current' def genesis(self): pass diff --git a/src/calibre/gui2/actions/convert.py b/src/calibre/gui2/actions/convert.py index ee0f06ab71..29acfc52b1 100644 --- a/src/calibre/gui2/actions/convert.py +++ b/src/calibre/gui2/actions/convert.py @@ -21,6 +21,7 @@ class ConvertAction(InterfaceAction): name = 'Convert Books' action_spec = (_('Convert books'), 'convert.png', None, _('C')) dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) + action_type = 'current' def genesis(self): cm = QMenu() diff --git a/src/calibre/gui2/actions/copy_to_library.py b/src/calibre/gui2/actions/copy_to_library.py index 7127c91e8c..6b7654f644 100644 --- a/src/calibre/gui2/actions/copy_to_library.py +++ b/src/calibre/gui2/actions/copy_to_library.py @@ -80,6 +80,7 @@ class CopyToLibraryAction(InterfaceAction): _('Copy selected books to the specified library'), None) popup_type = QToolButton.InstantPopup dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) + action_type = 'current' def genesis(self): self.menu = QMenu(self.gui) diff --git a/src/calibre/gui2/actions/delete.py b/src/calibre/gui2/actions/delete.py index 0343c6df84..406860e4ec 100644 --- a/src/calibre/gui2/actions/delete.py +++ b/src/calibre/gui2/actions/delete.py @@ -16,6 +16,7 @@ class DeleteAction(InterfaceAction): name = 'Remove Books' action_spec = (_('Remove books'), 'trash.png', None, _('Del')) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.delete_books) diff --git a/src/calibre/gui2/actions/edit_collections.py b/src/calibre/gui2/actions/edit_collections.py index e45d36fc62..7f5dd76538 100644 --- a/src/calibre/gui2/actions/edit_collections.py +++ b/src/calibre/gui2/actions/edit_collections.py @@ -13,6 +13,7 @@ class EditCollectionsAction(InterfaceAction): action_spec = (_('Manage collections'), None, _('Manage the collections on this device'), None) dont_add_to = frozenset(['toolbar', 'context-menu']) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.edit_collections) diff --git a/src/calibre/gui2/actions/edit_metadata.py b/src/calibre/gui2/actions/edit_metadata.py index 878ba77a43..ac04652efa 100644 --- a/src/calibre/gui2/actions/edit_metadata.py +++ b/src/calibre/gui2/actions/edit_metadata.py @@ -22,6 +22,7 @@ class EditMetadataAction(InterfaceAction): name = 'Edit Metadata' action_spec = (_('Edit metadata'), 'edit_input.png', None, _('E')) + action_type = 'current' def genesis(self): self.create_action(spec=(_('Merge book records'), 'merge_books.png', diff --git a/src/calibre/gui2/actions/open.py b/src/calibre/gui2/actions/open.py index 106bfa24f6..141ff01a66 100644 --- a/src/calibre/gui2/actions/open.py +++ b/src/calibre/gui2/actions/open.py @@ -14,6 +14,7 @@ class OpenFolderAction(InterfaceAction): action_spec = (_('Open containing folder'), 'document_open.png', None, _('O')) dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.gui.iactions['View'].view_folder) diff --git a/src/calibre/gui2/actions/save_to_disk.py b/src/calibre/gui2/actions/save_to_disk.py index bfcc02e130..e9664b9980 100644 --- a/src/calibre/gui2/actions/save_to_disk.py +++ b/src/calibre/gui2/actions/save_to_disk.py @@ -38,6 +38,7 @@ class SaveToDiskAction(InterfaceAction): name = "Save To Disk" action_spec = (_('Save to disk'), 'save.png', None, _('S')) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.save_to_disk) diff --git a/src/calibre/gui2/actions/show_book_details.py b/src/calibre/gui2/actions/show_book_details.py index d17d0998f1..18b0a694bf 100644 --- a/src/calibre/gui2/actions/show_book_details.py +++ b/src/calibre/gui2/actions/show_book_details.py @@ -16,6 +16,7 @@ class ShowBookDetailsAction(InterfaceAction): action_spec = (_('Show book details'), 'dialog_information.png', None, _('I')) dont_add_to = frozenset(['toolbar-device', 'context-menu-device']) + action_type = 'current' def genesis(self): self.qaction.triggered.connect(self.show_book_info) diff --git a/src/calibre/gui2/actions/similar_books.py b/src/calibre/gui2/actions/similar_books.py index 1a14869a9c..644cd3160a 100644 --- a/src/calibre/gui2/actions/similar_books.py +++ b/src/calibre/gui2/actions/similar_books.py @@ -16,6 +16,7 @@ class SimilarBooksAction(InterfaceAction): name = 'Similar Books' action_spec = (_('Similar books...'), None, None, None) popup_type = QToolButton.InstantPopup + action_type = 'current' def genesis(self): m = QMenu(self.gui) diff --git a/src/calibre/gui2/actions/view.py b/src/calibre/gui2/actions/view.py index 2f6be24e5b..0fbf86c567 100644 --- a/src/calibre/gui2/actions/view.py +++ b/src/calibre/gui2/actions/view.py @@ -22,6 +22,7 @@ class ViewAction(InterfaceAction): name = 'View' action_spec = (_('View'), 'view.png', None, _('V')) + action_type = 'current' def genesis(self): self.persistent_files = [] diff --git a/src/calibre/gui2/layout.py b/src/calibre/gui2/layout.py index 58d5267c8e..ec7e023dc1 100644 --- a/src/calibre/gui2/layout.py +++ b/src/calibre/gui2/layout.py @@ -61,7 +61,7 @@ class LocationManager(QObject): # {{{ ac('library', _('Library'), 'lt.png', _('Show books in calibre library')) - ac('main', _('Reader'), 'reader.png', + ac('main', _('Device'), 'reader.png', _('Show books in the main memory of the device')) ac('carda', _('Card A'), 'sd.png', _('Show books in storage card A')) @@ -197,11 +197,21 @@ class SearchBar(QWidget): # {{{ # }}} +class Spacer(QWidget): + + def __init__(self, parent): + QWidget.__init__(self, parent) + self.l = QHBoxLayout() + self.setLayout(self.l) + self.l.addStretch(10) + + class ToolBar(QToolBar): # {{{ - def __init__(self, donate, location_manager, parent): + def __init__(self, donate, location_manager, child_bar, parent): QToolBar.__init__(self, parent) self.gui = parent + self.child_bar = child_bar self.setContextMenuPolicy(Qt.PreventContextMenu) self.setMovable(False) self.setFloatable(False) @@ -223,16 +233,19 @@ class ToolBar(QToolBar): # {{{ sz = gprefs['toolbar_icon_size'] sz = {'small':24, 'medium':48, 'large':64}[sz] self.setIconSize(QSize(sz, sz)) + self.child_bar.setIconSize(QSize(sz, sz)) style = Qt.ToolButtonTextUnderIcon if gprefs['toolbar_text'] == 'never': style = Qt.ToolButtonIconOnly self.setToolButtonStyle(style) + self.child_bar.setToolButtonStyle(style) self.donate_button.set_normal_icon_size(sz, sz) def contextMenuEvent(self, *args): pass def build_bar(self): + self.child_bar.setVisible(gprefs['show_child_bar']) self.showing_donate = False showing_device = self.location_manager.has_device actions = '-device' if showing_device else '' @@ -244,10 +257,16 @@ class ToolBar(QToolBar): # {{{ m.setVisible(False) self.clear() + self.child_bar.clear() self.added_actions = [] + self.spacers = [Spacer(self.child_bar), Spacer(self.child_bar), + Spacer(self), Spacer(self)] + self.child_bar.addWidget(self.spacers[0]) + if gprefs['show_child_bar']: + self.addWidget(self.spacers[2]) for what in actions: - if what is None: + if what is None and not gprefs['show_child_bar']: self.addSeparator() elif what == 'Location Manager': for ac in self.location_manager.available_actions: @@ -262,12 +281,21 @@ class ToolBar(QToolBar): # {{{ self.showing_donate = True elif what in self.gui.iactions: action = self.gui.iactions[what] - self.addAction(action.qaction) + bar = self + if action.action_type == 'current' and gprefs['show_child_bar']: + bar = self.child_bar + bar.addAction(action.qaction) self.added_actions.append(action.qaction) self.setup_tool_button(action.qaction, action.popup_type) + self.child_bar.addWidget(self.spacers[1]) + if gprefs['show_child_bar']: + self.addWidget(self.spacers[3]) + def setup_tool_button(self, ac, menu_mode=None): ch = self.widgetForAction(ac) + if ch is None: + ch = self.child_bar.widgetForAction(ac) ch.setCursor(Qt.PointingHandCursor) ch.setAutoRaise(True) if ac.menu() is not None and menu_mode is not None: @@ -280,7 +308,8 @@ class ToolBar(QToolBar): # {{{ if p == 'never': style = Qt.ToolButtonIconOnly - if p == 'auto' and self.preferred_width > self.width()+35: + if p == 'auto' and self.preferred_width > self.width()+35 and \ + not gprefs['show_child_bar']: style = Qt.ToolButtonIconOnly self.setToolButtonStyle(style) @@ -309,9 +338,11 @@ class MainWindowMixin(object): # {{{ self.iactions['Fetch News'].init_scheduler(db) self.search_bar = SearchBar(self) + self.child_bar = QToolBar(self) self.tool_bar = ToolBar(self.donate_button, - self.location_manager, self) + self.location_manager, self.child_bar, self) self.addToolBar(Qt.TopToolBarArea, self.tool_bar) + self.addToolBar(Qt.BottomToolBarArea, self.child_bar) l = self.centralwidget.layout() l.addWidget(self.search_bar) diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index f30b2fddbb..10c2fcfe95 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -46,6 +46,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): r('use_roman_numerals_for_series_number', config) r('separate_cover_flow', config, restart_required=True) r('search_as_you_type', config) + r('show_child_bar', gprefs) choices = [(_('Small'), 'small'), (_('Medium'), 'medium'), (_('Large'), 'large')] diff --git a/src/calibre/gui2/preferences/look_feel.ui b/src/calibre/gui2/preferences/look_feel.ui index 7c6c736b24..1de55d51ef 100644 --- a/src/calibre/gui2/preferences/look_feel.ui +++ b/src/calibre/gui2/preferences/look_feel.ui @@ -173,6 +173,13 @@ + + + + &Split the toolbar into two toolbars + + +