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.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)
|
||||||
|
@ -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):
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user