From 11139ad4dcfe61664877056abd4a7cb1eddd5771 Mon Sep 17 00:00:00 2001 From: elkowar <5300871+elkowar@users.noreply.github.com> Date: Wed, 7 Oct 2020 21:02:06 +0200 Subject: [PATCH] cleanup --- src/widgets/mod.rs | 81 +++++++++++-------------- src/widgets/widget_definitions.rs | 98 +++++++++---------------------- 2 files changed, 63 insertions(+), 116 deletions(-) diff --git a/src/widgets/mod.rs b/src/widgets/mod.rs index f726014..6708cb9 100644 --- a/src/widgets/mod.rs +++ b/src/widgets/mod.rs @@ -109,58 +109,47 @@ pub fn build_gtk_widget( } #[macro_export] -macro_rules! resolve { +macro_rules! resolve_block { ($args:ident, $gtk_widget:ident, { $( - $func:ident => $attr:literal $( = $default:literal)? $( = req $(@$required:tt)?)? => |$arg:ident| $body:expr + prop( $( $attr_name:ident : $typecast_func:ident $(= $default:expr)?),*) $code:block ),+ $(,)? - }) => {{ - $( - resolve!($args, $gtk_widget, $func => $attr $( [ $default ] )* $($($required)*)* => |$arg| $body); - )+ - }}; + }) => { + $({ + $( + $args.unhandled_attrs.retain(|a| a != &::std::stringify!($attr_name).replace('_', "-")); + )* - ($args:ident, $gtk_widget:ident, { - $($func:ident => { - $($attr:literal $(= $default:literal)? $(= req $(@$required:tt)?)? => |$arg:ident| $body:expr),+ $(,)? - }),+ $(,)? - }) => {{ - $($( - resolve!($args, $gtk_widget, $func => $attr $( [ $default ] )* $($($required)*)* => |$arg| $body); - )+)+ - }}; - - // optional - ($args:ident, $gtk_widget:ident, $func:ident => $attr:literal => |$arg:ident| $body:expr) => { - $args.unhandled_attrs.retain(|a| a != &$attr); - if let Some(attr_value) = $args.widget.attrs.get($attr) { - $args.eww_state.$func($args.local_env, attr_value, { - let $gtk_widget = $gtk_widget.clone(); - move |$arg| { $body; } - }); - } - }; - - // required - ($args:ident, $gtk_widget:ident, $func:ident => $attr:literal req => |$arg:ident| $body:expr) => { - $args.unhandled_attrs.retain(|a| a != &$attr); - $args.eww_state.$func($args.local_env, $args.widget.get_attr($attr)?, { - let $gtk_widget = $gtk_widget.clone(); - move |$arg| { $body; } - }); - }; - - // with default - ($args:ident, $gtk_widget:ident, $func:ident => $attr:literal [$default:expr] => |$arg:ident| $body:expr) => { - $args.unhandled_attrs.retain(|a| a != &$attr); - $args.eww_state.$func( - $args.local_env, $args.widget.attrs.get($attr).unwrap_or(&AttrValue::Concrete(PrimitiveValue::from($default))), - { - let $gtk_widget = $gtk_widget.clone(); - move |$arg| { $body; } + let attr_map: Result<_> = try { + ::maplit::hashmap! { + $( + ::std::stringify!($attr_name).to_owned() => resolve_block!(@get_value $args, &::std::stringify!($attr_name).replace('_', "-"), $(= $default)?) + ),* + } + }; + if let Ok(attr_map) = attr_map { + $args.eww_state.resolve( + $args.local_env, + attr_map, + ::glib::clone!(@strong $gtk_widget => move |attrs| { + $( + let $attr_name = attrs.get( ::std::stringify!($attr_name) ).context("something went terribly wrong....")?.$typecast_func()?; + )* + $code + Ok(()) + }) + ); } - ); + })+ }; + + (@get_value $args:ident, $name:expr, = $default:expr) => { + $args.widget.get_attr($name).cloned().unwrap_or(AttrValue::Concrete(PrimitiveValue::from($default))) + }; + + (@get_value $args:ident, $name:expr,) => { + $args.widget.get_attr($name)?.clone() + } } #[allow(unused)] diff --git a/src/widgets/widget_definitions.rs b/src/widgets/widget_definitions.rs index ddf9fb2..2daba8b 100644 --- a/src/widgets/widget_definitions.rs +++ b/src/widgets/widget_definitions.rs @@ -1,5 +1,5 @@ use super::{run_command, BuilderArgs}; -use crate::resolve; +use crate::resolve_block; use crate::value::{AttrValue, PrimitiveValue, VarName}; use anyhow::*; use gtk::prelude::*; @@ -10,54 +10,28 @@ use std::path::Path; // TODO figure out how to // TODO https://developer.gnome.org/gtk3/stable/GtkFixed.html -#[macro_export] -macro_rules! resolve_block { - ($args:ident, $gtk_widget:ident, { - $( - prop( $( $attr_name:ident : $typecast_func:ident $(= $default:expr)?),*) $code:block - ),+ $(,)? - }) => { - $({ - $( - $args.unhandled_attrs.retain(|a| a != &::std::stringify!($attr_name).replace('_', "-")); - )* - let attr_map: Result<_> = try { - ::maplit::hashmap! { - $( - ::std::stringify!($attr_name).to_owned() => resolve_block!(@get_value $args, &::std::stringify!($attr_name).replace('_', "-"), $(= $default)?) - ),* - } - }; - if let Ok(attr_map) = attr_map { - $args.eww_state.resolve( - $args.local_env, - attr_map, - ::glib::clone!(@strong $gtk_widget => move |attrs| { - $( - let $attr_name = attrs.get( ::std::stringify!($attr_name) ).context("something went terribly wrong....")?.$typecast_func()?; - )* - $code - Ok(()) - }) - ); - } - })+ - }; +//// widget definitions - (@get_value $args:ident, $name:expr, = $default:expr) => { - $args.widget.get_attr($name).cloned().unwrap_or(AttrValue::Concrete(PrimitiveValue::from($default))) +pub(super) fn widget_to_gtk_widget(bargs: &mut BuilderArgs) -> Result> { + let gtk_widget = match bargs.widget.name.as_str() { + "layout" => build_gtk_layout(bargs)?.upcast(), + "slider" => build_gtk_scale(bargs)?.upcast(), + "image" => build_gtk_image(bargs)?.upcast(), + "button" => build_gtk_button(bargs)?.upcast(), + "label" => build_gtk_label(bargs)?.upcast(), + "text" => build_gtk_text(bargs)?.upcast(), + "aspect" => build_gtk_aspect_frame(bargs)?.upcast(), + _ => return Ok(None), }; - - (@get_value $args:ident, $name:expr,) => { - $args.widget.get_attr($name)?.clone() - } + Ok(Some(gtk_widget)) } + /// attributes that apply to all widgets pub(super) fn resolve_widget_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Widget) { resolve_block!(bargs, gtk_widget, { prop(class: as_string) { gtk_widget.get_style_context().add_class(&class) }, - prop(valign: as_string) { gtk_widget.set_valign(parse_align(&valign)) }, - prop(halign: as_string) { gtk_widget.set_halign(parse_align(&halign)) }, + prop(valign: as_string) { gtk_widget.set_valign(parse_align(&valign)?) }, + prop(halign: as_string) { gtk_widget.set_halign(parse_align(&halign)?) }, prop(width: as_f64 ) { gtk_widget.set_size_request(width as i32, gtk_widget.get_allocated_height()) }, prop(height: as_f64 ) { gtk_widget.set_size_request(gtk_widget.get_allocated_width(), height as i32) }, prop(active: as_bool = true) { gtk_widget.set_sensitive(active) }, @@ -81,7 +55,7 @@ pub(super) fn resolve_range_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Ran prop(value : as_f64) { gtk_widget.set_value(value)}, prop(min : as_f64) { gtk_widget.get_adjustment().set_lower(min)}, prop(max : as_f64) { gtk_widget.get_adjustment().set_upper(max)}, - prop(orientation : as_string) { gtk_widget.set_orientation(parse_orientation(&orientation)) }, + prop(orientation : as_string) { gtk_widget.set_orientation(parse_orientation(&orientation)?) }, prop(onchange : as_string) { gtk_widget.connect_value_changed(move |gtk_widget| { run_command(&onchange, gtk_widget.get_value()); @@ -92,26 +66,10 @@ pub(super) fn resolve_range_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Ran pub(super) fn resolve_orientable_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Range) { resolve_block!(bargs, gtk_widget, { - prop(orientation: as_string) { gtk_widget.set_orientation(parse_orientation(&orientation)) }, + prop(orientation: as_string) { gtk_widget.set_orientation(parse_orientation(&orientation)?) }, }); } -//// widget definitions - -pub(super) fn widget_to_gtk_widget(bargs: &mut BuilderArgs) -> Result> { - let gtk_widget = match bargs.widget.name.as_str() { - "layout" => build_gtk_layout(bargs)?.upcast(), - "slider" => build_gtk_scale(bargs)?.upcast(), - "image" => build_gtk_image(bargs)?.upcast(), - "button" => build_gtk_button(bargs)?.upcast(), - "label" => build_gtk_label(bargs)?.upcast(), - "text" => build_gtk_text(bargs)?.upcast(), - "aspect" => build_gtk_aspect_frame(bargs)?.upcast(), - _ => return Ok(None), - }; - Ok(Some(gtk_widget)) -} - // concrete widgets fn build_gtk_scale(bargs: &mut BuilderArgs) -> Result { @@ -145,9 +103,8 @@ fn build_gtk_image(bargs: &mut BuilderArgs) -> Result { fn build_gtk_layout(bargs: &mut BuilderArgs) -> Result { let gtk_widget = gtk::Box::new(gtk::Orientation::Horizontal, 0); resolve_block!(bargs, gtk_widget, { - prop(spacing: as_f64 = 0.0) { gtk_widget.set_spacing(spacing as i32) }, - prop(orientation: as_string) { gtk_widget.set_orientation(parse_orientation(&orientation)) }, + prop(orientation: as_string) { gtk_widget.set_orientation(parse_orientation(&orientation)?) }, prop(space_evenly: as_bool = true) { gtk_widget.set_homogeneous(space_evenly) }, }); Ok(gtk_widget) @@ -183,20 +140,21 @@ fn build_gtk_aspect_frame(bargs: &mut BuilderArgs) -> Result { Ok(gtk_widget) } -fn parse_orientation(o: &str) -> gtk::Orientation { - match o { +fn parse_orientation(o: &str) -> Result { + Ok(match o { "vertical" | "v" => gtk::Orientation::Vertical, - _ => gtk::Orientation::Horizontal, - } + "horizontal" | "h" => gtk::Orientation::Horizontal, + _ => bail!("Couldn't parse orientation: '{}'", o), + }) } -fn parse_align(o: &str) -> gtk::Align { - match o { +fn parse_align(o: &str) -> Result { + Ok(match o { "fill" => gtk::Align::Fill, "baseline" => gtk::Align::Baseline, "center" => gtk::Align::Center, "start" => gtk::Align::Start, "end" => gtk::Align::End, - _ => gtk::Align::Start, - } + _ => bail!("Couldn't parse alignment: '{}'", o), + }) }