diff --git a/i18n/en/cosmic_files.ftl b/i18n/en/cosmic_files.ftl index 9139d5da..e8d8d499 100644 --- a/i18n/en/cosmic_files.ftl +++ b/i18n/en/cosmic_files.ftl @@ -245,6 +245,12 @@ match-desktop = Match desktop dark = Dark light = Light +## NavBar Size +navbar-size = Sidebar Size +small = Small +medium = Medium +large = Large + # Context menu add-to-sidebar = Add to sidebar compress = Compress diff --git a/src/app.rs b/src/app.rs index 6c658745..c95d376a 100644 --- a/src/app.rs +++ b/src/app.rs @@ -61,7 +61,6 @@ use trash::TrashItem; #[cfg(feature = "wayland")] use wayland_client::{protocol::wl_output::WlOutput, Proxy}; -use crate::operation::{OperationError, OperationErrorType}; use crate::{ clipboard::{ClipboardCopy, ClipboardKind, ClipboardPaste}, config::{AppTheme, Config, DesktopConfig, Favorite, IconSizes, TabConfig}, @@ -74,6 +73,10 @@ use crate::{ spawn_detached::spawn_detached, tab::{self, HeadingOptions, ItemMetadata, Location, Tab, HOVER_DURATION}, }; +use crate::{ + config::NavBarSize, + operation::{OperationError, OperationErrorType}, +}; #[derive(Clone, Debug)] pub enum Mode { @@ -274,6 +277,7 @@ impl MenuAction for NavMenuAction { pub enum Message { AddToSidebar(Option), AppTheme(AppTheme), + NavBarSize(NavBarSize), CloseToast(widget::ToastId), Compress(Option), Config(Config), @@ -520,6 +524,7 @@ pub struct App { config: Config, mode: Mode, app_themes: Vec, + bar_sizes: Vec, context_page: ContextPage, dialog_pages: VecDeque, dialog_text_input: widget::Id, @@ -1544,6 +1549,24 @@ impl App { }, )) }) + .add({ + let nav_bar_size_selected = match self.config.nav_bar_size { + NavBarSize::Small => 0, + NavBarSize::Medium => 1, + NavBarSize::Large => 2, + }; + widget::settings::item::builder(fl!("navbar-size")).control(widget::dropdown( + &self.bar_sizes, + Some(nav_bar_size_selected), + move |index| { + Message::NavBarSize(match index { + 0 => NavBarSize::Small, + 1 => NavBarSize::Medium, + _ => NavBarSize::Large, + }) + }, + )) + }) .into()]) .into() } @@ -1590,6 +1613,7 @@ impl Application for App { } let app_themes = vec![fl!("match-desktop"), fl!("dark"), fl!("light")]; + let bar_sizes = vec![fl!("small"), fl!("medium"), fl!("large")]; let key_binds = key_binds(&match flags.mode { Mode::App => tab::Mode::App, @@ -1607,6 +1631,7 @@ impl Application for App { config: flags.config, mode: flags.mode, app_themes, + bar_sizes, context_page: ContextPage::Preview(None, PreviewKind::Selected), dialog_pages: VecDeque::new(), dialog_text_input: widget::Id::unique(), @@ -1701,7 +1726,7 @@ impl Application for App { .into_container(); if !self.core().is_condensed() { - nav = nav.max_width(280); + nav = nav.max_width(self.config.nav_bar_size.size()); } Some(Element::from( @@ -1907,6 +1932,10 @@ impl Application for App { config_set!(app_theme, app_theme); return self.update_config(); } + Message::NavBarSize(nav_bar_size) => { + config_set!(nav_bar_size, nav_bar_size); + return self.update_config(); + } Message::Compress(entity_opt) => { let paths = self.selected_paths(entity_opt); if let Some(current_path) = paths.first() { diff --git a/src/config.rs b/src/config.rs index e071a2b6..92d4f983 100644 --- a/src/config.rs +++ b/src/config.rs @@ -51,6 +51,23 @@ impl AppTheme { } } +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] +pub enum NavBarSize { + Small, + Medium, + Large, +} + +impl NavBarSize { + pub fn size(&self) -> f32 { + match self { + NavBarSize::Small => 64.0, + NavBarSize::Medium => 160.0, + NavBarSize::Large => 280.0, + } + } +} + #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] pub enum Favorite { Home, @@ -99,6 +116,7 @@ impl Favorite { #[serde(default)] pub struct Config { pub app_theme: AppTheme, + pub nav_bar_size: NavBarSize, pub desktop: DesktopConfig, pub favorites: Vec, pub show_details: bool, @@ -139,6 +157,7 @@ impl Default for Config { fn default() -> Self { Self { app_theme: AppTheme::System, + nav_bar_size: NavBarSize::Large, desktop: DesktopConfig::default(), favorites: vec![ Favorite::Home,