mirror of
https://codeberg.org/unspeaker/tek.git
synced 2025-12-10 13:46:42 +01:00
46 lines
1.6 KiB
Rust
46 lines
1.6 KiB
Rust
use crate::*;
|
|
|
|
/// A widget that tracks its render width and height
|
|
pub struct Measure<E: Engine>(PhantomData<E>, AtomicUsize, AtomicUsize);
|
|
|
|
impl<E: Engine> Clone for Measure<E> {
|
|
fn clone (&self) -> Self {
|
|
Self(
|
|
Default::default(),
|
|
AtomicUsize::from(self.1.load(Ordering::Relaxed)),
|
|
AtomicUsize::from(self.2.load(Ordering::Relaxed)),
|
|
)
|
|
}
|
|
}
|
|
|
|
impl<E: Engine> std::fmt::Debug for Measure<E> {
|
|
fn fmt (&self, f: &mut std::fmt::Formatter<'_>) -> std::result::Result<(), std::fmt::Error> {
|
|
f.debug_struct("Measure")
|
|
.field("width", &self.0)
|
|
.field("height", &self.1)
|
|
.finish()
|
|
}
|
|
}
|
|
|
|
impl<E: Engine> Measure<E> {
|
|
pub fn w (&self) -> usize { self.1.load(Ordering::Relaxed) }
|
|
pub fn h (&self) -> usize { self.2.load(Ordering::Relaxed) }
|
|
pub fn wh (&self) -> [usize;2] { [self.w(), self.h()] }
|
|
pub fn set_w (&self, w: impl Into<usize>) { self.1.store(w.into(), Ordering::Relaxed) }
|
|
pub fn set_h (&self, h: impl Into<usize>) { self.2.store(h.into(), Ordering::Relaxed) }
|
|
pub fn set_wh (&self, w: impl Into<usize>, h: impl Into<usize>) { self.set_w(w); self.set_h(h); }
|
|
pub fn new () -> Self { Self(PhantomData::default(), 0.into(), 0.into()) }
|
|
pub fn format (&self) -> String { format!("{}x{}", self.w(), self.h()) }
|
|
}
|
|
|
|
impl<E: Engine> Render<E> for Measure<E> {
|
|
fn min_size (&self, _: E::Size) -> Perhaps<E::Size> {
|
|
Ok(Some([0u16.into(), 0u16.into()].into()))
|
|
}
|
|
fn render (&self, to: &mut E::Output) -> Usually<()> {
|
|
self.set_w(to.area().w());
|
|
self.set_h(to.area().h());
|
|
Ok(())
|
|
}
|
|
}
|
|
|