URI: 
       Fixed clippy issues. - 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 198937a1c1c377fecca852f4fdf49a491e70070b
   DIR parent 853d441dcbd42ee09494d55064db568bf7e41117
  HTML Author: Mike Krüger <mkrueger@posteo.de>
       Date:   Sat,  2 Sep 2023 18:26:51 +0200
       
       Fixed clippy issues.
       
       Diffstat:
         M src/main.rs                         |       1 +
         M src/ui/dialogs/save_file_dialog.rs  |       8 +++++++-
         M src/ui/document_docking.rs          |       6 ++++--
         M src/ui/main_window.rs               |     117 +++++++++++++++++--------------
         M src/ui/messages.rs                  |     222 +++++++++++++++++++++++--------
         M src/ui/mod.rs                       |       1 -
         M src/ui/palette_editor.rs            |       5 +++--
         M src/ui/tool_docking.rs              |       7 +++----
         M src/ui/tool_switcher.rs             |       1 -
         M src/ui/tools/bitfont_selector.rs    |      18 +++++-------------
         M src/ui/tools/char_table.rs          |      74 +++++++++++++------------------
         M src/ui/tools/layer_view.rs          |     301 ++++++++++++++++---------------
         M src/ui/tools/mod.rs                 |       3 +--
         M src/ui/top_bar.rs                   |      86 +++++++++++++++++++++----------
       
       14 files changed, 494 insertions(+), 356 deletions(-)
       ---
   DIR diff --git a/src/main.rs b/src/main.rs
       @@ -1,5 +1,6 @@
        #![cfg_attr(not(debug_assertions), deny(warnings))] // Forbid warnings in release builds
        #![warn(clippy::all, rust_2018_idioms)]
       +#![allow(clippy::arc_with_non_send_sync)]
        use eframe::egui;
        const VERSION: &str = env!("CARGO_PKG_VERSION");
        mod model;
   DIR diff --git a/src/ui/dialogs/save_file_dialog.rs b/src/ui/dialogs/save_file_dialog.rs
       @@ -46,7 +46,13 @@ impl crate::ModalDialog for SaveFileDialog {
            fn commit_self(&self, window: &mut MainWindow) -> crate::TerminalResult<bool> {
                if let Some(file) = &self.opened_file.clone() {
                    let file = file.with_extension("icd");
       -            if let Some(editor) = window.get_active_document().unwrap().lock().unwrap().get_ansi_editor() {
       +            if let Some(editor) = window
       +                .get_active_document()
       +                .unwrap()
       +                .lock()
       +                .unwrap()
       +                .get_ansi_editor()
       +            {
                        let options = SaveOptions::new();
                        editor
                            .save_content(file.to_path_buf().as_path(), &options)
   DIR diff --git a/src/ui/document_docking.rs b/src/ui/document_docking.rs
       @@ -33,7 +33,6 @@ impl egui_tiles::Behavior<DocumentTab> for DocumentBehavior {
                _tile_id: egui_tiles::TileId,
                pane: &mut DocumentTab,
            ) -> egui_tiles::UiResponse {
       -
                pane.doc.lock().unwrap().show_ui(
                    ui,
                    &mut self.tools.lock().unwrap()[self.selected_tool],
       @@ -77,7 +76,10 @@ pub fn add_child(
            full_path: Option<String>,
            doc: Box<dyn Document>,
        ) {
       -    let tile = DocumentTab { full_path, doc: Arc::new(Mutex::new(doc)) };
       +    let tile = DocumentTab {
       +        full_path,
       +        doc: Arc::new(Mutex::new(doc)),
       +    };
            let new_child = tree.tiles.insert_pane(tile);
        
            if tree.root.is_none() {
   DIR diff --git a/src/ui/main_window.rs b/src/ui/main_window.rs
       @@ -8,8 +8,9 @@ use std::{
        };
        
        use crate::{
       -    add_child, model::Tool, AnsiEditor, BitFontEditor, CharFontEditor,
       -    Document, DocumentOptions, ModalDialog, DocumentTab, DocumentBehavior, TopBar, ToolTab, ToolBehavior, LayerToolWindow, CharTableToolWindow, BitFontSelector,
       +    add_child, model::Tool, AnsiEditor, BitFontEditor, BitFontSelector, CharFontEditor,
       +    CharTableToolWindow, Document, DocumentBehavior, DocumentOptions, DocumentTab, LayerToolWindow,
       +    Message, ModalDialog, ToolBehavior, ToolTab, TopBar,
        };
        use eframe::{
            egui::{self, Response, SidePanel, TextStyle, Ui},
       @@ -135,7 +136,6 @@ impl MainWindow {
                    egui::Visuals::dark()
                });
        
       -
                let mut style: egui::Style = (*ctx.style()).clone();
                style.spacing.window_margin = egui::Margin::same(8.0);
                use egui::FontFamily::Proportional;
       @@ -150,16 +150,24 @@ impl MainWindow {
                .into();
                ctx.set_style(style);
        
       -        let mut tool_tree= egui_tiles::Tree::<ToolTab>::empty("tool_tree");
       -        let layers = tool_tree.tiles.insert_pane(ToolTab::new(LayerToolWindow::default()));
       -        let charTable = tool_tree.tiles.insert_pane(ToolTab::new(CharTableToolWindow::default()));
       -        let bitfont_selector = tool_tree.tiles.insert_pane(ToolTab::new(BitFontSelector::default()));
       -
       -        let tab = tool_tree.tiles.insert_tab_tile(vec![charTable, bitfont_selector]);
       +        let mut tool_tree = egui_tiles::Tree::<ToolTab>::empty("tool_tree");
       +        let layers = tool_tree
       +            .tiles
       +            .insert_pane(ToolTab::new(LayerToolWindow::default()));
       +        let char_table = tool_tree
       +            .tiles
       +            .insert_pane(ToolTab::new(CharTableToolWindow::default()));
       +        let bitfont_selector = tool_tree
       +            .tiles
       +            .insert_pane(ToolTab::new(BitFontSelector::default()));
       +
       +        let tab = tool_tree
       +            .tiles
       +            .insert_tab_tile(vec![char_table, bitfont_selector]);
                let v = tool_tree.tiles.insert_vertical_tile(vec![tab, layers]);
        
                tool_tree.root = Some(v);
       -        
       +
                MainWindow {
                    document_behavior: DocumentBehavior {
                        tools: Arc::new(Mutex::new(tools)),
       @@ -171,7 +179,7 @@ impl MainWindow {
                    },
                    tool_behavior: ToolBehavior::default(),
                    toasts: egui_notify::Toasts::default(),
       -            document_tree:  egui_tiles::Tree::<DocumentTab>::empty("document_tree"),
       +            document_tree: egui_tiles::Tree::<DocumentTab>::empty("document_tree"),
                    tool_tree,
                    gl: cc.gl.clone().unwrap(),
                    dialog_open: false,
       @@ -331,11 +339,16 @@ impl MainWindow {
                self.modal_dialog = Some(Box::new(dialog));
            }
        
       -    pub(crate) fn run_editor_command<T>(&mut self, param: T, func: fn(&mut MainWindow, &mut AnsiEditor, T))  {
       +    pub(crate) fn run_editor_command<T>(
       +        &mut self,
       +        param: T,
       +        func: fn(&mut MainWindow, &mut AnsiEditor, T) -> Option<Message>,
       +    ) {
                if let Some(doc) = self.get_active_document() {
                    if let Ok(mut doc) = doc.lock() {
                        if let Some(editor) = doc.get_ansi_editor_mut() {
       -                    func(self, editor, param);
       +                    let msg = func(self, editor, param);
       +                    self.handle_message(msg);
                        }
                    }
                }
       @@ -387,38 +400,38 @@ impl eframe::App for MainWindow {
                        let mut palette: usize = self.palette_mode;
                        if let Some(doc) = self.get_active_document() {
                            if let Some(editor) = doc.lock().unwrap().get_ansi_editor() {
       -                    ui.vertical_centered(|ui| {
       -                        ui.add(crate::palette_switcher(ctx, editor));
       -                    });
       -                    ui.add_space(8.0);
       -                    ui.horizontal(|ui| {
       +                        ui.vertical_centered(|ui| {
       +                            ui.add(crate::palette_switcher(ctx, editor));
       +                        });
                                ui.add_space(8.0);
       +                        ui.horizontal(|ui| {
       +                            ui.add_space(8.0);
        
       -                        if ui.selectable_label(palette == 0, "DOS").clicked() {
       -                            palette = 0;
       -                        }
       -                        if ui.selectable_label(palette == 1, "Extended").clicked() {
       -                            palette = 1;
       -                        }
       -                        if ui.selectable_label(palette == 2, "Custom").clicked() {
       -                            palette = 2;
       -                        }
       -                    });
       -                    ui.separator();
       -                    match palette {
       -                        0 => {
       -                            crate::palette_editor_16(ui, editor);
       -                        }
       -                        1 => {
       -                            crate::show_extended_palette(ui, editor);
       -                        }
       -                        _ => {
       -                            ui.label("TODO");
       +                            if ui.selectable_label(palette == 0, "DOS").clicked() {
       +                                palette = 0;
       +                            }
       +                            if ui.selectable_label(palette == 1, "Extended").clicked() {
       +                                palette = 1;
       +                            }
       +                            if ui.selectable_label(palette == 2, "Custom").clicked() {
       +                                palette = 2;
       +                            }
       +                        });
       +                        ui.separator();
       +                        match palette {
       +                            0 => {
       +                                crate::palette_editor_16(ui, editor);
       +                            }
       +                            1 => {
       +                                crate::show_extended_palette(ui, editor);
       +                            }
       +                            _ => {
       +                                ui.label("TODO");
       +                            }
                                }
       +                        ui.separator();
                            }
       -                    ui.separator();
                        }
       -            }
                        self.palette_mode = palette;
        
                        crate::add_tool_switcher(ctx, ui, self);
       @@ -433,13 +446,12 @@ impl eframe::App for MainWindow {
                            ui.horizontal(|ui| {
                                ui.add_space(4.0);
                                ui.vertical(|ui| {
       -                if let Some(doc) = self.get_active_document() {
       -
       -                            if let Some(editor) = doc.lock().unwrap().get_ansi_editor() {
       -                                let tool_result = tool.show_ui(ctx, ui, editor);
       -                                self.handle_message(tool_result);
       +                            if let Some(doc) = self.get_active_document() {
       +                                if let Some(editor) = doc.lock().unwrap().get_ansi_editor() {
       +                                    let tool_result = tool.show_ui(ctx, ui, editor);
       +                                    self.handle_message(tool_result);
       +                                }
                                    }
       -                        }
                                });
                            });
                        }
       @@ -461,7 +473,7 @@ impl eframe::App for MainWindow {
                        let msg = self.tool_behavior.message.take();
                        self.handle_message(msg);
        
       -                /* 
       +                /*
                        let message = if let Some(doc) = self.get_active_document_mut() {
                            let doc = doc.get_ansi_editor_mut();
                            if let Some(editor) = doc {
       @@ -507,13 +519,12 @@ impl eframe::App for MainWindow {
                    if self.modal_dialog.as_mut().unwrap().show(ctx) {
                        let modal_dialog = self.modal_dialog.take().unwrap();
                        if modal_dialog.should_commit() {
       -                if let Some(doc) = self.get_active_document() {
       -
       -                    if let Some(editor) = doc.lock().unwrap().get_ansi_editor_mut() {
       -                        modal_dialog.commit(editor).unwrap();
       +                    if let Some(doc) = self.get_active_document() {
       +                        if let Some(editor) = doc.lock().unwrap().get_ansi_editor_mut() {
       +                            modal_dialog.commit(editor).unwrap();
       +                        }
                            }
       -                }
       -                     modal_dialog.commit_self(self).unwrap();
       +                    modal_dialog.commit_self(self).unwrap();
                        }
                    }
                }
   DIR diff --git a/src/ui/messages.rs b/src/ui/messages.rs
       @@ -95,8 +95,15 @@ impl MainWindow {
                        self.run_editor_command(0, |window, editor, _| {
                            let view = editor.buffer_view.clone();
                            window.open_dialog(crate::ExportFileDialog::new(&view.lock().buf));
       +                    None
                        });
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor() {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor()
       +                {
                            let view = editor.buffer_view.clone();
                            self.open_dialog(crate::ExportFileDialog::new(&view.lock().buf));
                        }
       @@ -105,129 +112,208 @@ impl MainWindow {
                        self.open_dialog(SelectOutlineDialog::default());
                    }
                    Message::Undo => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut() {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor_mut()
       +                {
                            editor.undo();
                            editor.buffer_view.lock().redraw_view();
                        }
                    }
                    Message::Redo => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut() {
       -                editor.redo();
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor_mut()
       +                {
       +                    editor.redo();
                            editor.buffer_view.lock().redraw_view();
                        }
       -            
                    }
        
                    Message::SelectAll => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor() {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor()
       +                {
                            let buf = &mut editor.buffer_view.lock();
       -                        let w = buf.buf.get_width();
       -                        let h = buf.buf.get_line_count();
       +                    let w = buf.buf.get_width();
       +                    let h = buf.buf.get_line_count();
        
       -                        buf.set_selection(Selection::from_rectangle(0.0, 0.0, w as f32, h as f32));
       -                    }
       +                    buf.set_selection(Selection::from_rectangle(0.0, 0.0, w as f32, h as f32));
       +                }
                    }
                    Message::Deselect => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor() {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor()
       +                {
                            editor.buffer_view.lock().clear_selection();
       -                        editor.redraw_view();
       -                    }
       +                    editor.redraw_view();
       +                }
                    }
        
                    Message::DeleteSelection => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut() {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor_mut()
       +                {
                            if editor.buffer_view.lock().get_selection().is_some() {
       -                            editor.delete_selection();
       -                            editor.redraw_view();
       -                        }
       +                        editor.delete_selection();
       +                        editor.redraw_view();
       +                    }
                        }
                    }
        
                    Message::ShowCharacterSelectionDialog(ch) => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor() {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor()
       +                {
                            let buf = editor.buffer_view.clone();
       -                        self.open_dialog(SelectCharacterDialog::new(buf, ch));
       -                    }
       +                    self.open_dialog(SelectCharacterDialog::new(buf, ch));
       +                }
                    }
                    Message::SelectFontDialog(fonts, selected_font) => {
                        self.open_dialog(crate::SelectFontDialog::new(fonts, selected_font));
                    }
        
                    Message::EditSauce => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor()  {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor()
       +                {
                            let view = editor.buffer_view.clone();
                            self.open_dialog(crate::EditSauceDialog::new(&view.lock().buf));
                        }
                    }
                    Message::SetCanvasSize => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor()  {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor()
       +                {
                            let view = editor.buffer_view.clone();
                            self.open_dialog(crate::SetCanvasSizeDialog::new(&view.lock().buf));
                        }
                    }
        
                    Message::EditLayer(i) => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor()  {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor()
       +                {
                            let view = editor.buffer_view.clone();
                            self.open_dialog(crate::EditLayerDialog::new(&view.lock().buf, i));
                        }
                    }
                    Message::NewLayer => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut()  {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor_mut()
       +                {
                            let buf = &mut editor.buffer_view.lock().buf;
       -                let size = buf.get_buffer_size();
       -                let mut new_layer = icy_engine::Layer::new("New Layer", size);
       -                new_layer.has_alpha_channel = true;
       -                if buf.layers.is_empty() {
       -                    new_layer.has_alpha_channel = false;
       -                }
       +                    let size = buf.get_buffer_size();
       +                    let mut new_layer = icy_engine::Layer::new("New Layer", size);
       +                    new_layer.has_alpha_channel = true;
       +                    if buf.layers.is_empty() {
       +                        new_layer.has_alpha_channel = false;
       +                    }
        
       -                buf.layers.insert(0, new_layer);
       -            }
       +                    buf.layers.insert(0, new_layer);
       +                }
                    }
                    Message::MoveLayerUp(cur_layer) => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut()  {
       -
       -                editor
       -                    .buffer_view
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
                            .lock()
       -                    .buf
       -                    .layers
       -                    .swap(cur_layer, cur_layer - 1);
       -                editor.cur_layer -= 1;
       +                    .unwrap()
       +                    .get_ansi_editor_mut()
       +                {
       +                    editor
       +                        .buffer_view
       +                        .lock()
       +                        .buf
       +                        .layers
       +                        .swap(cur_layer, cur_layer - 1);
       +                    editor.cur_layer -= 1;
                        }
                    }
                    Message::MoveLayerDown(cur_layer) => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut()  {
       -                    editor
       -                    .buffer_view
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
                            .lock()
       -                    .buf
       -                    .layers
       -                    .swap(cur_layer, cur_layer + 1);
       -                editor.cur_layer += 1;
       +                    .unwrap()
       +                    .get_ansi_editor_mut()
       +                {
       +                    editor
       +                        .buffer_view
       +                        .lock()
       +                        .buf
       +                        .layers
       +                        .swap(cur_layer, cur_layer + 1);
       +                    editor.cur_layer += 1;
                        }
                    }
                    Message::DeleteLayer(cur_layer) => {
                        self.run_editor_command(cur_layer, |_, editor, cur_layer| {
                            editor.buffer_view.lock().buf.layers.remove(cur_layer);
                            editor.cur_layer = editor.cur_layer.clamp(
       -                    0,
       -                    editor.buffer_view.lock().buf.layers.len().saturating_sub(1),
       +                        0,
       +                        editor.buffer_view.lock().buf.layers.len().saturating_sub(1),
                            );
       +                    None
                        });
                    }
                    Message::DuplicateLayer(cur_layer) => {
                        self.run_editor_command(cur_layer, |_, editor, cur_layer| {
                            let layer = editor.buffer_view.lock().buf.layers[cur_layer].clone();
       -                    editor.buffer_view.lock().buf.layers.insert(cur_layer + 1, layer);
       +                    editor
       +                        .buffer_view
       +                        .lock()
       +                        .buf
       +                        .layers
       +                        .insert(cur_layer + 1, layer);
                            editor.cur_layer += 1;
       +                    None
                        });
                    }
                    Message::MergeLayer(cur_layer) => {
                        self.run_editor_command(cur_layer, |_, editor, cur_layer| {
                            let layer = editor.buffer_view.lock().buf.layers.remove(cur_layer);
       -                    if let Some(layer_below) = editor.buffer_view.lock().buf.layers.get_mut(cur_layer) {
       +                    if let Some(layer_below) =
       +                        editor.buffer_view.lock().buf.layers.get_mut(cur_layer)
       +                    {
                                for y in 0..layer.get_height() {
                                    for x in 0..layer.get_width() {
                                        println!("{} {}", x, y);
       @@ -238,23 +324,42 @@ impl MainWindow {
                                    }
                                }
                            }
       +                    None
                        });
                    }
        
                    Message::ToggleVisibility(cur_layer) => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut()  {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor_mut()
       +                {
                            let is_visible = editor.buffer_view.lock().buf.layers[cur_layer].is_visible;
                            editor.buffer_view.lock().buf.layers[cur_layer].is_visible = !is_visible;
                        }
                    }
                    Message::SelectLayer(cur_layer) => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut()  {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor_mut()
       +                {
                            editor.cur_layer = cur_layer;
                        }
                    }
        
                    Message::SetFontPage(page) => {
       -                if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut()  {
       +                if let Some(editor) = self
       +                    .get_active_document()
       +                    .unwrap()
       +                    .lock()
       +                    .unwrap()
       +                    .get_ansi_editor_mut()
       +                {
                            editor.buffer_view.lock().caret.set_font_page(page);
        
                            let buf = &mut editor.buffer_view.lock().buf;
       @@ -275,9 +380,12 @@ impl MainWindow {
                        }
                    }
                    Message::CharTable(ch) => {
       -                let ch  =ch as u8;
       -                self.run_editor_command(ch,|_, editor, ch| {
       -                    editor.print_char(ch);
       +                let ch = ch as u8;
       +                self.run_editor_command(ch, |_, editor, ch| {
       +                    if let Err(err) = editor.print_char(ch) {
       +                        return Some(Message::ShowError(format!("{err}")));
       +                    }
       +                    None
                        });
                    }
        
   DIR diff --git a/src/ui/mod.rs b/src/ui/mod.rs
       @@ -13,7 +13,6 @@ pub use palette_editor::*;
        mod tool_switcher;
        pub use tool_switcher::*;
        
       -
        mod icons;
        pub use icons::*;
        
   DIR diff --git a/src/ui/palette_editor.rs b/src/ui/palette_editor.rs
       @@ -167,7 +167,8 @@ pub fn palette_editor_16(ui: &mut egui::Ui, editor: &AnsiEditor) {
                ui.add_space(4.0);
        
                let height = (ui.available_width()) / 8.0;
       -        let (id, stroke_rect) = ui.allocate_space(Vec2::new(ui.available_width() - 4.0, height * 2.0));
       +        let (id, stroke_rect) =
       +            ui.allocate_space(Vec2::new(ui.available_width() - 4.0, height * 2.0));
                let mut response = ui.interact(stroke_rect, id, Sense::click());
        
                let painter = ui.painter_at(stroke_rect);
       @@ -267,7 +268,7 @@ pub fn show_extended_palette(ui: &mut Ui, editor: &AnsiEditor) {
                    for idx in range {
                        ui.horizontal(|ui| {
                            ui.add_space(4.0);
       -                    let width =  ui.available_width();
       +                    let width = ui.available_width();
        
                            let (id, back_rect) = ui.allocate_space(Vec2::new(width, row_height));
                            let mut response = ui.interact(back_rect, id, Sense::click());
   DIR diff --git a/src/ui/tool_docking.rs b/src/ui/tool_docking.rs
       @@ -8,17 +8,16 @@ pub struct ToolTab {
            pub doc: Box<dyn ToolWindow>,
        }
        impl ToolTab {
       -    pub(crate) fn new<T:'static + ToolWindow>(tool_window:  T) -> Self {
       +    pub(crate) fn new<T: 'static + ToolWindow>(tool_window: T) -> Self {
                Self {
                    doc: Box::new(tool_window),
                }
       -
            }
        }
        
        #[derive(Default)]
        pub struct ToolBehavior {
       -    pub active_document: Option<Arc<Mutex<Box<dyn Document>>>>, 
       +    pub active_document: Option<Arc<Mutex<Box<dyn Document>>>>,
            pub message: Option<Message>,
        }
        
       @@ -59,6 +58,6 @@ pub trait ToolWindow {
            fn show_ui(
                &mut self,
                ui: &mut egui::Ui,
       -        active_document: Option<Arc<Mutex<Box<dyn Document>>>> 
       +        active_document: Option<Arc<Mutex<Box<dyn Document>>>>,
            ) -> Option<Message>;
        }
   DIR diff --git a/src/ui/tool_switcher.rs b/src/ui/tool_switcher.rs
       @@ -46,7 +46,6 @@ pub fn add_tool_switcher(ctx: &egui::Context, ui: &mut egui::Ui, arg: &mut MainW
                        );
                    }
        
       -
                    let painter = ui.painter_at(rect);
                    let tint = if i == arg.document_behavior.selected_tool {
                        ui.visuals().widgets.active.fg_stroke.color
   DIR diff --git a/src/ui/tools/bitfont_selector.rs b/src/ui/tools/bitfont_selector.rs
       @@ -1,14 +1,9 @@
        use std::sync::{Arc, Mutex};
        
       -use eframe::{
       -    egui::{self, RichText, Sense, TextStyle},
       -    epaint::{Color32, Vec2, Rounding, Rect, pos2}, emath::Align2,
       -};
       -use egui_extras::RetainedImage;
       +use eframe::egui::{self, RichText};
        use i18n_embed_fl::fl;
       -use icy_engine::{ascii, BufferParser};
        
       -use crate::{AnsiEditor, Message, ToolWindow, Document, VISIBLE_SVG, INVISIBLE_SVG};
       +use crate::{AnsiEditor, Document, Message, ToolWindow};
        
        #[derive(Default)]
        pub struct BitFontSelector {}
       @@ -17,11 +12,11 @@ impl ToolWindow for BitFontSelector {
            fn get_title(&self) -> String {
                fl!(crate::LANGUAGE_LOADER, "bitfont_tool_title")
            }
       - 
       +
            fn show_ui(
                &mut self,
                ui: &mut egui::Ui,
       -        active_document: Option<Arc<Mutex<Box<dyn Document>>>> 
       +        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() {
       @@ -36,10 +31,7 @@ impl ToolWindow for BitFontSelector {
            }
        }
        
       -fn show_font_list(
       -    ui: &mut egui::Ui,
       -    editor: &AnsiEditor,
       -) -> Option<Message> {
       +fn show_font_list(ui: &mut egui::Ui, editor: &AnsiEditor) -> Option<Message> {
            let mut result = None;
        
            /*
   DIR diff --git a/src/ui/tools/char_table.rs b/src/ui/tools/char_table.rs
       @@ -1,28 +1,22 @@
        use std::sync::{Arc, Mutex};
        
       -use eframe::{
       -    egui::{self, RichText, Sense, TextStyle},
       -    epaint::{Color32, Vec2, Rounding, Rect, pos2}, emath::Align2,
       -};
       -use egui_extras::RetainedImage;
       +use eframe::egui::{self, RichText};
        use i18n_embed_fl::fl;
       -use icy_engine::{ascii, BufferParser};
        
       -use crate::{AnsiEditor, Message, ToolWindow, Document, VISIBLE_SVG, INVISIBLE_SVG};
       +use crate::{AnsiEditor, Document, Message, ToolWindow};
        
        #[derive(Default)]
        pub struct CharTableToolWindow {}
        
       -
        impl ToolWindow for CharTableToolWindow {
            fn get_title(&self) -> String {
                fl!(crate::LANGUAGE_LOADER, "char_table_tool_title")
            }
       - 
       +
            fn show_ui(
                &mut self,
                ui: &mut egui::Ui,
       -        active_document: Option<Arc<Mutex<Box<dyn Document>>>> 
       +        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() {
       @@ -37,43 +31,39 @@ impl ToolWindow for CharTableToolWindow {
            }
        }
        
       -
        pub fn show_char_table(ui: &mut egui::Ui, editor: &AnsiEditor) -> Option<Message> {
            let mut result = None;
       -  
       -        let font_page = editor.buffer_view.lock().caret.get_font_page();
       -        let font_length = editor
       -            .buffer_view
       -            .lock()
       -            .buf
       -            .get_font(font_page)
       -            .unwrap()
       -            .length;
        
       -        egui::ScrollArea::vertical()
       -            .id_source("char_table_scroll_area")
       -            .show(ui, |ui| {
       -                ui.horizontal_wrapped(|ui| {
       -                    for i in 0..font_length {
       -                        let ch = unsafe { char::from_u32_unchecked(i as u32) };
       -                        if ui
       -                            .add(crate::model::pencil_imp::draw_glyph_plain(
       -                                editor,
       -                                ch,
       -                                font_page,
       -                            ))
       -                            .clicked()
       -                        { 
       +    let font_page = editor.buffer_view.lock().caret.get_font_page();
       +    let font_length = editor
       +        .buffer_view
       +        .lock()
       +        .buf
       +        .get_font(font_page)
       +        .unwrap()
       +        .length;
        
       -                            result = Some(Message::CharTable(ch));
       +    egui::ScrollArea::vertical()
       +        .id_source("char_table_scroll_area")
       +        .show(ui, |ui| {
       +            ui.horizontal_wrapped(|ui| {
       +                for i in 0..font_length {
       +                    let ch = unsafe { char::from_u32_unchecked(i as u32) };
       +                    if ui
       +                        .add(crate::model::pencil_imp::draw_glyph_plain(
       +                            editor, ch, font_page,
       +                        ))
       +                        .clicked()
       +                    {
       +                        result = Some(Message::CharTable(ch));
        
       -                            /* 
       -                            let editor = &mut b.editor;
       -                          
       -                            b.redraw_view();*/
       -                        }
       +                        /*
       +                        let editor = &mut b.editor;
       +
       +                        b.redraw_view();*/
                            }
       -                })
       -            });
       +                }
       +            })
       +        });
            result
        }
   DIR diff --git a/src/ui/tools/layer_view.rs b/src/ui/tools/layer_view.rs
       @@ -2,12 +2,13 @@ use std::sync::{Arc, Mutex};
        
        use eframe::{
            egui::{self, RichText, Sense, TextStyle},
       -    epaint::{Color32, Vec2, Rounding, Rect, pos2}, emath::Align2,
       +    emath::Align2,
       +    epaint::{pos2, Color32, Rect, Rounding, Vec2},
        };
        use egui_extras::RetainedImage;
        use i18n_embed_fl::fl;
        
       -use crate::{AnsiEditor, Message, ToolWindow, Document, VISIBLE_SVG, INVISIBLE_SVG};
       +use crate::{AnsiEditor, Document, Message, ToolWindow, INVISIBLE_SVG, VISIBLE_SVG};
        
        #[derive(Default)]
        pub struct LayerToolWindow {}
       @@ -16,11 +17,11 @@ impl ToolWindow for LayerToolWindow {
            fn get_title(&self) -> String {
                fl!(crate::LANGUAGE_LOADER, "layer_tool_title")
            }
       - 
       +
            fn show_ui(
                &mut self,
                ui: &mut egui::Ui,
       -        active_document: Option<Arc<Mutex<Box<dyn Document>>>> 
       +        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() {
       @@ -35,10 +36,7 @@ impl ToolWindow for LayerToolWindow {
            }
        }
        
       -fn show_layer_view(
       -    ui: &mut egui::Ui,
       -    editor: &AnsiEditor,
       -) -> Option<Message> {
       +fn show_layer_view(ui: &mut egui::Ui, editor: &AnsiEditor) -> Option<Message> {
            let row_height = 24.0;
            let mut result = None;
        
       @@ -47,167 +45,175 @@ fn show_layer_view(
            let uv = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
            ui.set_height(row_height * 6.0);
            egui::ScrollArea::vertical()
       -    .id_source("layer_view_scroll_area")
       -    
       -    .max_height(180.)
       -    .show_rows(ui, row_height, max, |ui, range| {
       -        for i in range {           
       -            ui.horizontal(|ui| {
       -                ui.add_space(4.0);
       -                let (is_visible, title, color) = {
       -                    let layer = &editor.buffer_view.lock().buf.layers[i];
       -                    (layer.is_visible, layer.title.clone(), layer.color)
       -                };
       -                let width =  ui.available_width();
       -
       -                let (id, back_rect) = ui.allocate_space(Vec2::new(width, row_height));
       -                let mut response = ui.interact(back_rect, id, Sense::click());
       -
       -                let back_painter = ui.painter_at(back_rect);
       -
       -                if response.hovered() {
       -                    back_painter.rect_filled(
       -                        back_rect,
       -                        Rounding::none(),
       -                        ui.style().visuals.widgets.active.bg_fill,
       -                    );
       -                } else if i == cur_layer {
       -                    back_painter.rect_filled(
       -                        back_rect,
       -                        Rounding::none(),
       -                        ui.style().visuals.extreme_bg_color,
       -                    );
       -                }
       -
       -                let stroke_rect = Rect::from_min_size(
       -                    back_rect.min + Vec2::new(0.0, 1.0),
       -                    Vec2::new(22.0, 22.0),
       -                );
       -                let visible_icon_response = ui.interact(stroke_rect, id.with("visible"), Sense::click());
       -
       -                let painter = ui.painter_at(stroke_rect);
       -
       -    
       -                if let Some(color) = color {
       -                    let (r, g, b) = color.into();
       -                    painter.rect_filled(
       -                        stroke_rect,
       -                        Rounding::none(),
       -                        Color32::from_rgb(r, g, b)
       -                    );
       -                } 
       -
       -                let image = if is_visible {
       -                    VISIBLE_SVG.texture_id(ui.ctx())
       -                } else {
       -                    INVISIBLE_SVG.texture_id(ui.ctx())
       -                };
       -
       -                let tint = if i == cur_layer {
       -                    ui.visuals().widgets.active.fg_stroke.color
       -                } else {
       -                    ui.visuals().widgets.inactive.fg_stroke.color
       -                };
       -                
       -                painter.image(image, stroke_rect, uv, tint);
       -                
       -
       -                let color = if  i == cur_layer {
       -                    ui.style().visuals.strong_text_color()
       -                } else {
       -                    ui.style().visuals.text_color()
       -                };
       -                let font_id = TextStyle::Button.resolve(ui.style());
       -
       -                back_painter.text(
       -                    stroke_rect.right_center() + Vec2::new(4., 0.),
       -                    Align2::LEFT_CENTER,
       -                    title,
       -                    font_id,
       -                    color,
       -                );
       -
       -                if visible_icon_response.clicked() {
       -                    result = Some(Message::ToggleVisibility(i));
       -                }
       -
       -                response = response.context_menu(|ui| {
       -                    if ui.button(fl!(crate::LANGUAGE_LOADER, "layer_tool_menu_layer_properties")).clicked() {
       -                        result = Some(Message::EditLayer(i));
       -                        ui.close_menu();
       -                    }
       -                    ui.separator();
       -                    if ui.button(fl!(crate::LANGUAGE_LOADER, "layer_tool_menu_new_layer")).clicked() {
       -                        result = Some(Message::NewLayer);
       -                        ui.close_menu();
       +        .id_source("layer_view_scroll_area")
       +        .max_height(180.)
       +        .show_rows(ui, row_height, max, |ui, range| {
       +            for i in range {
       +                ui.horizontal(|ui| {
       +                    ui.add_space(4.0);
       +                    let (is_visible, title, color) = {
       +                        let layer = &editor.buffer_view.lock().buf.layers[i];
       +                        (layer.is_visible, layer.title.clone(), layer.color)
       +                    };
       +                    let width = ui.available_width();
       +
       +                    let (id, back_rect) = ui.allocate_space(Vec2::new(width, row_height));
       +                    let mut response = ui.interact(back_rect, id, Sense::click());
       +
       +                    let back_painter = ui.painter_at(back_rect);
       +
       +                    if response.hovered() {
       +                        back_painter.rect_filled(
       +                            back_rect,
       +                            Rounding::none(),
       +                            ui.style().visuals.widgets.active.bg_fill,
       +                        );
       +                    } else if i == cur_layer {
       +                        back_painter.rect_filled(
       +                            back_rect,
       +                            Rounding::none(),
       +                            ui.style().visuals.extreme_bg_color,
       +                        );
                            }
       -                    if ui.button(fl!(crate::LANGUAGE_LOADER, "layer_tool_menu_duplicate_layer")).clicked() {
       -                        result = Some(Message::DuplicateLayer(i));
       -                        ui.close_menu();
       +
       +                    let stroke_rect = Rect::from_min_size(
       +                        back_rect.min + Vec2::new(0.0, 1.0),
       +                        Vec2::new(22.0, 22.0),
       +                    );
       +                    let visible_icon_response =
       +                        ui.interact(stroke_rect, id.with("visible"), Sense::click());
       +
       +                    let painter = ui.painter_at(stroke_rect);
       +
       +                    if let Some(color) = color {
       +                        let (r, g, b) = color.into();
       +                        painter.rect_filled(
       +                            stroke_rect,
       +                            Rounding::none(),
       +                            Color32::from_rgb(r, g, b),
       +                        );
                            }
       -                    if ui.button(fl!(crate::LANGUAGE_LOADER, "layer_tool_menu_merge_layer")).clicked() {
       -                        result = Some(Message::MergeLayer(i));
       -                        ui.close_menu();
       +
       +                    let image = if is_visible {
       +                        VISIBLE_SVG.texture_id(ui.ctx())
       +                    } else {
       +                        INVISIBLE_SVG.texture_id(ui.ctx())
       +                    };
       +
       +                    let tint = if i == cur_layer {
       +                        ui.visuals().widgets.active.fg_stroke.color
       +                    } else {
       +                        ui.visuals().widgets.inactive.fg_stroke.color
       +                    };
       +
       +                    painter.image(image, stroke_rect, uv, tint);
       +
       +                    let color = if i == cur_layer {
       +                        ui.style().visuals.strong_text_color()
       +                    } else {
       +                        ui.style().visuals.text_color()
       +                    };
       +                    let font_id = TextStyle::Button.resolve(ui.style());
       +
       +                    back_painter.text(
       +                        stroke_rect.right_center() + Vec2::new(4., 0.),
       +                        Align2::LEFT_CENTER,
       +                        title,
       +                        font_id,
       +                        color,
       +                    );
       +
       +                    if visible_icon_response.clicked() {
       +                        result = Some(Message::ToggleVisibility(i));
                            }
       -                    if ui.button(fl!(crate::LANGUAGE_LOADER, "layer_tool_menu_delete_layer")).clicked() {
       -                        result = Some(Message::DeleteLayer(i));
       -                        ui.close_menu();
       +
       +                    response = response.context_menu(|ui| {
       +                        if ui
       +                            .button(fl!(
       +                                crate::LANGUAGE_LOADER,
       +                                "layer_tool_menu_layer_properties"
       +                            ))
       +                            .clicked()
       +                        {
       +                            result = Some(Message::EditLayer(i));
       +                            ui.close_menu();
       +                        }
       +                        ui.separator();
       +                        if ui
       +                            .button(fl!(crate::LANGUAGE_LOADER, "layer_tool_menu_new_layer"))
       +                            .clicked()
       +                        {
       +                            result = Some(Message::NewLayer);
       +                            ui.close_menu();
       +                        }
       +                        if ui
       +                            .button(fl!(
       +                                crate::LANGUAGE_LOADER,
       +                                "layer_tool_menu_duplicate_layer"
       +                            ))
       +                            .clicked()
       +                        {
       +                            result = Some(Message::DuplicateLayer(i));
       +                            ui.close_menu();
       +                        }
       +                        if ui
       +                            .button(fl!(crate::LANGUAGE_LOADER, "layer_tool_menu_merge_layer"))
       +                            .clicked()
       +                        {
       +                            result = Some(Message::MergeLayer(i));
       +                            ui.close_menu();
       +                        }
       +                        if ui
       +                            .button(fl!(crate::LANGUAGE_LOADER, "layer_tool_menu_delete_layer"))
       +                            .clicked()
       +                        {
       +                            result = Some(Message::DeleteLayer(i));
       +                            ui.close_menu();
       +                        }
       +                    });
       +
       +                    if response.clicked() {
       +                        result = Some(Message::SelectLayer(i));
                            }
        
       +                    if response.double_clicked() {
       +                        result = Some(Message::EditLayer(i));
       +                    }
                        });
       -
       -                if response.clicked() {
       -                    result = Some(Message::SelectLayer(i));
       -                }
       -
       -                if response.double_clicked() {
       -                    result = Some(Message::EditLayer(i));
       -                }
       -            });
       -        }
       -    });
       +            }
       +        });
            ui.add_space(ui.available_height());
            ui.separator();
            ui.horizontal(|ui| {
                ui.add_space(4.0);
                ui.spacing_mut().item_spacing = eframe::epaint::Vec2::new(0.0, 0.0);
       -        let r = medium_hover_button(ui, &crate::ADD_LAYER_SVG)
       -            .on_hover_ui(|ui| {
       -                ui.label(RichText::new(fl!(crate::LANGUAGE_LOADER, "add_layer_tooltip")).small());
       -            });
       +        let r = medium_hover_button(ui, &crate::ADD_LAYER_SVG).on_hover_ui(|ui| {
       +            ui.label(RichText::new(fl!(crate::LANGUAGE_LOADER, "add_layer_tooltip")).small());
       +        });
        
                if r.clicked() {
                    result = Some(Message::NewLayer);
                }
        
       -        let r = medium_hover_button(ui, &crate::MOVE_UP_SVG)
       -            .on_hover_ui(|ui| {
       -                ui.label(
       -                    RichText::new(fl!(crate::LANGUAGE_LOADER, "move_layer_up_tooltip")).small(),
       -                );
       -            });
       +        let r = medium_hover_button(ui, &crate::MOVE_UP_SVG).on_hover_ui(|ui| {
       +            ui.label(RichText::new(fl!(crate::LANGUAGE_LOADER, "move_layer_up_tooltip")).small());
       +        });
        
                if r.clicked() && cur_layer > 0 {
                    result = Some(Message::MoveLayerUp(cur_layer));
                }
        
       -        let r = medium_hover_button(ui, &crate::MOVE_DOWN_SVG)
       -            .on_hover_ui(|ui| {
       -                ui.label(
       -                    RichText::new(fl!(crate::LANGUAGE_LOADER, "move_layer_down_tooltip")).small(),
       -                );
       -            });
       +        let r = medium_hover_button(ui, &crate::MOVE_DOWN_SVG).on_hover_ui(|ui| {
       +            ui.label(RichText::new(fl!(crate::LANGUAGE_LOADER, "move_layer_down_tooltip")).small());
       +        });
        
                if r.clicked() && (1 + cur_layer) < max {
                    result = Some(Message::MoveLayerDown(cur_layer));
                }
        
       -        let r = medium_hover_button(ui, &crate::DELETE_SVG)
       -            .on_hover_ui(|ui| {
       -                ui.label(
       -                    RichText::new(fl!(crate::LANGUAGE_LOADER, "delete_layer_tooltip")).small(),
       -                );
       -            });
       +        let r = medium_hover_button(ui, &crate::DELETE_SVG).on_hover_ui(|ui| {
       +            ui.label(RichText::new(fl!(crate::LANGUAGE_LOADER, "delete_layer_tooltip")).small());
       +        });
        
                if r.clicked() && cur_layer < max {
                    result = Some(Message::DeleteLayer(cur_layer));
       @@ -216,13 +222,9 @@ fn show_layer_view(
            result
        }
        
       -pub fn medium_hover_button(
       -    ui: &mut egui::Ui,
       -    image: &RetainedImage
       -) -> egui::Response {
       +pub fn medium_hover_button(ui: &mut egui::Ui, image: &RetainedImage) -> egui::Response {
            let size_points = egui::Vec2::splat(28.0);
        
       -
            let (id, rect) = ui.allocate_space(size_points);
            let response = ui.interact(rect, id, Sense::click());
            let painter = ui.painter_at(rect);
       @@ -243,4 +245,4 @@ pub fn medium_hover_button(
            painter.image(image.texture_id(ui.ctx()), rect.shrink(4.0), uv, tint);
        
            response
       -}
       -\ No newline at end of file
       +}
   DIR diff --git a/src/ui/tools/mod.rs b/src/ui/tools/mod.rs
       @@ -5,4 +5,4 @@ mod char_table;
        pub use char_table::*;
        
        mod bitfont_selector;
       -pub use bitfont_selector::*;
       -\ No newline at end of file
       +pub use bitfont_selector::*;
   DIR diff --git a/src/ui/top_bar.rs b/src/ui/top_bar.rs
       @@ -31,16 +31,17 @@ impl MainWindow {
                frame: &mut eframe::Frame,
            ) -> Option<Message> {
                let mut result = None;
       -        TopBottomPanel::top("top_panel").exact_height(24.0).show(ctx, |ui| {
       -            result = self.main_menu(ui, frame);
       -        });
       +        TopBottomPanel::top("top_panel")
       +            .exact_height(24.0)
       +            .show(ctx, |ui| {
       +                result = self.main_menu(ui, frame);
       +            });
                result
            }
        
            fn main_menu(&mut self, ui: &mut Ui, frame: &mut eframe::Frame) -> Option<Message> {
                let mut result = None;
                menu::bar(ui, |ui| {
       -
                    let mut has_buffer = false;
                    if let Some(doc) = self.get_active_document() {
                        has_buffer = doc.lock().unwrap().get_ansi_editor().is_some();
       @@ -210,10 +211,16 @@ impl MainWindow {
                            "X",
                        );
                        if button.clicked() {
       -                    if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut() {
       +                    if let Some(editor) = self
       +                        .get_active_document()
       +                        .unwrap()
       +                        .lock()
       +                        .unwrap()
       +                        .get_ansi_editor_mut()
       +                    {
                                editor.flip_x();
       -                            editor.redraw_view();
       -                        }
       +                        editor.redraw_view();
       +                    }
                            ui.close_menu();
                        }
        
       @@ -224,10 +231,16 @@ impl MainWindow {
                            "Y",
                        );
                        if button.clicked() {
       -                    if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut() {
       +                    if let Some(editor) = self
       +                        .get_active_document()
       +                        .unwrap()
       +                        .lock()
       +                        .unwrap()
       +                        .get_ansi_editor_mut()
       +                    {
                                editor.flip_y();
       -                            editor.redraw_view();
       -                        }
       +                        editor.redraw_view();
       +                    }
                            ui.close_menu();
                        }
        
       @@ -238,10 +251,16 @@ impl MainWindow {
                            "Y",
                        );
                        if button.clicked() {
       -                    if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut() {
       +                    if let Some(editor) = self
       +                        .get_active_document()
       +                        .unwrap()
       +                        .lock()
       +                        .unwrap()
       +                        .get_ansi_editor_mut()
       +                    {
                                editor.justify_center();
       -                            editor.redraw_view();
       -                        }
       +                        editor.redraw_view();
       +                    }
                            ui.close_menu();
                        }
        
       @@ -252,9 +271,15 @@ impl MainWindow {
                            "L",
                        );
                        if button.clicked() {
       -                    if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut() {
       +                    if let Some(editor) = self
       +                        .get_active_document()
       +                        .unwrap()
       +                        .lock()
       +                        .unwrap()
       +                        .get_ansi_editor_mut()
       +                    {
                                editor.justify_left();
       -                            editor.redraw_view();
       +                        editor.redraw_view();
                            }
                            ui.close_menu();
                        }
       @@ -266,9 +291,15 @@ impl MainWindow {
                            "R",
                        );
                        if button.clicked() {
       -                    if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut() {
       +                    if let Some(editor) = self
       +                        .get_active_document()
       +                        .unwrap()
       +                        .lock()
       +                        .unwrap()
       +                        .get_ansi_editor_mut()
       +                    {
                                editor.justify_right();
       -                            editor.redraw_view();
       +                        editor.redraw_view();
                            }
                            ui.close_menu();
                        }
       @@ -281,9 +312,15 @@ impl MainWindow {
                            "",
                        );
                        if button.clicked() {
       -                    if let Some(editor) = self.get_active_document().unwrap().lock().unwrap().get_ansi_editor_mut() {
       +                    if let Some(editor) = self
       +                        .get_active_document()
       +                        .unwrap()
       +                        .lock()
       +                        .unwrap()
       +                        .get_ansi_editor_mut()
       +                    {
                                editor.crop();
       -                            editor.redraw_view();
       +                        editor.redraw_view();
                            }
                            ui.close_menu();
                        }
       @@ -380,11 +417,5 @@ pub fn medium_toggle_button(
                ui.visuals().widgets.inactive.fg_stroke.color
            };
        
       -    ui.add(
       -        ImageButton::new(
       -            icon.texture_id(ui.ctx()),
       -            size_points,
       -        )
       -        .tint(tint),
       -    )
       -}
       -\ No newline at end of file
       +    ui.add(ImageButton::new(icon.texture_id(ui.ctx()), size_points).tint(tint))
       +}