1
0
Fork 0
mirror of https://github.com/Zedfrigg/ironbar.git synced 2025-07-01 10:41:03 +02:00

Merge pull request #114 from JakeStanger/feat/common-in-custom

feat(custom): support common options in widgets
This commit is contained in:
Jake Stanger 2023-04-22 13:48:08 +01:00 committed by GitHub
commit 1855416db4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 17 deletions

View file

@ -16,6 +16,7 @@ There are many widget types, each with their own config options.
You can think of these like HTML elements and their attributes.
Every widget has the following options available; `type` is mandatory.
You can also add common [module-level options](https://github.com/JakeStanger/ironbar/wiki/configuration-guide#32-module-level-options) on a widget.
| Name | Type | Default | Description |
|---------|-------------------------------------------------------------------|---------|-------------------------------|

View file

@ -1,5 +1,6 @@
use super::{try_get_orientation, CustomWidget, CustomWidgetContext, Widget};
use super::{try_get_orientation, CustomWidget, CustomWidgetContext};
use crate::build;
use crate::modules::custom::WidgetConfig;
use gtk::prelude::*;
use gtk::Orientation;
use serde::Deserialize;
@ -9,7 +10,7 @@ pub struct BoxWidget {
name: Option<String>,
class: Option<String>,
orientation: Option<String>,
widgets: Option<Vec<Widget>>,
widgets: Option<Vec<WidgetConfig>>,
}
impl CustomWidget for BoxWidget {
@ -26,7 +27,7 @@ impl CustomWidget for BoxWidget {
if let Some(widgets) = self.widgets {
for widget in widgets {
widget.add_to(&container, context);
widget.widget.add_to(&container, context, widget.common);
}
}

View file

@ -12,7 +12,9 @@ use self::slider::SliderWidget;
use crate::config::CommonConfig;
use crate::modules::custom::button::ButtonWidget;
use crate::modules::custom::progress::ProgressWidget;
use crate::modules::{Module, ModuleInfo, ModuleUpdateEvent, ModuleWidget, WidgetContext};
use crate::modules::{
wrap_widget, Module, ModuleInfo, ModuleUpdateEvent, ModuleWidget, WidgetContext,
};
use crate::popup::WidgetGeometry;
use crate::script::Script;
use crate::send_async;
@ -29,14 +31,22 @@ pub struct CustomModule {
/// Container class name
class: Option<String>,
/// Widgets to add to the bar container
bar: Vec<Widget>,
bar: Vec<WidgetConfig>,
/// Widgets to add to the popup container
popup: Option<Vec<Widget>>,
popup: Option<Vec<WidgetConfig>>,
#[serde(flatten)]
pub common: Option<CommonConfig>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct WidgetConfig {
#[serde(flatten)]
widget: Widget,
#[serde(flatten)]
common: CommonConfig,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Widget {
@ -107,15 +117,23 @@ fn try_get_orientation(orientation: &str) -> Result<Orientation> {
impl Widget {
/// Creates this widget and adds it to the parent container
fn add_to(self, parent: &gtk::Box, context: CustomWidgetContext) {
match self {
Self::Box(widget) => parent.add(&widget.into_widget(context)),
Self::Label(widget) => parent.add(&widget.into_widget(context)),
Self::Button(widget) => parent.add(&widget.into_widget(context)),
Self::Image(widget) => parent.add(&widget.into_widget(context)),
Self::Slider(widget) => parent.add(&widget.into_widget(context)),
Self::Progress(widget) => parent.add(&widget.into_widget(context)),
fn add_to(self, parent: &gtk::Box, context: CustomWidgetContext, common: CommonConfig) {
macro_rules! create {
($widget:expr) => {
wrap_widget(&$widget.into_widget(context), common)
};
}
let event_box = match self {
Self::Box(widget) => create!(widget),
Self::Label(widget) => create!(widget),
Self::Button(widget) => create!(widget),
Self::Image(widget) => create!(widget),
Self::Slider(widget) => create!(widget),
Self::Progress(widget) => create!(widget),
};
parent.add(&event_box);
}
}
@ -186,7 +204,9 @@ impl Module<gtk::Box> for CustomModule {
};
self.bar.clone().into_iter().for_each(|widget| {
widget.add_to(&container, custom_context);
widget
.widget
.add_to(&container, custom_context, widget.common);
});
let popup = self.into_popup(context.controller_tx, context.popup_rx, info);
@ -222,7 +242,9 @@ impl Module<gtk::Box> for CustomModule {
};
for widget in popup {
widget.add_to(&container, custom_context);
widget
.widget
.add_to(&container, custom_context, widget.common);
}
}