Small plot-relates fixes (#526)
* plot: take any id source as argument instead of ToString * plot: allow user to set stroke on HLine/VLine * Update changelog
This commit is contained in:
parent
3a14f5e8e2
commit
cba840ec49
5 changed files with 55 additions and 12 deletions
|
@ -7,6 +7,13 @@ NOTE: [`eframe`](eframe/CHANGELOG.md), [`egui_web`](egui_web/CHANGELOG.md) and [
|
||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
### Added ⭐
|
||||||
|
* Plot: you can now set the stroke of a `HLine/VLine`.
|
||||||
|
|
||||||
|
### Changed 🔧
|
||||||
|
* `Plot::new` now takes an `id_source: impl Hash` instead of a `name: impl ToString`. Functionally it is the same.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 0.13.0 - 2021-06-24 - Better panels, plots and new visual style
|
## 0.13.0 - 2021-06-24 - Better panels, plots and new visual style
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,24 @@ impl HLine {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the stroke.
|
||||||
|
pub fn stroke(mut self, stroke: impl Into<Stroke>) -> Self {
|
||||||
|
self.stroke = stroke.into();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Stroke width. A high value means the plot thickens.
|
||||||
|
pub fn width(mut self, width: impl Into<f32>) -> Self {
|
||||||
|
self.stroke.width = width.into();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Stroke color. Default is `Color32::TRANSPARENT` which means a color will be auto-assigned.
|
||||||
|
pub fn color(mut self, color: impl Into<Color32>) -> Self {
|
||||||
|
self.stroke.color = color.into();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Name of this horizontal line.
|
/// Name of this horizontal line.
|
||||||
///
|
///
|
||||||
/// This name will show up in the plot legend, if legends are turned on.
|
/// This name will show up in the plot legend, if legends are turned on.
|
||||||
|
@ -133,6 +151,24 @@ impl VLine {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the stroke.
|
||||||
|
pub fn stroke(mut self, stroke: impl Into<Stroke>) -> Self {
|
||||||
|
self.stroke = stroke.into();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Stroke width. A high value means the plot thickens.
|
||||||
|
pub fn width(mut self, width: impl Into<f32>) -> Self {
|
||||||
|
self.stroke.width = width.into();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Stroke color. Default is `Color32::TRANSPARENT` which means a color will be auto-assigned.
|
||||||
|
pub fn color(mut self, color: impl Into<Color32>) -> Self {
|
||||||
|
self.stroke.color = color.into();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Name of this vertical line.
|
/// Name of this vertical line.
|
||||||
///
|
///
|
||||||
/// This name will show up in the plot legend, if legends are turned on.
|
/// This name will show up in the plot legend, if legends are turned on.
|
||||||
|
|
|
@ -43,11 +43,11 @@ struct PlotMemory {
|
||||||
/// });
|
/// });
|
||||||
/// let line = Line::new(Values::from_values_iter(sin));
|
/// let line = Line::new(Values::from_values_iter(sin));
|
||||||
/// ui.add(
|
/// ui.add(
|
||||||
/// Plot::new("Test Plot").line(line).view_aspect(2.0)
|
/// Plot::new("my_plot").line(line).view_aspect(2.0)
|
||||||
/// );
|
/// );
|
||||||
/// ```
|
/// ```
|
||||||
pub struct Plot {
|
pub struct Plot {
|
||||||
name: String,
|
id_source: Id,
|
||||||
next_auto_color_idx: usize,
|
next_auto_color_idx: usize,
|
||||||
|
|
||||||
items: Vec<Box<dyn PlotItem>>,
|
items: Vec<Box<dyn PlotItem>>,
|
||||||
|
@ -71,10 +71,10 @@ pub struct Plot {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Plot {
|
impl Plot {
|
||||||
#[allow(clippy::needless_pass_by_value)]
|
/// Give a unique id for each plot within the same `Ui`.
|
||||||
pub fn new(name: impl ToString) -> Self {
|
pub fn new(id_source: impl std::hash::Hash) -> Self {
|
||||||
Self {
|
Self {
|
||||||
name: name.to_string(),
|
id_source: Id::new(id_source),
|
||||||
next_auto_color_idx: 0,
|
next_auto_color_idx: 0,
|
||||||
|
|
||||||
items: Default::default(),
|
items: Default::default(),
|
||||||
|
@ -317,7 +317,7 @@ impl Plot {
|
||||||
impl Widget for Plot {
|
impl Widget for Plot {
|
||||||
fn ui(self, ui: &mut Ui) -> Response {
|
fn ui(self, ui: &mut Ui) -> Response {
|
||||||
let Self {
|
let Self {
|
||||||
name,
|
id_source,
|
||||||
next_auto_color_idx: _,
|
next_auto_color_idx: _,
|
||||||
mut items,
|
mut items,
|
||||||
center_x_axis,
|
center_x_axis,
|
||||||
|
@ -336,7 +336,7 @@ impl Widget for Plot {
|
||||||
legend_config,
|
legend_config,
|
||||||
} = self;
|
} = self;
|
||||||
|
|
||||||
let plot_id = ui.make_persistent_id(name);
|
let plot_id = ui.make_persistent_id(id_source);
|
||||||
let memory = ui
|
let memory = ui
|
||||||
.memory()
|
.memory()
|
||||||
.id_data
|
.id_data
|
||||||
|
|
|
@ -121,7 +121,7 @@ impl Widget for &mut LineDemo {
|
||||||
ui.ctx().request_repaint();
|
ui.ctx().request_repaint();
|
||||||
self.time += ui.input().unstable_dt.at_most(1.0 / 30.0) as f64;
|
self.time += ui.input().unstable_dt.at_most(1.0 / 30.0) as f64;
|
||||||
};
|
};
|
||||||
let mut plot = Plot::new("Lines Demo")
|
let mut plot = Plot::new("lines_demo")
|
||||||
.line(self.circle())
|
.line(self.circle())
|
||||||
.line(self.sin())
|
.line(self.sin())
|
||||||
.line(self.thingy())
|
.line(self.thingy())
|
||||||
|
@ -201,7 +201,7 @@ impl Widget for &mut MarkerDemo {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut markers_plot = Plot::new("Markers Demo")
|
let mut markers_plot = Plot::new("markers_demo")
|
||||||
.data_aspect(1.0)
|
.data_aspect(1.0)
|
||||||
.legend(Legend::default());
|
.legend(Legend::default());
|
||||||
for marker in self.markers() {
|
for marker in self.markers() {
|
||||||
|
@ -266,7 +266,7 @@ impl Widget for &mut LegendDemo {
|
||||||
ui.end_row();
|
ui.end_row();
|
||||||
});
|
});
|
||||||
|
|
||||||
let legend_plot = Plot::new("Legend Demo")
|
let legend_plot = Plot::new("legend_demo")
|
||||||
.line(LegendDemo::line_with_slope(0.5).name("lines"))
|
.line(LegendDemo::line_with_slope(0.5).name("lines"))
|
||||||
.line(LegendDemo::line_with_slope(1.0).name("lines"))
|
.line(LegendDemo::line_with_slope(1.0).name("lines"))
|
||||||
.line(LegendDemo::line_with_slope(2.0).name("lines"))
|
.line(LegendDemo::line_with_slope(2.0).name("lines"))
|
||||||
|
@ -325,7 +325,7 @@ impl Widget for &mut ItemsDemo {
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
let plot = Plot::new("Items Demo")
|
let plot = Plot::new("items_demo")
|
||||||
.hline(HLine::new(9.0).name("Lines horizontal"))
|
.hline(HLine::new(9.0).name("Lines horizontal"))
|
||||||
.hline(HLine::new(-9.0).name("Lines horizontal"))
|
.hline(HLine::new(-9.0).name("Lines horizontal"))
|
||||||
.vline(VLine::new(9.0).name("Lines vertical"))
|
.vline(VLine::new(9.0).name("Lines vertical"))
|
||||||
|
|
|
@ -219,7 +219,7 @@ fn example_plot() -> egui::plot::Plot {
|
||||||
let x = egui::remap(i as f64, 0.0..=(n as f64), -TAU..=TAU);
|
let x = egui::remap(i as f64, 0.0..=(n as f64), -TAU..=TAU);
|
||||||
Value::new(x, x.sin())
|
Value::new(x, x.sin())
|
||||||
})));
|
})));
|
||||||
Plot::new("Example Plot")
|
Plot::new("example_plot")
|
||||||
.line(line)
|
.line(line)
|
||||||
.height(32.0)
|
.height(32.0)
|
||||||
.data_aspect(1.0)
|
.data_aspect(1.0)
|
||||||
|
|
Loading…
Reference in a new issue