better
This commit is contained in:
parent
c55fe47905
commit
838c8616dd
3 changed files with 1238 additions and 64 deletions
1170
logs/app.log
1170
logs/app.log
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
|
@ -4934,6 +4934,7 @@ class DownloadsPage(QWidget):
|
||||||
self.displayed_results = 0 # Track how many results are currently displayed
|
self.displayed_results = 0 # Track how many results are currently displayed
|
||||||
self.results_per_page = 15 # Show 15 results at a time
|
self.results_per_page = 15 # Show 15 results at a time
|
||||||
self.is_loading_more = False # Prevent multiple simultaneous loads
|
self.is_loading_more = False # Prevent multiple simultaneous loads
|
||||||
|
self._results_to_load_queue = []
|
||||||
self.status_processing_pool = QThreadPool()
|
self.status_processing_pool = QThreadPool()
|
||||||
self.status_processing_pool.setMaxThreadCount(1) # Only one status worker at a time.
|
self.status_processing_pool.setMaxThreadCount(1) # Only one status worker at a time.
|
||||||
self._is_status_update_running = False
|
self._is_status_update_running = False
|
||||||
|
|
@ -6713,77 +6714,34 @@ class DownloadsPage(QWidget):
|
||||||
if scroll_percentage >= 0.9 and self.displayed_results < len(self.current_filtered_results):
|
if scroll_percentage >= 0.9 and self.displayed_results < len(self.current_filtered_results):
|
||||||
self.load_more_results()
|
self.load_more_results()
|
||||||
|
|
||||||
|
# In downloads.py, find and REPLACE the existing load_more_results method with this:
|
||||||
|
|
||||||
def load_more_results(self):
|
def load_more_results(self):
|
||||||
"""Load the next batch of search results (respecting current filter)"""
|
"""
|
||||||
|
Prepares a batch of results and initiates the staggered loading process.
|
||||||
|
"""
|
||||||
if self.is_loading_more or not self.current_filtered_results:
|
if self.is_loading_more or not self.current_filtered_results:
|
||||||
return
|
return
|
||||||
|
|
||||||
self.is_loading_more = True
|
self.is_loading_more = True
|
||||||
|
|
||||||
# Calculate how many more results to show from filtered results
|
# Calculate how many more results to show
|
||||||
start_index = self.displayed_results
|
start_index = self.displayed_results
|
||||||
end_index = min(start_index + self.results_per_page, len(self.current_filtered_results))
|
end_index = min(start_index + self.results_per_page, len(self.current_filtered_results))
|
||||||
|
|
||||||
# Temporarily disable layout updates for smoother batch loading
|
# Get the batch of results to load and add them to our queue
|
||||||
self.search_results_widget.setUpdatesEnabled(False)
|
results_to_add = self.current_filtered_results[start_index:end_index]
|
||||||
|
self._results_to_load_queue.extend(results_to_add)
|
||||||
|
|
||||||
# Add result items to UI from filtered results
|
# Update status to show that we are loading more
|
||||||
for i in range(start_index, end_index):
|
self.update_search_status(f"✨ Loading more results...", "#1db954")
|
||||||
result = self.current_filtered_results[i]
|
|
||||||
|
|
||||||
# Create appropriate UI component based on result type
|
# Kick off the staggered loading process by loading the first item
|
||||||
if isinstance(result, AlbumResult):
|
if self._results_to_load_queue:
|
||||||
# Create expandable album result item
|
QTimer.singleShot(0, self._load_next_result_item)
|
||||||
result_item = AlbumResultItem(result)
|
|
||||||
result_item.album_download_requested.connect(self.start_album_download)
|
|
||||||
result_item.matched_album_download_requested.connect(self.start_matched_album_download)
|
|
||||||
result_item.track_download_requested.connect(self.start_download) # Individual track downloads
|
|
||||||
result_item.track_stream_requested.connect(lambda search_result, track_item: self.start_stream(search_result, track_item)) # Individual track streaming
|
|
||||||
else:
|
|
||||||
# Create track result item (play + download)
|
|
||||||
result_item = SearchResultItem(result)
|
|
||||||
result_item.download_requested.connect(self.start_download)
|
|
||||||
result_item.stream_requested.connect(lambda search_result, item=result_item: self.start_stream(search_result, item))
|
|
||||||
result_item.expansion_requested.connect(self.handle_expansion_request)
|
|
||||||
|
|
||||||
# Insert before the stretch (which is always last)
|
|
||||||
insert_position = self.search_results_layout.count() - 1
|
|
||||||
self.search_results_layout.insertWidget(insert_position, result_item)
|
|
||||||
|
|
||||||
# Re-enable updates and force layout refresh
|
|
||||||
self.search_results_widget.setUpdatesEnabled(True)
|
|
||||||
self.search_results_widget.updateGeometry()
|
|
||||||
self.search_results_layout.update()
|
|
||||||
|
|
||||||
# Force scroll area to recognize new content size
|
|
||||||
self.search_results_scroll.updateGeometry()
|
|
||||||
|
|
||||||
# Update displayed count
|
|
||||||
self.displayed_results = end_index
|
|
||||||
|
|
||||||
# Update status based on filtered results
|
|
||||||
total_filtered = len(self.current_filtered_results)
|
|
||||||
if self.displayed_results >= total_filtered:
|
|
||||||
# Determine filter status text
|
|
||||||
if self.current_filter == "albums":
|
|
||||||
filter_text = "albums"
|
|
||||||
elif self.current_filter == "singles":
|
|
||||||
filter_text = "singles"
|
|
||||||
else:
|
|
||||||
filter_text = "results"
|
|
||||||
self.update_search_status(f"✨ Showing all {total_filtered} {filter_text}", "#1db954")
|
|
||||||
else:
|
else:
|
||||||
remaining = total_filtered - self.displayed_results
|
self.is_loading_more = False
|
||||||
# Determine filter status text
|
|
||||||
if self.current_filter == "albums":
|
|
||||||
filter_text = "albums"
|
|
||||||
elif self.current_filter == "singles":
|
|
||||||
filter_text = "singles"
|
|
||||||
else:
|
|
||||||
filter_text = "results"
|
|
||||||
self.update_search_status(f"✨ Showing {self.displayed_results} of {total_filtered} {filter_text} (scroll for {remaining} more)", "#1db954")
|
|
||||||
|
|
||||||
self.is_loading_more = False
|
|
||||||
|
|
||||||
def handle_expansion_request(self, requesting_item):
|
def handle_expansion_request(self, requesting_item):
|
||||||
"""Handle accordion-style expansion where only one item can be expanded at a time"""
|
"""Handle accordion-style expansion where only one item can be expanded at a time"""
|
||||||
|
|
@ -10351,7 +10309,53 @@ class DownloadsPage(QWidget):
|
||||||
print(f"❌ Error matching track to Spotify title: {e}")
|
print(f"❌ Error matching track to Spotify title: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# In class DownloadsPage, add this new method
|
# In downloads.py, add this new method inside the DownloadsPage class (e.g., after load_more_results)
|
||||||
|
|
||||||
|
def _load_next_result_item(self):
|
||||||
|
"""
|
||||||
|
Processes one item from the loading queue and schedules the next.
|
||||||
|
This breaks up the work into small, non-blocking chunks.
|
||||||
|
"""
|
||||||
|
if not self._results_to_load_queue:
|
||||||
|
self.is_loading_more = False
|
||||||
|
return
|
||||||
|
|
||||||
|
# Pop one result from the front of the queue
|
||||||
|
result = self._results_to_load_queue.pop(0)
|
||||||
|
|
||||||
|
# Create the appropriate widget for the result
|
||||||
|
if isinstance(result, AlbumResult):
|
||||||
|
result_item = AlbumResultItem(result)
|
||||||
|
result_item.album_download_requested.connect(self.start_album_download)
|
||||||
|
result_item.matched_album_download_requested.connect(self.start_matched_album_download)
|
||||||
|
result_item.track_download_requested.connect(self.start_download)
|
||||||
|
result_item.track_stream_requested.connect(lambda r, i=result_item: self.start_stream(r, i))
|
||||||
|
else:
|
||||||
|
result_item = SearchResultItem(result)
|
||||||
|
result_item.download_requested.connect(self.start_download)
|
||||||
|
result_item.stream_requested.connect(lambda r, i=result_item: self.start_stream(r, i))
|
||||||
|
result_item.expansion_requested.connect(self.handle_expansion_request)
|
||||||
|
|
||||||
|
# Insert the newly created widget into the layout
|
||||||
|
insert_position = self.search_results_layout.count() - 1
|
||||||
|
self.search_results_layout.insertWidget(insert_position, result_item)
|
||||||
|
self.displayed_results += 1
|
||||||
|
|
||||||
|
# If there are more items in the queue, schedule the next one immediately
|
||||||
|
if self._results_to_load_queue:
|
||||||
|
QTimer.singleShot(0, self._load_next_result_item)
|
||||||
|
else:
|
||||||
|
# All items for this batch are loaded
|
||||||
|
self.is_loading_more = False
|
||||||
|
# Update the status message now that loading is complete
|
||||||
|
total_filtered = len(self.current_filtered_results)
|
||||||
|
if self.displayed_results < total_filtered:
|
||||||
|
remaining = total_filtered - self.displayed_results
|
||||||
|
self.update_search_status(f"✨ Showing {self.displayed_results} of {total_filtered} results (scroll for {remaining} more)", "#1db954")
|
||||||
|
else:
|
||||||
|
self.update_search_status(f"✨ Showing all {total_filtered} results", "#1db954")
|
||||||
|
|
||||||
|
# In class DownloadsPage, add this new method
|
||||||
|
|
||||||
def _handle_processed_status_updates(self, results):
|
def _handle_processed_status_updates(self, results):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue