mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Make it a little harder to accidentally change the sorting of items in the Tag Browser. Also frees up more vertical space for the Tag Browser itself.
This commit is contained in:
parent
418473dd90
commit
dde241c5fe
@ -10,8 +10,8 @@ __docformat__ = 'restructuredtext en'
|
|||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
from PyQt4.Qt import (Qt, QIcon, QWidget, QHBoxLayout, QVBoxLayout, QShortcut,
|
from PyQt4.Qt import (Qt, QIcon, QWidget, QHBoxLayout, QVBoxLayout, QShortcut,
|
||||||
QKeySequence, QToolButton, QString, QLabel, QFrame, QTimer, QComboBox,
|
QKeySequence, QToolButton, QString, QLabel, QFrame, QTimer,
|
||||||
QMenu, QPushButton)
|
QMenu, QPushButton, QActionGroup)
|
||||||
|
|
||||||
from calibre.gui2 import error_dialog, question_dialog
|
from calibre.gui2 import error_dialog, question_dialog
|
||||||
from calibre.gui2.widgets import HistoryLineEdit
|
from calibre.gui2.widgets import HistoryLineEdit
|
||||||
@ -27,7 +27,7 @@ class TagBrowserMixin(object): # {{{
|
|||||||
|
|
||||||
def __init__(self, db):
|
def __init__(self, db):
|
||||||
self.library_view.model().count_changed_signal.connect(self.tags_view.recount)
|
self.library_view.model().count_changed_signal.connect(self.tags_view.recount)
|
||||||
self.tags_view.set_database(db, self.tag_match, self.sort_by)
|
self.tags_view.set_database(db, self.alter_tb)
|
||||||
self.tags_view.tags_marked.connect(self.search.set_search_string)
|
self.tags_view.tags_marked.connect(self.search.set_search_string)
|
||||||
self.tags_view.tags_list_edit.connect(self.do_tags_list_edit)
|
self.tags_view.tags_list_edit.connect(self.do_tags_list_edit)
|
||||||
self.tags_view.edit_user_category.connect(self.do_edit_user_categories)
|
self.tags_view.edit_user_category.connect(self.do_edit_user_categories)
|
||||||
@ -59,9 +59,9 @@ class TagBrowserMixin(object): # {{{
|
|||||||
(_('Manage Saved Searches'),
|
(_('Manage Saved Searches'),
|
||||||
self.do_saved_search_edit, (None,), 'search')
|
self.do_saved_search_edit, (None,), 'search')
|
||||||
):
|
):
|
||||||
self.manage_items_button.menu().addAction(
|
m = self.alter_tb.manage_menu
|
||||||
QIcon(I(category_icon_map[cat_name])),
|
m.addAction( QIcon(I(category_icon_map[cat_name])), text,
|
||||||
text, partial(func, *args))
|
partial(func, *args))
|
||||||
|
|
||||||
def do_restriction_error(self):
|
def do_restriction_error(self):
|
||||||
error_dialog(self.tags_view, _('Invalid search restriction'),
|
error_dialog(self.tags_view, _('Invalid search restriction'),
|
||||||
@ -387,38 +387,51 @@ class TagBrowserWidget(QWidget): # {{{
|
|||||||
self.not_found_label_timer.timeout.connect(self.not_found_label_timer_event,
|
self.not_found_label_timer.timeout.connect(self.not_found_label_timer_event,
|
||||||
type=Qt.QueuedConnection)
|
type=Qt.QueuedConnection)
|
||||||
|
|
||||||
parent.sort_by = QComboBox(parent)
|
parent.alter_tb = l = QPushButton(parent)
|
||||||
# Must be in the same order as db2.CATEGORY_SORTS
|
l.setText(_('&Alter Tag Browser'))
|
||||||
for x in (_('Sort by name'), _('Sort by popularity'),
|
l.setIcon(QIcon(I('tags.png')))
|
||||||
_('Sort by average rating')):
|
|
||||||
parent.sort_by.addItem(x)
|
|
||||||
parent.sort_by.setToolTip(
|
|
||||||
_('Set the sort order for entries in the Tag Browser'))
|
|
||||||
parent.sort_by.setStatusTip(parent.sort_by.toolTip())
|
|
||||||
parent.sort_by.setCurrentIndex(0)
|
|
||||||
self._layout.addWidget(parent.sort_by)
|
|
||||||
|
|
||||||
# Must be in the same order as db2.MATCH_TYPE
|
|
||||||
parent.tag_match = QComboBox(parent)
|
|
||||||
for x in (_('Match any'), _('Match all')):
|
|
||||||
parent.tag_match.addItem(x)
|
|
||||||
parent.tag_match.setCurrentIndex(0)
|
|
||||||
self._layout.addWidget(parent.tag_match)
|
|
||||||
parent.tag_match.setToolTip(
|
|
||||||
_('When selecting multiple entries in the Tag Browser '
|
|
||||||
'match any or all of them'))
|
|
||||||
parent.tag_match.setStatusTip(parent.tag_match.toolTip())
|
|
||||||
|
|
||||||
|
|
||||||
l = parent.manage_items_button = QPushButton(self)
|
|
||||||
l.setStyleSheet('QPushButton {text-align: left; }')
|
|
||||||
l.setText(_('Manage authors, tags, etc'))
|
|
||||||
l.setToolTip(_('All of these category_managers are available by right-clicking '
|
|
||||||
'on items in the tag browser above'))
|
|
||||||
l.m = QMenu()
|
l.m = QMenu()
|
||||||
l.setMenu(l.m)
|
l.setMenu(l.m)
|
||||||
self._layout.addWidget(l)
|
self._layout.addWidget(l)
|
||||||
|
|
||||||
|
sb = l.m.addAction(_('Sort by'))
|
||||||
|
sb.m = l.sort_menu = QMenu(l.m)
|
||||||
|
sb.setMenu(sb.m)
|
||||||
|
sb.bg = QActionGroup(sb)
|
||||||
|
|
||||||
|
# Must be in the same order as db2.CATEGORY_SORTS
|
||||||
|
for i, x in enumerate((_('Sort by name'), _('Sort by popularity'),
|
||||||
|
_('Sort by average rating'))):
|
||||||
|
a = sb.m.addAction(x)
|
||||||
|
sb.bg.addAction(a)
|
||||||
|
a.setCheckable(True)
|
||||||
|
if i == 0: a.setChecked(True)
|
||||||
|
sb.setToolTip(
|
||||||
|
_('Set the sort order for entries in the Tag Browser'))
|
||||||
|
sb.setStatusTip(sb.toolTip())
|
||||||
|
|
||||||
|
ma = l.m.addAction(_('Match type'))
|
||||||
|
ma.m = l.match_menu = QMenu(l.m)
|
||||||
|
ma.setMenu(ma.m)
|
||||||
|
ma.ag = QActionGroup(ma)
|
||||||
|
|
||||||
|
# Must be in the same order as db2.MATCH_TYPE
|
||||||
|
for i, x in enumerate((_('Match any'), _('Match all'))):
|
||||||
|
a = ma.m.addAction(x)
|
||||||
|
ma.ag.addAction(a)
|
||||||
|
a.setCheckable(True)
|
||||||
|
if i == 0: a.setChecked(True)
|
||||||
|
ma.setToolTip(
|
||||||
|
_('When selecting multiple entries in the Tag Browser '
|
||||||
|
'match any or all of them'))
|
||||||
|
ma.setStatusTip(ma.toolTip())
|
||||||
|
|
||||||
|
mt = l.m.addAction(_('Manage authors, tags, etc'))
|
||||||
|
mt.setToolTip(_('All of these category_managers are available by right-clicking '
|
||||||
|
'on items in the tag browser above'))
|
||||||
|
mt.m = l.manage_menu = QMenu(l.m)
|
||||||
|
mt.setMenu(mt.m)
|
||||||
|
|
||||||
# self.leak_test_timer = QTimer(self)
|
# self.leak_test_timer = QTimer(self)
|
||||||
# self.leak_test_timer.timeout.connect(self.test_for_leak)
|
# self.leak_test_timer.timeout.connect(self.test_for_leak)
|
||||||
# self.leak_test_timer.start(5000)
|
# self.leak_test_timer.start(5000)
|
||||||
|
@ -75,7 +75,7 @@ class TagsView(QTreeView): # {{{
|
|||||||
|
|
||||||
def __init__(self, parent=None):
|
def __init__(self, parent=None):
|
||||||
QTreeView.__init__(self, parent=None)
|
QTreeView.__init__(self, parent=None)
|
||||||
self.tag_match = None
|
self.alter_tb = None
|
||||||
self.disable_recounting = False
|
self.disable_recounting = False
|
||||||
self.setUniformRowHeights(True)
|
self.setUniformRowHeights(True)
|
||||||
self.setCursor(Qt.PointingHandCursor)
|
self.setCursor(Qt.PointingHandCursor)
|
||||||
@ -139,27 +139,25 @@ class TagsView(QTreeView): # {{{
|
|||||||
def reread_collapse_parameters(self):
|
def reread_collapse_parameters(self):
|
||||||
self._model.reread_collapse_model(self.get_state()[1])
|
self._model.reread_collapse_model(self.get_state()[1])
|
||||||
|
|
||||||
def set_database(self, db, tag_match, sort_by):
|
def set_database(self, db, alter_tb):
|
||||||
self._model.set_database(db)
|
self._model.set_database(db)
|
||||||
|
self.alter_tb = alter_tb
|
||||||
self.pane_is_visible = True # because TagsModel.set_database did a recount
|
self.pane_is_visible = True # because TagsModel.set_database did a recount
|
||||||
self.sort_by = sort_by
|
|
||||||
self.tag_match = tag_match
|
|
||||||
self.setModel(self._model)
|
self.setModel(self._model)
|
||||||
self.setContextMenuPolicy(Qt.CustomContextMenu)
|
self.setContextMenuPolicy(Qt.CustomContextMenu)
|
||||||
pop = config['sort_tags_by']
|
pop = self.db.CATEGORY_SORTS.index(config['sort_tags_by'])
|
||||||
self.sort_by.setCurrentIndex(self.db.CATEGORY_SORTS.index(pop))
|
self.alter_tb.sort_menu.actions()[pop].setChecked(True)
|
||||||
try:
|
try:
|
||||||
match_pop = self.db.MATCH_TYPE.index(config['match_tags_type'])
|
match_pop = self.db.MATCH_TYPE.index(config['match_tags_type'])
|
||||||
except ValueError:
|
except ValueError:
|
||||||
match_pop = 0
|
match_pop = 0
|
||||||
self.tag_match.setCurrentIndex(match_pop)
|
self.alter_tb.match_menu.actions()[match_pop].setChecked(True)
|
||||||
if not self.made_connections:
|
if not self.made_connections:
|
||||||
self.clicked.connect(self.toggle)
|
self.clicked.connect(self.toggle)
|
||||||
self.customContextMenuRequested.connect(self.show_context_menu)
|
self.customContextMenuRequested.connect(self.show_context_menu)
|
||||||
self.refresh_required.connect(self.recount, type=Qt.QueuedConnection)
|
self.refresh_required.connect(self.recount, type=Qt.QueuedConnection)
|
||||||
self.sort_by.currentIndexChanged.connect(self.sort_changed)
|
self.alter_tb.sort_menu.triggered.connect(self.sort_changed)
|
||||||
self.tag_match.currentIndexChanged.connect(self.match_changed)
|
self.alter_tb.match_menu.triggered.connect(self.match_changed)
|
||||||
self.made_connections = True
|
self.made_connections = True
|
||||||
self.refresh_signal_processed = True
|
self.refresh_signal_processed = True
|
||||||
db.add_listener(self.database_changed)
|
db.add_listener(self.database_changed)
|
||||||
@ -179,15 +177,21 @@ class TagsView(QTreeView): # {{{
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def match_all(self):
|
def match_all(self):
|
||||||
return self.tag_match and self.tag_match.currentIndex() > 0
|
return (self.alter_tb and
|
||||||
|
self.alter_tb.match_menu.actions()[1].isChecked())
|
||||||
|
|
||||||
def sort_changed(self, pop):
|
def sort_changed(self, action):
|
||||||
config.set('sort_tags_by', self.db.CATEGORY_SORTS[pop])
|
for i, ac in enumerate(self.alter_tb.sort_menu.actions()):
|
||||||
|
if ac is action:
|
||||||
|
config.set('sort_tags_by', self.db.CATEGORY_SORTS[i])
|
||||||
self.recount()
|
self.recount()
|
||||||
|
break
|
||||||
|
|
||||||
def match_changed(self, pop):
|
def match_changed(self, action):
|
||||||
try:
|
try:
|
||||||
config.set('match_tags_type', self.db.MATCH_TYPE[pop])
|
for i, ac in enumerate(self.alter_tb.match_menu.actions()):
|
||||||
|
if ac is action:
|
||||||
|
config.set('match_tags_type', self.db.MATCH_TYPE[i])
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user