use sys::imgui::im_str;
pub struct PlotLine {
label: String,
}
impl PlotLine {
pub fn new(label: &str) -> Self {
Self {
label: label.to_owned(),
}
}
pub fn plot(&self, x: &Vec<f64>, y: &Vec<f64>) {
if x.len().min(y.len()) == 0 {
return;
}
unsafe {
sys::ImPlot_PlotLinedoublePtrdoublePtr(
im_str!("{}", self.label).as_ptr() as *const i8,
x.as_ptr(),
y.as_ptr(),
x.len().min(y.len()) as i32, 0, std::mem::size_of::<f64>() as i32, );
}
}
}
pub struct PlotScatter {
label: String,
}
impl PlotScatter {
pub fn new(label: &str) -> Self {
Self {
label: label.to_owned(),
}
}
pub fn plot(&self, x: &Vec<f64>, y: &Vec<f64>) {
if x.len().min(y.len()) == 0 {
return;
}
unsafe {
sys::ImPlot_PlotScatterdoublePtrdoublePtr(
im_str!("{}", self.label).as_ptr() as *const i8,
x.as_ptr(),
y.as_ptr(),
x.len().min(y.len()) as i32, 0, std::mem::size_of::<f64>() as i32, );
}
}
}
pub struct PlotBars {
label: String,
bar_width: f64,
horizontal_bars: bool,
}
impl PlotBars {
pub fn new(label: &str) -> Self {
Self {
label: label.to_owned(),
bar_width: 0.67, horizontal_bars: false,
}
}
pub fn with_bar_width(mut self, bar_width: f64) -> Self {
self.bar_width = bar_width;
self
}
pub fn with_horizontal_bars(mut self) -> Self {
self.horizontal_bars = true;
self
}
pub fn plot(&self, axis_positions: &Vec<f64>, bar_values: &Vec<f64>) {
let number_of_points = axis_positions.len().min(bar_values.len());
if number_of_points == 0 {
return;
}
unsafe {
let (plot_function, x, y);
if self.horizontal_bars {
plot_function = sys::ImPlot_PlotBarsHdoublePtrdoublePtr
as unsafe extern "C" fn(*const i8, *const f64, *const f64, i32, f64, i32, i32);
x = bar_values;
y = axis_positions;
} else {
plot_function = sys::ImPlot_PlotBarsdoublePtrdoublePtr
as unsafe extern "C" fn(*const i8, *const f64, *const f64, i32, f64, i32, i32);
x = axis_positions;
y = bar_values;
};
plot_function(
im_str!("{}", self.label).as_ptr() as *const i8,
x.as_ptr(),
y.as_ptr(),
number_of_points as i32, self.bar_width,
0, std::mem::size_of::<f64>() as i32, );
}
}
}
pub struct PlotText {
label: String,
pixel_offset_x: f32,
pixel_offset_y: f32,
}
impl PlotText {
pub fn new(label: &str) -> Self {
Self {
label: label.into(),
pixel_offset_x: 0.0,
pixel_offset_y: 0.0,
}
}
pub fn with_pixel_offset(mut self, offset_x: f32, offset_y: f32) -> Self {
self.pixel_offset_x = offset_x;
self.pixel_offset_y = offset_y;
self
}
pub fn plot(&self, x: f64, y: f64, vertical: bool) {
if self.label == "" {
return;
}
unsafe {
sys::ImPlot_PlotTextdouble(
im_str!("{}", self.label).as_ptr() as *const i8,
x,
y,
vertical,
sys::ImVec2 {
x: self.pixel_offset_x,
y: self.pixel_offset_y,
},
);
}
}
}