From 1c4a68e1d4bf8947a1369a36793840dadf370632 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 5 Nov 2008 10:22:53 -0800 Subject: [PATCH] Various rendering optimizations in the book list. Long text is no longer word wrapped. This should significantly speed up sort operation --- src/calibre/gui2/library.py | 19 +++++++++++-------- src/calibre/gui2/main.ui | 9 +++++++++ src/calibre/library/database2.py | 9 ++++++--- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index 8f3d7a2fe3..f0cb9f330b 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -198,11 +198,11 @@ class BooksModel(QAbstractTableModel): return ascending = order == Qt.AscendingOrder self.db.sort(self.column_map[col], ascending) - self.research(reset=False) if reset: self.clear_caches() self.reset() self.sorted_on = (self.column_map[col], order) + def resort(self, reset=True): try: @@ -222,7 +222,7 @@ class BooksModel(QAbstractTableModel): def rowCount(self, parent): if parent and parent.isValid(): return 0 - return self.db.rows() if self.db else 0 + return len(self.db.data) if self.db else 0 def count(self): return self.rowCount(None) @@ -400,7 +400,7 @@ class BooksModel(QAbstractTableModel): au = self.db.data[r][aidx] if au: au = [a.strip().replace('|', ',') for a in au.split(',')] - return '\n'.join(au) + return ' & '.join(au) def timestamp(r): dt = self.db.data[r][tmdx] @@ -427,11 +427,16 @@ class BooksModel(QAbstractTableModel): series = self.db.data[r][srdx] if series: return series + ' [%d]'%self.db.data[r][siix] + + def size(r): + size = self.db.data[r][sidx] + if size: + return '%.1f'%(float(size)/(1024*1024)) self.dc = { 'title' : lambda r : self.db.data[r][tidx], 'authors' : authors, - 'size' : lambda r : '%.1f'%(float(self.db.data[r][sidx])/(1024*1024)), + 'size' : size, 'timestamp': timestamp, 'rating' : rating, 'publisher': publisher, @@ -521,10 +526,8 @@ class BooksView(TableView): QObject.connect(self.selectionModel(), SIGNAL('currentRowChanged(QModelIndex, QModelIndex)'), self._model.current_changed) # 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) + #QObject.connect(self.model(), SIGNAL('rowsRemoved(QModelIndex, int, int)'), self.resizeRowsToContents) + #QObject.connect(self.model(), SIGNAL('rowsInserted(QModelIndex, int, int)'), self.resizeRowsToContents) self.set_visible_columns() def columns_sorted(self): diff --git a/src/calibre/gui2/main.ui b/src/calibre/gui2/main.ui index 065b322b04..ff2177b149 100644 --- a/src/calibre/gui2/main.ui +++ b/src/calibre/gui2/main.ui @@ -316,6 +316,9 @@ false + + false + @@ -353,6 +356,9 @@ false + + false + @@ -388,6 +394,9 @@ false + + false + diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 4d8cd6fdf2..2d37d726ae 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -282,14 +282,15 @@ class ResultCache(SearchQueryParser): field = field.lower().strip() if field in ('author', 'tag', 'comment'): field += 's' - if field == 'date': field = 'timestamp' + if field == 'date': field = 'timestamp' elif field == 'title': field = 'sort' elif field == 'author': field = 'author_sort' fcmp = self.seriescmp if field == 'series' else \ functools.partial(self.cmp, FIELD_MAP[field], str=field not in ('size', 'rating', 'timestamp')) - self._map.sort(cmp=fcmp, reverse=not ascending) + self._map.sort(cmp=fcmp, reverse=not ascending) + self._map_filtered = [id for id in self._map if id in self._map_filtered] def search(self, query): if not query or not query.strip(): @@ -363,7 +364,7 @@ class LibraryDatabase2(LibraryDatabase): self.data = ResultCache() self.search = self.data.search self.refresh = functools.partial(self.data.refresh, self) - self.sort = functools.partial(self.data.refresh, self) + self.sort = self.data.sort self.index = self.data.index self.refresh_ids = functools.partial(self.data.refresh_ids, self.conn) self.row = self.data.row @@ -1008,6 +1009,7 @@ class LibraryDatabase2(LibraryDatabase): if not hasattr(path, 'read'): stream.close() self.conn.commit() + self.data.refresh_ids(self.conn, ids) # Needed to update format list and size if duplicates: paths = tuple(duplicate[0] for duplicate in duplicates) formats = tuple(duplicate[1] for duplicate in duplicates) @@ -1032,6 +1034,7 @@ class LibraryDatabase2(LibraryDatabase): stream = open(path, 'rb') self.add_format(id, ext, stream, index_is_id=True) self.conn.commit() + self.data.refresh_ids(self.conn, [id]) # Needed to update format list and size self.notify('add', [id]) def move_library_to(self, newloc, progress=None):