use crate::controls::UIElement;
use crate::error::Result;
use parking_lot::RwLock;
use std::sync::Arc;
use windows::Win32::Foundation::*;
#[derive(Clone)]
pub struct ProgressBar {
element: UIElement,
inner: Arc<ProgressBarInner>,
}
struct ProgressBarInner {
value: RwLock<f64>,
minimum: RwLock<f64>,
maximum: RwLock<f64>,
is_indeterminate: RwLock<bool>,
}
impl ProgressBar {
pub fn new() -> Result<Self> {
let inner = Arc::new(ProgressBarInner {
value: RwLock::new(0.0),
minimum: RwLock::new(0.0),
maximum: RwLock::new(100.0),
is_indeterminate: RwLock::new(false),
});
Ok(ProgressBar {
element: UIElement::empty(),
inner,
})
}
pub fn value(&self) -> f64 {
*self.inner.value.read()
}
pub fn set_value(&self, value: f64) {
*self.inner.value.write() = value;
}
pub fn with_value(self, value: f64) -> Self {
self.set_value(value);
self
}
pub fn minimum(&self) -> f64 {
*self.inner.minimum.read()
}
pub fn set_minimum(&self, minimum: f64) {
*self.inner.minimum.write() = minimum;
}
pub fn with_minimum(self, minimum: f64) -> Self {
self.set_minimum(minimum);
self
}
pub fn maximum(&self) -> f64 {
*self.inner.maximum.read()
}
pub fn set_maximum(&self, maximum: f64) {
*self.inner.maximum.write() = maximum;
}
pub fn with_maximum(self, maximum: f64) -> Self {
self.set_maximum(maximum);
self
}
pub fn is_indeterminate(&self) -> bool {
*self.inner.is_indeterminate.read()
}
pub fn set_indeterminate(&self, indeterminate: bool) {
*self.inner.is_indeterminate.write() = indeterminate;
}
pub fn with_is_indeterminate(self, indeterminate: bool) -> Self {
self.set_indeterminate(indeterminate);
self
}
pub fn element(&self) -> &UIElement {
&self.element
}
pub fn hwnd(&self) -> HWND {
self.element.hwnd()
}
}
impl Default for ProgressBar {
fn default() -> Self {
Self::new().expect("Failed to create progress bar")
}
}
impl From<ProgressBar> for UIElement {
fn from(progress: ProgressBar) -> Self {
progress.element.clone()
}
}