feat(slint): favorites tabs as history pages + homologated nav-bar/title
Each favorites tab is now its own history entry (NavEntry::Favorites{tab},
mirroring Discover) recorded from both the header nav and the in-view tab
bar, so back/forward moves between tabs instead of exiting Favorites. Add
the back/forward NavButtons at the same position as every other page
(11px top padding + 22px gap) — FavoritesView was the only view missing
it — and shrink the "Favorites" heading to Typography.section (the album
name size in AlbumView).
cc
This commit is contained in:
3 files changed
+44
-3
No files matched your search
@@ -465,6 +465,18 @@ fn apply_entry(
|
||||
ensure_for_you_loaded(runtime, weak, handle, image_cache);
|
||||
}
|
||||
}
|
||||
nav::NavEntry::Favorites { tab } => {
|
||||
if let Some(fav_tab) = favorites::FavTab::from_tab_id(&tab) {
|
||||
navigate_favorites(
|
||||
runtime.clone(),
|
||||
weak.clone(),
|
||||
handle,
|
||||
image_cache.clone(),
|
||||
fav_tab,
|
||||
&tab,
|
||||
);
|
||||
}
|
||||
}
|
||||
nav::NavEntry::Settings => {
|
||||
let _ = weak.upgrade_in_event_loop(|w| {
|
||||
w.global::<NavState>().set_view(ContentView::Settings);
|
||||
@@ -2476,7 +2488,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
}
|
||||
if let Some(tab) = favorites::FavTab::from_route(route.as_str()) {
|
||||
let tab_id = route.strip_prefix("favorites-").unwrap_or("tracks");
|
||||
nav::record(nav::NavEntry::Home); // favorites is not yet a history entry
|
||||
nav::record(nav::NavEntry::Favorites {
|
||||
tab: tab_id.to_string(),
|
||||
});
|
||||
if let Some(w) = weak.upgrade() {
|
||||
update_nav_flags(&w);
|
||||
}
|
||||
navigate_favorites(
|
||||
runtime.clone(),
|
||||
weak.clone(),
|
||||
@@ -2948,6 +2965,12 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
}
|
||||
return;
|
||||
};
|
||||
// Each favorites tab is its own history page (mirrors the
|
||||
// Discover tabs) so back/forward moves between them.
|
||||
nav::record(nav::NavEntry::Favorites { tab: id.to_string() });
|
||||
if let Some(w) = weak.upgrade() {
|
||||
update_nav_flags(&w);
|
||||
}
|
||||
navigate_favorites(
|
||||
runtime.clone(),
|
||||
weak.clone(),
|
||||
|
||||
@@ -19,6 +19,12 @@ pub enum NavEntry {
|
||||
Discover {
|
||||
tab: String,
|
||||
},
|
||||
/// A Library > Favorites tab page ("tracks" | "albums" | "artists" |
|
||||
/// "playlists" | "labels"). Each tab is its own history entry so
|
||||
/// back/forward moves between the favorites pages, mirroring Discover.
|
||||
Favorites {
|
||||
tab: String,
|
||||
},
|
||||
/// A Qobuz mix detail page ("daily" | "weekly" | "fav" | "top").
|
||||
Mix {
|
||||
kind: String,
|
||||
|
||||
@@ -22,6 +22,7 @@ import { AlbumCard } from "../discover/AlbumCard.slint";
|
||||
import { TrackRow } from "../primitives/TrackRow.slint";
|
||||
import { QbzIcon } from "../primitives/QbzIcon.slint";
|
||||
import { LoadingSpinner } from "../primitives/LoadingSpinner.slint";
|
||||
import { NavButtons } from "../shell/NavButtons.slint";
|
||||
|
||||
// One tab in the favorites tab bar.
|
||||
component FavTab inherits Rectangle {
|
||||
@@ -256,15 +257,26 @@ export component FavoritesView inherits Rectangle {
|
||||
width: parent.width;
|
||||
padding-left: 32px;
|
||||
padding-right: 32px;
|
||||
padding-top: 20px;
|
||||
padding-top: 11px;
|
||||
padding-bottom: 100px;
|
||||
spacing: 0px;
|
||||
alignment: start;
|
||||
|
||||
// Back / forward nav buttons — same position as every other
|
||||
// page (11px top padding, then a 22px gap to the header).
|
||||
HorizontalLayout {
|
||||
alignment: start;
|
||||
NavButtons { }
|
||||
}
|
||||
|
||||
Rectangle { height: 22px; }
|
||||
|
||||
// Page title — same size as the album name in AlbumView
|
||||
// (Typography.section), not the larger Typography.title.
|
||||
Text {
|
||||
text: @tr("Favorites");
|
||||
color: Theme.text-primary;
|
||||
font-size: Typography.title;
|
||||
font-size: Typography.section;
|
||||
font-weight: Typography.bold;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user