diff --git a/src/calibre/gui2/dialogs/edit_authors_dialog.py b/src/calibre/gui2/dialogs/edit_authors_dialog.py index 752257bc5a..7622961886 100644 --- a/src/calibre/gui2/dialogs/edit_authors_dialog.py +++ b/src/calibre/gui2/dialogs/edit_authors_dialog.py @@ -13,7 +13,8 @@ from calibre.ebooks.metadata import author_to_author_sort, string_to_authors from calibre.gui2 import error_dialog, gprefs from calibre.gui2.dialogs.edit_authors_dialog_ui import Ui_EditAuthorsDialog from calibre.utils.config import prefs -from calibre.utils.icu import sort_key, primary_contains, contains +from calibre.utils.config_base import tweaks +from calibre.utils.icu import sort_key, primary_contains, contains, primary_startswith from polyglot.builtins import unicode_type QT_HIDDEN_CLEAR_ACTION = '_q_qlineeditclearaction' @@ -50,7 +51,8 @@ class EditColumnDelegate(QItemDelegate): class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog): - def __init__(self, parent, db, id_to_select, select_sort, select_link, find_aut_func): + def __init__(self, parent, db, id_to_select, select_sort, select_link, + find_aut_func, is_first_letter=False): QDialog.__init__(self, parent) Ui_EditAuthorsDialog.__init__(self) self.setupUi(self) @@ -153,19 +155,19 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog): self.author_order = 1 self.author_sort_order = 0 self.link_order = 1 - self.show_table(id_to_select, select_sort, select_link) + self.show_table(id_to_select, select_sort, select_link, is_first_letter) def use_vl_changed(self, x): - self.show_table(None, None, None) + self.show_table(None, None, None, False) def clear_filter(self): self.filter_box.setText('') - self.show_table(None, None, None) + self.show_table(None, None, None, False) def do_filter(self): - self.show_table(None, None, None) + self.show_table(None, None, None, False) - def show_table(self, id_to_select, select_sort, select_link): + def show_table(self, id_to_select, select_sort, select_link, is_first_letter): filter_text = icu_lower(unicode_type(self.filter_box.text())) auts_to_show = [] for t in self.find_aut_func(use_virtual_library=self.apply_vl_checkbox.isChecked()): @@ -176,7 +178,6 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog): self.table.setColumnCount(3) self.table.setRowCount(len(auts_to_show)) - select_item = None row = 0 for id_, v in self.authors.items(): if id_ not in auts_to_show: @@ -198,14 +199,6 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog): self.table.setItem(row, 0, name_item) self.table.setItem(row, 1, sort_item) self.table.setItem(row, 2, link_item) - - if id_to_select and id_to_select in (id_, name): - if select_sort: - select_item = sort_item - elif select_link: - select_item = link_item - else: - select_item = name_item row += 1 self.table.setItemDelegate(EditColumnDelegate(self.completion_data)) @@ -222,10 +215,28 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog): self.do_sort_by_link() # Position on the desired item - if select_item is not None: - self.table.setCurrentItem(select_item) - self.table.editItem(select_item) - self.start_find_pos = select_item.row() * 2 + select_item.column() + if id_to_select: + select_item = None + use_as = tweaks['categories_use_field_for_author_name'] + for row in range(0, len(auts_to_show)): + name_item = self.table.item(row, 1) if use_as else self.table.item(row, 0) + if is_first_letter: + if primary_startswith(name_item.text(), id_to_select): + select_item = self.table.item(row, 1) + break + elif id_to_select == self.table.item(row, 0).data(Qt.UserRole): + if select_sort: + select_item = self.table.item(row, 1) + elif select_link: + select_item = self.table.item(row, 2) + else: + select_item = name_item + break + if select_item: + self.table.setCurrentItem(select_item) + if select_sort or select_link: + self.table.editItem(select_item) + self.start_find_pos = select_item.row() * 2 + select_item.column() else: self.table.setCurrentCell(0, 0) self.start_find_pos = -1 diff --git a/src/calibre/gui2/dialogs/tag_list_editor.py b/src/calibre/gui2/dialogs/tag_list_editor.py index e034bd2b88..de5192781a 100644 --- a/src/calibre/gui2/dialogs/tag_list_editor.py +++ b/src/calibre/gui2/dialogs/tag_list_editor.py @@ -13,7 +13,7 @@ from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.widgets import EnLineEdit from calibre.gui2 import question_dialog, error_dialog, gprefs from calibre.utils.config import prefs -from calibre.utils.icu import sort_key, contains, primary_contains +from calibre.utils.icu import sort_key, contains, primary_contains, primary_startswith from polyglot.builtins import unicode_type QT_HIDDEN_CLEAR_ACTION = '_q_qlineeditclearaction' @@ -132,7 +132,8 @@ class EditColumnDelegate(QItemDelegate): class TagListEditor(QDialog, Ui_TagListEditor): - def __init__(self, window, cat_name, tag_to_match, get_book_ids, sorter): + def __init__(self, window, cat_name, tag_to_match, get_book_ids, sorter, + ttm_is_first_letter=False): QDialog.__init__(self, window) Ui_TagListEditor.__init__(self) self.setupUi(self) @@ -188,6 +189,7 @@ class TagListEditor(QDialog, Ui_TagListEditor): self.string_contains = contains self.delete_button.clicked.connect(self.delete_tags) + self.table.delete_pressed.connect(self.delete_pressed) self.rename_button.clicked.connect(self.rename_tag) self.undo_button.clicked.connect(self.undo_edit) self.table.itemDoubleClicked.connect(self._rename_tag) @@ -242,11 +244,11 @@ class TagListEditor(QDialog, Ui_TagListEditor): pass # Add the data self.search_item_row = -1 - self.fill_in_table(None, tag_to_match) + self.fill_in_table(None, tag_to_match, ttm_is_first_letter) def vl_box_changed(self): self.search_item_row = -1 - self.fill_in_table(None, None) + self.fill_in_table(None, None, False) def do_search(self): self.not_found_label.setVisible(False) @@ -271,7 +273,7 @@ class TagListEditor(QDialog, Ui_TagListEditor): self.search_item_row = -1 self.search_box.setText('') - def fill_in_table(self, tags, tag_to_match): + def fill_in_table(self, tags, tag_to_match, ttm_is_first_letter): data = self.get_book_ids(self.apply_vl_checkbox.isChecked()) self.all_tags = {} filter_text = icu_lower(unicode_type(self.filter_box.text())) @@ -310,8 +312,12 @@ class TagListEditor(QDialog, Ui_TagListEditor): item.setText(tag) item.setFlags(item.flags() | Qt.ItemIsSelectable | Qt.ItemIsEditable) self.table.setItem(row, 0, item) - if tag == tag_to_match: - select_item = item + if select_item is None: + if ttm_is_first_letter: + if primary_startswith(tag, tag_to_match): + select_item = item + elif tag == tag_to_match: + select_item = item item = CountTableWidgetItem(self.all_tags[tag]['count']) # only the name column can be selected item.setFlags(item.flags() & ~(Qt.ItemIsSelectable|Qt.ItemIsEditable)) @@ -343,10 +349,10 @@ class TagListEditor(QDialog, Ui_TagListEditor): def clear_filter(self): self.filter_box.setText('') - self.fill_in_table(None, None) + self.fill_in_table(None, None, False) def do_filter(self): - self.fill_in_table(None, None) + self.fill_in_table(None, None, False) def table_column_resized(self, col, old, new): self.table_column_widths = [] @@ -452,6 +458,10 @@ class TagListEditor(QDialog, Ui_TagListEditor): else: self.table.editItem(item) + def delete_pressed(self): + if self.table.currentColumn() == 0: + self.delete_tags() + def delete_tags(self): deletes = self.table.selectedItems() if not deletes: @@ -460,41 +470,26 @@ class TagListEditor(QDialog, Ui_TagListEditor): return to_del = [] - to_undel = [] for item in deletes: - if item.is_deleted: - to_undel.append(item) - else: + if not item.is_deleted: to_del.append(item) + if to_del: ct = ', '.join([unicode_type(item.text()) for item in to_del]) if not confirm( '
'+_('Are you sure you want to delete the following items?')+'
'+ct,
'tag_list_editor_delete'):
return
- if to_undel:
- ct = ', '.join([unicode_type(item.text()) for item in to_undel])
- if not confirm(
- '
'+_('Are you sure you want to undelete the following items?')+'
'+ct,
- 'tag_list_editor_undelete'):
- return
+
row = self.table.row(deletes[0])
+ self.table.blockSignals(True)
for item in deletes:
- if item.is_deleted:
- item.set_is_deleted(False)
- self.to_delete.discard(int(item.data(Qt.UserRole)))
- orig = self.table.item(item.row(), 2)
- self.table.blockSignals(True)
- orig.setData(Qt.DisplayRole, '')
- self.table.blockSignals(False)
- else:
- id = int(item.data(Qt.UserRole))
- self.to_delete.add(id)
- item.set_is_deleted(True)
- orig = self.table.item(item.row(), 2)
- self.table.blockSignals(True)
- orig.setData(Qt.DisplayRole, item.initial_text())
- self.table.blockSignals(False)
+ id_ = int(item.data(Qt.UserRole))
+ self.to_delete.add(id_)
+ item.set_is_deleted(True)
+ orig = self.table.item(item.row(), 2)
+ orig.setData(Qt.DisplayRole, item.initial_text())
+ self.table.blockSignals(False)
if row >= self.table.rowCount():
row = self.table.rowCount() - 1
if row >= 0:
diff --git a/src/calibre/gui2/dialogs/tag_list_editor.ui b/src/calibre/gui2/dialogs/tag_list_editor.ui
index 031e0e2d39..a0373d32c6 100644
--- a/src/calibre/gui2/dialogs/tag_list_editor.ui
+++ b/src/calibre/gui2/dialogs/tag_list_editor.ui
@@ -197,7 +197,7 @@