Move delegate dependent code to base class

This commit is contained in:
Kovid Goyal 2025-02-10 09:51:11 +05:30
parent 8f44ab81df
commit 249052d6e7
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 115 additions and 109 deletions

View File

@ -46,26 +46,8 @@ from calibre.gui2 import BOOK_DETAILS_DISPLAY_DEBOUNCE_DELAY, FunctionDispatcher
from calibre.gui2.dialogs.enum_values_edit import EnumValuesEdit from calibre.gui2.dialogs.enum_values_edit import EnumValuesEdit
from calibre.gui2.gestures import GestureManager from calibre.gui2.gestures import GestureManager
from calibre.gui2.library import DEFAULT_SORT from calibre.gui2.library import DEFAULT_SORT
from calibre.gui2.library.alternate_views import AlternateViews, handle_enter_press, setup_dnd_interface from calibre.gui2.library.alternate_views import AlternateViews, setup_dnd_interface
from calibre.gui2.library.delegates import ( from calibre.gui2.library.delegates import TextDelegate
CcBoolDelegate,
CcCommentsDelegate,
CcDateDelegate,
CcEnumDelegate,
CcLongTextDelegate,
CcMarkdownDelegate,
CcNumberDelegate,
CcSeriesDelegate,
CcTemplateDelegate,
CcTextDelegate,
CompleteDelegate,
DateDelegate,
LanguagesDelegate,
PubDateDelegate,
RatingDelegate,
SeriesDelegate,
TextDelegate,
)
from calibre.gui2.library.models import BooksModel, DeviceBooksModel from calibre.gui2.library.models import BooksModel, DeviceBooksModel
from calibre.gui2.pin_columns import PinTableView, TableView from calibre.gui2.pin_columns import PinTableView, TableView
from calibre.gui2.preferences.create_custom_column import CreateNewCustomColumn from calibre.gui2.preferences.create_custom_column import CreateNewCustomColumn
@ -416,31 +398,8 @@ class BooksView(TableView): # {{{
wv.setAlternatingRowColors(True) wv.setAlternatingRowColors(True)
wv.setWordWrap(False) wv.setWordWrap(False)
self.refresh_grid() self.refresh_grid()
self.create_delegates()
def create_delegates(view): self.pin_view.create_delegates()
view.rating_delegate = RatingDelegate(view)
view.half_rating_delegate = RatingDelegate(view, is_half_star=True)
view.timestamp_delegate = DateDelegate(view)
view.pubdate_delegate = PubDateDelegate(view)
view.last_modified_delegate = DateDelegate(view, tweak_name='gui_last_modified_display_format')
view.languages_delegate = LanguagesDelegate(view)
view.tags_delegate = CompleteDelegate(view, ',', 'all_tag_names')
view.authors_delegate = CompleteDelegate(view, '&', 'all_author_names', True)
view.cc_names_delegate = CompleteDelegate(view, '&', 'all_custom', True)
view.series_delegate = SeriesDelegate(view)
view.publisher_delegate = TextDelegate(view)
view.text_delegate = TextDelegate(view)
view.cc_text_delegate = CcTextDelegate(view)
view.cc_series_delegate = CcSeriesDelegate(view)
view.cc_longtext_delegate = CcLongTextDelegate(view)
view.cc_markdown_delegate = CcMarkdownDelegate(view)
view.cc_enum_delegate = CcEnumDelegate(view)
view.cc_bool_delegate = CcBoolDelegate(view)
view.cc_comments_delegate = CcCommentsDelegate(view)
view.cc_template_delegate = CcTemplateDelegate(view)
view.cc_number_delegate = CcNumberDelegate(view)
create_delegates(self), create_delegates(self.pin_view)
self.display_parent = parent self.display_parent = parent
self._model = modelcls(self) self._model = modelcls(self)
self.setModel(self._model) self.setModel(self._model)
@ -1085,9 +1044,6 @@ class BooksView(TableView): # {{{
self.was_restored = True self.was_restored = True
def refresh_composite_edit(self):
self.cc_template_delegate.refresh()
def refresh_row_sizing(self): def refresh_row_sizing(self):
self.row_sizing_done = False self.row_sizing_done = False
self.do_row_sizing() self.do_row_sizing()
@ -1168,57 +1124,8 @@ class BooksView(TableView): # {{{
self.last_modified_delegate, self.languages_delegate, self.half_rating_delegate): self.last_modified_delegate, self.languages_delegate, self.half_rating_delegate):
vw.setItemDelegateForColumn(i, vw.itemDelegate()) vw.setItemDelegateForColumn(i, vw.itemDelegate())
def set_delegates(view): self.set_delegates()
cm = view.column_map self.pin_view.set_delegates()
def set_item_delegate(colhead, delegate):
idx = view.column_map.index(colhead)
view.setItemDelegateForColumn(idx, delegate)
for colhead in cm:
if self._model.is_custom_column(colhead):
cc = self._model.custom_columns[colhead]
if cc['datatype'] == 'datetime':
delegate = CcDateDelegate(view)
delegate.set_format(cc['display'].get('date_format',''))
set_item_delegate(colhead, delegate)
elif cc['datatype'] == 'comments':
ctype = cc['display'].get('interpret_as', 'html')
if ctype == 'short-text':
set_item_delegate(colhead, view.cc_text_delegate)
elif ctype == 'long-text':
set_item_delegate(colhead, view.cc_longtext_delegate)
elif ctype == 'markdown':
set_item_delegate(colhead, view.cc_markdown_delegate)
else:
set_item_delegate(colhead, view.cc_comments_delegate)
elif cc['datatype'] == 'text':
if cc['is_multiple']:
if cc['display'].get('is_names', False):
set_item_delegate(colhead, view.cc_names_delegate)
else:
set_item_delegate(colhead, view.tags_delegate)
else:
set_item_delegate(colhead, view.cc_text_delegate)
elif cc['datatype'] == 'series':
set_item_delegate(colhead, view.cc_series_delegate)
elif cc['datatype'] in ('int', 'float'):
set_item_delegate(colhead, view.cc_number_delegate)
elif cc['datatype'] == 'bool':
set_item_delegate(colhead, view.cc_bool_delegate)
elif cc['datatype'] == 'rating':
d = view.half_rating_delegate if cc['display'].get('allow_half_stars', False) else view.rating_delegate
set_item_delegate(colhead, d)
elif cc['datatype'] == 'composite':
set_item_delegate(colhead, view.cc_template_delegate)
elif cc['datatype'] == 'enumeration':
set_item_delegate(colhead, view.cc_enum_delegate)
else:
dattr = colhead+'_delegate'
delegate = colhead if hasattr(view, dattr) else 'text'
set_item_delegate(colhead, getattr(view, delegate+'_delegate'))
set_delegates(self), set_delegates(self.pin_view)
self.restore_state() self.restore_state()
self.set_ondevice_column_visibility() self.set_ondevice_column_visibility()
# in case there were marked books # in case there were marked books
@ -1505,16 +1412,6 @@ class BooksView(TableView): # {{{
return QItemSelectionModel.SelectionFlag.ClearAndSelect | QItemSelectionModel.SelectionFlag.Rows return QItemSelectionModel.SelectionFlag.ClearAndSelect | QItemSelectionModel.SelectionFlag.Rows
return super().selectionCommand(index, event) return super().selectionCommand(index, event)
def keyPressEvent(self, ev):
if handle_enter_press(self, ev):
return
if ev.key() == Qt.Key.Key_F2:
key = self.column_map[self.currentIndex().column()]
db = self.model().db
if hasattr(db, 'field_metadata') and db.field_metadata[key]['datatype'] == 'composite':
self.cc_template_delegate.allow_one_edit()
return QTableView.keyPressEvent(self, ev)
def ids_to_rows(self, ids): def ids_to_rows(self, ids):
row_map = OrderedDict() row_map = OrderedDict()
ids = frozenset(ids) ids = frozenset(ids)

View File

@ -6,6 +6,25 @@ from qt.core import QAbstractItemDelegate, QSplitter, Qt, QTableView
from calibre.gui2 import gprefs from calibre.gui2 import gprefs
from calibre.gui2.library import DEFAULT_SORT from calibre.gui2.library import DEFAULT_SORT
from calibre.gui2.library.delegates import (
CcBoolDelegate,
CcCommentsDelegate,
CcDateDelegate,
CcEnumDelegate,
CcLongTextDelegate,
CcMarkdownDelegate,
CcNumberDelegate,
CcSeriesDelegate,
CcTemplateDelegate,
CcTextDelegate,
CompleteDelegate,
DateDelegate,
LanguagesDelegate,
PubDateDelegate,
RatingDelegate,
SeriesDelegate,
TextDelegate,
)
class TableView(QTableView): class TableView(QTableView):
@ -58,6 +77,96 @@ class TableView(QTableView):
self.setCurrentIndex(idx) self.setCurrentIndex(idx)
self.edit(idx) self.edit(idx)
def create_delegates(self):
self.rating_delegate = RatingDelegate(self)
self.half_rating_delegate = RatingDelegate(self, is_half_star=True)
self.timestamp_delegate = DateDelegate(self)
self.pubdate_delegate = PubDateDelegate(self)
self.last_modified_delegate = DateDelegate(self, tweak_name='gui_last_modified_display_format')
self.languages_delegate = LanguagesDelegate(self)
self.tags_delegate = CompleteDelegate(self, ',', 'all_tag_names')
self.authors_delegate = CompleteDelegate(self, '&', 'all_author_names', True)
self.cc_names_delegate = CompleteDelegate(self, '&', 'all_custom', True)
self.series_delegate = SeriesDelegate(self)
self.publisher_delegate = TextDelegate(self)
self.text_delegate = TextDelegate(self)
self.cc_text_delegate = CcTextDelegate(self)
self.cc_series_delegate = CcSeriesDelegate(self)
self.cc_longtext_delegate = CcLongTextDelegate(self)
self.cc_markdown_delegate = CcMarkdownDelegate(self)
self.cc_enum_delegate = CcEnumDelegate(self)
self.cc_bool_delegate = CcBoolDelegate(self)
self.cc_comments_delegate = CcCommentsDelegate(self)
self.cc_template_delegate = CcTemplateDelegate(self)
self.cc_number_delegate = CcNumberDelegate(self)
def set_delegates(self):
cm = self.column_map
def set_item_delegate(colhead, delegate):
idx = self.column_map.index(colhead)
self.setItemDelegateForColumn(idx, delegate)
for colhead in cm:
if self.model().is_custom_column(colhead):
cc = self.model().custom_columns[colhead]
if cc['datatype'] == 'datetime':
delegate = CcDateDelegate(self)
delegate.set_format(cc['display'].get('date_format',''))
set_item_delegate(colhead, delegate)
elif cc['datatype'] == 'comments':
ctype = cc['display'].get('interpret_as', 'html')
if ctype == 'short-text':
set_item_delegate(colhead, self.cc_text_delegate)
elif ctype == 'long-text':
set_item_delegate(colhead, self.cc_longtext_delegate)
elif ctype == 'markdown':
set_item_delegate(colhead, self.cc_markdown_delegate)
else:
set_item_delegate(colhead, self.cc_comments_delegate)
elif cc['datatype'] == 'text':
if cc['is_multiple']:
if cc['display'].get('is_names', False):
set_item_delegate(colhead, self.cc_names_delegate)
else:
set_item_delegate(colhead, self.tags_delegate)
else:
set_item_delegate(colhead, self.cc_text_delegate)
elif cc['datatype'] == 'series':
set_item_delegate(colhead, self.cc_series_delegate)
elif cc['datatype'] in ('int', 'float'):
set_item_delegate(colhead, self.cc_number_delegate)
elif cc['datatype'] == 'bool':
set_item_delegate(colhead, self.cc_bool_delegate)
elif cc['datatype'] == 'rating':
d = self.half_rating_delegate if cc['display'].get('allow_half_stars', False) else self.rating_delegate
set_item_delegate(colhead, d)
elif cc['datatype'] == 'composite':
set_item_delegate(colhead, self.cc_template_delegate)
elif cc['datatype'] == 'enumeration':
set_item_delegate(colhead, self.cc_enum_delegate)
else:
dattr = colhead+'_delegate'
delegate = colhead if hasattr(self, dattr) else 'text'
set_item_delegate(colhead, getattr(self, delegate+'_delegate'))
def refresh_composite_edit(self):
self.cc_template_delegate.refresh()
def allow_one_edit_for_f2(self):
key = self.column_map[self.currentIndex().column()]
db = self.model().db
if hasattr(db, 'field_metadata') and db.field_metadata[key]['datatype'] == 'composite':
self.cc_template_delegate.allow_one_edit()
def keyPressEvent(self, ev):
from calibre.gui2.library.alternate_views import handle_enter_press
if handle_enter_press(self, ev):
return
if ev.key() == Qt.Key.Key_F2:
self.allow_one_edit_for_f2()
return super().keyPressEvent(ev)
class PinTableView(TableView): class PinTableView(TableView):