use super::Control;
use std::mem;
use libui_ffi::{self, uiControl, uiProgressBar};
pub enum ProgressBarValue {
Determinate(u32),
Indeterminate,
}
impl From<u32> for ProgressBarValue {
fn from(value: u32) -> ProgressBarValue {
if value <= 100 {
ProgressBarValue::Determinate(value)
} else {
ProgressBarValue::Determinate(100)
}
}
}
impl From<Option<u32>> for ProgressBarValue {
fn from(value: Option<u32>) -> ProgressBarValue {
match value {
Some(v) => v.into(),
None => ProgressBarValue::Indeterminate,
}
}
}
define_control! {
rust_type: ProgressBar,
sys_type: uiProgressBar,
}
impl ProgressBar {
pub fn new() -> ProgressBar {
unsafe { ProgressBar::from_raw(libui_ffi::uiNewProgressBar()) }
}
pub fn indeterminate() -> ProgressBar {
let mut pb = ProgressBar::new();
pb.set_value(ProgressBarValue::Indeterminate);
pb
}
pub fn set_value<V: Into<ProgressBarValue>>(&mut self, value: V) {
let sys_value = match value.into() {
ProgressBarValue::Determinate(value) => {
let value = if value > 100 { 100 } else { value };
value as i32
}
ProgressBarValue::Indeterminate => -1,
};
unsafe { libui_ffi::uiProgressBarSetValue(self.uiProgressBar, sys_value) }
}
pub fn value(&self) -> ProgressBarValue {
let sys_value = unsafe { libui_ffi::uiProgressBarValue(self.uiProgressBar) };
if sys_value.is_negative() {
assert!(
sys_value == -1,
"if ProgressBar value is negative it can only be -1"
);
ProgressBarValue::Indeterminate
} else {
ProgressBarValue::Determinate(sys_value as u32)
}
}
}