mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Optimization of model manipulation code.
This commit is contained in:
parent
6b7af60e4b
commit
55602e7daf
@ -109,7 +109,6 @@ class BooksModel(QAbstractTableModel):
|
||||
self.beginRemoveRows(QModelIndex(), row, row)
|
||||
self.db.delete_book(id)
|
||||
self.endRemoveRows()
|
||||
self.emit(SIGNAL('deleted()'))
|
||||
|
||||
def search_tokens(self, text):
|
||||
tokens = []
|
||||
@ -127,28 +126,28 @@ class BooksModel(QAbstractTableModel):
|
||||
continue
|
||||
return ans
|
||||
|
||||
|
||||
|
||||
def search(self, text, refinement):
|
||||
def search(self, text, refinement, reset=True):
|
||||
tokens = self.search_tokens(text)
|
||||
self.db.filter(tokens, refinement)
|
||||
self.last_search = text
|
||||
self.reset()
|
||||
if reset:
|
||||
self.reset()
|
||||
|
||||
def sort(self, col, order):
|
||||
def sort(self, col, order, reset=True):
|
||||
if not self.db:
|
||||
return
|
||||
ascending = order == Qt.AscendingOrder
|
||||
self.db.refresh(self.cols[col], ascending)
|
||||
self.research()
|
||||
self.reset()
|
||||
if reset:
|
||||
self.reset()
|
||||
self.sorted_on = (col, order)
|
||||
|
||||
def resort(self):
|
||||
self.sort(*self.sorted_on)
|
||||
def resort(self, reset=True):
|
||||
self.sort(*self.sorted_on, **dict(reset=reset))
|
||||
|
||||
def research(self):
|
||||
self.search(self.last_search, False)
|
||||
def research(self, reset=True):
|
||||
self.search(self.last_search, False, reset=reset)
|
||||
|
||||
def database_needs_migration(self):
|
||||
path = os.path.expanduser('~/library.db')
|
||||
@ -336,30 +335,17 @@ class BooksView(QTableView):
|
||||
self.setSelectionBehavior(QAbstractItemView.SelectRows)
|
||||
self.setSortingEnabled(True)
|
||||
self.setItemDelegateForColumn(4, LibraryDelegate(self))
|
||||
QObject.connect(self._model, SIGNAL('modelReset()'), self.resizeRowsToContents)
|
||||
QObject.connect(self._model, SIGNAL('deleted()'), self.deleted)
|
||||
QObject.connect(self._model, SIGNAL('update_current()'), self.update_current)
|
||||
QObject.connect(self.selectionModel(), SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'),
|
||||
self._model.current_changed)
|
||||
#self.verticalHeader().setVisible(False)
|
||||
# Adding and removing rows should resize rows to contents
|
||||
QObject.connect(self.model(), SIGNAL('rowsRemoved(QModelIndex, int, int)'), self.resizeRowsToContents)
|
||||
QObject.connect(self.model(), SIGNAL('rowsInserted(QModelIndex, int, int)'), self.resizeRowsToContents)
|
||||
# Resetting the model should resize rows (model is reset after search and sort operations)
|
||||
QObject.connect(self.model(), SIGNAL('modelReset()'), self.resizeRowsToContents)
|
||||
|
||||
def set_database(self, db):
|
||||
self._model.set_database(db)
|
||||
|
||||
def update_current(self):
|
||||
'''
|
||||
Clear selection and update durrent index.
|
||||
'''
|
||||
cidx = self.currentIndex()
|
||||
self.selectionModel().clear()
|
||||
for idx in self.model().row_indices(cidx):
|
||||
self.selectionModel().select(idx, QItemSelectionModel.Select)
|
||||
self.selectionModel().setCurrentIndex(cidx, QItemSelectionModel.NoUpdate)
|
||||
|
||||
def deleted(self):
|
||||
self.resizeRowsToContents()
|
||||
self.update_current()
|
||||
|
||||
def migrate_database(self):
|
||||
if self._model.database_needs_migration():
|
||||
print 'Migrating database from pre 0.4.0 version'
|
||||
@ -428,12 +414,16 @@ class DeviceBooksModel(BooksModel):
|
||||
indices = self.row_indices(self.index(row, 0))
|
||||
self.emit(SIGNAL('dataChanged(QModelIndex, QModelIndex)'), indices[0], indices[-1])
|
||||
|
||||
def remap(self):
|
||||
self.set_database(self.db)
|
||||
self.resort()
|
||||
self.research()
|
||||
self.emit(SIGNAL('update_current()'))
|
||||
def path_about_to_be_deleted(self, path):
|
||||
for row in range(len(self.map)):
|
||||
if self.db[self.map[row]].path == path:
|
||||
print row, path
|
||||
self.beginRemoveRows(QModelIndex(), row, row)
|
||||
self.map.pop(row)
|
||||
return
|
||||
|
||||
def path_deleted(self):
|
||||
self.endRemoveRows()
|
||||
|
||||
def indices_to_be_deleted(self):
|
||||
ans = []
|
||||
@ -447,7 +437,7 @@ class DeviceBooksModel(BooksModel):
|
||||
return BooksModel.flags(self, index)
|
||||
|
||||
|
||||
def search(self, text, refinement):
|
||||
def search(self, text, refinement, reset=True):
|
||||
tokens = self.search_tokens(text)
|
||||
base = self.map if refinement else self.sorted_map
|
||||
result = []
|
||||
@ -462,9 +452,10 @@ class DeviceBooksModel(BooksModel):
|
||||
result.append(i)
|
||||
|
||||
self.map = result
|
||||
self.reset()
|
||||
if reset:
|
||||
self.reset()
|
||||
|
||||
def sort(self, col, order):
|
||||
def sort(self, col, order, reset=True):
|
||||
if not self.db:
|
||||
return
|
||||
descending = order != Qt.AscendingOrder
|
||||
@ -496,7 +487,8 @@ class DeviceBooksModel(BooksModel):
|
||||
self.sorted_map = list(range(len(self.db)))
|
||||
self.sorted_map.sort(cmp=fcmp, reverse=descending)
|
||||
self.sorted_on = (col, order)
|
||||
self.reset()
|
||||
if reset:
|
||||
self.reset()
|
||||
|
||||
def columnCount(self, parent):
|
||||
return 4
|
||||
@ -600,7 +592,7 @@ class SearchBox(QLineEdit):
|
||||
|
||||
def __init__(self, parent):
|
||||
QLineEdit.__init__(self, parent)
|
||||
self.help_text = 'Search by title, author, publisher, tags and comments'
|
||||
self.help_text = 'Search by title, author, publisher, tags, series and comments'
|
||||
self.initial_state = True
|
||||
self.default_palette = QApplication.palette(self)
|
||||
self.gray = QPalette(self.default_palette)
|
||||
|
@ -262,13 +262,13 @@ class Main(QObject, Ui_MainWindow):
|
||||
files, names, on_card=on_card,
|
||||
job_extra_description=titles
|
||||
)
|
||||
self.upload_memory[id] = metadata
|
||||
self.upload_memory[id] = (metadata, on_card)
|
||||
|
||||
def books_uploaded(self, id, description, result, exception, formatted_traceback):
|
||||
'''
|
||||
Called once books have been uploaded.
|
||||
'''
|
||||
metadata = self.upload_memory.pop(id)
|
||||
metadata, on_card = self.upload_memory.pop(id)
|
||||
if exception:
|
||||
if isinstance(exception, FreeSpaceError):
|
||||
where = 'in main memory.' if 'memory' in str(exception) else 'on the storage card.'
|
||||
@ -285,9 +285,9 @@ class Main(QObject, Ui_MainWindow):
|
||||
|
||||
self.upload_booklists()
|
||||
|
||||
for view in (self.memory_view, self.card_view):
|
||||
view.model().resort()
|
||||
view.model().research()
|
||||
view = self.card_view if on_card else self.memory_view
|
||||
view.model().resort(reset=False)
|
||||
view.model().research()
|
||||
|
||||
|
||||
############################################################################
|
||||
@ -307,7 +307,7 @@ class Main(QObject, Ui_MainWindow):
|
||||
view = self.memory_view if self.stack.currentIndex() == 1 else self.card_view
|
||||
paths = view.model().paths(rows)
|
||||
id = self.remove_paths(paths)
|
||||
self.delete_memory[id] = paths
|
||||
self.delete_memory[id] = (paths, view.model())
|
||||
view.model().mark_for_deletion(id, rows)
|
||||
self.status_bar.showMessage('Deleting books from device.', 1000)
|
||||
|
||||
@ -329,11 +329,12 @@ class Main(QObject, Ui_MainWindow):
|
||||
self.upload_booklists()
|
||||
|
||||
if self.delete_memory.has_key(id):
|
||||
paths = self.delete_memory.pop(id)
|
||||
self.device_manager.remove_books_from_metadata(paths, self.booklists())
|
||||
paths, model = self.delete_memory.pop(id)
|
||||
for path in paths:
|
||||
model.path_about_to_be_deleted(path)
|
||||
self.device_manager.remove_books_from_metadata((path,), self.booklists())
|
||||
model.path_deleted()
|
||||
|
||||
for view in (self.memory_view, self.card_view):
|
||||
view.model().remap()
|
||||
|
||||
############################################################################
|
||||
|
||||
@ -354,7 +355,7 @@ class Main(QObject, Ui_MainWindow):
|
||||
changed = True
|
||||
|
||||
if changed:
|
||||
self.library_view.model().resort()
|
||||
self.library_view.model().resort(reset=False)
|
||||
self.library_view.model().research()
|
||||
|
||||
def edit_bulk_metadata(self, checked):
|
||||
@ -367,7 +368,7 @@ class Main(QObject, Ui_MainWindow):
|
||||
d.exec_()
|
||||
return
|
||||
if MetadataBulkDialog(self.window, rows, self.library_view.model().db).changed:
|
||||
self.library_view.model().resort()
|
||||
self.library_view.model().resort(reset=False)
|
||||
self.library_view.model().research()
|
||||
|
||||
############################################################################
|
||||
@ -436,7 +437,6 @@ class Main(QObject, Ui_MainWindow):
|
||||
view.resize_on_select = False
|
||||
self.status_bar.reset_info()
|
||||
self.current_view().clearSelection()
|
||||
self.current_view().setCurrentIndex(self.current_view().model().index(0, 0))
|
||||
|
||||
|
||||
def wrap_traceback(self, tb):
|
||||
|
@ -344,7 +344,10 @@
|
||||
<iconset resource="images.qrc" >:/images/trash.svg</iconset>
|
||||
</property>
|
||||
<property name="text" >
|
||||
<string>Delete books</string>
|
||||
<string>Remove books</string>
|
||||
</property>
|
||||
<property name="toolTip" >
|
||||
<string>Remove books</string>
|
||||
</property>
|
||||
<property name="shortcut" >
|
||||
<string>Del</string>
|
||||
|
Loading…
x
Reference in New Issue
Block a user