Allow right clicking on row numbers to mark/unmark books
This commit is contained in:
Kovid Goyal 2022-04-24 17:03:26 +05:30
commit c116696086
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 42 additions and 6 deletions

View File

@ -76,6 +76,9 @@ class MarkWithTextDialog(QDialog):
super().accept() super().accept()
mark_books_with_text = None
class MarkBooksAction(InterfaceAction): class MarkBooksAction(InterfaceAction):
name = 'Mark Books' name = 'Mark Books'
@ -119,12 +122,16 @@ class MarkBooksAction(InterfaceAction):
m.aboutToShow.connect(self.about_to_show_menu) m.aboutToShow.connect(self.about_to_show_menu)
ma = partial(self.create_menu_action, m) ma = partial(self.create_menu_action, m)
self.show_marked_action = a = ma('mark_with_text', _('Mark books with text label'), icon='marked.png') self.show_marked_action = a = ma('mark_with_text', _('Mark books with text label'), icon='marked.png')
a.triggered.connect(self.mark_with_text) a.triggered.connect(partial(self.mark_with_text, book_ids = None))
global mark_books_with_text
mark_books_with_text = self.mark_with_text
self.show_marked_action = a = ma('show-marked', _('Show marked books'), icon='search.png', shortcut='Shift+Ctrl+M') self.show_marked_action = a = ma('show-marked', _('Show marked books'), icon='search.png', shortcut='Shift+Ctrl+M')
a.triggered.connect(self.show_marked) a.triggered.connect(self.show_marked)
self.show_marked_with_text = QMenu(_('Show marked books with text label')) self.show_marked_with_text = QMenu(_('Show marked books with text label'))
self.show_marked_with_text.setIcon(self.search_icon) self.show_marked_with_text.setIcon(self.search_icon)
m.addMenu(self.show_marked_with_text) m.addMenu(self.show_marked_with_text)
self.clear_selected_marked_action = a = ma('clear-marks-on-selected', _('Clear marks for selected books'), icon='clear_left.png')
a.triggered.connect(self.clear_marks_on_selected_books)
self.clear_marked_action = a = ma('clear-all-marked', _('Clear all marked books'), icon='clear_left.png') self.clear_marked_action = a = ma('clear-all-marked', _('Clear all marked books'), icon='clear_left.png')
a.triggered.connect(self.clear_all_marked) a.triggered.connect(self.clear_all_marked)
m.addSeparator() m.addSeparator()
@ -226,7 +233,8 @@ class MarkBooksAction(InterfaceAction):
mids.pop(book_id, None) mids.pop(book_id, None)
db.data.set_marked_ids(mids) db.data.set_marked_ids(mids)
def mark_with_text(self): def mark_with_text(self, book_ids=None):
if book_ids is None:
book_ids = self._get_selected_ids() book_ids = self._get_selected_ids()
if not book_ids: if not book_ids:
return return
@ -240,3 +248,13 @@ class MarkBooksAction(InterfaceAction):
for book_id in book_ids: for book_id in book_ids:
mids[book_id] = txt mids[book_id] = txt
db.data.set_marked_ids(mids) db.data.set_marked_ids(mids)
def clear_marks_on_selected_books(self):
book_ids = self._get_selected_ids()
if not book_ids:
return
db = self.gui.current_db
items = db.data.marked_ids.copy()
for book_id in book_ids:
items.pop(book_id, None)
self.gui.current_db.data.set_marked_ids(items)

View File

@ -516,11 +516,29 @@ class BooksView(QTableView): # {{{
def show_row_header_context_menu(self, pos): def show_row_header_context_menu(self, pos):
menu = QMenu(self) menu = QMenu(self)
menu.addAction(_('Hide row numbers'), self.hide_row_numbers) # Even when hidden, row numbers show if any marks show, which is why it makes
# sense to offer "show row numbers" here. Saves having to go to Preferences
# Look & feel, assuming you know the trick.
if gprefs['row_numbers_in_book_list']:
menu.addAction(_('Hide row numbers'), partial(self.hide_row_numbers, show=False))
else:
menu.addAction(_('Show row numbers'), partial(self.hide_row_numbers, show=True))
db = self._model.db
row = self.row_header.logicalIndexAt(pos)
if row >= 0 and row < len(db.data):
book_id_col = db.field_metadata['id']['rec_index']
book_id = db.data[row][book_id_col]
m = menu.addAction(_('Toggle mark for book'), lambda: db.data.toggle_marked_ids({book_id,}))
ic = QIcon.ic('marked.png')
m.setIcon(ic)
from calibre.gui2.actions.mark_books import mark_books_with_text
m = menu.addAction(_('Mark book with text label'), partial(mark_books_with_text, {book_id,}))
m.setIcon(ic)
menu.popup(self.mapToGlobal(pos)) menu.popup(self.mapToGlobal(pos))
def hide_row_numbers(self): # Probably should change the method name, but leave it for compatibility
gprefs['row_numbers_in_book_list'] = False def hide_row_numbers(self, show=False):
gprefs['row_numbers_in_book_list'] = show
self.set_row_header_visibility() self.set_row_header_visibility()
def show_column_header_context_menu(self, pos, view=None): def show_column_header_context_menu(self, pos, view=None):