Added direct limit setting API for y limits
This commit is contained in:
parent
465e81d7f9
commit
ad80781f4d
3 changed files with 43 additions and 20 deletions
|
@ -39,12 +39,13 @@ pub fn show_two_yaxis_plot(ui: &Ui, plot_ui: &PlotUi) {
|
||||||
.size([content_width, 300.0])
|
.size([content_width, 300.0])
|
||||||
.with_plot_flags(&(PlotFlags::NONE | PlotFlags::Y_AXIS_2))
|
.with_plot_flags(&(PlotFlags::NONE | PlotFlags::Y_AXIS_2))
|
||||||
.y_limits(
|
.y_limits(
|
||||||
&ImPlotRange { Min: 0.0, Max: 1.0 },
|
ImPlotRange { Min: 0.0, Max: 1.0 },
|
||||||
YAxisChoice::First,
|
YAxisChoice::First,
|
||||||
Condition::Always,
|
Condition::Always,
|
||||||
)
|
)
|
||||||
.y_limits(
|
.y_limits(
|
||||||
&ImPlotRange { Min: 1.0, Max: 3.5 },
|
// One can also use [f32; 2], (f32, f32) and ImVec2 for limit setting
|
||||||
|
[1.0, 3.5],
|
||||||
YAxisChoice::Second,
|
YAxisChoice::Second,
|
||||||
Condition::Always,
|
Condition::Always,
|
||||||
)
|
)
|
||||||
|
@ -114,7 +115,7 @@ pub fn show_configurable_plot(ui: &Ui, plot_ui: &PlotUi) {
|
||||||
.x_label(&x_label)
|
.x_label(&x_label)
|
||||||
.y_label(&y_label)
|
.y_label(&y_label)
|
||||||
.x_limits(
|
.x_limits(
|
||||||
&ImPlotRange {
|
ImPlotRange {
|
||||||
Min: x_min,
|
Min: x_min,
|
||||||
Max: x_max,
|
Max: x_max,
|
||||||
},
|
},
|
||||||
|
@ -125,7 +126,7 @@ pub fn show_configurable_plot(ui: &Ui, plot_ui: &PlotUi) {
|
||||||
Condition::Always,
|
Condition::Always,
|
||||||
)
|
)
|
||||||
.y_limits(
|
.y_limits(
|
||||||
&ImPlotRange {
|
ImPlotRange {
|
||||||
Min: y_min,
|
Min: y_min,
|
||||||
Max: y_max,
|
Max: y_max,
|
||||||
},
|
},
|
||||||
|
@ -162,9 +163,9 @@ pub fn show_query_features_plot(ui: &Ui, plot_ui: &PlotUi) {
|
||||||
// Draw a plot
|
// Draw a plot
|
||||||
Plot::new("Plot querying")
|
Plot::new("Plot querying")
|
||||||
.size([content_width, 300.0])
|
.size([content_width, 300.0])
|
||||||
.x_limits(&ImPlotRange { Min: 0.0, Max: 5.0 }, Condition::FirstUseEver)
|
.x_limits(ImPlotRange { Min: 0.0, Max: 5.0 }, Condition::FirstUseEver)
|
||||||
.y_limits(
|
.y_limits(
|
||||||
&ImPlotRange { Min: 0.0, Max: 5.0 },
|
ImPlotRange { Min: 0.0, Max: 5.0 },
|
||||||
YAxisChoice::First,
|
YAxisChoice::First,
|
||||||
Condition::FirstUseEver,
|
Condition::FirstUseEver,
|
||||||
)
|
)
|
||||||
|
@ -247,9 +248,9 @@ pub fn show_style_plot(ui: &Ui, plot_ui: &PlotUi) {
|
||||||
let style = push_style_color(&PlotColorElement::PlotBg, 1.0, 1.0, 1.0, 0.2);
|
let style = push_style_color(&PlotColorElement::PlotBg, 1.0, 1.0, 1.0, 0.2);
|
||||||
Plot::new("Style demo plot")
|
Plot::new("Style demo plot")
|
||||||
.size([content_width, 300.0])
|
.size([content_width, 300.0])
|
||||||
.x_limits(&ImPlotRange { Min: 0.0, Max: 6.0 }, Condition::Always)
|
.x_limits(ImPlotRange { Min: 0.0, Max: 6.0 }, Condition::Always)
|
||||||
.y_limits(
|
.y_limits(
|
||||||
&ImPlotRange {
|
ImPlotRange {
|
||||||
Min: -1.0,
|
Min: -1.0,
|
||||||
Max: 3.0,
|
Max: 3.0,
|
||||||
},
|
},
|
||||||
|
@ -338,8 +339,8 @@ pub fn show_conversions_plot(ui: &Ui, plot_ui: &PlotUi) {
|
||||||
let content_width = ui.window_content_region_width();
|
let content_width = ui.window_content_region_width();
|
||||||
Plot::new("Simple line plot, conversion 1")
|
Plot::new("Simple line plot, conversion 1")
|
||||||
.size([content_width, 300.0])
|
.size([content_width, 300.0])
|
||||||
.x_limits(&ImVec2 { x: 0.0, y: 1.0 }.into(), Condition::Always)
|
.x_limits(ImVec2 { x: 0.0, y: 1.0 }, Condition::Always)
|
||||||
.y_limits(&[0.0, 1.0].into(), YAxisChoice::First, Condition::Always)
|
.y_limits([0.0, 1.0], YAxisChoice::First, Condition::Always)
|
||||||
.build(plot_ui, || {
|
.build(plot_ui, || {
|
||||||
// If this is called outside a plot build callback, the program will panic.
|
// If this is called outside a plot build callback, the program will panic.
|
||||||
let x_positions = vec![0.1, 0.9];
|
let x_positions = vec![0.1, 0.9];
|
||||||
|
|
40
src/plot.rs
40
src/plot.rs
|
@ -204,27 +204,49 @@ impl Plot {
|
||||||
|
|
||||||
/// Set the x limits of the plot
|
/// Set the x limits of the plot
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn x_limits(mut self, limits: &ImPlotRange, condition: Condition) -> Self {
|
pub fn x_limits<L: Into<ImPlotRange>>(mut self, limits: L, condition: Condition) -> Self {
|
||||||
self.x_limits = Some(*limits);
|
self.x_limits = Some(limits.into());
|
||||||
self.x_limit_condition = Some(condition);
|
self.x_limit_condition = Some(condition);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the Y limits of the plot for the given Y axis. Call multiple times
|
/// Set the Y limits of the plot for the given Y axis. Call multiple times with different
|
||||||
/// to set for multiple axes.
|
/// `y_axis_choice` values to set for multiple axes, or use the convenience methods such as
|
||||||
|
/// [`Plot::y1_limits`].
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn y_limits(
|
pub fn y_limits<L: Into<ImPlotRange>>(
|
||||||
mut self,
|
mut self,
|
||||||
limits: &ImPlotRange,
|
limits: L,
|
||||||
y_axis_choice: YAxisChoice,
|
y_axis_choice: YAxisChoice,
|
||||||
condition: Condition,
|
condition: Condition,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let axis_index = y_axis_choice as usize;
|
let axis_index = y_axis_choice as usize;
|
||||||
self.y_limits[axis_index] = Some(*limits);
|
self.y_limits[axis_index] = Some(limits.into());
|
||||||
self.y_limit_condition[axis_index] = Some(condition);
|
self.y_limit_condition[axis_index] = Some(condition);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Convenience function to directly set the Y limits for the first Y axis. To programmatically
|
||||||
|
/// (or on demand) decide which axie to set limits for, use [`Plot::y_limits`]
|
||||||
|
#[inline]
|
||||||
|
pub fn y1_limits<L: Into<ImPlotRange>>(self, limits: L, condition: Condition) -> Self {
|
||||||
|
self.y_limits(limits, YAxisChoice::First, condition)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Convenience function to directly set the Y limits for the second Y axis. To
|
||||||
|
/// programmatically (or on demand) decide which axie to set limits for, use [`Plot::y_limits`]
|
||||||
|
#[inline]
|
||||||
|
pub fn y2_limits<L: Into<ImPlotRange>>(self, limits: L, condition: Condition) -> Self {
|
||||||
|
self.y_limits(limits, YAxisChoice::Second, condition)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Convenience function to directly set the Y limits for the third Y axis. To programmatically
|
||||||
|
/// (or on demand) decide which axie to set limits for, use [`Plot::y_limits`]
|
||||||
|
#[inline]
|
||||||
|
pub fn y3_limits<L: Into<ImPlotRange>>(self, limits: L, condition: Condition) -> Self {
|
||||||
|
self.y_limits(limits, YAxisChoice::Third, condition)
|
||||||
|
}
|
||||||
|
|
||||||
/// Set X ticks without labels for the plot. The vector contains one label each in
|
/// Set X ticks without labels for the plot. The vector contains one label each in
|
||||||
/// the form of a tuple `(label_position, label_string)`. The `show_default` setting
|
/// the form of a tuple `(label_position, label_string)`. The `show_default` setting
|
||||||
/// determines whether the default ticks are also shown.
|
/// determines whether the default ticks are also shown.
|
||||||
|
@ -352,7 +374,7 @@ impl Plot {
|
||||||
/// "set next plot ticks" wrapper functions for both X and Y.
|
/// "set next plot ticks" wrapper functions for both X and Y.
|
||||||
fn maybe_set_tick_labels(&self) {
|
fn maybe_set_tick_labels(&self) {
|
||||||
// Show x ticks if they are available
|
// Show x ticks if they are available
|
||||||
if self.x_tick_positions.is_some() && self.x_tick_positions.as_ref().unwrap().len() > 0 {
|
if self.x_tick_positions.is_some() && !self.x_tick_positions.as_ref().unwrap().is_empty() {
|
||||||
let mut pointer_vec; // The vector of pointers we create has to have a longer lifetime
|
let mut pointer_vec; // The vector of pointers we create has to have a longer lifetime
|
||||||
let labels_pointer = if let Some(labels_value) = &self.x_tick_labels {
|
let labels_pointer = if let Some(labels_value) = &self.x_tick_labels {
|
||||||
pointer_vec = labels_value
|
pointer_vec = labels_value
|
||||||
|
@ -380,7 +402,7 @@ impl Plot {
|
||||||
.zip(self.show_y_default_ticks.iter())
|
.zip(self.show_y_default_ticks.iter())
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.for_each(|(k, ((positions, labels), show_defaults))| {
|
.for_each(|(k, ((positions, labels), show_defaults))| {
|
||||||
if positions.is_some() && positions.as_ref().unwrap().len() > 0 {
|
if positions.is_some() && !positions.as_ref().unwrap().is_empty() {
|
||||||
// The vector of pointers we create has to have a longer lifetime
|
// The vector of pointers we create has to have a longer lifetime
|
||||||
let mut pointer_vec;
|
let mut pointer_vec;
|
||||||
let labels_pointer = if let Some(labels_value) = &labels {
|
let labels_pointer = if let Some(labels_value) = &labels {
|
||||||
|
|
|
@ -222,7 +222,7 @@ impl PlotText {
|
||||||
/// closures passed to [`Plot::build()`](struct.Plot.html#method.build)
|
/// closures passed to [`Plot::build()`](struct.Plot.html#method.build)
|
||||||
pub fn plot(&self, x: f64, y: f64, vertical: bool) {
|
pub fn plot(&self, x: f64, y: f64, vertical: bool) {
|
||||||
// If there is nothing to show, don't do anything
|
// If there is nothing to show, don't do anything
|
||||||
if self.label == "" {
|
if self.label.is_empty() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue