Add tab config to settings page

* Allow tabs to be configured globally
* Update each tab when global tab config changes
This commit is contained in:
Josh Megnauth 2024-02-17 02:07:21 -05:00 committed by Jeremy Soller
parent 25a0850667
commit 3167a9936c
2 changed files with 56 additions and 16 deletions

View file

@ -32,6 +32,9 @@ properties = Properties
## Settings ## Settings
settings = Settings settings = Settings
settings-tab = Tab
settings-hidden = Hidden files
settings-show-hidden = Show hidden files
### Appearance ### Appearance
appearance = Appearance appearance = Appearance

View file

@ -26,7 +26,7 @@ use std::{
}; };
use crate::{ use crate::{
config::{AppTheme, Config, CONFIG_VERSION}, config::{AppTheme, Config, TabConfig, CONFIG_VERSION},
fl, home_dir, fl, home_dir,
key_bind::{key_binds, KeyBind}, key_bind::{key_binds, KeyBind},
menu, mouse_area, menu, mouse_area,
@ -124,6 +124,7 @@ pub enum Message {
TabNext, TabNext,
TabPrev, TabPrev,
TabClose(Option<segmented_button::Entity>), TabClose(Option<segmented_button::Entity>),
TabConfig(TabConfig),
TabContextAction(segmented_button::Entity, Action), TabContextAction(segmented_button::Entity, Action),
TabContextMenu(segmented_button::Entity, Option<Point>), TabContextMenu(segmented_button::Entity, Option<Point>),
TabMessage(Option<segmented_button::Entity>, tab::Message), TabMessage(Option<segmented_button::Entity>, tab::Message),
@ -370,21 +371,40 @@ impl App {
AppTheme::Light => 2, AppTheme::Light => 2,
AppTheme::System => 0, AppTheme::System => 0,
}; };
widget::settings::view_column(vec![widget::settings::view_section(fl!("appearance")) let hidden_selected = self.config.tab.show_hidden;
.add( widget::settings::view_column(vec![
widget::settings::item::builder(fl!("theme")).control(widget::dropdown( widget::settings::view_section(fl!("appearance"))
&self.app_themes, .add(
Some(app_theme_selected), widget::settings::item::builder(fl!("theme")).control(widget::dropdown(
move |index| { &self.app_themes,
Message::AppTheme(match index { Some(app_theme_selected),
1 => AppTheme::Dark, move |index| {
2 => AppTheme::Light, Message::AppTheme(match index {
_ => AppTheme::System, 1 => AppTheme::Dark,
}) 2 => AppTheme::Light,
}, _ => AppTheme::System,
)), })
) },
.into()]) )),
)
.into(),
widget::settings::view_section(fl!("settings-tab"))
.add(
widget::settings::item::builder(fl!("settings-hidden")).control(
widget::checkbox(
fl!("settings-show-hidden"),
hidden_selected,
|show_hidden| {
Message::TabConfig(TabConfig {
show_hidden,
..self.config.tab
})
},
),
),
)
.into(),
])
.into() .into()
} }
} }
@ -754,6 +774,23 @@ impl Application for App {
return Command::batch([self.update_title(), self.update_watcher()]); return Command::batch([self.update_title(), self.update_watcher()]);
} }
Message::TabConfig(config) => {
// Tabs are collected first to placate the borrowck
let tabs: Vec<_> = self.tab_model.iter().collect();
// Update main conf and each tab with the new config
let commands: Vec<_> = std::iter::once(self.update_config())
.chain(tabs.into_iter().map(|entity| {
let config = config.clone();
self.update(Message::TabMessage(
Some(entity),
tab::Message::Config(config),
))
}))
.collect();
config_set!(tab, config);
return Command::batch(commands);
}
Message::TabContextAction(entity, action) => { Message::TabContextAction(entity, action) => {
match self.tab_model.data_mut::<Tab>(entity) { match self.tab_model.data_mut::<Tab>(entity) {
Some(tab) => { Some(tab) => {