Skip to content

Commit

Permalink
feat: Add option for graph drawing direction (#1113)
Browse files Browse the repository at this point in the history
* feat: Add option for vertical graph

* doc: Add feature to changelog
  • Loading branch information
lenianiva authored Aug 25, 2024
1 parent dc4def5 commit 452cab7
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 6 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ All notable changes to eww will be listed here, starting at changes since versio
- Add support for `:hover` css selectors for tray items (By: zeapoz)
- Add scss support for the `:style` widget property (By: ovalkonia)
- Add `min` and `max` function calls to simplexpr (By: ovalkonia)
- Add `flip-x`, `flip-y`, `vertical` options to the graph widget to determine its direction

## [0.6.0] (21.04.2024)

Expand Down
38 changes: 32 additions & 6 deletions crates/eww/src/widgets/graph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ pub struct GraphPriv {
#[property(get, set, nick = "Time Range", blurb = "The Time Range", minimum = 0u64, maximum = u64::MAX, default = 10u64)]
time_range: RefCell<u64>,

#[property(get, set, nick = "Flip X", blurb = "Flip the x axis", default = true)]
flip_x: RefCell<bool>,
#[property(get, set, nick = "Flip Y", blurb = "Flip the y axis", default = true)]
flip_y: RefCell<bool>,
#[property(get, set, nick = "Vertical", blurb = "Exchange the x and y axes", default = false)]
vertical: RefCell<bool>,

history: RefCell<VecDeque<(std::time::Instant, f64)>>,
extra_point: RefCell<Option<(std::time::Instant, f64)>>,
last_updated_at: RefCell<std::time::Instant>,
Expand All @@ -53,6 +60,9 @@ impl Default for GraphPriv {
max: RefCell::new(100.0),
dynamic: RefCell::new(true),
time_range: RefCell::new(10),
flip_x: RefCell::new(true),
flip_y: RefCell::new(true),
vertical: RefCell::new(false),
history: RefCell::new(VecDeque::new()),
extra_point: RefCell::new(None),
last_updated_at: RefCell::new(std::time::Instant::now()),
Expand All @@ -77,6 +87,16 @@ impl GraphPriv {
}
history.push_back(v);
}
/**
* Receives normalized (0-1) coordinates `x` and `y` and convert them to the
* point on the widget.
*/
fn value_to_point(&self, width: f64, height: f64, x: f64, y: f64) -> (f64, f64) {
let x = if *self.flip_x.borrow() { 1.0 - x } else { x };
let y = if *self.flip_y.borrow() { 1.0 - y } else { y };
let (x, y) = if *self.vertical.borrow() { (y, x) } else { (x, y) };
(width * x, height * y)
}
}

impl ObjectImpl for GraphPriv {
Expand Down Expand Up @@ -110,6 +130,15 @@ impl ObjectImpl for GraphPriv {
"line-style" => {
self.line_style.replace(value.get().unwrap());
}
"flip-x" => {
self.flip_x.replace(value.get().unwrap());
}
"flip-y" => {
self.flip_y.replace(value.get().unwrap());
}
"vertical" => {
self.vertical.replace(value.get().unwrap());
}
x => panic!("Tried to set inexistant property of Graph: {}", x,),
}
}
Expand Down Expand Up @@ -214,18 +243,15 @@ impl WidgetImpl for GraphPriv {
.iter()
.map(|(instant, value)| {
let t = last_updated_at.duration_since(*instant).as_millis() as f64;
let x = width * (1.0 - (t / time_range));
let y = height * (1.0 - ((value - min) / value_range));
(x, y)
self.value_to_point(width, height, t / time_range, (value - min) / value_range)
})
.collect::<VecDeque<(f64, f64)>>();

// Aad an extra point outside of the graph to extend the line to the left
if let Some((instant, value)) = extra_point {
let t = last_updated_at.duration_since(instant).as_millis() as f64;
let x = -width * ((t - time_range) / time_range);
let y = height * (1.0 - ((value - min) / value_range));
points.push_front((x, y));
let (x, y) = self.value_to_point(width, height, (t - time_range) / time_range, (value - min) / value_range);
points.push_front(if *self.vertical.borrow() { (x, -y) } else { (-x, y) });
}
points
};
Expand Down
6 changes: 6 additions & 0 deletions crates/eww/src/widgets/widget_definitions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1246,6 +1246,12 @@ fn build_graph(bargs: &mut BuilderArgs) -> Result<super::graph::Graph> {
// @prop line-style - changes the look of the edges in the graph. Values: "miter" (default), "round",
// "bevel"
prop(line_style: as_string) { w.set_property("line-style", line_style); },
// @prop flip-x - whether the x axis should go from high to low
prop(flip_x: as_bool) { w.set_property("flip-x", flip_x); },
// @prop flip-y - whether the y axis should go from high to low
prop(flip_y: as_bool) { w.set_property("flip-y", flip_y); },
// @prop vertical - if set to true, the x and y axes will be exchanged
prop(vertical: as_bool) { w.set_property("vertical", vertical); },
});
Ok(w)
}
Expand Down

0 comments on commit 452cab7

Please sign in to comment.