use gtk::prelude::*; use relm4::actions::ActionablePlus; use relm4::prelude::*; use crate::constants; use crate::tr; use crate::icon_names::shipped::{ZOOM_IN_REGULAR, ZOOM_OUT_REGULAR}; use crate::{ZoomInAction, ZoomOutAction, actions::Action}; // Model and Input Messages pub struct Footer { zoom: f64, } pub struct FooterInit { pub zoom: f64, } #[derive(Debug, Clone)] pub enum FooterAction { SetZoom(f64), } #[relm4::component(pub)] impl SimpleComponent for Footer { type Init = FooterInit; type Input = FooterAction; type Output = Action; view! { >k::ActionBar { pack_end = >k::Box { set_orientation: gtk::Orientation::Horizontal, gtk::Label { #[watch] set_label: &format!("{:.1}x", model.zoom), set_margin_end: 5 }, gtk::Button::with_label(&tr!("command.view.zoom_out")) { set_icon_name: ZOOM_OUT_REGULAR, set_margin_end: 5, add_css_class: "flat", add_css_class: "zoom", add_css_class: "zoom-out", ActionablePlus::set_stateless_action::: &(), }, gtk::Scale { set_orientation: gtk::Orientation::Horizontal, set_range: (constants::MIN_ZOOM, constants::MAX_ZOOM), #[watch] set_value: model.zoom, set_draw_value: false, set_increments: (constants::ZOOM_STEP, constants::ZOOM_STEP), set_value_pos: gtk::PositionType::Left, set_width_request: 100, connect_value_changed[sender] => move |scale| { let _ = sender.output(Action::Zoom(scale.value())); } }, gtk::Button::with_label(&tr!("command.view.zoom_in")) { set_icon_name: ZOOM_IN_REGULAR, add_css_class: "flat", add_css_class: "zoom", add_css_class: "zoom-in", ActionablePlus::set_stateless_action::: &(), }, } } } fn init( init: Self::Init, root: Self::Root, sender: ComponentSender, ) -> ComponentParts { let model = Footer { zoom: init.zoom }; let widgets = view_output!(); ComponentParts { model, widgets } } fn update(&mut self, message: Self::Input, _sender: ComponentSender) { match message { FooterAction::SetZoom(zoom) => self.zoom = zoom, } } }