From 4ea00e817a13a77a7d580dca980146fb594377c5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 6 Aug 2007 23:05:06 +0000 Subject: [PATCH] Fix delete bug in library view and apply search after sort. --- src/libprs500/__init__.py | 2 +- src/libprs500/gui2/__init__.py | 3 ++- src/libprs500/gui2/library.py | 12 +++++++----- src/libprs500/gui2/main.py | 2 ++ src/libprs500/gui2/widgets.py | 16 ++++++++++++---- src/libprs500/library/database.py | 25 ++++++++++++++----------- 6 files changed, 38 insertions(+), 22 deletions(-) diff --git a/src/libprs500/__init__.py b/src/libprs500/__init__.py index ff833a66b7..59cf3273f9 100644 --- a/src/libprs500/__init__.py +++ b/src/libprs500/__init__.py @@ -13,7 +13,7 @@ ## with this program; if not, write to the Free Software Foundation, Inc., ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ''' E-book management software''' -__version__ = "0.3.90" +__version__ = "0.3.91" __docformat__ = "epytext" __author__ = "Kovid Goyal " __appname__ = 'libprs500' diff --git a/src/libprs500/gui2/__init__.py b/src/libprs500/gui2/__init__.py index f78ea4319d..26561a9f17 100644 --- a/src/libprs500/gui2/__init__.py +++ b/src/libprs500/gui2/__init__.py @@ -155,7 +155,8 @@ class FileDialog(QObject): ): QObject.__init__(self) initialize_file_icon_provider() - self.fd = QFileDialog(parent) + self.fd = QFileDialog(parent) + self.fd.setFileMode(mode) self.fd.setIconProvider(_file_icon_provider) self.fd.setModal(modal) settings = QSettings() diff --git a/src/libprs500/gui2/library.py b/src/libprs500/gui2/library.py index feef7909f2..52de3c5b92 100644 --- a/src/libprs500/gui2/library.py +++ b/src/libprs500/gui2/library.py @@ -103,11 +103,12 @@ class BooksModel(QAbstractTableModel): return [ self.index(index.row(), c) for c in range(self.columnCount(None))] def delete_books(self, indices): - rows = [ i.row() for i in indices ] - for row in rows: + ids = [ self.id(i) for i in indices ] + for id in ids: + row = self.db.index(id) self.beginRemoveRows(QModelIndex(), row, row) - self.db.delete_books(rows) - self.endRemoveRows() + self.db.delete_book(id) + self.endRemoveRows() self.emit(SIGNAL('deleted()')) def search_tokens(self, text): @@ -139,7 +140,8 @@ class BooksModel(QAbstractTableModel): return ascending = order == Qt.AscendingOrder self.db.refresh(self.cols[col], ascending) - self.reset() + self.research() + self.reset() self.sorted_on = (col, order) def resort(self): diff --git a/src/libprs500/gui2/main.py b/src/libprs500/gui2/main.py index 6d4e68e998..cb0ea2f7d0 100644 --- a/src/libprs500/gui2/main.py +++ b/src/libprs500/gui2/main.py @@ -64,6 +64,8 @@ class Main(QObject, Ui_MainWindow): ####################### Location View ######################## QObject.connect(self.location_view, SIGNAL('location_selected(PyQt_PyObject)'), self.location_selected) + QObject.connect(self.stack, SIGNAL('currentChanged(int)'), + self.location_view.location_changed) ####################### Vanity ######################## self.vanity_template = self.vanity.text().arg(__version__) diff --git a/src/libprs500/gui2/widgets.py b/src/libprs500/gui2/widgets.py index 733af7c1a3..4e6230808a 100644 --- a/src/libprs500/gui2/widgets.py +++ b/src/libprs500/gui2/widgets.py @@ -29,7 +29,8 @@ class LocationModel(QAbstractListModel): self.text = ['Library', 'Reader\n%s available', 'Card\n%s available'] - self.free = [-1, -1] + self.free = [-1, -1] + self.highlight_row = 0 def rowCount(self, parent): return 1 + sum([1 for i in self.free if i >= 0]) @@ -46,7 +47,7 @@ class LocationModel(QAbstractListModel): elif role == Qt.SizeHintRole: if row == 1: return QVariant(QSize(150, 65)) - elif role == Qt.FontRole: + elif role == Qt.FontRole and row == self.highlight_row: font = QFont() font.setBold(True) data = QVariant(font) @@ -61,6 +62,10 @@ class LocationModel(QAbstractListModel): if cp == None: self.free[1] = -1 self.reset() + + def location_changed(self, row): + self.highlight_row = row + self.reset() class LocationView(QListView): @@ -68,12 +73,15 @@ class LocationView(QListView): QListView.__init__(self, parent) self.setModel(LocationModel(self)) self.reset() - QObject.connect(self.selectionModel(), SIGNAL('currentChanged(QModelIndex, QModelIndex)'), self.current_changed) - + QObject.connect(self.selectionModel(), SIGNAL('currentChanged(QModelIndex, QModelIndex)'), self.current_changed) def current_changed(self, current, previous): i = current.row() location = 'library' if i == 0 else 'main' if i == 1 else 'card' self.emit(SIGNAL('location_selected(PyQt_PyObject)'), location) + + def location_changed(self, row): + if 0 <= row and row <= 2: + self.model().location_changed(row) diff --git a/src/libprs500/library/database.py b/src/libprs500/library/database.py index 04b0385090..9213e1f547 100644 --- a/src/libprs500/library/database.py +++ b/src/libprs500/library/database.py @@ -589,7 +589,6 @@ class LibraryDatabase(object): order = 'DESC' - self.cache = self.conn.execute('select * from meta order by size').fetchall() self.cache = self.conn.execute('SELECT * from meta ORDER BY '+field+' ' +order).fetchall() self.data = self.cache @@ -882,16 +881,20 @@ class LibraryDatabase(object): self.conn.commit() - def delete_books(self, indices): + def index(self, id, cache=False): + data = self.cache if cache else self.data + for i in range(len(data)): + if data[i][0] == id: + return i + + def delete_book(self, id): ''' - Removes books from self.cache, self.data and underlying database. + Removes book from self.cache, self.data and underlying database. ''' - ids = [ self.id(i) for i in indices ] - cache_indices = [ idx for idx in range(len(self.cache)-1, -1, -1) if self.cache[idx][0] in ids ] - for idx in cache_indices: - self.cache[idx:idx+1] = [] - for idx in indices: - self.data[idx:idx+1] = [] - for id in ids: - self.conn.execute('DELETE FROM books WHERE id=?', (id,)) + try: + self.cache.pop(self.index(id, cache=True)) + self.data.pop(self.index(id, cache=False)) + except TypeError: #If data and cache are the same object + pass + self.conn.execute('DELETE FROM books WHERE id=?', (id,)) self.conn.commit() \ No newline at end of file