Auto complete author, series, publisher in library_view

This commit is contained in:
John Schember 2009-07-05 21:16:21 -04:00
parent 4b338c5274
commit a2457cb939

View File

@ -10,7 +10,7 @@ from PyQt4.QtGui import QTableView, QAbstractItemView, QColor, \
QItemDelegate, QPainterPath, QLinearGradient, QBrush, \ QItemDelegate, QPainterPath, QLinearGradient, QBrush, \
QPen, QStyle, QPainter, QLineEdit, \ QPen, QStyle, QPainter, QLineEdit, \
QPalette, QImage, QApplication, QMenu, \ QPalette, QImage, QApplication, QMenu, \
QStyledItemDelegate, QCompleter, QStringListModel QStyledItemDelegate, QCompleter
from PyQt4.QtCore import QAbstractTableModel, QVariant, Qt, QString, \ from PyQt4.QtCore import QAbstractTableModel, QVariant, Qt, QString, \
SIGNAL, QObject, QSize, QModelIndex, QDate SIGNAL, QObject, QSize, QModelIndex, QDate
@ -114,8 +114,26 @@ class PubDateDelegate(QStyledItemDelegate):
class TextDelegate(QStyledItemDelegate): class TextDelegate(QStyledItemDelegate):
def __init__(self, parent):
'''
Delegate for text data. If auto_complete_function needs to return a list
of text items to auto-complete with. The funciton is None no
auto-complete will be used.
'''
QStyledItemDelegate.__init__(self, parent)
self.auto_complete_function = None
def set_auto_complete_function(self, f):
self.auto_complete_function = f
def createEditor(self, parent, option, index): def createEditor(self, parent, option, index):
editor = EnLineEdit(parent) editor = EnLineEdit(parent)
if self.auto_complete_function:
complete_items = [i[1] for i in self.auto_complete_function()]
completer = QCompleter(complete_items, self)
completer.setCaseSensitivity(Qt.CaseInsensitive)
completer.setCompletionMode(QCompleter.InlineCompletion)
editor.setCompleter(completer)
return editor return editor
class TagsDelegate(QStyledItemDelegate): class TagsDelegate(QStyledItemDelegate):
@ -170,26 +188,7 @@ class BooksModel(QAbstractTableModel):
if cols != self.column_map: if cols != self.column_map:
self.column_map = cols self.column_map = cols
self.reset() self.reset()
try: self.emit(SIGNAL('columns_sorted()'))
idx = self.column_map.index('rating')
except ValueError:
idx = -1
try:
tidx = self.column_map.index('timestamp')
except ValueError:
tidx = -1
try:
pidx = self.column_map.index('pubdate')
except ValueError:
pidx = -1
try:
taidx = self.column_map.index('tags')
except ValueError:
taidx = -1
self.emit(SIGNAL('columns_sorted(int,int,int,int)'), idx, tidx, pidx,
taidx)
def set_database(self, db): def set_database(self, db):
self.db = db self.db = db
@ -670,6 +669,9 @@ class BooksView(TableView):
self.timestamp_delegate = DateDelegate(self) self.timestamp_delegate = DateDelegate(self)
self.pubdate_delegate = PubDateDelegate(self) self.pubdate_delegate = PubDateDelegate(self)
self.tags_delegate = TagsDelegate(self) self.tags_delegate = TagsDelegate(self)
self.authors_delegate = TextDelegate(self)
self.series_delegate = TextDelegate(self)
self.publisher_delegate = TextDelegate(self)
self.display_parent = parent self.display_parent = parent
self._model = modelcls(self) self._model = modelcls(self)
self.setModel(self._model) self.setModel(self._model)
@ -677,32 +679,34 @@ class BooksView(TableView):
self.setSortingEnabled(True) self.setSortingEnabled(True)
for i in range(10): for i in range(10):
self.setItemDelegateForColumn(i, TextDelegate(self)) self.setItemDelegateForColumn(i, TextDelegate(self))
try: self.columns_sorted()
cm = self._model.column_map
self.columns_sorted(cm.index('rating') if 'rating' in cm else -1,
cm.index('timestamp') if 'timestamp' in cm else -1,
cm.index('pubdate') if 'pubdate' in cm else -1,
cm.index('tags') if 'tags' in cm else -1)
except ValueError:
pass
QObject.connect(self.selectionModel(), SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'), QObject.connect(self.selectionModel(), SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'),
self._model.current_changed) self._model.current_changed)
self.connect(self._model, SIGNAL('columns_sorted(int,int,int,int)'), self.connect(self._model, SIGNAL('columns_sorted()'),
self.columns_sorted, Qt.QueuedConnection) self.columns_sorted, Qt.QueuedConnection)
def columns_sorted(self, rating_col, timestamp_col, pubdate_col, tags_col): def columns_sorted(self):
for i in range(self.model().columnCount(None)): for i in range(self.model().columnCount(None)):
if self.itemDelegateForColumn(i) in (self.rating_delegate, if self.itemDelegateForColumn(i) in (self.rating_delegate,
self.timestamp_delegate, self.pubdate_delegate): self.timestamp_delegate, self.pubdate_delegate):
self.setItemDelegateForColumn(i, self.itemDelegate()) self.setItemDelegateForColumn(i, self.itemDelegate())
if rating_col > -1:
self.setItemDelegateForColumn(rating_col, self.rating_delegate) cm = self._model.column_map
if timestamp_col > -1:
self.setItemDelegateForColumn(timestamp_col, self.timestamp_delegate) if 'rating' in cm:
if pubdate_col > -1: self.setItemDelegateForColumn(cm.index('rating'), self.rating_delegate)
self.setItemDelegateForColumn(pubdate_col, self.pubdate_delegate) if 'timestamp' in cm:
if tags_col > -1: self.setItemDelegateForColumn(cm.index('timestamp'), self.timestamp_delegate)
self.setItemDelegateForColumn(tags_col, self.tags_delegate) if 'pubdate' in cm:
self.setItemDelegateForColumn(cm.index('pubdate'), self.pubdate_delegate)
if 'tags' in cm:
self.setItemDelegateForColumn(cm.index('tags'), self.tags_delegate)
if 'authors' in cm:
self.setItemDelegateForColumn(cm.index('authors'), self.authors_delegate)
if 'publisher' in cm:
self.setItemDelegateForColumn(cm.index('publisher'), self.publisher_delegate)
if 'series' in cm:
self.setItemDelegateForColumn(cm.index('series'), self.series_delegate)
def set_context_menu(self, edit_metadata, send_to_device, convert, view, def set_context_menu(self, edit_metadata, send_to_device, convert, view,
save, open_folder, book_details, similar_menu=None): save, open_folder, book_details, similar_menu=None):
@ -766,6 +770,9 @@ class BooksView(TableView):
def set_database(self, db): def set_database(self, db):
self._model.set_database(db) self._model.set_database(db)
self.tags_delegate.set_database(db) self.tags_delegate.set_database(db)
self.authors_delegate.set_auto_complete_function(db.all_authors)
self.series_delegate.set_auto_complete_function(db.all_series)
self.publisher_delegate.set_auto_complete_function(db.all_publishers)
def close(self): def close(self):
self._model.close() self._model.close()