feat(examples/cosmic): scaling factor spin button
This commit is contained in:
parent
046dd49438
commit
f386609414
3 changed files with 39 additions and 7 deletions
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
])
|
])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue