// Map, wardley map editor for linux // Copyright (C) 2026 Rubén Beltrán del Río // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . 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!("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| { sender.output(Action::Zoom(scale.value())).ok(); } }, gtk::Button::with_label(&tr!("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, } } }