Add literal tag

This commit is contained in:
elkowar 2020-10-11 16:19:09 +02:00
parent 600f104552
commit 42ae0e6d04
5 changed files with 42 additions and 10 deletions

View file

@ -57,10 +57,7 @@ impl EwwConfig {
let content = std::fs::read_to_string(path)?; let content = std::fs::read_to_string(path)?;
let document = roxmltree::Document::parse(&content)?; let document = roxmltree::Document::parse(&content)?;
let start = std::time::Instant::now();
let result = EwwConfig::from_xml_element(XmlNode::from(document.root_element()).as_element()?); let result = EwwConfig::from_xml_element(XmlNode::from(document.root_element()).as_element()?);
let end = std::time::Instant::now();
dbg!(end - start);
result result
} }
@ -97,7 +94,12 @@ impl EwwConfig {
"var" => { "var" => {
initial_variables.insert( initial_variables.insert(
VarName(node.attr("name")?.to_owned()), VarName(node.attr("name")?.to_owned()),
PrimitiveValue::parse_string(&node.only_child()?.as_text()?.text()), PrimitiveValue::parse_string(
&node
.only_child()
.and_then(|c| Ok(c.as_text()?.text()))
.unwrap_or_else(|_| String::new()),
),
); );
} }
"script-var" => { "script-var" => {

View file

@ -17,6 +17,7 @@ pub enum XmlNode<'a, 'b> {
Text(XmlText<'a, 'b>), Text(XmlText<'a, 'b>),
Ignored(roxmltree::Node<'a, 'b>), Ignored(roxmltree::Node<'a, 'b>),
} }
impl<'a, 'b> fmt::Display for XmlNode<'a, 'b> { impl<'a, 'b> fmt::Display for XmlNode<'a, 'b> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self { match self {

View file

@ -168,7 +168,7 @@ impl EwwState {
} }
}; };
if let Err(e) = result { if let Err(e) = result {
eprintln!("{:?}", e); eprintln!("Error resolving values: {:?}", e);
} }
} }
} }

View file

@ -1,5 +1,4 @@
use crate::config::element; use crate::config::{element, WindowName};
use crate::config::WindowName;
use crate::eww_state::*; use crate::eww_state::*;
use crate::value::{AttrValue, VarName}; use crate::value::{AttrValue, VarName};
use anyhow::*; use anyhow::*;
@ -21,12 +20,13 @@ pub fn run_command<T: std::fmt::Display>(cmd: &str, arg: T) {
} }
} }
struct BuilderArgs<'a, 'b, 'c, 'd> { struct BuilderArgs<'a, 'b, 'c, 'd, 'e> {
eww_state: &'a mut EwwState, eww_state: &'a mut EwwState,
local_env: &'b HashMap<VarName, AttrValue>, local_env: &'b HashMap<VarName, AttrValue>,
widget: &'c element::WidgetUse, widget: &'c element::WidgetUse,
unhandled_attrs: Vec<&'c str>, unhandled_attrs: Vec<&'c str>,
window_name: &'d WindowName, window_name: &'d WindowName,
widget_definitions: &'e HashMap<String, element::WidgetDefinition>,
} }
/// Generate a [gtk::Widget] from a [element::WidgetUse]. /// Generate a [gtk::Widget] from a [element::WidgetUse].
@ -43,7 +43,7 @@ pub fn widget_use_to_gtk_widget(
local_env: &HashMap<VarName, AttrValue>, local_env: &HashMap<VarName, AttrValue>,
widget: &element::WidgetUse, widget: &element::WidgetUse,
) -> Result<gtk::Widget> { ) -> Result<gtk::Widget> {
let builtin_gtk_widget = build_gtk_widget(widget_definitions, eww_state, window_name, local_env, widget)?; let builtin_gtk_widget = build_builtin_gtk_widget(widget_definitions, eww_state, window_name, local_env, widget)?;
let gtk_widget = if let Some(builtin_gtk_widget) = builtin_gtk_widget { let gtk_widget = if let Some(builtin_gtk_widget) = builtin_gtk_widget {
builtin_gtk_widget builtin_gtk_widget
@ -100,7 +100,7 @@ pub fn widget_use_to_gtk_widget(
/// ///
/// This may return `Err` in case there was an actual error while parsing or resolving the widget, /// This may return `Err` in case there was an actual error while parsing or resolving the widget,
/// Or `Ok(None)` if the widget_use just didn't match any widget name. /// Or `Ok(None)` if the widget_use just didn't match any widget name.
fn build_gtk_widget( fn build_builtin_gtk_widget(
widget_definitions: &HashMap<String, element::WidgetDefinition>, widget_definitions: &HashMap<String, element::WidgetDefinition>,
eww_state: &mut EwwState, eww_state: &mut EwwState,
window_name: &WindowName, window_name: &WindowName,
@ -113,6 +113,7 @@ fn build_gtk_widget(
widget, widget,
window_name, window_name,
unhandled_attrs: widget.attrs.keys().map(|x| x.as_ref()).collect(), unhandled_attrs: widget.attrs.keys().map(|x| x.as_ref()).collect(),
widget_definitions,
}; };
let gtk_widget = match widget_to_gtk_widget(&mut bargs) { let gtk_widget = match widget_to_gtk_widget(&mut bargs) {
Ok(Some(gtk_widget)) => gtk_widget, Ok(Some(gtk_widget)) => gtk_widget,
@ -142,6 +143,7 @@ fn build_gtk_widget(
) )
})?; })?;
gtk_widget.add(&child_widget); gtk_widget.add(&child_widget);
child_widget.show();
} }
} }

View file

@ -1,4 +1,6 @@
use super::{run_command, BuilderArgs}; use super::{run_command, BuilderArgs};
use crate::config;
use crate::eww_state;
use crate::resolve_block; use crate::resolve_block;
use crate::value::{AttrValue, PrimitiveValue}; use crate::value::{AttrValue, PrimitiveValue};
use anyhow::*; use anyhow::*;
@ -21,6 +23,7 @@ pub(super) fn widget_to_gtk_widget(bargs: &mut BuilderArgs) -> Result<Option<gtk
"label" => build_gtk_label(bargs)?.upcast(), "label" => build_gtk_label(bargs)?.upcast(),
"text" => build_gtk_text(bargs)?.upcast(), "text" => build_gtk_text(bargs)?.upcast(),
"aspect" => build_gtk_aspect_frame(bargs)?.upcast(), "aspect" => build_gtk_aspect_frame(bargs)?.upcast(),
"literal" => build_gtk_literal(bargs)?.upcast(),
_ => return Ok(None), _ => return Ok(None),
}; };
Ok(Some(gtk_widget)) Ok(Some(gtk_widget))
@ -136,6 +139,30 @@ fn build_gtk_text(bargs: &mut BuilderArgs) -> Result<gtk::Label> {
Ok(gtk_widget) Ok(gtk_widget)
} }
fn build_gtk_literal(bargs: &mut BuilderArgs) -> Result<gtk::Frame> {
let gtk_widget = gtk::Frame::new(None);
// TODO these clones here are dumdum
let window_name = bargs.window_name.clone();
let widget_definitions = bargs.widget_definitions.clone();
resolve_block!(bargs, gtk_widget, {
prop(content: as_string) {
let document = roxmltree::Document::parse(&content)?;
let content_widget_use = config::element::WidgetUse::from_xml_node(document.root_element().into())?;
let child_widget = super::widget_use_to_gtk_widget(
&widget_definitions,
&mut eww_state::EwwState::default(),
&window_name,
&std::collections::HashMap::new(),
&content_widget_use,
)?;
gtk_widget.get_children().iter().for_each(|w| gtk_widget.remove(w));
gtk_widget.add(&child_widget);
child_widget.show();
}
});
Ok(gtk_widget)
}
fn build_gtk_aspect_frame(_bargs: &mut BuilderArgs) -> Result<gtk::AspectFrame> { fn build_gtk_aspect_frame(_bargs: &mut BuilderArgs) -> Result<gtk::AspectFrame> {
let gtk_widget = gtk::AspectFrame::new(None, 0.5, 0.5, 1.0, true); let gtk_widget = gtk::AspectFrame::new(None, 0.5, 0.5, 1.0, true);
Ok(gtk_widget) Ok(gtk_widget)