use apply::Apply; use cosmic::iced::widget; use cosmic::widget::settings; use cosmic::Element; use cosmic_settings_page::Section; use cosmic_settings_page::{self as page, section}; use slotmap::SlotMap; use super::Message; // XXX pub fn default_primary_button() -> cosmic::widget::segmented_button::SingleSelectModel { let mut model = cosmic::widget::segmented_button::SingleSelectModel::builder() .insert(|b| b.text(fl!("mouse", "primary-button-left"))) .insert(|b| b.text(fl!("mouse", "primary-button-right"))) .build(); model.activate_position(0); model } #[derive(Default)] pub struct Page; impl page::Page for Page { fn content( &self, sections: &mut SlotMap>, ) -> Option { Some(vec![sections.insert(mouse()), sections.insert(scrolling())]) } fn info(&self) -> page::Info { page::Info::new("mouse", "input-mouse-symbolic") .title(fl!("mouse")) .description(fl!("mouse", "desc")) } } impl page::AutoBind for Page {} fn mouse() -> Section { Section::default() .descriptions(vec![ fl!("mouse", "primary-button"), fl!("mouse", "speed"), fl!("mouse", "acceleration"), fl!("mouse", "acceleration-desc"), fl!("mouse", "double-click-speed"), fl!("mouse", "double-click-speed-desc"), ]) .view::(|binder, _page, section| { let descriptions = §ion.descriptions; let input = binder.page::().expect("input page not found"); // TODO need something more custom settings::view_section(§ion.title) // TODO .add(settings::item( &descriptions[0], cosmic::widget::segmented_selection::horizontal(&input.primary_button) .on_activate(Message::PrimaryButtonSelected), )) .add( settings::item::builder(&descriptions[1]).control(widget::slider( 0..=100, input.mouse_speed, Message::SetMouseSpeed, )), ) .add( settings::item::builder(&descriptions[2]) .description(&descriptions[3]) .toggler(input.acceleration, Message::SetAcceleration), ) .add( settings::item::builder(&descriptions[4]) .description(&descriptions[5]) .control(widget::slider( 0..=100, input.double_click_speed, Message::SetDoubleClickSpeed, )), ) .apply(Element::from) .map(crate::pages::Message::Input) }) } fn scrolling() -> Section { Section::default() .title(fl!("mouse-scrolling")) .descriptions(vec![ fl!("mouse-scrolling", "speed"), fl!("mouse-scrolling", "natural"), fl!("mouse-scrolling", "natural-desc"), ]) .view::(|binder, _page, section| { let descriptions = §ion.descriptions; let input = binder.page::().expect("input page not found"); settings::view_section(§ion.title) .add(settings::item( &descriptions[0], // TODO show numeric value widget::slider(0..=100, input.scroll_speed, Message::SetScrollSpeed), )) .add( settings::item::builder(&descriptions[1]) .description(&descriptions[2]) .toggler(input.natural_scroll, Message::SetNaturalScroll), ) .apply(Element::from) .map(crate::pages::Message::Input) }) }