mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
improve NotesUtilities
This commit is contained in:
parent
705a11cd50
commit
7a5bf8be33
@ -15,7 +15,7 @@ from qt.core import (
|
|||||||
from calibre.ebooks.metadata import author_to_author_sort, string_to_authors
|
from calibre.ebooks.metadata import author_to_author_sort, string_to_authors
|
||||||
from calibre.gui2 import error_dialog, gprefs
|
from calibre.gui2 import error_dialog, gprefs
|
||||||
from calibre.gui2.dialogs.edit_authors_dialog_ui import Ui_EditAuthorsDialog
|
from calibre.gui2.dialogs.edit_authors_dialog_ui import Ui_EditAuthorsDialog
|
||||||
from calibre.gui2.dialogs.tag_list_editor import NotesUtilities
|
from calibre.gui2.dialogs.tag_list_editor import CHECK_MARK, NotesUtilities
|
||||||
from calibre.utils.config import prefs
|
from calibre.utils.config import prefs
|
||||||
from calibre.utils.config_base import tweaks
|
from calibre.utils.config_base import tweaks
|
||||||
from calibre.utils.icu import (
|
from calibre.utils.icu import (
|
||||||
@ -46,7 +46,6 @@ class TableItem(QTableWidgetItem):
|
|||||||
return self.sort_key < other.sort_key
|
return self.sort_key < other.sort_key
|
||||||
|
|
||||||
|
|
||||||
CHECK_MARK = '✓'
|
|
||||||
AUTHOR_COLUMN = 0
|
AUTHOR_COLUMN = 0
|
||||||
AUTHOR_SORT_COLUMN = 1
|
AUTHOR_SORT_COLUMN = 1
|
||||||
LINK_COLUMN = 2
|
LINK_COLUMN = 2
|
||||||
@ -55,11 +54,11 @@ NOTES_COLUMN = 3
|
|||||||
|
|
||||||
class EditColumnDelegate(QStyledItemDelegate):
|
class EditColumnDelegate(QStyledItemDelegate):
|
||||||
|
|
||||||
def __init__(self, completion_data, table, modified_notes, item_id_getter):
|
def __init__(self, completion_data, table, notes_utilities, item_id_getter):
|
||||||
super().__init__(table)
|
super().__init__(table)
|
||||||
self.table = table
|
self.table = table
|
||||||
self.completion_data = completion_data
|
self.completion_data = completion_data
|
||||||
self.modified_notes = modified_notes
|
self.notes_utilities = notes_utilities
|
||||||
self.item_id_getter = item_id_getter
|
self.item_id_getter = item_id_getter
|
||||||
|
|
||||||
def createEditor(self, parent, option, index):
|
def createEditor(self, parent, option, index):
|
||||||
@ -71,7 +70,7 @@ class EditColumnDelegate(QStyledItemDelegate):
|
|||||||
editor.update_items_cache(self.completion_data)
|
editor.update_items_cache(self.completion_data)
|
||||||
return editor
|
return editor
|
||||||
if index.column() == NOTES_COLUMN:
|
if index.column() == NOTES_COLUMN:
|
||||||
self.edit_note(self.table.itemFromIndex(index))
|
self.notes_utilities.edit_note(self.table.itemFromIndex(index))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
from calibre.gui2.widgets import EnLineEdit
|
from calibre.gui2.widgets import EnLineEdit
|
||||||
@ -79,24 +78,11 @@ class EditColumnDelegate(QStyledItemDelegate):
|
|||||||
editor.setClearButtonEnabled(True)
|
editor.setClearButtonEnabled(True)
|
||||||
return editor
|
return editor
|
||||||
|
|
||||||
def edit_note(self, item):
|
|
||||||
item_id = self.item_id_getter(item)
|
|
||||||
from calibre.gui2.dialogs.edit_category_notes import EditNoteDialog
|
|
||||||
from calibre.gui2.ui import get_gui
|
|
||||||
db = get_gui().current_db.new_api
|
|
||||||
before = db.notes_for('authors', item_id)
|
|
||||||
note = db.export_note('authors', item_id) if before else ''
|
|
||||||
d = EditNoteDialog('authors', item_id, db, parent=self.table)
|
|
||||||
if d.exec() == QDialog.DialogCode.Accepted:
|
|
||||||
after = db.notes_for('authors', item_id)
|
|
||||||
if item_id not in self.modified_notes:
|
|
||||||
self.modified_notes[item_id] = note
|
|
||||||
item.setText(CHECK_MARK if after else '')
|
|
||||||
self.table.cellChanged.emit(item.row(), item.column())
|
|
||||||
|
|
||||||
|
|
||||||
class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
|
class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
|
||||||
|
|
||||||
|
edited_icon = QIcon.ic('modified.png')
|
||||||
|
|
||||||
def __init__(self, parent, db, id_to_select, select_sort, select_link,
|
def __init__(self, parent, db, id_to_select, select_sort, select_link,
|
||||||
find_aut_func, is_first_letter=False):
|
find_aut_func, is_first_letter=False):
|
||||||
QDialog.__init__(self, parent)
|
QDialog.__init__(self, parent)
|
||||||
@ -115,8 +101,7 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
self.modified_notes = {}
|
self.notes_utilities = NotesUtilities(self.table, "authors",
|
||||||
self.notes_utilities = NotesUtilities(self.table, self.modified_notes, "authors",
|
|
||||||
lambda item: int(self.table.item(item.row(), AUTHOR_COLUMN).data(Qt.ItemDataRole.UserRole)))
|
lambda item: int(self.table.item(item.row(), AUTHOR_COLUMN).data(Qt.ItemDataRole.UserRole)))
|
||||||
|
|
||||||
self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setText(_('&OK'))
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setText(_('&OK'))
|
||||||
@ -199,8 +184,6 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
|
|||||||
self.original_authors[id_] = {'name': name, 'sort': v['sort'],
|
self.original_authors[id_] = {'name': name, 'sort': v['sort'],
|
||||||
'link': v['link']}
|
'link': v['link']}
|
||||||
|
|
||||||
self.edited_icon = QIcon.ic('modified.png')
|
|
||||||
self.empty_icon = QIcon()
|
|
||||||
if prefs['use_primary_find_in_search']:
|
if prefs['use_primary_find_in_search']:
|
||||||
self.string_contains = primary_contains
|
self.string_contains = primary_contains
|
||||||
else:
|
else:
|
||||||
@ -212,7 +195,7 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
|
|||||||
self.link_order = 1
|
self.link_order = 1
|
||||||
self.notes_order = 1
|
self.notes_order = 1
|
||||||
self.table.setItemDelegate(EditColumnDelegate(self.completion_data, self.table,
|
self.table.setItemDelegate(EditColumnDelegate(self.completion_data, self.table,
|
||||||
self.modified_notes, self.get_item_id))
|
self.notes_utilities, self.get_item_id))
|
||||||
self.show_table(id_to_select, select_sort, select_link, is_first_letter)
|
self.show_table(id_to_select, select_sort, select_link, is_first_letter)
|
||||||
|
|
||||||
def get_item_id(self, item):
|
def get_item_id(self, item):
|
||||||
@ -570,7 +553,7 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
|
|||||||
|
|
||||||
def set_icon(self, item, id_):
|
def set_icon(self, item, id_):
|
||||||
modified = self.item_is_modified(item, id_)
|
modified = self.item_is_modified(item, id_)
|
||||||
item.setIcon(self.edited_icon if modified else self.empty_icon)
|
item.setIcon(self.edited_icon if modified else QIcon())
|
||||||
|
|
||||||
def cell_changed(self, row, col):
|
def cell_changed(self, row, col):
|
||||||
if self.ignore_cell_changed:
|
if self.ignore_cell_changed:
|
||||||
|
@ -118,9 +118,9 @@ class CountTableWidgetItem(QTableWidgetItem):
|
|||||||
|
|
||||||
class NotesUtilities():
|
class NotesUtilities():
|
||||||
|
|
||||||
def __init__(self, table, modified_notes, category, item_id_getter):
|
def __init__(self, table, category, item_id_getter):
|
||||||
self.table = table
|
self.table = table
|
||||||
self.modified_notes = modified_notes
|
self.modified_notes = {}
|
||||||
self.category = category
|
self.category = category
|
||||||
self.item_id_getter = item_id_getter
|
self.item_id_getter = item_id_getter
|
||||||
|
|
||||||
@ -141,6 +141,25 @@ class NotesUtilities():
|
|||||||
db.set_notes_for(self.category, item_id, '')
|
db.set_notes_for(self.category, item_id, '')
|
||||||
self.modified_notes.clear()
|
self.modified_notes.clear()
|
||||||
|
|
||||||
|
def change_text(self, item, val):
|
||||||
|
with block_signals(self.table):
|
||||||
|
item.setText(CHECK_MARK if bool(val) else '')
|
||||||
|
self.table.cellChanged.emit(item.row(), item.column())
|
||||||
|
self.table.itemChanged.emit(item)
|
||||||
|
|
||||||
|
def edit_note(self, item):
|
||||||
|
item_id = self.item_id_getter(item)
|
||||||
|
from calibre.gui2.dialogs.edit_category_notes import EditNoteDialog
|
||||||
|
db = self.get_db()
|
||||||
|
before = db.notes_for(self.category, item_id)
|
||||||
|
note = db.export_note(self.category, item_id) if before else ''
|
||||||
|
d = EditNoteDialog(self.category, item_id, db, parent=self.table)
|
||||||
|
if d.exec() == QDialog.DialogCode.Accepted:
|
||||||
|
after = db.notes_for(self.category, item_id)
|
||||||
|
if item_id not in self.modified_notes:
|
||||||
|
self.modified_notes[item_id] = note
|
||||||
|
self.change_text(item, after)
|
||||||
|
|
||||||
def undo_note_edit(self, item):
|
def undo_note_edit(self, item):
|
||||||
item_id = self.item_id_getter(item)
|
item_id = self.item_id_getter(item)
|
||||||
before = self.modified_notes.pop(item_id, None)
|
before = self.modified_notes.pop(item_id, None)
|
||||||
@ -150,8 +169,7 @@ class NotesUtilities():
|
|||||||
db.import_note(self.category, item_id, before.encode('utf-8'), path_is_data=True)
|
db.import_note(self.category, item_id, before.encode('utf-8'), path_is_data=True)
|
||||||
else:
|
else:
|
||||||
db.set_notes_for(self.category, item_id, '')
|
db.set_notes_for(self.category, item_id, '')
|
||||||
item.setText(CHECK_MARK if before else '')
|
self.change_text(item, before)
|
||||||
item.setIcon(QIcon())
|
|
||||||
|
|
||||||
def delete_note(self, item):
|
def delete_note(self, item):
|
||||||
item_id = self.item_id_getter(item)
|
item_id = self.item_id_getter(item)
|
||||||
@ -159,9 +177,7 @@ class NotesUtilities():
|
|||||||
if item_id not in self.modified_notes:
|
if item_id not in self.modified_notes:
|
||||||
self.modified_notes[item_id] = db.notes_for(self.category, item_id)
|
self.modified_notes[item_id] = db.notes_for(self.category, item_id)
|
||||||
db.set_notes_for(self.category, item_id, '')
|
db.set_notes_for(self.category, item_id, '')
|
||||||
item.setText('')
|
self.change_text(item, False)
|
||||||
self.table.cellChanged.emit(item.row(), item.column())
|
|
||||||
self.table.itemChanged.emit(item)
|
|
||||||
|
|
||||||
def do_export(self, item, item_name):
|
def do_export(self, item, item_name):
|
||||||
item_id = self.item_id_getter(item)
|
item_id = self.item_id_getter(item)
|
||||||
@ -186,9 +202,7 @@ class NotesUtilities():
|
|||||||
self.modified_notes[item_id] = before
|
self.modified_notes[item_id] = before
|
||||||
db.import_note(self.category, item_id, src[0])
|
db.import_note(self.category, item_id, src[0])
|
||||||
after = db.notes_for(self.category, item_id)
|
after = db.notes_for(self.category, item_id)
|
||||||
item.setText(CHECK_MARK if after else '')
|
self.change_text(item, after)
|
||||||
self.table.cellChanged.emit(item.row(), item.column())
|
|
||||||
self.table.itemChanged.emit(item)
|
|
||||||
|
|
||||||
edit_icon = QIcon.ic('edit_input.png')
|
edit_icon = QIcon.ic('edit_input.png')
|
||||||
delete_icon = QIcon.ic('trash.png')
|
delete_icon = QIcon.ic('trash.png')
|
||||||
@ -233,13 +247,13 @@ class EditColumnDelegate(QStyledItemDelegate):
|
|||||||
editing_finished = pyqtSignal(int)
|
editing_finished = pyqtSignal(int)
|
||||||
editing_started = pyqtSignal(int)
|
editing_started = pyqtSignal(int)
|
||||||
|
|
||||||
def __init__(self, table, check_for_deleted_items, category, modified_notes, item_id_getter, parent=None):
|
def __init__(self, table, check_for_deleted_items, category, notes_utilities, item_id_getter, parent=None):
|
||||||
super().__init__(table)
|
super().__init__(table)
|
||||||
self.table = table
|
self.table = table
|
||||||
self.completion_data = None
|
self.completion_data = None
|
||||||
self.check_for_deleted_items = check_for_deleted_items
|
self.check_for_deleted_items = check_for_deleted_items
|
||||||
self.category = category
|
self.category = category
|
||||||
self.modified_notes = modified_notes
|
self.notes_utilities = notes_utilities
|
||||||
self.item_id_getter = item_id_getter
|
self.item_id_getter = item_id_getter
|
||||||
|
|
||||||
def set_completion_data(self, data):
|
def set_completion_data(self, data):
|
||||||
@ -259,7 +273,7 @@ class EditColumnDelegate(QStyledItemDelegate):
|
|||||||
editor = EnLineEdit(parent)
|
editor = EnLineEdit(parent)
|
||||||
return editor
|
return editor
|
||||||
if index.column() == NOTES_COLUMN:
|
if index.column() == NOTES_COLUMN:
|
||||||
self.edit_note(self.table.itemFromIndex(index))
|
self.notes_utilities.edit_note(self.table.itemFromIndex(index))
|
||||||
return None
|
return None
|
||||||
self.editing_started.emit(index.row())
|
self.editing_started.emit(index.row())
|
||||||
editor = EnLineEdit(parent)
|
editor = EnLineEdit(parent)
|
||||||
@ -270,22 +284,6 @@ class EditColumnDelegate(QStyledItemDelegate):
|
|||||||
self.editing_finished.emit(index.row())
|
self.editing_finished.emit(index.row())
|
||||||
super().destroyEditor(editor, index)
|
super().destroyEditor(editor, index)
|
||||||
|
|
||||||
def edit_note(self, item):
|
|
||||||
item_id = self.item_id_getter(item)
|
|
||||||
from calibre.gui2.dialogs.edit_category_notes import EditNoteDialog
|
|
||||||
from calibre.gui2.ui import get_gui
|
|
||||||
db = get_gui().current_db.new_api
|
|
||||||
before = db.notes_for(self.category, item_id)
|
|
||||||
note = db.export_note(self.category, item_id) if before else ''
|
|
||||||
d = EditNoteDialog(self.category, item_id, db, parent=self.table)
|
|
||||||
if d.exec() == QDialog.DialogCode.Accepted:
|
|
||||||
after = db.notes_for(self.category, item_id)
|
|
||||||
if item_id not in self.modified_notes:
|
|
||||||
self.modified_notes[item_id] = note
|
|
||||||
item.setText(CHECK_MARK if after else '')
|
|
||||||
self.table.cellChanged.emit(item.row(), item.column())
|
|
||||||
self.table.itemChanged.emit(item)
|
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def block_signals(widget):
|
def block_signals(widget):
|
||||||
@ -298,6 +296,8 @@ def block_signals(widget):
|
|||||||
|
|
||||||
class TagListEditor(QDialog, Ui_TagListEditor):
|
class TagListEditor(QDialog, Ui_TagListEditor):
|
||||||
|
|
||||||
|
edited_icon = QIcon.ic('modified.png')
|
||||||
|
|
||||||
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, category=None, fm=None, link_map=None):
|
ttm_is_first_letter=False, category=None, fm=None, link_map=None):
|
||||||
QDialog.__init__(self, window)
|
QDialog.__init__(self, window)
|
||||||
@ -325,15 +325,13 @@ class TagListEditor(QDialog, Ui_TagListEditor):
|
|||||||
self.setWindowFlags(self.windowFlags()&(~Qt.WindowType.WindowContextHelpButtonHint))
|
self.setWindowFlags(self.windowFlags()&(~Qt.WindowType.WindowContextHelpButtonHint))
|
||||||
self.setWindowIcon(icon)
|
self.setWindowIcon(icon)
|
||||||
|
|
||||||
self.edited_icon = QIcon.ic('modified.png')
|
|
||||||
|
|
||||||
# initialization
|
# initialization
|
||||||
self.to_rename = {}
|
self.to_rename = {}
|
||||||
self.to_delete = set()
|
self.to_delete = set()
|
||||||
self.all_tags = {}
|
self.all_tags = {}
|
||||||
self.original_names = {}
|
self.original_names = {}
|
||||||
self.links = {}
|
self.links = {}
|
||||||
self.modified_notes = {}
|
self.notes_utilities = NotesUtilities(None, self.category, self.get_item_id)
|
||||||
|
|
||||||
self.ordered_tags = []
|
self.ordered_tags = []
|
||||||
self.sorter = sorter
|
self.sorter = sorter
|
||||||
@ -597,8 +595,9 @@ class TagListEditor(QDialog, Ui_TagListEditor):
|
|||||||
|
|
||||||
self.table.setColumnCount(5)
|
self.table.setColumnCount(5)
|
||||||
|
|
||||||
|
self.notes_utilities.table = self.table
|
||||||
self.edit_delegate = EditColumnDelegate(self.table, self.check_for_deleted_items,
|
self.edit_delegate = EditColumnDelegate(self.table, self.check_for_deleted_items,
|
||||||
self.category, self.modified_notes, self.get_item_id)
|
self.category, self.notes_utilities, self.get_item_id)
|
||||||
self.edit_delegate.editing_finished.connect(self.stop_editing)
|
self.edit_delegate.editing_finished.connect(self.stop_editing)
|
||||||
self.edit_delegate.editing_started.connect(self.start_editing)
|
self.edit_delegate.editing_started.connect(self.start_editing)
|
||||||
self.table.setItemDelegateForColumn(VALUE_COLUMN, self.edit_delegate)
|
self.table.setItemDelegateForColumn(VALUE_COLUMN, self.edit_delegate)
|
||||||
@ -634,7 +633,6 @@ class TagListEditor(QDialog, Ui_TagListEditor):
|
|||||||
|
|
||||||
self.table.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
self.table.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
||||||
self.table.customContextMenuRequested.connect(self.show_context_menu)
|
self.table.customContextMenuRequested.connect(self.show_context_menu)
|
||||||
self.notes_utilities = NotesUtilities(self.table, self.modified_notes, self.category, self.get_item_id)
|
|
||||||
|
|
||||||
def get_item_id(self, item):
|
def get_item_id(self, item):
|
||||||
return int(self.table.item(item.row(), VALUE_COLUMN).data(Qt.ItemDataRole.UserRole))
|
return int(self.table.item(item.row(), VALUE_COLUMN).data(Qt.ItemDataRole.UserRole))
|
||||||
@ -742,12 +740,13 @@ class TagListEditor(QDialog, Ui_TagListEditor):
|
|||||||
self.table.setItem(row, LINK_COLUMN, item)
|
self.table.setItem(row, LINK_COLUMN, item)
|
||||||
|
|
||||||
if self.supports_notes:
|
if self.supports_notes:
|
||||||
item = QTableWidgetItem(CHECK_MARK if id_ in all_items_that_have_notes else '')
|
item = QTableWidgetItem()
|
||||||
|
self.notes_utilities.change_text(item, id_ in all_items_that_have_notes)
|
||||||
if is_deleted:
|
if is_deleted:
|
||||||
item.setFlags(item.flags() & ~(Qt.ItemFlag.ItemIsSelectable|Qt.ItemFlag.ItemIsEditable))
|
item.setFlags(item.flags() & ~(Qt.ItemFlag.ItemIsSelectable|Qt.ItemFlag.ItemIsEditable))
|
||||||
else:
|
else:
|
||||||
item.setFlags(item.flags() | (Qt.ItemFlag.ItemIsSelectable|Qt.ItemFlag.ItemIsEditable))
|
item.setFlags(item.flags() | (Qt.ItemFlag.ItemIsSelectable|Qt.ItemFlag.ItemIsEditable))
|
||||||
item.setIcon(self.edited_icon if id_ in self.modified_notes else QIcon())
|
item.setIcon(self.edited_icon if id_ in self.notes_utilities.modified_notes else QIcon())
|
||||||
self.table.setItem(row, NOTES_COLUMN, item)
|
self.table.setItem(row, NOTES_COLUMN, item)
|
||||||
|
|
||||||
# re-sort the table
|
# re-sort the table
|
||||||
@ -836,7 +835,7 @@ class TagListEditor(QDialog, Ui_TagListEditor):
|
|||||||
if edited_item.column() == NOTES_COLUMN:
|
if edited_item.column() == NOTES_COLUMN:
|
||||||
id_ = self.get_item_id(edited_item)
|
id_ = self.get_item_id(edited_item)
|
||||||
with block_signals(self.table):
|
with block_signals(self.table):
|
||||||
edited_item.setIcon(self.edited_icon if id_ in self.modified_notes else QIcon())
|
edited_item.setIcon(self.edited_icon if id_ in self.notes_utilities.modified_notes else QIcon())
|
||||||
return
|
return
|
||||||
|
|
||||||
# Item value column
|
# Item value column
|
||||||
@ -915,8 +914,9 @@ class TagListEditor(QDialog, Ui_TagListEditor):
|
|||||||
# Notes column
|
# Notes column
|
||||||
item = self.table.item(row, NOTES_COLUMN)
|
item = self.table.item(row, NOTES_COLUMN)
|
||||||
item.setFlags(item.flags() | Qt.ItemFlag.ItemIsEditable | Qt.ItemFlag.ItemIsSelectable)
|
item.setFlags(item.flags() | Qt.ItemFlag.ItemIsEditable | Qt.ItemFlag.ItemIsSelectable)
|
||||||
if id_ in self.modified_notes:
|
if id_ in self.notes_utilities.modified_notes:
|
||||||
self.notes_utilities.undo_note_edit(item)
|
self.notes_utilities.undo_note_edit(item)
|
||||||
|
item.setIcon(QIcon())
|
||||||
|
|
||||||
def selection_changed(self):
|
def selection_changed(self):
|
||||||
if self.table.currentIndex().isValid():
|
if self.table.currentIndex().isValid():
|
||||||
|
Loading…
x
Reference in New Issue
Block a user