feat(examples/cosmic): scaling factor spin button

This commit is contained in:
Michael Aaron Murphy 2023-01-19 19:46:28 +01:00 committed by Michael Murphy
parent 046dd49438
commit f386609414
3 changed files with 39 additions and 7 deletions

View file

@ -7,5 +7,6 @@ publish = false
[dependencies] [dependencies]
apply = "0.3.0" apply = "0.3.0"
fraction = "0.13.0"
libcosmic = { path = "../..", default-features = false, features = ["debug", "winit_softbuffer"] } libcosmic = { path = "../..", default-features = false, features = ["debug", "winit_softbuffer"] }
once_cell = "1.15" once_cell = "1.15"

View file

@ -143,6 +143,8 @@ pub struct Window {
title: String, title: String,
show_warning: bool, show_warning: bool,
warning_message: String, warning_message: String,
scale_factor: f64,
scale_factor_string: String,
} }
impl Window { impl Window {
@ -239,6 +241,11 @@ impl Window {
.into() .into()
} }
fn set_scale_factor(&mut self, factor: f32) {
self.scale_factor = factor as f64;
self.scale_factor_string = format!("{:.2}", factor);
}
fn sub_page_button<Message: Clone + From<Page> + 'static>( fn sub_page_button<Message: Clone + From<Page> + 'static>(
&self, &self,
sub_page: impl SubPage, sub_page: impl SubPage,
@ -307,6 +314,7 @@ impl Application for Window {
.show_minimize(true); .show_minimize(true);
window.title = String::from("COSMIC Design System - Iced"); window.title = String::from("COSMIC Design System - Iced");
window.set_scale_factor(1.0);
window.warning_message = String::from("You were not supposed to touch that."); window.warning_message = String::from("You were not supposed to touch that.");
window.insert_page(Page::Demo); window.insert_page(Page::Demo);
@ -373,6 +381,7 @@ impl Application for Window {
} }
Message::Demo(message) => match self.demo.update(message) { Message::Demo(message) => match self.demo.update(message) {
Some(demo::Output::Debug(debug)) => self.debug = debug, Some(demo::Output::Debug(debug)) => self.debug = debug,
Some(demo::Output::ScalingFactor(factor)) => self.set_scale_factor(factor),
Some(demo::Output::ThemeChanged(theme)) => self.theme = theme, Some(demo::Output::ThemeChanged(theme)) => self.theme = theme,
Some(demo::Output::ToggleWarning) => self.toggle_warning(), Some(demo::Output::ToggleWarning) => self.toggle_warning(),
None => (), None => (),
@ -540,6 +549,10 @@ impl Application for Window {
} }
} }
fn scale_factor(&self) -> f64 {
self.scale_factor
}
fn theme(&self) -> Theme { fn theme(&self) -> Theme {
self.theme self.theme
} }

View file

@ -4,12 +4,12 @@ use cosmic::{
iced::{widget::container, Alignment, Length}, iced::{widget::container, Alignment, Length},
theme::{self, Button as ButtonTheme, Theme}, theme::{self, Button as ButtonTheme, Theme},
widget::{ widget::{
button, icon, segmented_button, segmented_selection, settings, button, icon, segmented_button, segmented_selection, settings, spin_button, toggler,
spin_button::{SpinButtonModel, SpinMessage}, view_switcher,
toggler, view_switcher,
}, },
Element, Element,
}; };
use fraction::{Decimal, ToPrimitive};
use super::{Page, Window}; use super::{Page, Window};
@ -37,9 +37,10 @@ pub enum Message {
MultiSelection(segmented_button::Entity), MultiSelection(segmented_button::Entity),
PickListSelected(&'static str), PickListSelected(&'static str),
RowSelected(usize), RowSelected(usize),
ScalingFactor(spin_button::Message),
Selection(segmented_button::Entity), Selection(segmented_button::Entity),
SliderChanged(f32), SliderChanged(f32),
SpinButton(SpinMessage), SpinButton(spin_button::Message),
ThemeChanged(Theme), ThemeChanged(Theme),
ToggleWarning, ToggleWarning,
TogglerToggled(bool), TogglerToggled(bool),
@ -48,6 +49,7 @@ pub enum Message {
pub enum Output { pub enum Output {
Debug(bool), Debug(bool),
ScalingFactor(f32),
ThemeChanged(Theme), ThemeChanged(Theme),
ToggleWarning, ToggleWarning,
} }
@ -58,9 +60,10 @@ pub struct State {
pub multi_selection: segmented_button::MultiSelectModel, pub multi_selection: segmented_button::MultiSelectModel,
pub pick_list_selected: Option<&'static str>, pub pick_list_selected: Option<&'static str>,
pub pick_list_options: Vec<&'static str>, pub pick_list_options: Vec<&'static str>,
pub scaling_value: spin_button::Model<Decimal>,
pub selection: segmented_button::SingleSelectModel, pub selection: segmented_button::SingleSelectModel,
pub slider_value: f32, pub slider_value: f32,
pub spin_button: SpinButtonModel<i32>, pub spin_button: spin_button::Model<i32>,
pub toggler_value: bool, pub toggler_value: bool,
pub view_switcher: segmented_button::SingleSelectModel, pub view_switcher: segmented_button::SingleSelectModel,
} }
@ -71,8 +74,13 @@ impl Default for State {
checkbox_value: false, checkbox_value: false,
pick_list_selected: Some("Option 1"), pick_list_selected: Some("Option 1"),
pick_list_options: vec!["Option 1", "Option 2", "Option 3", "Option 4"], pick_list_options: vec!["Option 1", "Option 2", "Option 3", "Option 4"],
scaling_value: spin_button::Model::default()
.value(1.0)
.min(0.5)
.max(2.0)
.step(0.25),
slider_value: 50.0, slider_value: 50.0,
spin_button: SpinButtonModel::default().min(-10).max(10), spin_button: spin_button::Model::default().min(-10).max(10),
toggler_value: false, toggler_value: false,
icon_themes: segmented_button::Model::builder() icon_themes: segmented_button::Model::builder()
.insert(|b| b.text("Pop").activate()) .insert(|b| b.text("Pop").activate())
@ -108,6 +116,12 @@ impl State {
Message::PickListSelected(value) => self.pick_list_selected = Some(value), Message::PickListSelected(value) => self.pick_list_selected = Some(value),
Message::RowSelected(row) => println!("Selected row {row}"), Message::RowSelected(row) => println!("Selected row {row}"),
Message::MultiSelection(key) => self.multi_selection.activate(key), Message::MultiSelection(key) => self.multi_selection.activate(key),
Message::ScalingFactor(message) => {
self.scaling_value.update(message);
if let Some(factor) = self.scaling_value.value.to_f32() {
return Some(Output::ScalingFactor(factor));
}
}
Message::Selection(key) => self.selection.activate(key), Message::Selection(key) => self.selection.activate(key),
Message::SliderChanged(value) => self.slider_value = value, Message::SliderChanged(value) => self.slider_value = value,
Message::SpinButton(msg) => self.spin_button.update(msg), Message::SpinButton(msg) => self.spin_button.update(msg),
@ -157,6 +171,10 @@ impl State {
"Debug layout", "Debug layout",
toggler(None, window.debug, Message::Debug), toggler(None, window.debug, Message::Debug),
)) ))
.add(settings::item(
"Scaling Factor",
spin_button(&window.scale_factor_string, Message::ScalingFactor),
))
.add(settings::item_row(vec![button(ButtonTheme::Destructive) .add(settings::item_row(vec![button(ButtonTheme::Destructive)
.on_press(Message::ToggleWarning) .on_press(Message::ToggleWarning)
.custom(vec![ .custom(vec![
@ -234,7 +252,7 @@ impl State {
"Spin Button (Range {}:{})", "Spin Button (Range {}:{})",
self.spin_button.min, self.spin_button.max self.spin_button.min, self.spin_button.max
), ),
self.spin_button.view(Message::SpinButton), spin_button(format!("{}", self.spin_button.value), Message::SpinButton),
)) ))
.into(), .into(),
]) ])