maps 1.10.0

Inspect, compare and align multiple grid maps in an intuitive & fast GUI
Documentation
use eframe::egui;

use crate::app::AppState;
use crate::app_impl::ui_helpers::section_heading;
use crate::grid_options::{GridLineDimension, GridOptions, SubLineVisibility};

impl AppState {
    pub(crate) fn grid_settings(&mut self, ui: &mut egui::Ui) {
        section_heading(ui, "Grid", &mut self.options.collapsed.grid_settings);
        if ui.button("Reset").clicked() {
            self.options.grid = GridOptions::default();
        }
        if self.options.collapsed.grid_settings {
            return;
        }
        ui.end_row();

        ui.label("Show grid lines");
        ui.checkbox(&mut self.options.grid.lines_visible, "");
        ui.end_row();
        if self.options.grid.lines_visible {
            self.grid_lines_settings(ui);
        }

        ui.end_row();
        ui.label("Show marker");
        self.options.grid.marker_visibility.ui(ui);
        ui.end_row();
        if self.options.grid.marker_visibility.any_visible() {
            ui.label("Marker length (meters)");
            ui.add(egui::Slider::new(
                &mut self.options.grid.marker_length_meters,
                0.1..=25.0,
            ));
            ui.end_row();
            ui.label("Marker width (meters)");
            ui.add(egui::Slider::new(
                &mut self.options.grid.marker_width_meters,
                0.01..=5.,
            ));
            ui.end_row();
            ui.label("Marker color (x, y, z)");
            ui.horizontal(|ui| {
                ui.color_edit_button_srgba(&mut self.options.grid.marker_x_color);
                ui.color_edit_button_srgba(&mut self.options.grid.marker_y_color);
                ui.color_edit_button_srgba(&mut self.options.grid.marker_z_color);
            });
            ui.end_row();
        }
        ui.end_row();
        ui.label("Grid scale (points per meter)");
        ui.add(egui::Slider::new(
            &mut self.options.grid.scale,
            self.options.grid.min_scale..=self.options.grid.max_scale,
        ));
        ui.end_row();
        ui.label("Zoom delta (%)")
            .on_hover_text("How much the grid zooms in/out when scrolling.");
        ui.add(egui::Slider::new(
            &mut self.options.grid.scroll_delta_percent,
            0.01..=10.,
        ));
    }

    pub(crate) fn tool_settings(&mut self, ui: &mut egui::Ui) {
        if !section_heading(ui, "Tools", &mut self.options.collapsed.tool_settings) {
            return;
        }
        ui.end_row();
        ui.label("Measurement color")
            .on_hover_text("Line color of the measurement tool.");
        ui.color_edit_button_srgba(&mut self.options.grid.measure_stroke.color);
        ui.end_row();
        ui.label("Lens magnification")
            .on_hover_text("Magnification factor for hovering / fixed lenses.");
        ui.add(egui::Slider::new(
            &mut self.options.grid.lens_magnification,
            0.1..=10.0,
        ));
    }

    fn grid_lines_settings(&mut self, ui: &mut egui::Ui) {
        ui.label("Show sub grid lines")
            .on_hover_text("Show sub lines between main grid lines.");
        ui.horizontal(|ui| {
            ui.selectable_value(
                &mut self.options.grid.sub_lines_visible,
                SubLineVisibility::OnlyLens,
                "In Lens",
            );
            ui.selectable_value(
                &mut self.options.grid.sub_lines_visible,
                SubLineVisibility::Always,
                "Always",
            );
            ui.selectable_value(
                &mut self.options.grid.sub_lines_visible,
                SubLineVisibility::Never,
                "Never",
            );
        });
        ui.end_row();
        ui.label("Grid color");
        ui.horizontal(|ui| {
            ui.color_edit_button_srgba(&mut self.options.grid.line_stroke.color);
            if self.options.grid.sub_lines_visible != SubLineVisibility::Never {
                ui.color_edit_button_srgba(&mut self.options.grid.sub_lines_stroke.color);
            }
        });
        ui.end_row();
        ui.label("Grid spacing dimension");
        ui.horizontal(|ui| {
            ui.selectable_value(
                &mut self.options.grid.line_dimension,
                GridLineDimension::Screen,
                "Screen",
            );
            ui.selectable_value(
                &mut self.options.grid.line_dimension,
                GridLineDimension::Metric,
                "Metric",
            );
        });
        ui.end_row();
        match self.options.grid.line_dimension {
            GridLineDimension::Screen => {
                ui.label("Grid lines spacing (points)");
                ui.add(egui::Slider::new(
                    &mut self.options.grid.line_spacing_points,
                    self.options.grid.min_line_spacing_points
                        ..=self.options.grid.max_line_spacing_points,
                ));
            }
            GridLineDimension::Metric => {
                ui.label("Grid lines spacing (meters)");
                ui.add(egui::Slider::new(
                    &mut self.options.grid.line_spacing_meters,
                    self.options.grid.min_line_spacing_meters
                        ..=self.options.grid.max_line_spacing_meters,
                ));
            }
        }
        if self.options.grid.sub_lines_visible != SubLineVisibility::Never {
            ui.end_row();
            ui.label("Sub grid lines factor").on_hover_text(
                "The multiplier for sub lines between main grid lines.\n\
                1 means no sub lines, 2 means one sub line between main lines, etc.",
            );
            ui.add(egui::Slider::new(
                &mut self.options.grid.sub_lines_factor,
                1..=10,
            ));
        }
        ui.end_row();
        ui.end_row();
        ui.label("Show tick labels");
        ui.checkbox(&mut self.options.grid.tick_labels_visible, "");
        ui.end_row();
        ui.label("Tick label color");
        ui.color_edit_button_srgba(&mut self.options.grid.tick_labels_color);
        ui.end_row();
    }
}