Added minimap. - icy_draw - icy_draw is the successor to mystic draw. fork / mirror
 (HTM) git clone https://git.drkhsh.at/icy_draw.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 04559526a2cb13d9bb83a55c8403fb8ce170a2bd
 (DIR) parent 3f8a6b7e38fa5f26dba39bdfd92e2b1dc3b96e14
 (HTM) Author: Mike Krüger <mkrueger@posteo.de>
       Date:   Wed,  6 Sep 2023 20:23:33 +0200
       
       Added minimap.
       
       Diffstat:
         M Cargo.toml                          |       1 +
         M i18n/en/icy_draw.ftl                |       1 +
         M src/ui/main_window.rs               |      11 ++++++++---
         A src/ui/tools/minimap_view.rs        |      88 +++++++++++++++++++++++++++++++
         M src/ui/tools/mod.rs                 |       3 +++
       
       5 files changed, 101 insertions(+), 3 deletions(-)
       ---
 (DIR) diff --git a/Cargo.toml b/Cargo.toml
       @@ -58,6 +58,7 @@ copyright = "Copyright (c) Mike Krüger 2022. All rights reserved."
        [package.metadata.deb]
        section="Network"
        copyright = "Copyright (c) Mike Krüger 2022. All rights reserved."
       +metadata.deb.revision=""
        license-file="build/license.rtf"
        assets = [
            ["target/release/icy_draw", "/usr/bin/", "755"],
 (DIR) diff --git a/i18n/en/icy_draw.ftl b/i18n/en/icy_draw.ftl
       @@ -164,6 +164,7 @@ layer_tool_menu_delete_layer=Delete layer
        
        char_table_tool_title=Char table
        bitfont_tool_title=Fonts
       +minimap_tool_title=Minimap
        
        no_document_selected=No document selected
        
 (DIR) diff --git a/src/ui/main_window.rs b/src/ui/main_window.rs
       @@ -10,7 +10,7 @@ use std::{
        use crate::{
            add_child, model::Tool, AnsiEditor, BitFontEditor, BitFontSelector, CharFontEditor,
            CharTableToolWindow, Commands, Document, DocumentBehavior, DocumentOptions, DocumentTab,
       -    LayerToolWindow, Message, ModalDialog, ToolBehavior, ToolTab, TopBar,
       +    LayerToolWindow, Message, MinimapToolWindow, ModalDialog, ToolBehavior, ToolTab, TopBar,
        };
        use eframe::{
            egui::{self, Key, Response, SidePanel, TextStyle, Ui},
       @@ -161,10 +161,15 @@ impl MainWindow {
                .into();
                ctx.set_style(style);
        
       +        let gl = cc.gl.clone().unwrap();
       +
                let mut tool_tree = egui_tiles::Tree::<ToolTab>::empty("tool_tree");
                let layers = tool_tree
                    .tiles
                    .insert_pane(ToolTab::new(LayerToolWindow::default()));
       +        let minimap = tool_tree
       +            .tiles
       +            .insert_pane(ToolTab::new(MinimapToolWindow::new(gl.clone())));
                let char_table = tool_tree
                    .tiles
                    .insert_pane(ToolTab::new(CharTableToolWindow::default()));
       @@ -174,7 +179,7 @@ impl MainWindow {
        
                let tab = tool_tree
                    .tiles
       -            .insert_tab_tile(vec![char_table, bitfont_selector]);
       +            .insert_tab_tile(vec![minimap, char_table, bitfont_selector]);
                let v = tool_tree.tiles.insert_vertical_tile(vec![tab, layers]);
        
                tool_tree.root = Some(v);
       @@ -194,7 +199,7 @@ impl MainWindow {
                    toasts: egui_notify::Toasts::default(),
                    document_tree: egui_tiles::Tree::<DocumentTab>::empty("document_tree"),
                    tool_tree,
       -            gl: cc.gl.clone().unwrap(),
       +            gl,
                    dialog_open: false,
                    modal_dialog: None,
                    id: 0,
 (DIR) diff --git a/src/ui/tools/minimap_view.rs b/src/ui/tools/minimap_view.rs
       @@ -0,0 +1,88 @@
       +use std::sync::{Arc, Mutex};
       +
       +use eframe::{
       +    egui::{self, RichText},
       +    epaint::Vec2,
       +};
       +use i18n_embed_fl::fl;
       +use icy_engine::TextPane;
       +use icy_engine_egui::BufferView;
       +
       +use crate::{AnsiEditor, Document, Message, ToolWindow};
       +
       +pub struct MinimapToolWindow {
       +    buffer_view: Arc<eframe::epaint::mutex::Mutex<BufferView>>,
       +    undo_size: i32,
       +    last_title: String,
       +}
       +
       +impl ToolWindow for MinimapToolWindow {
       +    fn get_title(&self) -> String {
       +        fl!(crate::LANGUAGE_LOADER, "minimap_tool_title")
       +    }
       +
       +    fn show_ui(
       +        &mut self,
       +        ui: &mut egui::Ui,
       +        active_document: Option<Arc<Mutex<Box<dyn Document>>>>,
       +    ) -> Option<Message> {
       +        if let Some(doc) = active_document {
       +            if let Some(editor) = doc.lock().unwrap().get_ansi_editor() {
       +                return self.show_minimap(ui, editor);
       +            }
       +        }
       +        ui.vertical_centered(|ui| {
       +            ui.add_space(8.0);
       +            ui.label(RichText::new(fl!(crate::LANGUAGE_LOADER, "no_document_selected")).small());
       +        });
       +        None
       +    }
       +}
       +
       +impl MinimapToolWindow {
       +    pub fn show_minimap(&mut self, ui: &mut egui::Ui, editor: &AnsiEditor) -> Option<Message> {
       +        let w = (ui.available_width() / 8.0).floor();
       +
       +        let undo_stack = editor.buffer_view.lock().get_edit_state().undo_stack_len() as i32;
       +        if undo_stack != self.undo_size || self.last_title != editor.get_title() {
       +            self.undo_size = undo_stack;
       +            self.last_title = editor.get_title().clone();
       +            let bv = editor.buffer_view.lock();
       +            let buffer = bv.get_buffer();
       +            self.buffer_view
       +                .lock()
       +                .get_buffer_mut()
       +                .set_size(buffer.get_size());
       +            self.buffer_view.lock().get_buffer_mut().layers = buffer.layers.clone();
       +
       +            self.buffer_view.lock().redraw_view();
       +        }
       +        let scalex = (w / self.buffer_view.lock().get_width() as f32).min(2.0);
       +        let scaley = if self.buffer_view.lock().get_buffer_mut().use_aspect_ratio() {
       +            scalex * 1.35
       +        } else {
       +            scalex
       +        };
       +
       +        let opt = icy_engine_egui::TerminalOptions {
       +            focus_lock: false,
       +            stick_to_bottom: false,
       +            scale: Some(Vec2::new(scalex, scaley)),
       +            use_terminal_height: false,
       +            ..Default::default()
       +        };
       +        icy_engine_egui::show_terminal_area(ui, self.buffer_view.clone(), opt);
       +        None
       +    }
       +
       +    pub(crate) fn new(gl: Arc<glow::Context>) -> Self {
       +        let mut buffer_view = BufferView::new(&gl, glow::NEAREST as i32);
       +        buffer_view.get_buffer_mut().is_terminal_buffer = true;
       +        buffer_view.get_caret_mut().is_visible = false;
       +        Self {
       +            buffer_view: Arc::new(eframe::epaint::mutex::Mutex::new(buffer_view)),
       +            last_title: String::new(),
       +            undo_size: -1,
       +        }
       +    }
       +}
 (DIR) diff --git a/src/ui/tools/mod.rs b/src/ui/tools/mod.rs
       @@ -6,3 +6,6 @@ pub use char_table::*;
        
        mod bitfont_selector;
        pub use bitfont_selector::*;
       +
       +mod minimap_view;
       +pub use minimap_view::*;