// Copyright 2022 System76 // SPDX-License-Identifier: MPL-2.0 use derive_setters::Setters; use fraction::{Bounded, Decimal}; use std::hash::Hash; use std::ops::{Add, Sub}; /// A message emitted by the [`SpinButton`](super) widget. #[derive(Clone, Copy, Debug, Hash)] pub enum Message { Increment, Decrement, } #[derive(Setters)] pub struct Model { /// The current value of the spin button. #[setters(into)] pub value: T, /// The amount to increment the value. #[setters(into)] pub step: T, /// The minimum value permitted. #[setters(into)] pub min: T, /// The maximum value permitted. #[setters(into)] pub max: T, } impl Model where T: Copy + Hash + Sub + Add + Ord, { pub fn update(&mut self, message: Message) { self.value = match message { Message::Increment => { std::cmp::min(std::cmp::max(self.value + self.step, self.min), self.max) } Message::Decrement => { std::cmp::max(std::cmp::min(self.value - self.step, self.max), self.min) } } } } impl Default for Model { fn default() -> Self { Self { value: 0, step: 1, min: i8::MIN, max: i8::MAX, } } } impl Default for Model { fn default() -> Self { Self { value: 0, step: 1, min: i16::MIN, max: i16::MAX, } } } impl Default for Model { fn default() -> Self { Self { value: 0, step: 1, min: i32::MIN, max: i32::MAX, } } } impl Default for Model { fn default() -> Self { Self { value: 0, step: 1, min: isize::MIN, max: isize::MAX, } } } impl Default for Model { fn default() -> Self { Self { value: 0, step: 1, min: u8::MIN, max: u8::MAX, } } } impl Default for Model { fn default() -> Self { Self { value: 0, step: 1, min: u16::MIN, max: u16::MAX, } } } impl Default for Model { fn default() -> Self { Self { value: 0, step: 1, min: u32::MIN, max: u32::MAX, } } } impl Default for Model { fn default() -> Self { Self { value: 0, step: 1, min: usize::MIN, max: usize::MAX, } } } impl Default for Model { fn default() -> Self { Self { value: Decimal::from(0.0), step: Decimal::from(0.0), min: Decimal::min_positive_value(), max: Decimal::max_value(), } } }