From b43a5bda691278a4449bad980bfdbb2d1e15bc19 Mon Sep 17 00:00:00 2001 From: Csaba Date: Tue, 12 Nov 2024 22:23:54 +0100 Subject: [PATCH] added widget_spacing to config --- komorebi-bar/src/bar.rs | 14 ++++++++---- komorebi-bar/src/battery.rs | 11 ++------- komorebi-bar/src/config.rs | 9 ++++---- komorebi-bar/src/cpu.rs | 11 ++------- komorebi-bar/src/date.rs | 11 ++------- komorebi-bar/src/group.rs | 44 ++++++++++++++++++++---------------- komorebi-bar/src/komorebi.rs | 17 ++++---------- komorebi-bar/src/main.rs | 2 -- komorebi-bar/src/media.rs | 11 ++------- komorebi-bar/src/memory.rs | 11 ++------- komorebi-bar/src/network.rs | 15 ++++-------- komorebi-bar/src/storage.rs | 11 ++------- komorebi-bar/src/time.rs | 11 ++------- komorebi-bar/src/widget.rs | 6 ++++- 14 files changed, 68 insertions(+), 116 deletions(-) diff --git a/komorebi-bar/src/bar.rs b/komorebi-bar/src/bar.rs index 8955dfc8..c3548989 100644 --- a/komorebi-bar/src/bar.rs +++ b/komorebi-bar/src/bar.rs @@ -349,7 +349,9 @@ impl Komobar { let mut komobar = Self { config: config.clone(), render_config: Rc::new(RefCell::new(RenderConfig { + spacing: 0.0, grouping: Grouping::None, + alignment: None, })), komorebi_notification_state: None, left_widgets: vec![], @@ -466,9 +468,7 @@ impl eframe::App for Komobar { Frame::none().fill(*self.bg_color.borrow()) }; - // NOTE: is there a better way? let mut render_config = self.render_config.borrow_mut(); - let render_config_clone = *render_config; CentralPanel::default().frame(frame).show(ctx, |ui| { // Apply grouping logic for the bar as a whole @@ -476,18 +476,24 @@ impl eframe::App for Komobar { ui.horizontal_centered(|ui| { // Left-aligned widgets layout ui.with_layout(Layout::left_to_right(Align::Center), |ui| { + let mut render_conf = *render_config; + render_conf.alignment = Some(Alignment::Left); + render_config.grouping.apply_on_alignment(ui, |ui| { for w in &mut self.left_widgets { - w.render(ctx, ui, render_config_clone, Alignment::Left); + w.render(ctx, ui, render_conf); } }); }); // Right-aligned widgets layout ui.with_layout(Layout::right_to_left(Align::Center), |ui| { + let mut render_conf = *render_config; + render_conf.alignment = Some(Alignment::Right); + render_config.grouping.apply_on_alignment(ui, |ui| { for w in &mut self.right_widgets { - w.render(ctx, ui, render_config_clone, Alignment::Right); + w.render(ctx, ui, render_conf); } }); }) diff --git a/komorebi-bar/src/battery.rs b/komorebi-bar/src/battery.rs index 67ebb2a2..ee0668d3 100644 --- a/komorebi-bar/src/battery.rs +++ b/komorebi-bar/src/battery.rs @@ -1,4 +1,3 @@ -use crate::bar::Alignment; use crate::config::LabelPrefix; use crate::widget::BarWidget; use crate::widget::RenderConfig; @@ -116,13 +115,7 @@ impl Battery { } impl BarWidget for Battery { - fn render( - &mut self, - ctx: &Context, - ui: &mut Ui, - mut config: RenderConfig, - alignment: Alignment, - ) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let output = self.output(); if !output.is_empty() { @@ -154,7 +147,7 @@ impl BarWidget for Battery { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { ui.add( Label::new(layout_job) .selectable(false) diff --git a/komorebi-bar/src/config.rs b/komorebi-bar/src/config.rs index fc394813..259d6a09 100644 --- a/komorebi-bar/src/config.rs +++ b/komorebi-bar/src/config.rs @@ -33,6 +33,8 @@ pub struct KomobarConfig { pub theme: Option, /// Alpha value for the color transparency [[0-255]] (default: 200) pub transparency_alpha: Option, + /// Spacing between widgets + pub widget_spacing: Option, /// Visual grouping for widgets pub grouping: Option, /// Left side widgets (ordered left-to-right) @@ -73,10 +75,9 @@ impl KomobarConfig { impl From<&KomobarConfig> for RenderConfig { fn from(value: &KomobarConfig) -> Self { RenderConfig { - grouping: match value.grouping { - Some(grouping) => grouping, - None => Grouping::None, - }, + spacing: value.widget_spacing.unwrap_or(10.0), + grouping: value.grouping.unwrap_or(Grouping::None), + alignment: None, } } } diff --git a/komorebi-bar/src/cpu.rs b/komorebi-bar/src/cpu.rs index 065e4938..ff7e9a18 100644 --- a/komorebi-bar/src/cpu.rs +++ b/komorebi-bar/src/cpu.rs @@ -1,4 +1,3 @@ -use crate::bar::Alignment; use crate::config::LabelPrefix; use crate::widget::BarWidget; use crate::widget::RenderConfig; @@ -71,13 +70,7 @@ impl Cpu { } impl BarWidget for Cpu { - fn render( - &mut self, - ctx: &Context, - ui: &mut Ui, - mut config: RenderConfig, - alignment: Alignment, - ) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let output = self.output(); if !output.is_empty() { @@ -106,7 +99,7 @@ impl BarWidget for Cpu { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { if ui .add( Label::new(layout_job) diff --git a/komorebi-bar/src/date.rs b/komorebi-bar/src/date.rs index afad7e1b..5025b1ed 100644 --- a/komorebi-bar/src/date.rs +++ b/komorebi-bar/src/date.rs @@ -1,4 +1,3 @@ -use crate::bar::Alignment; use crate::config::LabelPrefix; use crate::widget::BarWidget; use crate::widget::RenderConfig; @@ -87,13 +86,7 @@ impl Date { } impl BarWidget for Date { - fn render( - &mut self, - ctx: &Context, - ui: &mut Ui, - mut config: RenderConfig, - alignment: Alignment, - ) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let mut output = self.output(); if !output.is_empty() { @@ -126,7 +119,7 @@ impl BarWidget for Date { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { if ui .add( Label::new(WidgetText::LayoutJob(layout_job.clone())) diff --git a/komorebi-bar/src/group.rs b/komorebi-bar/src/group.rs index a76fe0a7..570d7ab1 100644 --- a/komorebi-bar/src/group.rs +++ b/komorebi-bar/src/group.rs @@ -1,7 +1,7 @@ use crate::bar::Alignment; use crate::config::Color32Ext; +use crate::widget::RenderConfig; use crate::BACKGROUND_COLOR; -use crate::WIDGET_SPACING; use eframe::egui::Color32; use eframe::egui::Frame; use eframe::egui::InnerResponse; @@ -58,29 +58,29 @@ impl Grouping { pub fn apply_on_widget( &mut self, use_spacing: bool, - alignment: Alignment, + render_config: RenderConfig, ui: &mut Ui, add_contents: impl FnOnce(&mut Ui) -> R, ) -> InnerResponse { match self { - Self::Bar(_) => Self::widget_group(use_spacing, alignment, ui, add_contents), - Self::Alignment(_) => Self::widget_group(use_spacing, alignment, ui, add_contents), + Self::Bar(_) => Self::widget_group(use_spacing, render_config, ui, add_contents), + Self::Alignment(_) => Self::widget_group(use_spacing, render_config, ui, add_contents), Self::Widget(config) => { - Self::define_group(use_spacing, Some(alignment), ui, add_contents, config) + Self::define_group(use_spacing, Some(render_config), ui, add_contents, config) } - Self::None => Self::widget_group(use_spacing, alignment, ui, add_contents), + Self::None => Self::widget_group(use_spacing, render_config, ui, add_contents), } } fn define_group( use_spacing: bool, - alignment: Option, + render_config: Option, ui: &mut Ui, add_contents: impl FnOnce(&mut Ui) -> R, config: &mut GroupingConfig, ) -> InnerResponse { Frame::none() - .outer_margin(Self::widget_outer_margin(alignment)) + .outer_margin(Self::widget_outer_margin(render_config)) .inner_margin(match use_spacing { true => Margin::symmetric(5.0 + 3.0, 3.0), false => Margin::symmetric(3.0, 3.0), @@ -112,12 +112,12 @@ impl Grouping { fn widget_group( use_spacing: bool, - alignment: Alignment, + render_config: RenderConfig, ui: &mut Ui, add_contents: impl FnOnce(&mut Ui) -> R, ) -> InnerResponse { Frame::none() - .outer_margin(Self::widget_outer_margin(Some(alignment))) + .outer_margin(Self::widget_outer_margin(Some(render_config))) .inner_margin(match use_spacing { true => Margin::symmetric(5.0, 0.0), false => Margin::same(0.0), @@ -132,19 +132,25 @@ impl Grouping { } } - fn widget_outer_margin(alignment: Option) -> Margin { + fn widget_outer_margin(render_config: Option) -> Margin { Margin { - left: match alignment { - Some(align) => match align { - Alignment::Left => 0.0, - Alignment::Right => WIDGET_SPACING, + left: match render_config { + Some(config) => match config.alignment { + Some(align) => match align { + Alignment::Left => 0.0, + Alignment::Right => config.spacing, + }, + None => 0.0, }, None => 0.0, }, - right: match alignment { - Some(align) => match align { - Alignment::Left => WIDGET_SPACING, - Alignment::Right => 0.0, + right: match render_config { + Some(config) => match config.alignment { + Some(align) => match align { + Alignment::Left => config.spacing, + Alignment::Right => 0.0, + }, + None => 0.0, }, None => 0.0, }, diff --git a/komorebi-bar/src/komorebi.rs b/komorebi-bar/src/komorebi.rs index 61bbf250..c83bc310 100644 --- a/komorebi-bar/src/komorebi.rs +++ b/komorebi-bar/src/komorebi.rs @@ -1,5 +1,4 @@ use crate::bar::apply_theme; -use crate::bar::Alignment; use crate::config::KomobarTheme; use crate::ui::CustomUi; use crate::widget::BarWidget; @@ -123,20 +122,14 @@ pub struct Komorebi { } impl BarWidget for Komorebi { - fn render( - &mut self, - ctx: &Context, - ui: &mut Ui, - mut config: RenderConfig, - alignment: Alignment, - ) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { let mut komorebi_notification_state = self.komorebi_notification_state.borrow_mut(); if self.workspaces.enable { let mut update = None; // NOTE: There should always be at least one workspace. - config.grouping.apply_on_widget(false, alignment, ui, |ui| { + config.grouping.apply_on_widget(false, config, ui, |ui| { for (i, (ws, should_show)) in komorebi_notification_state.workspaces.iter().enumerate() { @@ -203,7 +196,7 @@ impl BarWidget for Komorebi { if let Some(layout) = self.layout { if layout.enable { - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { if ui .add( Label::new(komorebi_notification_state.layout.to_string()) @@ -254,7 +247,7 @@ impl BarWidget for Komorebi { for (name, location) in configuration_switcher.configurations.iter() { let path = PathBuf::from(location); if path.is_file() { - config.grouping.apply_on_widget(true, alignment, ui,|ui|{ + config.grouping.apply_on_widget(true, config, ui,|ui|{ if ui .add(Label::new(name).selectable(false).sense(Sense::click())) .clicked() @@ -312,7 +305,7 @@ impl BarWidget for Komorebi { let titles = &komorebi_notification_state.focused_container_information.0; if !titles.is_empty() { - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { let icons = &komorebi_notification_state.focused_container_information.1; let focused_window_idx = komorebi_notification_state.focused_container_information.2; diff --git a/komorebi-bar/src/main.rs b/komorebi-bar/src/main.rs index 9def465f..65534ab7 100644 --- a/komorebi-bar/src/main.rs +++ b/komorebi-bar/src/main.rs @@ -44,8 +44,6 @@ use windows::Win32::UI::HiDpi::DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2; use windows::Win32::UI::WindowsAndMessaging::EnumThreadWindows; use windows::Win32::UI::WindowsAndMessaging::GetWindowThreadProcessId; -pub static WIDGET_SPACING: f32 = 10.0; - pub static BACKGROUND_COLOR: AtomicU32 = AtomicU32::new(0); pub static MAX_LABEL_WIDTH: AtomicI32 = AtomicI32::new(400); pub static MONITOR_LEFT: AtomicI32 = AtomicI32::new(0); diff --git a/komorebi-bar/src/media.rs b/komorebi-bar/src/media.rs index ab4a3bbb..e353749d 100644 --- a/komorebi-bar/src/media.rs +++ b/komorebi-bar/src/media.rs @@ -1,4 +1,3 @@ -use crate::bar::Alignment; use crate::ui::CustomUi; use crate::widget::BarWidget; use crate::widget::RenderConfig; @@ -79,13 +78,7 @@ impl Media { } impl BarWidget for Media { - fn render( - &mut self, - ctx: &Context, - ui: &mut Ui, - mut config: RenderConfig, - alignment: Alignment, - ) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let output = self.output(); if !output.is_empty() { @@ -109,7 +102,7 @@ impl BarWidget for Media { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { let available_height = ui.available_height(); let mut custom_ui = CustomUi(ui); diff --git a/komorebi-bar/src/memory.rs b/komorebi-bar/src/memory.rs index e277de2d..52cae5fb 100644 --- a/komorebi-bar/src/memory.rs +++ b/komorebi-bar/src/memory.rs @@ -1,4 +1,3 @@ -use crate::bar::Alignment; use crate::config::LabelPrefix; use crate::widget::BarWidget; use crate::widget::RenderConfig; @@ -74,13 +73,7 @@ impl Memory { } impl BarWidget for Memory { - fn render( - &mut self, - ctx: &Context, - ui: &mut Ui, - mut config: RenderConfig, - alignment: Alignment, - ) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let output = self.output(); if !output.is_empty() { @@ -109,7 +102,7 @@ impl BarWidget for Memory { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { if ui .add( Label::new(layout_job) diff --git a/komorebi-bar/src/network.rs b/komorebi-bar/src/network.rs index d69f1bac..bb920fec 100644 --- a/komorebi-bar/src/network.rs +++ b/komorebi-bar/src/network.rs @@ -1,4 +1,3 @@ -use crate::bar::Alignment; use crate::config::LabelPrefix; use crate::widget::BarWidget; use crate::widget::RenderConfig; @@ -318,16 +317,10 @@ impl Network { } impl BarWidget for Network { - fn render( - &mut self, - ctx: &Context, - ui: &mut Ui, - mut config: RenderConfig, - alignment: Alignment, - ) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.show_total_data_transmitted { for output in self.total_data_transmitted() { - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { ui.add(Label::new(output).selectable(false)); }); } @@ -335,7 +328,7 @@ impl BarWidget for Network { if self.show_network_activity { for output in self.network_activity() { - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { ui.add(Label::new(output).selectable(false)); }); } @@ -374,7 +367,7 @@ impl BarWidget for Network { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { if ui .add( Label::new(layout_job) diff --git a/komorebi-bar/src/storage.rs b/komorebi-bar/src/storage.rs index d9329892..2c436e65 100644 --- a/komorebi-bar/src/storage.rs +++ b/komorebi-bar/src/storage.rs @@ -1,4 +1,3 @@ -use crate::bar::Alignment; use crate::config::LabelPrefix; use crate::widget::BarWidget; use crate::widget::RenderConfig; @@ -80,13 +79,7 @@ impl Storage { } impl BarWidget for Storage { - fn render( - &mut self, - ctx: &Context, - ui: &mut Ui, - mut config: RenderConfig, - alignment: Alignment, - ) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let font_id = ctx .style() @@ -114,7 +107,7 @@ impl BarWidget for Storage { TextFormat::simple(font_id.clone(), ctx.style().visuals.text_color()), ); - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { if ui .add( Label::new(layout_job) diff --git a/komorebi-bar/src/time.rs b/komorebi-bar/src/time.rs index 0f6211f7..fcbaedf8 100644 --- a/komorebi-bar/src/time.rs +++ b/komorebi-bar/src/time.rs @@ -1,4 +1,3 @@ -use crate::bar::Alignment; use crate::config::LabelPrefix; use crate::widget::BarWidget; use crate::widget::RenderConfig; @@ -78,13 +77,7 @@ impl Time { } impl BarWidget for Time { - fn render( - &mut self, - ctx: &Context, - ui: &mut Ui, - mut config: RenderConfig, - alignment: Alignment, - ) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let mut output = self.output(); if !output.is_empty() { @@ -117,7 +110,7 @@ impl BarWidget for Time { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - config.grouping.apply_on_widget(true, alignment, ui, |ui| { + config.grouping.apply_on_widget(true, config, ui, |ui| { if ui .add( Label::new(layout_job) diff --git a/komorebi-bar/src/widget.rs b/komorebi-bar/src/widget.rs index 82fc8883..85a5d2d9 100644 --- a/komorebi-bar/src/widget.rs +++ b/komorebi-bar/src/widget.rs @@ -25,13 +25,17 @@ use serde::Deserialize; use serde::Serialize; pub trait BarWidget { - fn render(&mut self, ctx: &Context, ui: &mut Ui, config: RenderConfig, alignment: Alignment); + fn render(&mut self, ctx: &Context, ui: &mut Ui, config: RenderConfig); } #[derive(Copy, Clone)] pub struct RenderConfig { + /// Spacing between widgets + pub spacing: f32, /// Sets how widgets are grouped pub grouping: Grouping, + /// Alignment of the widgets + pub alignment: Option, } #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]