From d188222be71adea7fcb6e9c32e16e6b3fd156657 Mon Sep 17 00:00:00 2001 From: Csaba Date: Fri, 8 Nov 2024 00:40:13 +0100 Subject: [PATCH] added widget grouping and group module --- komorebi-bar/src/bar.rs | 16 +- komorebi-bar/src/battery.rs | 14 +- komorebi-bar/src/config.rs | 40 +--- komorebi-bar/src/cpu.rs | 27 ++- komorebi-bar/src/date.rs | 24 +- komorebi-bar/src/group.rs | 74 +++++++ komorebi-bar/src/komorebi.rs | 412 +++++++++++++++++++---------------- komorebi-bar/src/main.rs | 1 + komorebi-bar/src/media.rs | 38 ++-- komorebi-bar/src/memory.rs | 27 ++- komorebi-bar/src/network.rs | 62 ++---- komorebi-bar/src/storage.rs | 38 ++-- komorebi-bar/src/time.rs | 35 ++- komorebi-bar/src/widget.rs | 4 +- 14 files changed, 436 insertions(+), 376 deletions(-) create mode 100644 komorebi-bar/src/group.rs diff --git a/komorebi-bar/src/bar.rs b/komorebi-bar/src/bar.rs index c0143e59..f4211579 100644 --- a/komorebi-bar/src/bar.rs +++ b/komorebi-bar/src/bar.rs @@ -1,8 +1,10 @@ -use crate::config::Grouping; use crate::config::KomobarConfig; use crate::config::KomobarTheme; use crate::config::Position; use crate::config::PositionConfig; +use crate::group::BorderRadius; +use crate::group::Grouping; +use crate::group::GroupingConfig; use crate::komorebi::Komorebi; use crate::komorebi::KomorebiNotificationState; use crate::process_hwnd; @@ -319,8 +321,16 @@ impl Komobar { let mut komobar = Self { config: config.clone(), render_config: RenderConfig { - _grouping: match config.grouping { - None => Grouping::None, + grouping: match config.grouping { + // TESTING + None => Grouping::Widget(GroupingConfig { + rounding: Some(BorderRadius { + nw: 15.0, + ne: 15.0, + sw: 15.0, + se: 15.0, + }), + }), Some(grouping) => grouping, }, }, diff --git a/komorebi-bar/src/battery.rs b/komorebi-bar/src/battery.rs index da0ea8d3..e7706caa 100644 --- a/komorebi-bar/src/battery.rs +++ b/komorebi-bar/src/battery.rs @@ -116,7 +116,7 @@ impl Battery { } impl BarWidget for Battery { - fn render(&mut self, ctx: &Context, ui: &mut Ui, _config: RenderConfig) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let output = self.output(); if !output.is_empty() { @@ -148,11 +148,13 @@ impl BarWidget for Battery { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - ui.add( - Label::new(layout_job) - .selectable(false) - .sense(Sense::click()), - ); + config.grouping.apply_on_widget(ui, |ui| { + ui.add( + Label::new(layout_job) + .selectable(false) + .sense(Sense::click()), + ); + }); } ui.add_space(WIDGET_SPACING); diff --git a/komorebi-bar/src/config.rs b/komorebi-bar/src/config.rs index 64937023..4aa2bafe 100644 --- a/komorebi-bar/src/config.rs +++ b/komorebi-bar/src/config.rs @@ -1,6 +1,6 @@ +use crate::group::Grouping; use crate::widget::WidgetConfig; use eframe::egui::Pos2; -use eframe::egui::Rounding; use eframe::egui::TextBuffer; use eframe::egui::Vec2; use komorebi_client::KomorebiTheme; @@ -181,41 +181,3 @@ pub enum LabelPrefix { /// Show an icon and text IconAndText, } - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] -pub enum Grouping { - /// No grouping is applied - None, - /// Widgets are grouped individually - Widget(GroupingConfig), - /// Widgets are grouped on each side - Side(GroupingConfig), -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] -pub struct GroupingConfig { - pub rounding: Option, -} - -#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] -pub struct BorderRadius { - /// Radius of the rounding of the North-West (left top) corner. - pub nw: f32, - /// Radius of the rounding of the North-East (right top) corner. - pub ne: f32, - /// Radius of the rounding of the South-West (left bottom) corner. - pub sw: f32, - /// Radius of the rounding of the South-East (right bottom) corner. - pub se: f32, -} - -impl From for Rounding { - fn from(value: BorderRadius) -> Self { - Self { - nw: value.nw, - ne: value.ne, - sw: value.sw, - se: value.se, - } - } -} diff --git a/komorebi-bar/src/cpu.rs b/komorebi-bar/src/cpu.rs index 97b5a6f4..62d509fd 100644 --- a/komorebi-bar/src/cpu.rs +++ b/komorebi-bar/src/cpu.rs @@ -71,7 +71,7 @@ impl Cpu { } impl BarWidget for Cpu { - fn render(&mut self, ctx: &Context, ui: &mut Ui, _config: RenderConfig) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let output = self.output(); if !output.is_empty() { @@ -100,19 +100,22 @@ impl BarWidget for Cpu { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - if ui - .add( - Label::new(layout_job) - .selectable(false) - .sense(Sense::click()), - ) - .clicked() - { - if let Err(error) = Command::new("cmd.exe").args(["/C", "taskmgr.exe"]).spawn() + config.grouping.apply_on_widget(ui, |ui| { + if ui + .add( + Label::new(layout_job) + .selectable(false) + .sense(Sense::click()), + ) + .clicked() { - eprintln!("{}", error) + if let Err(error) = + Command::new("cmd.exe").args(["/C", "taskmgr.exe"]).spawn() + { + eprintln!("{}", error) + } } - } + }); } ui.add_space(WIDGET_SPACING); diff --git a/komorebi-bar/src/date.rs b/komorebi-bar/src/date.rs index 423c8f47..e3d73ac7 100644 --- a/komorebi-bar/src/date.rs +++ b/komorebi-bar/src/date.rs @@ -87,7 +87,7 @@ impl Date { } impl BarWidget for Date { - fn render(&mut self, ctx: &Context, ui: &mut Ui, _config: RenderConfig) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let mut output = self.output(); if !output.is_empty() { @@ -120,16 +120,18 @@ impl BarWidget for Date { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - if ui - .add( - Label::new(WidgetText::LayoutJob(layout_job.clone())) - .selectable(false) - .sense(Sense::click()), - ) - .clicked() - { - self.format.next() - } + config.grouping.apply_on_widget(ui, |ui| { + if ui + .add( + Label::new(WidgetText::LayoutJob(layout_job.clone())) + .selectable(false) + .sense(Sense::click()), + ) + .clicked() + { + self.format.next() + } + }); } ui.add_space(WIDGET_SPACING); diff --git a/komorebi-bar/src/group.rs b/komorebi-bar/src/group.rs new file mode 100644 index 00000000..cee7abf6 --- /dev/null +++ b/komorebi-bar/src/group.rs @@ -0,0 +1,74 @@ +use eframe::egui::Frame; +use eframe::egui::InnerResponse; +use eframe::egui::Margin; +use eframe::egui::Rounding; +use eframe::egui::Ui; +use schemars::JsonSchema; +use serde::Deserialize; +use serde::Serialize; + +#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] +pub enum Grouping { + /// No grouping is applied + None, + /// Widgets are grouped individually + Widget(GroupingConfig), + /// Widgets are grouped on each side + Side(GroupingConfig), +} + +impl Grouping { + pub fn apply_on_widget( + &mut self, + ui: &mut Ui, + add_contents: impl FnOnce(&mut Ui) -> R, + ) -> InnerResponse { + match self { + Self::None => InnerResponse { + inner: add_contents(ui), + response: ui.response().clone(), + }, + Self::Widget(_config) => { + Frame::none() + //.fill(Color32::from_black_alpha(255u8)) + .outer_margin(Margin::symmetric(0.0, 0.0)) + .inner_margin(Margin::symmetric(7.0, 2.0)) + .rounding(Rounding::same(15.0)) + .stroke(ui.style().visuals.widgets.noninteractive.bg_stroke) + .show(ui, add_contents) + } + Self::Side(_config) => InnerResponse { + inner: add_contents(ui), + response: ui.response().clone(), + }, + } + } +} + +#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] +pub struct GroupingConfig { + pub rounding: Option, +} + +#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema)] +pub struct BorderRadius { + /// Radius of the rounding of the North-West (left top) corner. + pub nw: f32, + /// Radius of the rounding of the North-East (right top) corner. + pub ne: f32, + /// Radius of the rounding of the South-West (left bottom) corner. + pub sw: f32, + /// Radius of the rounding of the South-East (right bottom) corner. + pub se: f32, +} + +impl From for Rounding { + fn from(value: BorderRadius) -> Self { + Self { + nw: value.nw, + ne: value.ne, + sw: value.sw, + se: value.se, + } + } +} diff --git a/komorebi-bar/src/komorebi.rs b/komorebi-bar/src/komorebi.rs index f620756e..adcfcc08 100644 --- a/komorebi-bar/src/komorebi.rs +++ b/komorebi-bar/src/komorebi.rs @@ -123,58 +123,71 @@ pub struct Komorebi { } impl BarWidget for Komorebi { - fn render(&mut self, ctx: &Context, ui: &mut Ui, _config: RenderConfig) { + 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; - for (i, (ws, should_show)) in komorebi_notification_state.workspaces.iter().enumerate() - { - if *should_show - && ui - .add(SelectableLabel::new( - komorebi_notification_state.selected_workspace.eq(ws), - ws.to_string(), - )) - .clicked() + config.grouping.apply_on_widget(ui, |ui| { + for (i, (ws, should_show)) in + komorebi_notification_state.workspaces.iter().enumerate() { - update = Some(ws.to_string()); - let mut proceed = true; - - if komorebi_client::send_message(&SocketMessage::MouseFollowsFocus(false)) - .is_err() + if *should_show + && ui + .add(SelectableLabel::new( + komorebi_notification_state.selected_workspace.eq(ws), + ws.to_string(), + )) + .clicked() { - tracing::error!("could not send message to komorebi: MouseFollowsFocus"); - proceed = false; - } + update = Some(ws.to_string()); + let mut proceed = true; - if proceed - && komorebi_client::send_message(&SocketMessage::FocusWorkspaceNumber(i)) + if komorebi_client::send_message(&SocketMessage::MouseFollowsFocus(false)) .is_err() - { - tracing::error!("could not send message to komorebi: FocusWorkspaceNumber"); - proceed = false; - } + { + tracing::error!( + "could not send message to komorebi: MouseFollowsFocus" + ); + proceed = false; + } - if proceed - && komorebi_client::send_message(&SocketMessage::MouseFollowsFocus( - komorebi_notification_state.mouse_follows_focus, - )) - .is_err() - { - tracing::error!("could not send message to komorebi: MouseFollowsFocus"); - proceed = false; - } - - if proceed - && komorebi_client::send_message(&SocketMessage::RetileWithResizeDimensions) + if proceed + && komorebi_client::send_message(&SocketMessage::FocusWorkspaceNumber( + i, + )) .is_err() - { - tracing::error!("could not send message to komorebi: Retile"); + { + tracing::error!( + "could not send message to komorebi: FocusWorkspaceNumber" + ); + proceed = false; + } + + if proceed + && komorebi_client::send_message(&SocketMessage::MouseFollowsFocus( + komorebi_notification_state.mouse_follows_focus, + )) + .is_err() + { + tracing::error!( + "could not send message to komorebi: MouseFollowsFocus" + ); + proceed = false; + } + + if proceed + && komorebi_client::send_message( + &SocketMessage::RetileWithResizeDimensions, + ) + .is_err() + { + tracing::error!("could not send message to komorebi: Retile"); + } } } - } + }); if let Some(update) = update { komorebi_notification_state.selected_workspace = update; @@ -185,38 +198,49 @@ impl BarWidget for Komorebi { if let Some(layout) = self.layout { if layout.enable { - if ui - .add( - Label::new(komorebi_notification_state.layout.to_string()) - .selectable(false) - .sense(Sense::click()), - ) - .clicked() - { - match komorebi_notification_state.layout { - KomorebiLayout::Default(_) => { - if komorebi_client::send_message(&SocketMessage::CycleLayout( - CycleDirection::Next, - )) - .is_err() - { - tracing::error!("could not send message to komorebi: CycleLayout"); + config.grouping.apply_on_widget(ui, |ui| { + if ui + .add( + Label::new(komorebi_notification_state.layout.to_string()) + .selectable(false) + .sense(Sense::click()), + ) + .clicked() + { + match komorebi_notification_state.layout { + KomorebiLayout::Default(_) => { + if komorebi_client::send_message(&SocketMessage::CycleLayout( + CycleDirection::Next, + )) + .is_err() + { + tracing::error!( + "could not send message to komorebi: CycleLayout" + ); + } } - } - KomorebiLayout::Floating => { - if komorebi_client::send_message(&SocketMessage::ToggleTiling).is_err() - { - tracing::error!("could not send message to komorebi: ToggleTiling"); + KomorebiLayout::Floating => { + if komorebi_client::send_message(&SocketMessage::ToggleTiling) + .is_err() + { + tracing::error!( + "could not send message to komorebi: ToggleTiling" + ); + } } - } - KomorebiLayout::Paused => { - if komorebi_client::send_message(&SocketMessage::TogglePause).is_err() { - tracing::error!("could not send message to komorebi: TogglePause"); + KomorebiLayout::Paused => { + if komorebi_client::send_message(&SocketMessage::TogglePause) + .is_err() + { + tracing::error!( + "could not send message to komorebi: TogglePause" + ); + } } + KomorebiLayout::Custom => {} } - KomorebiLayout::Custom => {} } - } + }); ui.add_space(WIDGET_SPACING); } @@ -226,53 +250,55 @@ impl BarWidget for Komorebi { if configuration_switcher.enable { for (name, location) in configuration_switcher.configurations.iter() { let path = PathBuf::from(location); - if path.is_file() - && ui + if path.is_file() { + config.grouping.apply_on_widget(ui,|ui|{ + if ui .add(Label::new(name).selectable(false).sense(Sense::click())) .clicked() - { - let canonicalized = dunce::canonicalize(path.clone()).unwrap_or(path); - let mut proceed = true; - if komorebi_client::send_message(&SocketMessage::ReplaceConfiguration( - canonicalized, - )) - .is_err() { - tracing::error!( - "could not send message to komorebi: ReplaceConfiguration" - ); - proceed = false; - } + let canonicalized = dunce::canonicalize(path.clone()).unwrap_or(path); + let mut proceed = true; + if komorebi_client::send_message(&SocketMessage::ReplaceConfiguration( + canonicalized, + )) + .is_err() + { + tracing::error!( + "could not send message to komorebi: ReplaceConfiguration" + ); + proceed = false; + } - if let Some(rect) = komorebi_notification_state.work_area_offset { - if proceed { - match komorebi_client::send_query(&SocketMessage::Query( - komorebi_client::StateQuery::FocusedMonitorIndex, - )) { - Ok(idx) => { - if let Ok(monitor_idx) = idx.parse::() { - if komorebi_client::send_message( - &SocketMessage::MonitorWorkAreaOffset( - monitor_idx, - rect, - ), - ) - .is_err() - { - tracing::error!( + if let Some(rect) = komorebi_notification_state.work_area_offset { + if proceed { + match komorebi_client::send_query(&SocketMessage::Query( + komorebi_client::StateQuery::FocusedMonitorIndex, + )) { + Ok(idx) => { + if let Ok(monitor_idx) = idx.parse::() { + if komorebi_client::send_message( + &SocketMessage::MonitorWorkAreaOffset( + monitor_idx, + rect, + ), + ) + .is_err() + { + tracing::error!( "could not send message to komorebi: MonitorWorkAreaOffset" ); + } } } - } - Err(_) => { - tracing::error!( - "could not send message to komorebi: Query" - ); + Err(_) => { + tracing::error!( + "could not send message to komorebi: Query" + ); + } } } } - } + }}); } } @@ -282,111 +308,115 @@ impl BarWidget for Komorebi { if let Some(focused_window) = self.focused_window { if focused_window.enable { - let titles = &komorebi_notification_state.focused_container_information.0; - let icons = &komorebi_notification_state.focused_container_information.1; - let focused_window_idx = - komorebi_notification_state.focused_container_information.2; + config.grouping.apply_on_widget(ui, |ui| { + let titles = &komorebi_notification_state.focused_container_information.0; + let icons = &komorebi_notification_state.focused_container_information.1; + let focused_window_idx = + komorebi_notification_state.focused_container_information.2; - let iter = titles.iter().zip(icons.iter()); + let iter = titles.iter().zip(icons.iter()); - for (i, (title, icon)) in iter.enumerate() { - if focused_window.show_icon { - if let Some(img) = icon { - ui.add( - Image::from(&img_to_texture(ctx, img)) - .maintain_aspect_ratio(true) - .max_height(15.0), - ); + for (i, (title, icon)) in iter.enumerate() { + if focused_window.show_icon { + if let Some(img) = icon { + ui.add( + Image::from(&img_to_texture(ctx, img)) + .maintain_aspect_ratio(true) + .max_height(15.0), + ); + } } - } - if i == focused_window_idx { - let font_id = ctx - .style() - .text_styles - .get(&TextStyle::Body) - .cloned() - .unwrap_or_else(FontId::default); + if i == focused_window_idx { + let font_id = ctx + .style() + .text_styles + .get(&TextStyle::Body) + .cloned() + .unwrap_or_else(FontId::default); - let layout_job = LayoutJob::simple( - title.to_string(), - font_id.clone(), - komorebi_notification_state - .stack_accent - .unwrap_or(ctx.style().visuals.selection.stroke.color), - 100.0, - ); - - if titles.len() > 1 { - let available_height = ui.available_height(); - let mut custom_ui = CustomUi(ui); - custom_ui.add_sized_left_to_right( - Vec2::new( - MAX_LABEL_WIDTH.load(Ordering::SeqCst) as f32, - available_height, - ), - Label::new(layout_job).selectable(false).truncate(), + let layout_job = LayoutJob::simple( + title.to_string(), + font_id.clone(), + komorebi_notification_state + .stack_accent + .unwrap_or(ctx.style().visuals.selection.stroke.color), + 100.0, ); + + if titles.len() > 1 { + let available_height = ui.available_height(); + let mut custom_ui = CustomUi(ui); + custom_ui.add_sized_left_to_right( + Vec2::new( + MAX_LABEL_WIDTH.load(Ordering::SeqCst) as f32, + available_height, + ), + Label::new(layout_job).selectable(false).truncate(), + ); + } else { + let available_height = ui.available_height(); + let mut custom_ui = CustomUi(ui); + custom_ui.add_sized_left_to_right( + Vec2::new( + MAX_LABEL_WIDTH.load(Ordering::SeqCst) as f32, + available_height, + ), + Label::new(title).selectable(false).truncate(), + ); + } } else { let available_height = ui.available_height(); let mut custom_ui = CustomUi(ui); - custom_ui.add_sized_left_to_right( - Vec2::new( - MAX_LABEL_WIDTH.load(Ordering::SeqCst) as f32, - available_height, - ), - Label::new(title).selectable(false).truncate(), - ); - } - } else { - let available_height = ui.available_height(); - let mut custom_ui = CustomUi(ui); - if custom_ui - .add_sized_left_to_right( - Vec2::new( - MAX_LABEL_WIDTH.load(Ordering::SeqCst) as f32, - available_height, - ), - Label::new(title) - .selectable(false) - .sense(Sense::click()) - .truncate(), - ) - .clicked() - { - if komorebi_client::send_message(&SocketMessage::MouseFollowsFocus( - false, - )) - .is_err() + if custom_ui + .add_sized_left_to_right( + Vec2::new( + MAX_LABEL_WIDTH.load(Ordering::SeqCst) as f32, + available_height, + ), + Label::new(title) + .selectable(false) + .sense(Sense::click()) + .truncate(), + ) + .clicked() { - tracing::error!( - "could not send message to komorebi: MouseFollowsFocus" - ); - } - - if komorebi_client::send_message(&SocketMessage::FocusStackWindow(i)) + if komorebi_client::send_message(&SocketMessage::MouseFollowsFocus( + false, + )) .is_err() - { - tracing::error!( - "could not send message to komorebi: FocusStackWindow" - ); - } + { + tracing::error!( + "could not send message to komorebi: MouseFollowsFocus" + ); + } - if komorebi_client::send_message(&SocketMessage::MouseFollowsFocus( - komorebi_notification_state.mouse_follows_focus, - )) - .is_err() - { - tracing::error!( - "could not send message to komorebi: MouseFollowsFocus" - ); + if komorebi_client::send_message(&SocketMessage::FocusStackWindow( + i, + )) + .is_err() + { + tracing::error!( + "could not send message to komorebi: FocusStackWindow" + ); + } + + if komorebi_client::send_message(&SocketMessage::MouseFollowsFocus( + komorebi_notification_state.mouse_follows_focus, + )) + .is_err() + { + tracing::error!( + "could not send message to komorebi: MouseFollowsFocus" + ); + } } } - } - ui.add_space(WIDGET_SPACING); - } + ui.add_space(WIDGET_SPACING); + } + }); } ui.add_space(WIDGET_SPACING); diff --git a/komorebi-bar/src/main.rs b/komorebi-bar/src/main.rs index f32c5937..3cba0e01 100644 --- a/komorebi-bar/src/main.rs +++ b/komorebi-bar/src/main.rs @@ -3,6 +3,7 @@ mod battery; mod config; mod cpu; mod date; +mod group; mod komorebi; mod media; mod memory; diff --git a/komorebi-bar/src/media.rs b/komorebi-bar/src/media.rs index aef29356..91904cec 100644 --- a/komorebi-bar/src/media.rs +++ b/komorebi-bar/src/media.rs @@ -79,7 +79,7 @@ impl Media { } impl BarWidget for Media { - fn render(&mut self, ctx: &Context, ui: &mut Ui, _config: RenderConfig) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let output = self.output(); if !output.is_empty() { @@ -103,24 +103,26 @@ impl BarWidget for Media { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - let available_height = ui.available_height(); - let mut custom_ui = CustomUi(ui); + config.grouping.apply_on_widget(ui, |ui| { + let available_height = ui.available_height(); + let mut custom_ui = CustomUi(ui); - if custom_ui - .add_sized_left_to_right( - Vec2::new( - MAX_LABEL_WIDTH.load(Ordering::SeqCst) as f32, - available_height, - ), - Label::new(layout_job) - .selectable(false) - .sense(Sense::click()) - .truncate(), - ) - .clicked() - { - self.toggle(); - } + if custom_ui + .add_sized_left_to_right( + Vec2::new( + MAX_LABEL_WIDTH.load(Ordering::SeqCst) as f32, + available_height, + ), + Label::new(layout_job) + .selectable(false) + .sense(Sense::click()) + .truncate(), + ) + .clicked() + { + self.toggle(); + } + }); ui.add_space(WIDGET_SPACING); } diff --git a/komorebi-bar/src/memory.rs b/komorebi-bar/src/memory.rs index 28d6616a..bd2f8f88 100644 --- a/komorebi-bar/src/memory.rs +++ b/komorebi-bar/src/memory.rs @@ -74,7 +74,7 @@ impl Memory { } impl BarWidget for Memory { - fn render(&mut self, ctx: &Context, ui: &mut Ui, _config: RenderConfig) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let output = self.output(); if !output.is_empty() { @@ -103,19 +103,22 @@ impl BarWidget for Memory { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - if ui - .add( - Label::new(layout_job) - .selectable(false) - .sense(Sense::click()), - ) - .clicked() - { - if let Err(error) = Command::new("cmd.exe").args(["/C", "taskmgr.exe"]).spawn() + config.grouping.apply_on_widget(ui, |ui| { + if ui + .add( + Label::new(layout_job) + .selectable(false) + .sense(Sense::click()), + ) + .clicked() { - eprintln!("{}", error) + if let Err(error) = + Command::new("cmd.exe").args(["/C", "taskmgr.exe"]).spawn() + { + eprintln!("{}", error) + } } - } + }); } ui.add_space(WIDGET_SPACING); diff --git a/komorebi-bar/src/network.rs b/komorebi-bar/src/network.rs index 7d06af21..61fa09b9 100644 --- a/komorebi-bar/src/network.rs +++ b/komorebi-bar/src/network.rs @@ -5,10 +5,7 @@ use crate::WIDGET_SPACING; use eframe::egui::text::LayoutJob; use eframe::egui::Context; use eframe::egui::FontId; -use eframe::egui::Frame; use eframe::egui::Label; -use eframe::egui::Margin; -use eframe::egui::Rounding; use eframe::egui::Sense; use eframe::egui::TextFormat; use eframe::egui::TextStyle; @@ -321,18 +318,12 @@ impl Network { } impl BarWidget for Network { - fn render(&mut self, ctx: &Context, ui: &mut Ui, _config: RenderConfig) { + 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() { - Frame::none() - //.fill(Color32::from_black_alpha(255u8)) - .outer_margin(Margin::symmetric(0.0, 0.0)) - .inner_margin(Margin::symmetric(7.0, 2.0)) - .rounding(Rounding::same(15.0)) - .stroke(ui.style().visuals.widgets.noninteractive.bg_stroke) - .show(ui, |ui| { - ui.add(Label::new(output).selectable(false)); - }); + config.grouping.apply_on_widget(ui, |ui| { + ui.add(Label::new(output).selectable(false)); + }); } ui.add_space(WIDGET_SPACING); @@ -340,15 +331,9 @@ impl BarWidget for Network { if self.show_network_activity { for output in self.network_activity() { - Frame::none() - //.fill(Color32::from_black_alpha(255u8)) - .outer_margin(Margin::symmetric(0.0, 0.0)) - .inner_margin(Margin::symmetric(7.0, 2.0)) - .rounding(Rounding::same(15.0)) - .stroke(ui.style().visuals.widgets.noninteractive.bg_stroke) - .show(ui, |ui| { - ui.add(Label::new(output).selectable(false)); - }); + config.grouping.apply_on_widget(ui, |ui| { + ui.add(Label::new(output).selectable(false)); + }); } ui.add_space(WIDGET_SPACING); @@ -387,27 +372,20 @@ impl BarWidget for Network { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - Frame::none() - //.fill(Color32::from_black_alpha(255u8)) - .outer_margin(Margin::symmetric(0.0, 0.0)) - .inner_margin(Margin::symmetric(7.0, 2.0)) - .rounding(Rounding::same(15.0)) - .stroke(ui.style().visuals.widgets.noninteractive.bg_stroke) - .show(ui, |ui| { - if ui - .add( - Label::new(layout_job) - .selectable(false) - .sense(Sense::click()), - ) - .clicked() - { - if let Err(error) = Command::new("cmd.exe").args(["/C", "ncpa"]).spawn() - { - eprintln!("{}", error) - } + config.grouping.apply_on_widget(ui, |ui| { + if ui + .add( + Label::new(layout_job) + .selectable(false) + .sense(Sense::click()), + ) + .clicked() + { + if let Err(error) = Command::new("cmd.exe").args(["/C", "ncpa"]).spawn() { + eprintln!("{}", error) } - }); + } + }); } ui.add_space(WIDGET_SPACING); diff --git a/komorebi-bar/src/storage.rs b/komorebi-bar/src/storage.rs index 9dc60032..20844623 100644 --- a/komorebi-bar/src/storage.rs +++ b/komorebi-bar/src/storage.rs @@ -80,7 +80,7 @@ impl Storage { } impl BarWidget for Storage { - fn render(&mut self, ctx: &Context, ui: &mut Ui, _config: RenderConfig) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let font_id = ctx .style() @@ -108,25 +108,27 @@ impl BarWidget for Storage { TextFormat::simple(font_id.clone(), ctx.style().visuals.text_color()), ); - if ui - .add( - Label::new(layout_job) - .selectable(false) - .sense(Sense::click()), - ) - .clicked() - { - if let Err(error) = Command::new("cmd.exe") - .args([ - "/C", - "explorer.exe", - output.split(' ').collect::>()[0], - ]) - .spawn() + config.grouping.apply_on_widget(ui, |ui| { + if ui + .add( + Label::new(layout_job) + .selectable(false) + .sense(Sense::click()), + ) + .clicked() { - eprintln!("{}", error) + if let Err(error) = Command::new("cmd.exe") + .args([ + "/C", + "explorer.exe", + output.split(' ').collect::>()[0], + ]) + .spawn() + { + eprintln!("{}", error) + } } - } + }); ui.add_space(WIDGET_SPACING); } diff --git a/komorebi-bar/src/time.rs b/komorebi-bar/src/time.rs index 8cee8357..d7aa5029 100644 --- a/komorebi-bar/src/time.rs +++ b/komorebi-bar/src/time.rs @@ -5,10 +5,7 @@ use crate::WIDGET_SPACING; use eframe::egui::text::LayoutJob; use eframe::egui::Context; use eframe::egui::FontId; -use eframe::egui::Frame; use eframe::egui::Label; -use eframe::egui::Margin; -use eframe::egui::Rounding; use eframe::egui::Sense; use eframe::egui::TextFormat; use eframe::egui::TextStyle; @@ -81,7 +78,7 @@ impl Time { } impl BarWidget for Time { - fn render(&mut self, ctx: &Context, ui: &mut Ui, _config: RenderConfig) { + fn render(&mut self, ctx: &Context, ui: &mut Ui, mut config: RenderConfig) { if self.enable { let mut output = self.output(); if !output.is_empty() { @@ -114,24 +111,18 @@ impl BarWidget for Time { TextFormat::simple(font_id, ctx.style().visuals.text_color()), ); - Frame::none() - //.fill(Color32::from_black_alpha(255u8)) - .outer_margin(Margin::symmetric(0.0, 0.0)) - .inner_margin(Margin::symmetric(7.0, 2.0)) - .rounding(Rounding::same(15.0)) - .stroke(ui.style().visuals.widgets.noninteractive.bg_stroke) - .show(ui, |ui| { - if ui - .add( - Label::new(layout_job) - .selectable(false) - .sense(Sense::click()), - ) - .clicked() - { - self.format.toggle() - } - }); + config.grouping.apply_on_widget(ui, |ui| { + if ui + .add( + Label::new(layout_job) + .selectable(false) + .sense(Sense::click()), + ) + .clicked() + { + self.format.toggle() + } + }); } ui.add_space(WIDGET_SPACING); diff --git a/komorebi-bar/src/widget.rs b/komorebi-bar/src/widget.rs index 8fb1a4fd..5f9f9584 100644 --- a/komorebi-bar/src/widget.rs +++ b/komorebi-bar/src/widget.rs @@ -1,10 +1,10 @@ use crate::battery::Battery; use crate::battery::BatteryConfig; -use crate::config::Grouping; use crate::cpu::Cpu; use crate::cpu::CpuConfig; use crate::date::Date; use crate::date::DateConfig; +use crate::group::Grouping; use crate::komorebi::Komorebi; use crate::komorebi::KomorebiConfig; use crate::media::Media; @@ -30,7 +30,7 @@ pub trait BarWidget { #[derive(Copy, Clone)] pub struct RenderConfig { /// Sets how widgets are grouped - pub _grouping: Grouping, + pub grouping: Grouping, } #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]