feat(core,gui): phase 1 shell — per-page headers, sidebar footer, Preferences dialog

Restructure the app shell per docs/UI_UX_PLAN.md phase 1:

- Every destination page gets its own AdwHeaderBar via page_frame(), with
  page actions packed into it and a busy spinner beside the title.
- The sidebar is regrouped (files, then a Sync section) with a primary menu
  (Preferences, Keyboard Shortcuts, About) and a footer showing sync state,
  storage quota and the account with Sign Out.
- The Settings page is gone: startup, folder location, appearance and cache
  options move into an AdwPreferencesDialog (Ctrl+,); transfers move to the
  Sync page; developer details move into About's debug info.
- Inline CSS moves to a gresource stylesheet using libadwaita colour
  variables. The system accent is the default; the Proton purple accent is
  an opt-in preference (new `proton_accent` config key, defaults off).
- Add a keyboard shortcuts dialog (Ctrl+?).

libadwaita requirement stays at 1.5, so Ubuntu 24.04 remains supported.
This commit is contained in:
nvrl committed 2026-09-23 01:50:37 +02:00
1 parent cc308ac25a
commit cf9e1665ca
17 files changed
+861 -579

No files matched your search

+8
View File
@@ -119,6 +119,11 @@ pub struct AppConfig {
/// field.
#[serde(default)]
pub prompt: Option<PromptConfig>,
/// Paint the desktop app in Proton purple instead of the system accent
/// colour. `None` means "follow the system". Defaulted for configs
/// predating the field.
#[serde(default)]
pub proton_accent: Option<bool>,
}
impl Default for AppConfig {
@@ -133,6 +138,7 @@ impl Default for AppConfig {
conflict_sweep: None,
open_with: None,
prompt: None,
proton_accent: None,
}
}
}
@@ -477,11 +483,13 @@ mod tests {
conflict_sweep: Some(SweepMode::Enforce),
open_with: None,
prompt: None,
proton_accent: Some(true),
};
let json = serde_json::to_string(&config).unwrap();
let decoded: AppConfig = serde_json::from_str(&json).unwrap();
assert_eq!(decoded.app_version, "external-drive-test-client@1.0.0");
assert_eq!(decoded.user_agent, "test-agent/1.0");
assert_eq!(decoded.proton_accent, Some(true));
}
#[test]