URI: 
       Select tool select operation is now atomic - icy_draw - icy_draw is the successor to mystic draw. fork / mirror
  HTML git clone https://git.drkhsh.at/icy_draw.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 3f7bb19e8591b3345f9a0e3bf9d1e8996beceeb4
   DIR parent 2e251a9d4728d24e88ed432cbfd1c8d335b65e95
  HTML Author: Mike Krüger <mkrueger@posteo.de>
       Date:   Tue, 12 Sep 2023 16:48:42 +0200
       
       Select tool select operation is now atomic
       
       Diffstat:
         M i18n/de/icy_draw.ftl                |       1 +
         M i18n/en/icy_draw.ftl                |       2 +-
         M src/model/tools/click_imp.rs        |       9 ++++++---
         M src/model/tools/font_imp.rs         |       4 ++--
         M src/model/tools/select_imp.rs       |      10 ++++++++--
         M src/ui/dialogs/font_manager.rs      |       2 +-
       
       6 files changed, 19 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/i18n/de/icy_draw.ftl b/i18n/de/icy_draw.ftl
       @@ -247,6 +247,7 @@ undo-bitfont-clear=Leeren
        undo-bitfont-edit=Editieren
        undo-render_character=Zeichen rendern
        undo-delete_character=Zeichen löschen
       +undo-select=Auswahl
        
        autosave-dialog-title=Autosave
        autosave-dialog-description=Icy Draw hat eine Autosave Datei gefunden.
   DIR diff --git a/i18n/en/icy_draw.ftl b/i18n/en/icy_draw.ftl
       @@ -252,7 +252,7 @@ undo-bitfont-clear=Clear
        undo-bitfont-edit=Edit
        undo-render_character=Render character
        undo-delete_character=Delete character
       -
       +undo-select=Select
        
        font_manager-builtin_font=BUILTIN
        font_manager-library_font=LIBRARY
   DIR diff --git a/src/model/tools/click_imp.rs b/src/model/tools/click_imp.rs
       @@ -1,6 +1,7 @@
        use eframe::egui;
        use egui_extras::RetainedImage;
       -use icy_engine::Rectangle;
       +use i18n_embed_fl::fl;
       +use icy_engine::{editor::AtomicUndoGuard, Rectangle};
        use icy_engine_egui::TerminalCalc;
        
        use crate::{
       @@ -30,6 +31,7 @@ enum SelectionDrag {
        pub struct ClickTool {
            start_selection: Rectangle,
            selection_drag: SelectionDrag,
       +    undo_op: Option<AtomicUndoGuard>,
        }
        
        impl Tool for ClickTool {
       @@ -69,6 +71,7 @@ impl Tool for ClickTool {
                        self.start_selection = selection.as_rectangle();
                    }
                }
       +        self.undo_op = Some(editor.begin_atomic_undo(fl!(crate::LANGUAGE_LOADER, "undo-select")));
        
                Event::None
            }
       @@ -187,6 +190,7 @@ impl Tool for ClickTool {
            fn handle_drag_end(&mut self, editor: &mut AnsiEditor) -> Event {
                if !matches!(self.selection_drag, SelectionDrag::None) {
                    self.selection_drag = SelectionDrag::None;
       +            self.undo_op = None;
                    return Event::None;
                }
        
       @@ -198,9 +202,8 @@ impl Tool for ClickTool {
                if editor.drag_pos.start == cur {
                    editor.buffer_view.lock().clear_selection();
                }
       +        self.undo_op = None;
        
       -        let lock = &mut editor.buffer_view.lock();
       -        lock.get_edit_state_mut().add_selection_to_mask();
                Event::None
            }
        
   DIR diff --git a/src/model/tools/font_imp.rs b/src/model/tools/font_imp.rs
       @@ -58,7 +58,7 @@ fn load_fonts(tdf_dir: &Path) -> Vec<TheDrawFont> {
            let walker = WalkDir::new(tdf_dir).into_iter();
            for entry in walker.filter_entry(|e| !FontTool::is_hidden(e)) {
                if let Err(e) = entry {
       -            eprintln!("Can't load tdf font library: {e}");
       +            log::error!("Can't load tdf font library: {e}");
                    break;
                }
                let entry = entry.unwrap();
       @@ -516,7 +516,7 @@ fn watch(path: &Path, fonts: &Arc<Mutex<Vec<TheDrawFont>>>) -> notify::Result<()
        
                        break;
                    }
       -            Err(e) => println!("watch error: {e:}"),
       +            Err(e) => log::error!("watch error: {e:}"),
                }
            }
        
   DIR diff --git a/src/model/tools/select_imp.rs b/src/model/tools/select_imp.rs
       @@ -1,7 +1,7 @@
        use eframe::egui;
        use egui_extras::RetainedImage;
        use i18n_embed_fl::fl;
       -use icy_engine::Rectangle;
       +use icy_engine::{editor::AtomicUndoGuard, Rectangle};
        use icy_engine_egui::TerminalCalc;
        
        use crate::{AnsiEditor, Message};
       @@ -65,6 +65,7 @@ pub struct SelectTool {
            start_selection: Rectangle,
            selection_drag: SelectionDrag,
            mode: SelectionMode,
       +    undo_op: Option<AtomicUndoGuard>,
        }
        
        impl Tool for SelectTool {
       @@ -174,11 +175,12 @@ impl Tool for SelectTool {
            }
        
            fn handle_drag_begin(&mut self, editor: &mut AnsiEditor, _response: &egui::Response) -> Event {
       +        self.undo_op = Some(editor.begin_atomic_undo(fl!(crate::LANGUAGE_LOADER, "undo-select")));
       +
                if self.mode != SelectionMode::Normal {
                    return Event::None;
                }
                self.selection_drag = get_selection_drag(editor, editor.drag_pos.start_abs);
       -
                if !matches!(self.selection_drag, SelectionDrag::None) {
                    if let Some(selection) = editor.buffer_view.lock().get_selection() {
                        self.start_selection = selection.as_rectangle();
       @@ -307,11 +309,13 @@ impl Tool for SelectTool {
        
            fn handle_drag_end(&mut self, editor: &mut AnsiEditor) -> Event {
                if self.mode != SelectionMode::Normal {
       +            self.undo_op = None;
                    return Event::None;
                }
        
                if !matches!(self.selection_drag, SelectionDrag::None) {
                    self.selection_drag = SelectionDrag::None;
       +            self.undo_op = None;
                    return Event::None;
                }
        
       @@ -326,6 +330,8 @@ impl Tool for SelectTool {
        
                let lock = &mut editor.buffer_view.lock();
                lock.get_edit_state_mut().add_selection_to_mask();
       +        self.undo_op = None;
       +
                Event::None
            }
        
   DIR diff --git a/src/ui/dialogs/font_manager.rs b/src/ui/dialogs/font_manager.rs
       @@ -84,7 +84,7 @@ impl FontManager {
                let walker = WalkDir::new(tdf_dir).into_iter();
                for entry in walker.filter_entry(|e| !crate::model::font_imp::FontTool::is_hidden(e)) {
                    if let Err(e) = entry {
       -                eprintln!("Can't load font library: {e}");
       +                log::error!("Can't load font library: {e}");
                        break;
                    }
                    let entry = entry.unwrap();