diff --git a/app/gui.py b/app/gui.py index ddc0185..e6da7c2 100644 --- a/app/gui.py +++ b/app/gui.py @@ -1831,6 +1831,8 @@ class StorePage(QWidget): self._lib_cover = {} # norm -> (release_id, system) self._psp_norm = set() # norm of library items installed on the PSP self._cover_attempted = set() + self._cover_busy = False + self._date_busy = False self._generation = 0 self._scan_gen = 0 self._meta_gen = 0 @@ -2180,6 +2182,8 @@ class StorePage(QWidget): self._cover_next = 0 self._date_queue = [] self._date_next = 0 + self._cover_busy = False + self._date_busy = False self._cover_attempted.clear() self._placeholder = QIcon(_placeholder_pixmap(self.ICON_W, self.ICON_H)) @@ -2305,13 +2309,14 @@ class StorePage(QWidget): self._load_date_batch(self.DATE_BATCH) def _load_cover_batch(self, n): - if self._closing or not self._cover_queue: + if self._closing or not self._cover_queue or self._cover_busy: return end = min(self._cover_next + n, len(self._cover_queue)) if self._cover_next >= end: return tasks = self._cover_queue[self._cover_next:end] self._cover_next = end + self._cover_busy = True self._start_cover_loader(self._generation, tasks) def _active_scrollbar(self): @@ -2342,13 +2347,14 @@ class StorePage(QWidget): self._fill_timer.start() def _load_date_batch(self, n): - if self._closing or not self._date_queue: + if self._closing or not self._date_queue or self._date_busy: return end = min(self._date_next + n, len(self._date_queue)) if self._date_next >= end: return tasks = self._date_queue[self._date_next:end] self._date_next = end + self._date_busy = True self._start_date_loader(self._generation, tasks) def _start_date_loader(self, gen, tasks): @@ -2359,12 +2365,22 @@ class StorePage(QWidget): loader.moveToThread(thread) thread.started.connect(loader.run) loader.loaded.connect(self._on_date_loaded) + loader.finished.connect(self._on_date_batch_done) loader.finished.connect(thread.quit) thread.finished.connect(self._on_thread_finished) self._threads.append(thread) self._loaders.append(loader) thread.start() + def _on_date_batch_done(self): + if self._closing: + return + loader = self.sender() + if getattr(loader, "gen", None) != self._generation: + return + self._date_busy = False + self._load_date_batch(self.DATE_BATCH) + def _on_date_loaded(self, gen, row, date): if self._closing or gen != self._generation or not date: return @@ -2382,12 +2398,22 @@ class StorePage(QWidget): loader.moveToThread(thread) thread.started.connect(loader.run) loader.loaded.connect(self._on_cover_loaded) + loader.finished.connect(self._on_cover_batch_done) loader.finished.connect(thread.quit) thread.finished.connect(self._on_thread_finished) self._threads.append(thread) self._loaders.append(loader) thread.start() + def _on_cover_batch_done(self): + if self._closing: + return + loader = self.sender() + if getattr(loader, "gen", None) != self._generation: + return + self._cover_busy = False + self._load_cover_batch(self.COVER_SCROLL_BATCH) + def _on_cover_loaded(self, gen, row, image): if self._closing or gen != self._generation: return