mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Move delegate dependent code to base class
This commit is contained in:
parent
8f44ab81df
commit
249052d6e7
@ -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.gestures import GestureManager
|
||||
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.delegates import (
|
||||
CcBoolDelegate,
|
||||
CcCommentsDelegate,
|
||||
CcDateDelegate,
|
||||
CcEnumDelegate,
|
||||
CcLongTextDelegate,
|
||||
CcMarkdownDelegate,
|
||||
CcNumberDelegate,
|
||||
CcSeriesDelegate,
|
||||
CcTemplateDelegate,
|
||||
CcTextDelegate,
|
||||
CompleteDelegate,
|
||||
DateDelegate,
|
||||
LanguagesDelegate,
|
||||
PubDateDelegate,
|
||||
RatingDelegate,
|
||||
SeriesDelegate,
|
||||
TextDelegate,
|
||||
)
|
||||
from calibre.gui2.library.alternate_views import AlternateViews, setup_dnd_interface
|
||||
from calibre.gui2.library.delegates import TextDelegate
|
||||
from calibre.gui2.library.models import BooksModel, DeviceBooksModel
|
||||
from calibre.gui2.pin_columns import PinTableView, TableView
|
||||
from calibre.gui2.preferences.create_custom_column import CreateNewCustomColumn
|
||||
@ -416,31 +398,8 @@ class BooksView(TableView): # {{{
|
||||
wv.setAlternatingRowColors(True)
|
||||
wv.setWordWrap(False)
|
||||
self.refresh_grid()
|
||||
|
||||
def create_delegates(view):
|
||||
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.create_delegates()
|
||||
self.pin_view.create_delegates()
|
||||
self.display_parent = parent
|
||||
self._model = modelcls(self)
|
||||
self.setModel(self._model)
|
||||
@ -1085,9 +1044,6 @@ class BooksView(TableView): # {{{
|
||||
|
||||
self.was_restored = True
|
||||
|
||||
def refresh_composite_edit(self):
|
||||
self.cc_template_delegate.refresh()
|
||||
|
||||
def refresh_row_sizing(self):
|
||||
self.row_sizing_done = False
|
||||
self.do_row_sizing()
|
||||
@ -1168,57 +1124,8 @@ class BooksView(TableView): # {{{
|
||||
self.last_modified_delegate, self.languages_delegate, self.half_rating_delegate):
|
||||
vw.setItemDelegateForColumn(i, vw.itemDelegate())
|
||||
|
||||
def set_delegates(view):
|
||||
cm = view.column_map
|
||||
|
||||
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.set_delegates()
|
||||
self.pin_view.set_delegates()
|
||||
self.restore_state()
|
||||
self.set_ondevice_column_visibility()
|
||||
# in case there were marked books
|
||||
@ -1505,16 +1412,6 @@ class BooksView(TableView): # {{{
|
||||
return QItemSelectionModel.SelectionFlag.ClearAndSelect | QItemSelectionModel.SelectionFlag.Rows
|
||||
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):
|
||||
row_map = OrderedDict()
|
||||
ids = frozenset(ids)
|
||||
|
@ -6,6 +6,25 @@ from qt.core import QAbstractItemDelegate, QSplitter, Qt, QTableView
|
||||
|
||||
from calibre.gui2 import gprefs
|
||||
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):
|
||||
@ -58,6 +77,96 @@ class TableView(QTableView):
|
||||
self.setCurrentIndex(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):
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user