diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index ea83688621..78c1b1cf34 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -1063,6 +1063,13 @@ class ActionMarkBooks(InterfaceActionBase): description = _('Temporarily mark books') +class ActionManageCategories(InterfaceActionBase): + name = 'Manage categories' + author = 'Charles Haley' + actual_plugin = 'calibre.gui2.actions.manage_categories:ManageCategoriesAction' + description = _('Manage tag browser categories') + + class ActionVirtualLibrary(InterfaceActionBase): name = 'Virtual Library' actual_plugin = 'calibre.gui2.actions.virtual_library:VirtualLibraryAction' @@ -1104,7 +1111,7 @@ plugins += [ActionAdd, ActionFetchAnnotations, ActionGenerateCatalog, ActionPluginUpdater, ActionPickRandom, ActionEditToC, ActionSortBy, ActionMarkBooks, ActionEmbed, ActionTemplateTester, ActionTagMapper, ActionAuthorMapper, ActionVirtualLibrary, ActionBrowseAnnotations, ActionTemplateFunctions, ActionAutoscrollBooks, - ActionFullTextSearch,] + ActionFullTextSearch, ActionManageCategories] # }}} diff --git a/src/calibre/gui2/actions/manage_categories.py b/src/calibre/gui2/actions/manage_categories.py new file mode 100644 index 0000000000..a9e3e01268 --- /dev/null +++ b/src/calibre/gui2/actions/manage_categories.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + + +__license__ = 'GPL v3' +__copyright__ = '2013, Kovid Goyal ' + +from qt.core import (QPoint) + +from calibre.gui2.actions import InterfaceAction + + +class ManageCategoriesAction(InterfaceAction): + + name = 'Manage categories' + action_spec = (_('Manage categories'), 'tags.png', + _('Manage categories: authors, tags, series, etc.'), '') + action_type = 'current' + action_add_menu = True + dont_add_to = frozenset(['context-menu-device', 'menubar-device']) + + def genesis(self): + self.menu = m = self.qaction.menu() + self.qaction.triggered.connect(self.show_menu) + m.aboutToShow.connect(self.about_to_show_menu) + + # We want to show the menu when the toolbar button is clicked. Apparently + # the only way to do that is to scan the toolbar(s) for the action button + # then exec the associated menu. The search is done here to take adding and + # removing the action from toolbars into account. + def show_menu(self): + for x in self.gui.bars_manager.main_bars + self.gui.bars_manager.child_bars: + try: + w = x.widgetForAction(self.qaction) + # It seems that multiple copies of the action can exist, such as + # when the device-connected menu is changed while the device is + # connected. Use the one that has an actual position. + if w.pos().x() == 0: + continue + # The w.height() assures that the menu opens below the button. + self.menu.exec(w.mapToGlobal(QPoint(0, w.height()))) + break + except: + continue + + def about_to_show_menu(self): + db = self.gui.current_db + self.gui.populate_manage_categories_menu(db, self.menu) + + def location_selected(self, loc): + enabled = loc == 'library' + self.qaction.setEnabled(enabled) + for action in self.menu.actions(): + action.setEnabled(enabled) \ No newline at end of file diff --git a/src/calibre/gui2/tag_browser/ui.py b/src/calibre/gui2/tag_browser/ui.py index c885b7f13c..6e54306f1f 100644 --- a/src/calibre/gui2/tag_browser/ui.py +++ b/src/calibre/gui2/tag_browser/ui.py @@ -30,8 +30,11 @@ class TagBrowserMixin: # {{{ pass def populate_tb_manage_menu(self, db): + self.populate_manage_categories_menu(db, self.alter_tb.manage_menu) + + def populate_manage_categories_menu(self, db, menu): from calibre.db.categories import find_categories - m = self.alter_tb.manage_menu + m = menu m.clear() for text, func, args, cat_name in ( (_('Authors'),