use implot_sys as sys;
pub use self::{context::*, plot::*, plot_elements::*};
use imgui::im_str;
pub use sys::{ImPlotLimits, ImPlotPoint, ImPlotRange, ImVec2, ImVec4};
use std::os::raw::c_char;
mod context;
mod plot;
mod plot_elements;
const IMPLOT_AUTO: i32 = -1;
const NUMBER_OF_Y_AXES: usize = 3;
#[rustversion::attr(since(1.48), doc(alias = "ImPlotYAxis"))]
#[derive(Clone)]
#[repr(u32)]
pub enum YAxisChoice {
First = sys::ImPlotYAxis__ImPlotYAxis_1,
Second = sys::ImPlotYAxis__ImPlotYAxis_2,
Third = sys::ImPlotYAxis__ImPlotYAxis_3,
}
#[rustversion::attr(since(1.48), doc(alias = "IMPLOT_AUTO"))]
fn y_axis_choice_option_to_i32(y_axis_choice: Option<YAxisChoice>) -> i32 {
match y_axis_choice {
Some(choice) => choice as i32,
None => IMPLOT_AUTO,
}
}
pub struct PlotUi<'ui> {
context: &'ui Context,
}
#[rustversion::attr(since(1.48), doc(alias = "ImPlotMarker"))]
#[repr(i32)]
#[derive(Copy, Clone, Debug)]
pub enum Marker {
None = sys::ImPlotMarker__ImPlotMarker_None,
Circle = sys::ImPlotMarker__ImPlotMarker_Circle,
Square = sys::ImPlotMarker__ImPlotMarker_Square,
Diamond = sys::ImPlotMarker__ImPlotMarker_Diamond,
Up = sys::ImPlotMarker__ImPlotMarker_Up,
Down = sys::ImPlotMarker__ImPlotMarker_Down,
Left = sys::ImPlotMarker__ImPlotMarker_Left,
Right = sys::ImPlotMarker__ImPlotMarker_Right,
Cross = sys::ImPlotMarker__ImPlotMarker_Cross,
Plus = sys::ImPlotMarker__ImPlotMarker_Plus,
Asterisk = sys::ImPlotMarker__ImPlotMarker_Asterisk,
}
#[rustversion::attr(since(1.48), doc(alias = "ImPlotCol"))]
#[repr(u32)]
#[derive(Copy, Clone, Debug)]
pub enum PlotColorElement {
Line = sys::ImPlotCol__ImPlotCol_Line,
Fill = sys::ImPlotCol__ImPlotCol_Fill,
MarkerOutline = sys::ImPlotCol__ImPlotCol_MarkerOutline,
MarkerFill = sys::ImPlotCol__ImPlotCol_MarkerFill,
ErrorBar = sys::ImPlotCol__ImPlotCol_ErrorBar,
FrameBg = sys::ImPlotCol__ImPlotCol_FrameBg,
PlotBg = sys::ImPlotCol__ImPlotCol_PlotBg,
PlotBorder = sys::ImPlotCol__ImPlotCol_PlotBorder,
LegendBackground = sys::ImPlotCol__ImPlotCol_LegendBg,
LegendBorder = sys::ImPlotCol__ImPlotCol_LegendBorder,
LegendText = sys::ImPlotCol__ImPlotCol_LegendText,
TitleText = sys::ImPlotCol__ImPlotCol_TitleText,
InlayText = sys::ImPlotCol__ImPlotCol_InlayText,
XAxis = sys::ImPlotCol__ImPlotCol_XAxis,
XAxisGrid = sys::ImPlotCol__ImPlotCol_XAxisGrid,
YAxis = sys::ImPlotCol__ImPlotCol_YAxis,
YAxisGrid = sys::ImPlotCol__ImPlotCol_YAxisGrid,
YAxis2 = sys::ImPlotCol__ImPlotCol_YAxis2,
YAxisGrid2 = sys::ImPlotCol__ImPlotCol_YAxisGrid2,
YAxis3 = sys::ImPlotCol__ImPlotCol_YAxis3,
YAxisGrid3 = sys::ImPlotCol__ImPlotCol_YAxisGrid3,
Selection = sys::ImPlotCol__ImPlotCol_Selection,
Crosshairs = sys::ImPlotCol__ImPlotCol_Crosshairs,
Query = sys::ImPlotCol__ImPlotCol_Query,
}
#[rustversion::attr(since(1.48), doc(alias = "ImPlotColormap"))]
#[repr(u32)]
#[derive(Copy, Clone, Debug)]
pub enum Colormap {
Standard = sys::ImPlotColormap__ImPlotColormap_Default,
Deep = sys::ImPlotColormap__ImPlotColormap_Deep,
Dark = sys::ImPlotColormap__ImPlotColormap_Dark,
Pastel = sys::ImPlotColormap__ImPlotColormap_Pastel,
Paired = sys::ImPlotColormap__ImPlotColormap_Paired,
Viridis = sys::ImPlotColormap__ImPlotColormap_Viridis,
Plasma = sys::ImPlotColormap__ImPlotColormap_Plasma,
Hot = sys::ImPlotColormap__ImPlotColormap_Hot,
Cool = sys::ImPlotColormap__ImPlotColormap_Cool,
Pink = sys::ImPlotColormap__ImPlotColormap_Pink,
Jet = sys::ImPlotColormap__ImPlotColormap_Jet,
}
#[rustversion::attr(since(1.48), doc(alias = "ImPlotStyleVar"))]
#[repr(u32)]
#[derive(Copy, Clone, Debug)]
pub enum StyleVar {
LineWeight = sys::ImPlotStyleVar__ImPlotStyleVar_LineWeight,
Marker = sys::ImPlotStyleVar__ImPlotStyleVar_Marker,
MarkerSize = sys::ImPlotStyleVar__ImPlotStyleVar_MarkerSize,
MarkerWeight = sys::ImPlotStyleVar__ImPlotStyleVar_MarkerWeight,
FillAlpha = sys::ImPlotStyleVar__ImPlotStyleVar_FillAlpha,
ErrorBarSize = sys::ImPlotStyleVar__ImPlotStyleVar_ErrorBarSize,
ErrorBarWeight = sys::ImPlotStyleVar__ImPlotStyleVar_ErrorBarWeight,
DigitalBitHeight = sys::ImPlotStyleVar__ImPlotStyleVar_DigitalBitHeight,
DigitalBitGap = sys::ImPlotStyleVar__ImPlotStyleVar_DigitalBitGap,
PlotBorderSize = sys::ImPlotStyleVar__ImPlotStyleVar_PlotBorderSize,
MinorAlpha = sys::ImPlotStyleVar__ImPlotStyleVar_MinorAlpha,
MajorTickLen = sys::ImPlotStyleVar__ImPlotStyleVar_MajorTickLen,
MinorTickLen = sys::ImPlotStyleVar__ImPlotStyleVar_MinorTickLen,
MajorTickSize = sys::ImPlotStyleVar__ImPlotStyleVar_MajorTickSize,
MinorTickSize = sys::ImPlotStyleVar__ImPlotStyleVar_MinorTickSize,
MajorGridSize = sys::ImPlotStyleVar__ImPlotStyleVar_MajorGridSize,
MinorGridSize = sys::ImPlotStyleVar__ImPlotStyleVar_MinorGridSize,
PlotPadding = sys::ImPlotStyleVar__ImPlotStyleVar_PlotPadding,
LabelPadding = sys::ImPlotStyleVar__ImPlotStyleVar_LabelPadding,
LegendPadding = sys::ImPlotStyleVar__ImPlotStyleVar_LegendPadding,
LegendInnerPadding = sys::ImPlotStyleVar__ImPlotStyleVar_LegendInnerPadding,
LegendSpacing = sys::ImPlotStyleVar__ImPlotStyleVar_LegendSpacing,
MousePosPadding = sys::ImPlotStyleVar__ImPlotStyleVar_MousePosPadding,
AnnotationPadding = sys::ImPlotStyleVar__ImPlotStyleVar_AnnotationPadding,
FitPadding = sys::ImPlotStyleVar__ImPlotStyleVar_FitPadding,
PlotDefaultSize = sys::ImPlotStyleVar__ImPlotStyleVar_PlotDefaultSize,
PlotMinSize = sys::ImPlotStyleVar__ImPlotStyleVar_PlotMinSize,
}
#[rustversion::attr(since(1.48), doc(alias = "ImPlotLocation"))]
#[repr(u32)]
#[derive(Copy, Clone, Debug)]
pub enum PlotLocation {
Center = sys::ImPlotLocation__ImPlotLocation_Center,
North = sys::ImPlotLocation__ImPlotLocation_North,
South = sys::ImPlotLocation__ImPlotLocation_South,
West = sys::ImPlotLocation__ImPlotLocation_West,
East = sys::ImPlotLocation__ImPlotLocation_East,
NorthWest = sys::ImPlotLocation__ImPlotLocation_NorthWest,
NorthEast = sys::ImPlotLocation__ImPlotLocation_NorthEast,
SouthWest = sys::ImPlotLocation__ImPlotLocation_SouthWest,
SouthEast = sys::ImPlotLocation__ImPlotLocation_SouthEast,
}
#[rustversion::attr(since(1.48), doc(alias = "ImPlotOrientation"))]
#[repr(u32)]
#[derive(Copy, Clone, Debug)]
pub enum PlotOrientation {
Horizontal = sys::ImPlotOrientation__ImPlotOrientation_Horizontal,
Vertical = sys::ImPlotOrientation__ImPlotOrientation_Vertical,
}
#[rustversion::attr(since(1.48), doc(alias = "SetColormap"))]
pub fn set_colormap_from_preset(preset: Colormap, samples: u32) {
unsafe {
sys::ImPlot_SetColormapPlotColormap(preset as i32, samples as i32);
}
}
#[rustversion::attr(since(1.48), doc(alias = "SetColormap"))]
pub fn set_colormap_from_vec(colors: Vec<ImVec4>) {
unsafe {
sys::ImPlot_SetColormapVec4Ptr(colors.as_ptr(), colors.len() as i32);
}
}
#[rustversion::attr(since(1.48), doc(alias = "PushStyleColor"))]
pub fn push_style_color(
element: &PlotColorElement,
red: f32,
green: f32,
blue: f32,
alpha: f32,
) -> StyleColorToken {
unsafe {
sys::ImPlot_PushStyleColorVec4(
*element as sys::ImPlotCol,
sys::ImVec4 {
x: red,
y: green,
z: blue,
w: alpha,
},
);
}
StyleColorToken { was_popped: false }
}
pub struct StyleColorToken {
was_popped: bool,
}
impl StyleColorToken {
#[rustversion::attr(since(1.48), doc(alias = "PopStyleColor"))]
pub fn pop(mut self) {
if self.was_popped {
panic!("Attempted to pop a style color token twice.")
}
self.was_popped = true;
unsafe {
sys::ImPlot_PopStyleColor(1);
}
}
}
#[rustversion::attr(since(1.48), doc(alias = "PushStyleVar"))]
pub fn push_style_var_f32(element: &StyleVar, value: f32) -> StyleVarToken {
unsafe {
sys::ImPlot_PushStyleVarFloat(*element as sys::ImPlotStyleVar, value);
}
StyleVarToken { was_popped: false }
}
#[rustversion::attr(since(1.48), doc(alias = "PushStyleVar"))]
pub fn push_style_var_i32(element: &StyleVar, value: i32) -> StyleVarToken {
unsafe {
sys::ImPlot_PushStyleVarInt(*element as sys::ImPlotStyleVar, value);
}
StyleVarToken { was_popped: false }
}
pub fn push_style_var_imvec2(element: &StyleVar, value: ImVec2) -> StyleVarToken {
unsafe {
sys::ImPlot_PushStyleVarVec2(*element as sys::ImPlotStyleVar, value);
}
StyleVarToken { was_popped: false }
}
pub struct StyleVarToken {
was_popped: bool,
}
impl StyleVarToken {
#[rustversion::attr(since(1.48), doc(alias = "PopStyleVar"))]
pub fn pop(mut self) {
if self.was_popped {
panic!("Attempted to pop a style var token twice.")
}
self.was_popped = true;
unsafe {
sys::ImPlot_PopStyleVar(1);
}
}
}
#[rustversion::attr(since(1.48), doc(alias = "IsPlotHovered"))]
pub fn is_plot_hovered() -> bool {
unsafe { sys::ImPlot_IsPlotHovered() }
}
#[rustversion::attr(since(1.48), doc(alias = "IsPlotQueried"))]
pub fn is_plot_queried() -> bool {
unsafe { sys::ImPlot_IsPlotQueried() }
}
#[rustversion::attr(since(1.48), doc(alias = "GetPlotMousePos"))]
pub fn get_plot_mouse_position(y_axis_choice: Option<YAxisChoice>) -> ImPlotPoint {
let y_axis_choice_i32 = y_axis_choice_option_to_i32(y_axis_choice);
let mut point = ImPlotPoint { x: 0.0, y: 0.0 }; unsafe {
sys::ImPlot_GetPlotMousePos(&mut point as *mut ImPlotPoint, y_axis_choice_i32);
}
point
}
#[rustversion::attr(since(1.48), doc(alias = "PixelsToPlot"))]
pub fn pixels_to_plot_vec2(
pixel_position: &ImVec2,
y_axis_choice: Option<YAxisChoice>,
) -> ImPlotPoint {
let y_axis_choice_i32 = y_axis_choice_option_to_i32(y_axis_choice);
let mut point = ImPlotPoint { x: 0.0, y: 0.0 }; unsafe {
sys::ImPlot_PixelsToPlotVec2(
&mut point as *mut ImPlotPoint,
*pixel_position,
y_axis_choice_i32,
);
}
point
}
#[rustversion::attr(since(1.48), doc(alias = "PixelsToPlot"))]
pub fn pixels_to_plot_f32(
pixel_position_x: f32,
pixel_position_y: f32,
y_axis_choice: Option<YAxisChoice>,
) -> ImPlotPoint {
let y_axis_choice_i32 = y_axis_choice_option_to_i32(y_axis_choice);
let mut point = ImPlotPoint { x: 0.0, y: 0.0 }; unsafe {
sys::ImPlot_PixelsToPlotFloat(
&mut point as *mut ImPlotPoint,
pixel_position_x,
pixel_position_y,
y_axis_choice_i32,
);
}
point
}
#[rustversion::attr(since(1.48), doc(alias = "PlotToPixels"))]
pub fn plot_to_pixels_vec2(
plot_position: &ImPlotPoint,
y_axis_choice: Option<YAxisChoice>,
) -> ImVec2 {
let y_axis_choice_i32 = y_axis_choice_option_to_i32(y_axis_choice);
let mut pixel_position = ImVec2 { x: 0.0, y: 0.0 }; unsafe {
sys::ImPlot_PlotToPixelsPlotPoInt(
&mut pixel_position as *mut ImVec2,
*plot_position,
y_axis_choice_i32,
);
}
pixel_position
}
#[rustversion::attr(since(1.48), doc(alias = "PlotToPixels"))]
pub fn plot_to_pixels_f32(
plot_position_x: f64,
plot_position_y: f64,
y_axis_choice: Option<YAxisChoice>,
) -> ImVec2 {
let y_axis_choice_i32 = y_axis_choice_option_to_i32(y_axis_choice);
let mut pixel_position = ImVec2 { x: 0.0, y: 0.0 }; unsafe {
sys::ImPlot_PlotToPixelsdouble(
&mut pixel_position as *mut ImVec2,
plot_position_x,
plot_position_y,
y_axis_choice_i32,
);
}
pixel_position
}
#[rustversion::attr(since(1.48), doc(alias = "GetPlotLimits"))]
pub fn get_plot_limits(y_axis_choice: Option<YAxisChoice>) -> ImPlotLimits {
let y_axis_choice_i32 = y_axis_choice_option_to_i32(y_axis_choice);
let mut limits = ImPlotLimits {
X: ImPlotRange { Min: 0.0, Max: 0.0 },
Y: ImPlotRange { Min: 0.0, Max: 0.0 },
};
unsafe {
sys::ImPlot_GetPlotLimits(&mut limits as *mut ImPlotLimits, y_axis_choice_i32);
}
limits
}
#[rustversion::attr(since(1.48), doc(alias = "GetPlotQuery"))]
pub fn get_plot_query(y_axis_choice: Option<YAxisChoice>) -> ImPlotLimits {
let y_axis_choice_i32 = y_axis_choice_option_to_i32(y_axis_choice);
let mut limits = ImPlotLimits {
X: ImPlotRange { Min: 0.0, Max: 0.0 },
Y: ImPlotRange { Min: 0.0, Max: 0.0 },
};
unsafe {
sys::ImPlot_GetPlotQuery(&mut limits as *mut ImPlotLimits, y_axis_choice_i32);
}
limits
}
#[rustversion::attr(since(1.48), doc(alias = "SetPlotYAxis"))]
pub fn set_plot_y_axis(y_axis_choice: YAxisChoice) {
unsafe {
sys::ImPlot_SetPlotYAxis(y_axis_choice as i32);
}
}
#[rustversion::attr(since(1.48), doc(alias = "IsPlotXAxisHovered"))]
pub fn is_plot_x_axis_hovered() -> bool {
unsafe { sys::ImPlot_IsPlotXAxisHovered() }
}
#[rustversion::attr(since(1.48), doc(alias = "IsPlotYAxisHovered"))]
pub fn is_plot_y_axis_hovered(y_axis_choice: Option<YAxisChoice>) -> bool {
let y_axis_choice_i32 = y_axis_choice_option_to_i32(y_axis_choice);
unsafe { sys::ImPlot_IsPlotYAxisHovered(y_axis_choice_i32) }
}
pub fn is_legend_entry_hovered(legend_entry: &str) -> bool {
unsafe { sys::ImPlot_IsLegendEntryHovered(im_str!("{}", legend_entry).as_ptr() as *const c_char) }
}
#[rustversion::attr(since(1.48), doc(alias = "ShowDemoWindow"))]
pub fn show_demo_window(show: &mut bool) {
unsafe {
implot_sys::ImPlot_ShowDemoWindow(show);
}
}