feat(bar): floating center area for widgets

* Added a new floating area at the center of the bar
* Optional center widgets config, fixed spacing on the center widget
* Turning transparency on by default
This commit is contained in:
CtByte
2024-11-27 05:14:01 +01:00
committed by GitHub
parent 6f00c527a4
commit 46b81e4372
4 changed files with 52 additions and 2 deletions
+47 -1
View File
@@ -18,6 +18,8 @@ use crate::MONITOR_RIGHT;
use crate::MONITOR_TOP; use crate::MONITOR_TOP;
use crossbeam_channel::Receiver; use crossbeam_channel::Receiver;
use eframe::egui::Align; use eframe::egui::Align;
use eframe::egui::Align2;
use eframe::egui::Area;
use eframe::egui::CentralPanel; use eframe::egui::CentralPanel;
use eframe::egui::Color32; use eframe::egui::Color32;
use eframe::egui::Context; use eframe::egui::Context;
@@ -26,6 +28,7 @@ use eframe::egui::FontDefinitions;
use eframe::egui::FontFamily; use eframe::egui::FontFamily;
use eframe::egui::FontId; use eframe::egui::FontId;
use eframe::egui::Frame; use eframe::egui::Frame;
use eframe::egui::Id;
use eframe::egui::Layout; use eframe::egui::Layout;
use eframe::egui::Margin; use eframe::egui::Margin;
use eframe::egui::Rgba; use eframe::egui::Rgba;
@@ -50,6 +53,7 @@ pub struct Komobar {
pub render_config: Rc<RefCell<RenderConfig>>, pub render_config: Rc<RefCell<RenderConfig>>,
pub komorebi_notification_state: Option<Rc<RefCell<KomorebiNotificationState>>>, pub komorebi_notification_state: Option<Rc<RefCell<KomorebiNotificationState>>>,
pub left_widgets: Vec<Box<dyn BarWidget>>, pub left_widgets: Vec<Box<dyn BarWidget>>,
pub center_widgets: Vec<Box<dyn BarWidget>>,
pub right_widgets: Vec<Box<dyn BarWidget>>, pub right_widgets: Vec<Box<dyn BarWidget>>,
pub rx_gui: Receiver<komorebi_client::Notification>, pub rx_gui: Receiver<komorebi_client::Notification>,
pub rx_config: Receiver<KomobarConfig>, pub rx_config: Receiver<KomobarConfig>,
@@ -290,6 +294,16 @@ impl Komobar {
} }
} }
if let Some(center_widgets) = &config.center_widgets {
for (idx, widget_config) in center_widgets.iter().enumerate() {
if let WidgetConfig::Komorebi(config) = widget_config {
komorebi_widget = Some(Komorebi::from(config));
komorebi_widget_idx = Some(idx);
side = Some(Alignment::Center);
}
}
}
for (idx, widget_config) in config.right_widgets.iter().enumerate() { for (idx, widget_config) in config.right_widgets.iter().enumerate() {
if let WidgetConfig::Komorebi(config) = widget_config { if let WidgetConfig::Komorebi(config) = widget_config {
komorebi_widget = Some(Komorebi::from(config)); komorebi_widget = Some(Komorebi::from(config));
@@ -304,6 +318,14 @@ impl Komobar {
.map(|config| config.as_boxed_bar_widget()) .map(|config| config.as_boxed_bar_widget())
.collect::<Vec<Box<dyn BarWidget>>>(); .collect::<Vec<Box<dyn BarWidget>>>();
let mut center_widgets = match &config.center_widgets {
Some(center_widgets) => center_widgets
.iter()
.map(|config| config.as_boxed_bar_widget())
.collect::<Vec<Box<dyn BarWidget>>>(),
None => vec![],
};
let mut right_widgets = config let mut right_widgets = config
.right_widgets .right_widgets
.iter() .iter()
@@ -329,6 +351,7 @@ impl Komobar {
let boxed: Box<dyn BarWidget> = Box::new(widget); let boxed: Box<dyn BarWidget> = Box::new(widget);
match side { match side {
Alignment::Left => left_widgets[idx] = boxed, Alignment::Left => left_widgets[idx] = boxed,
Alignment::Center => center_widgets[idx] = boxed,
Alignment::Right => right_widgets[idx] = boxed, Alignment::Right => right_widgets[idx] = boxed,
} }
} }
@@ -336,6 +359,7 @@ impl Komobar {
right_widgets.reverse(); right_widgets.reverse();
self.left_widgets = left_widgets; self.left_widgets = left_widgets;
self.center_widgets = center_widgets;
self.right_widgets = right_widgets; self.right_widgets = right_widgets;
tracing::info!("widget configuration options applied"); tracing::info!("widget configuration options applied");
@@ -354,6 +378,7 @@ impl Komobar {
render_config: Rc::new(RefCell::new(RenderConfig::new())), render_config: Rc::new(RefCell::new(RenderConfig::new())),
komorebi_notification_state: None, komorebi_notification_state: None,
left_widgets: vec![], left_widgets: vec![],
center_widgets: vec![],
right_widgets: vec![], right_widgets: vec![],
rx_gui, rx_gui,
rx_config, rx_config,
@@ -495,7 +520,27 @@ impl eframe::App for Komobar {
w.render(ctx, ui, &mut render_conf); w.render(ctx, ui, &mut render_conf);
} }
}); });
}) });
if !self.center_widgets.is_empty() {
// Floating center widgets
Area::new(Id::new("center_panel"))
.anchor(Align2::CENTER_CENTER, [0.0, 0.0]) // Align in the center of the window
.show(ctx, |ui| {
Frame::none().show(ui, |ui| {
ui.horizontal_centered(|ui| {
let mut render_conf = *render_config;
render_conf.alignment = Some(Alignment::Center);
render_config.apply_on_alignment(ui, |ui| {
for w in &mut self.center_widgets {
w.render(ctx, ui, &mut render_conf);
}
});
});
});
});
}
}) })
}) })
}); });
@@ -505,5 +550,6 @@ impl eframe::App for Komobar {
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub enum Alignment { pub enum Alignment {
Left, Left,
Center,
Right, Right,
} }
+2
View File
@@ -37,6 +37,8 @@ pub struct KomobarConfig {
pub grouping: Option<Grouping>, pub grouping: Option<Grouping>,
/// Left side widgets (ordered left-to-right) /// Left side widgets (ordered left-to-right)
pub left_widgets: Vec<WidgetConfig>, pub left_widgets: Vec<WidgetConfig>,
/// Center widgets (ordered left-to-right)
pub center_widgets: Option<Vec<WidgetConfig>>,
/// Right side widgets (ordered left-to-right) /// Right side widgets (ordered left-to-right)
pub right_widgets: Vec<WidgetConfig>, pub right_widgets: Vec<WidgetConfig>,
} }
+1 -1
View File
@@ -269,7 +269,7 @@ fn main() -> color_eyre::Result<()> {
let viewport_builder = ViewportBuilder::default() let viewport_builder = ViewportBuilder::default()
.with_decorations(false) .with_decorations(false)
.with_transparent(config.transparency_alpha.is_some()) .with_transparent(true)
.with_taskbar(false); .with_taskbar(false);
let native_options = eframe::NativeOptions { let native_options = eframe::NativeOptions {
+2
View File
@@ -190,6 +190,7 @@ impl RenderConfig {
left: match self.alignment { left: match self.alignment {
Some(align) => match align { Some(align) => match align {
Alignment::Left => spacing, Alignment::Left => spacing,
Alignment::Center => spacing,
Alignment::Right => 0.0, Alignment::Right => 0.0,
}, },
None => 0.0, None => 0.0,
@@ -197,6 +198,7 @@ impl RenderConfig {
right: match self.alignment { right: match self.alignment {
Some(align) => match align { Some(align) => match align {
Alignment::Left => 0.0, Alignment::Left => 0.0,
Alignment::Center => 0.0,
Alignment::Right => spacing, Alignment::Right => spacing,
}, },
None => 0.0, None => 0.0,