diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index c298147497..525fd2aaa1 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -168,6 +168,11 @@ class BooksModel(QAbstractTableModel): def search_tokens(self, text): return text_to_tokens(text) + + def books_added(self, num): + if num > 0: + self.beginInsertRows(QModelIndex(), 0, num-1) + self.endInsertRows() def search(self, text, refinement, reset=True): tokens, OR = self.search_tokens(text) diff --git a/src/calibre/gui2/main.py b/src/calibre/gui2/main.py index 34f720fce9..c5fb6ba86d 100644 --- a/src/calibre/gui2/main.py +++ b/src/calibre/gui2/main.py @@ -529,16 +529,18 @@ in which you want to store your books files. Any existing books will be automati paths[i] = path else: formats[i] = 'zip' - duplicates = model.add_books(paths, formats, metadata) + duplicates, number_added = model.add_books(paths, formats, metadata) if duplicates: files = _('

Books with the same title as the following already exist in the database. Add them anyway?

', parent=self) if d.exec_() == QDialog.Accepted: - model.add_books(*duplicates, **dict(add_duplicates=True)) - self.library_view.sortByColumn(3, Qt.DescendingOrder) - model.research() + num = model.add_books(*duplicates, **dict(add_duplicates=True))[1] + number_added += num + #self.library_view.sortByColumn(3, Qt.DescendingOrder) + #model.research() + model.books_added(number_added) else: self.upload_books(paths, names, infos, on_card=on_card) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 2fba3118da..3e040988de 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -48,6 +48,7 @@ class CoverCache(QThread): self.load_queue_lock = QReadWriteLock(QReadWriteLock.Recursive) self.cache = {} self.cache_lock = QReadWriteLock() + self.id_map_stale = True self.keep_running = True def build_id_map(self): @@ -61,6 +62,7 @@ class CoverCache(QThread): except: continue self.id_map_lock.unlock() + self.id_map_stale = False def set_cache(self, ids): @@ -80,9 +82,9 @@ class CoverCache(QThread): def run(self): while self.keep_running: - if self.id_map is None: + if self.id_map is None or self.id_map_stale: self.build_id_map() - while True: + while True: # Load images from the load queue self.load_queue_lock.lockForWrite() try: id = self.load_queue.popleft() @@ -102,6 +104,8 @@ class CoverCache(QThread): self.id_map_lock.lockForRead() if id in self.id_map.keys(): path = self.id_map[id] + else: + self.id_map_stale = True self.id_map_lock.unlock() if path and os.access(path, os.R_OK): try: @@ -215,6 +219,15 @@ class ResultCache(object): self._data[id] = conn.execute('SELECT * from meta WHERE id=?', (id,)).fetchone() return map(self.row, ids) + def books_added(self, ids, conn): + if not ids: + return + self._data.extend(repeat(None, max(ids)-len(self._data)+2)) + for id in ids: + self._data[id] = conn.execute('SELECT * from meta WHERE id=?', (id,)).fetchone() + self._map[0:0] = ids + self._map_filtered[0:0] = ids + def refresh(self, db, field, ascending): field = field.lower() method = getattr(self, 'sort_on_' + self.METHOD_MAP[field]) @@ -867,13 +880,15 @@ class LibraryDatabase2(LibraryDatabase): if not hasattr(path, 'read'): stream.close() self.conn.commit() + if ids: + self.data.books_added(ids, self.conn) if duplicates: paths = tuple(duplicate[0] for duplicate in duplicates) formats = tuple(duplicate[1] for duplicate in duplicates) metadata = tuple(duplicate[2] for duplicate in duplicates) uris = tuple(duplicate[3] for duplicate in duplicates) - return (paths, formats, metadata, uris) - return None + return (paths, formats, metadata, uris), len(ids) + return None, len(ids) def import_book(self, mi, formats): series_index = 1 if mi.series_index is None else mi.series_index @@ -890,6 +905,7 @@ class LibraryDatabase2(LibraryDatabase): stream = open(path, 'rb') self.add_format(id, ext, stream, index_is_id=True) self.conn.commit() + self.data.books_added([id], self.conn) self.notify('add', [id]) def move_library_to(self, newloc):