feat(locallibrary): complete Albums 1:1 + dedicated local album view with versions
Albums tab — full 1:1 with Tauri in one pass: - Switch from the chunked-paginated grid to a full-load + in-memory derive so grouping/filtering span the whole set. derive_albums = search + sort + group (off / by letter with A-Z jump / by artist, both with section headers) + the quality/format/source filter (1:1 with matchesQualityFilters: OR within a group, AND between groups; empty group passes). - Grid/list view toggle; the list view shows a SOURCE column (Local/Offline/ Plex), placed after TYPE. Filter popup now FLOATS (sibling of the content layout, not a layout slot) with an active-count badge. Fixed the year sort (sort_album_items maps year-asc/desc — was also silently broken in Folders). - Album covers dual-set by id across the full set + visible + grouped sections. Dedicated local album view — SEPARATE from the Qobuz AlbumView: - New ContentView::local-album + NavEntry::LocalAlbum + ui/album/LocalAlbumView.slint, reusing TrackRow/NavButtons/CircleAction/QualityBadge internals but ONLY local actions (play all / shuffle / edit tags / add to playlist) — no Qobuz chrome. - Versions: an album's tracks are split by source directory into versions, so multiple copies of the same album no longer merge into a duplicated track list. Best-quality version is the default; a source-icon version picker (hard-drive / Qobuz / Plex glyph in both the selected display and the options) switches the shown copy in place. The album cover is the best-quality version that has one, falling through versions, else a placeholder (covers backfilled from disk via fill_missing_covers). Header padding-top 11px matches the app. Fix: Artists tab deadlock — fetch_missing_artist_images snapshotted names with a blocking rx.recv() called from inside an event-loop closure, freezing the UI (static spinner, no error). Names are now snapshotted on the UI thread and passed in; the worker never blocks the event loop. cc
This commit is contained in:
13 files changed
+1440
-360
No files matched your search
@@ -18,7 +18,7 @@ import { AppShell } from "shell/AppShell.slint";
|
||||
import { Toast } from "primitives/Toast.slint";
|
||||
|
||||
// Re-export the state globals so the Rust layer can populate them.
|
||||
export { HomeState, HomeActions, DiscoverBrowseState, DiscoverBrowseActions, ForYouState, MixState, GenreFilterState, GenreFilterActions, AlbumState, ArtistState, NavState, SessionState, SettingsState, AlbumActions, ArtistActions, ArtworkActions, NowPlayingState, QueueState, SearchState, SearchActions, NetworkSidebarState, NetworkSidebarActions, MusicianState, MusicianActions, LabelState, LabelActions, LocationViewState, LocationViewActions, FavoritesState, FavoritesActions, PlaylistPickerState, PlaylistPickerActions, PlaylistState, PlaylistActions, SidebarState, SidebarActions, CreatePlaylistState, CreatePlaylistActions, EditPlaylistState, EditPlaylistActions, CreateFolderState, CreateFolderActions, DragState, DragActions, PlaylistManagerState, PlaylistManagerActions, OfflineManagerState, OfflineManagerActions, LocalLibraryState, LocalLibraryActions, LibraryFoldersState, LibFolderEditState, LibraryManageActions, LibraryScanState, TagEditorState, TagEditorActions, FolderEditState, FolderEditActions, ToastState } from "state.slint";
|
||||
export { HomeState, HomeActions, DiscoverBrowseState, DiscoverBrowseActions, ForYouState, MixState, GenreFilterState, GenreFilterActions, AlbumState, ArtistState, NavState, SessionState, SettingsState, AlbumActions, ArtistActions, ArtworkActions, NowPlayingState, QueueState, SearchState, SearchActions, NetworkSidebarState, NetworkSidebarActions, MusicianState, MusicianActions, LabelState, LabelActions, LocationViewState, LocationViewActions, FavoritesState, FavoritesActions, PlaylistPickerState, PlaylistPickerActions, PlaylistState, PlaylistActions, SidebarState, SidebarActions, CreatePlaylistState, CreatePlaylistActions, EditPlaylistState, EditPlaylistActions, CreateFolderState, CreateFolderActions, DragState, DragActions, PlaylistManagerState, PlaylistManagerActions, OfflineManagerState, OfflineManagerActions, LocalLibraryState, LocalLibraryActions, LibraryFoldersState, LibFolderEditState, LibraryManageActions, LibraryScanState, LibAlbumFilterState, LocalAlbumState, LocalAlbumActions, TagEditorState, TagEditorActions, FolderEditState, FolderEditActions, ToastState } from "state.slint";
|
||||
|
||||
// Which top-level screen is shown. The app starts on `splash` while it
|
||||
// restores a saved session, then resolves to `shell` or `login`.
|
||||
|
||||
Reference in new issue
Block a user