diff --git a/src/main.rs b/src/main.rs index 8760588..f846401 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,7 +16,9 @@ pub mod app; pub mod application_lifecycle; pub mod client; pub mod config; +pub mod display_backend; pub mod eww_state; +pub mod geometry; pub mod ipc_server; pub mod opts; pub mod script_var_handler; @@ -24,8 +26,6 @@ pub mod server; pub mod util; pub mod value; pub mod widgets; -pub mod geometry; -pub mod display_backend; lazy_static::lazy_static! { pub static ref IPC_SOCKET_PATH: std::path::PathBuf = std::env::var("XDG_RUNTIME_DIR") diff --git a/src/util.rs b/src/util.rs index 6c17435..49c4a7d 100644 --- a/src/util.rs +++ b/src/util.rs @@ -54,7 +54,8 @@ macro_rules! loop_select { /// then parse it into css. pub fn parse_scss_from_file(path: &Path) -> Result { let config_dir = path.parent().context("Given SCSS file has no parent directory?!")?; - let scss_file_content = std::fs::read_to_string(path).with_context(|| { format!("Given SCSS File Doesnt Exist! {}", path.display()) })?; + let scss_file_content = + std::fs::read_to_string(path).with_context(|| format!("Given SCSS File Doesnt Exist! {}", path.display()))?; let file_content = replace_env_var_references(scss_file_content); let grass_config = grass::Options::default().load_path(config_dir); grass::from_string(file_content, &grass_config).map_err(|err| anyhow!("Encountered SCSS parsing error: {:?}", err)) diff --git a/src/widgets/widget_definitions.rs b/src/widgets/widget_definitions.rs index c1f629c..31c5c46 100644 --- a/src/widgets/widget_definitions.rs +++ b/src/widgets/widget_definitions.rs @@ -24,6 +24,8 @@ pub(super) fn widget_to_gtk_widget(bargs: &mut BuilderArgs) -> Result build_gtk_expander(bargs)?.upcast(), "color-chooser" => build_gtk_color_chooser(bargs)?.upcast(), "combo-box-text" => build_gtk_combo_box_text(bargs)?.upcast(), + "checkbox" => build_gtk_checkbox(bargs)?.upcast(), + _ => return Ok(None), }; Ok(Some(gtk_widget)) @@ -197,6 +199,30 @@ fn build_gtk_expander(bargs: &mut BuilderArgs) -> Result { Ok(gtk_widget) } +/// @widget a checkbox +/// @desc A checkbox that can trigger events on checked / unchecked. +fn build_gtk_checkbox(bargs: &mut BuilderArgs) -> Result { + let gtk_widget = gtk::CheckButton::new(); + let on_change_handler_id: Rc>> = Rc::new(RefCell::new(None)); + resolve_block!(bargs, gtk_widget, { + // @prop onchecked - action (command) to be executed when checked by the user + // @prop onunchecked - similar to onchecked but when the widget is unchecked + prop(onchecked: as_string = "", onunchecked: as_string = "") { + let old_id = on_change_handler_id.replace(Some( + gtk_widget.connect_toggled(move |gtk_widget| { + if gtk_widget.get_active() { + run_command(&onchecked, ""); + } else { + run_command(&onunchecked, ""); + } + }) + )); + old_id.map(|id| gtk_widget.disconnect(id)); + } + }); + Ok(gtk_widget) +} + /// @widget color-button /// @desc A button opening a color chooser window fn build_gtk_color_button(bargs: &mut BuilderArgs) -> Result {