URI: 
       Fixed some issues with layers. - 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 548da88c3ac9e2d5d1b35f99751203d0bbd93050
   DIR parent f5bc09b3a24d574a1e68f6735031cfb73590dbdb
  HTML Author: Mike Krüger <mkrueger@posteo.de>
       Date:   Thu, 31 Aug 2023 08:00:28 +0200
       
       Fixed some issues with layers.
       
       Diffstat:
         M Cargo.toml                          |      33 ++++++++++++++++++++++++++++---
         M i18n/en/icy_draw.ftl                |       2 ++
         M src/ui/dialogs/edit_layer_dialog.rs |      84 ++++++++++++++++++++++++++++++-
         M src/ui/layer_view.rs                |      13 +++++++++----
         M src/ui/main_window.rs               |      21 +++++++++++++--------
       
       5 files changed, 136 insertions(+), 17 deletions(-)
       ---
   DIR diff --git a/Cargo.toml b/Cargo.toml
       @@ -1,8 +1,8 @@
        [package]
        name = "icy_draw"
       -version = "0.1.0"
       -authors = ["Mike Krüger <mkrueger@posteo.de>"]
       +version = "0.0.1"
        edition = "2021"
       +authors = ["Mike Krüger <mkrueger@posteo.de>"]
        description = "A drawing program for ANSI & ASCII art and other text-based art forms."
        license = "Apache-2.0"
        repository = "https://github.com/mkrueger/icy_draw"
       @@ -19,7 +19,9 @@ egui_dock = "0.6"
        egui_file = "0.10.0"
        
        icy_engine = { git ="https://github.com/mkrueger/icy_engine" }
       -icy_engine_egui = { path = "../icy_engine_egui" }
       +icy_engine_egui = { git ="https://github.com/mkrueger/icy_engine_egui" }
       +#icy_engine = { path = "../icy_engine" }
       +#icy_engine_egui = { path = "../icy_engine_egui" }
        walkdir = "2"
        serde = { version = "1", features = ["derive"], optional = true }
        lazy_static = "1.4.0"
       @@ -32,3 +34,27 @@ once_cell = "1.16.0"
        
        [features]
        default = []
       +
       +[build-dependencies]
       +winres = "0.1"
       +
       +[profile.release]
       +strip = "symbols"
       +
       +[package.metadata.bundle]
       +name = "Icy Draw"
       +identifier = "com.github.icy_draw"
       +icon = [ "build/mac/128x128@2x.png" ]
       +resources = []
       +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."
       +license-file="build/license.rtf"
       +assets = [
       +    ["target/release/icy_draw", "/usr/bin/", "755"],
       +    ["build/linux/icy_draw.desktop", "/usr/share/applications/", "644"],
       +    ["build/linux/128x128.png", "/usr/share/icons/hicolor/128x128/apps/icy_draw.png", "644"],
       +    ["build/linux/256x256.png", "/usr/share/icons/hicolor/256x256/apps/icy_draw.png", "644"],
       +]
       +\ No newline at end of file
   DIR diff --git a/i18n/en/icy_draw.ftl b/i18n/en/icy_draw.ftl
       @@ -113,3 +113,5 @@ edit-layer-dialog-is-edit-locked-checkbox=Edit locked
        edit-layer-dialog-is-position-locked-checkbox=Position locked
        edit-layer-dialog-is-x-offset-label=X offset:
        edit-layer-dialog-is-y-offset-label=Y offset:
       +edit-layer-dialog-has-alpha-checkbox=Has alpha
       +edit-layer-dialog-is-alpha-locked-checkbox=Alpha locked
   DIR diff --git a/src/ui/dialogs/edit_layer_dialog.rs b/src/ui/dialogs/edit_layer_dialog.rs
       @@ -1,7 +1,7 @@
       -use eframe::egui::{self, Layout};
       +use eframe::egui::{self, color_picker, Layout, RichText};
        use egui_modal::Modal;
        use i18n_embed_fl::fl;
       -use icy_engine::Position;
       +use icy_engine::{Color, Mode, Position};
        
        use crate::{AnsiEditor, ModalDialog, TerminalResult};
        
       @@ -14,6 +14,12 @@ pub struct EditLayerDialog {
            is_visible: bool,
            is_locked: bool,
            is_position_locked: bool,
       +    has_alpha_channel: bool,
       +    is_alpha_channel_locked: bool,
       +
       +    mode: Mode,
       +
       +    color: Option<Color>,
        
            x_offset: i32,
            y_offset: i32,
       @@ -26,9 +32,13 @@ impl EditLayerDialog {
                    should_commit: false,
                    layer,
                    title: l.title.clone(),
       +            color: l.color,
                    is_visible: l.is_visible,
                    is_locked: l.is_locked,
                    is_position_locked: l.is_position_locked,
       +            has_alpha_channel: l.has_alpha_channel,
       +            is_alpha_channel_locked: l.is_alpha_channel_locked,
       +            mode: l.mode,
                    x_offset: l.offset.x,
                    y_offset: l.offset.y,
                }
       @@ -54,6 +64,32 @@ impl ModalDialog for EditLayerDialog {
                                ui.add(egui::TextEdit::singleline(&mut self.title));
                                ui.end_row();
        
       +                        if self.color.is_some() {
       +                            let mut use_color = true;
       +
       +                            if let Some(color) = &mut self.color {
       +                                ui.checkbox(&mut use_color, "Use Color");
       +
       +                                let mut c = (*color).into();
       +                                color_picker::color_edit_button_rgb(ui, &mut c);
       +                                *color = c.into();
       +
       +                                ui.end_row();
       +                            }
       +
       +                            if !use_color {
       +                                self.color = None;
       +                            }
       +                        } else {
       +                            ui.label("");
       +                            let mut use_color = false;
       +                            ui.checkbox(&mut use_color, "Use Color");
       +                            ui.end_row();
       +                            if use_color {
       +                                self.color = Some(Color::new(255, 255, 255));
       +                            }
       +                        }
       +
                                ui.label("");
                                ui.checkbox(
                                    &mut self.is_visible,
       @@ -82,6 +118,46 @@ impl ModalDialog for EditLayerDialog {
                                );
                                ui.end_row();
        
       +                        ui.label("");
       +                        ui.checkbox(
       +                            &mut self.has_alpha_channel,
       +                            fl!(
       +                                crate::LANGUAGE_LOADER,
       +                                "edit-layer-dialog-has-alpha-checkbox"
       +                            ),
       +                        );
       +                        ui.end_row();
       +
       +                        if self.has_alpha_channel {
       +                            ui.checkbox(
       +                                &mut self.is_alpha_channel_locked,
       +                                fl!(
       +                                    crate::LANGUAGE_LOADER,
       +                                    "edit-layer-dialog-is-alpha-locked-checkbox"
       +                                ),
       +                            );
       +                            ui.end_row();
       +                        }
       +
       +                        ui.label("Mode:");
       +
       +                        egui::ComboBox::from_id_source("combobox1")
       +                            .selected_text(RichText::new(match self.mode {
       +                                Mode::Normal => "Normal",
       +                                Mode::Chars => "Chars only",
       +                                Mode::Attributes => "Attribute only",
       +                            }))
       +                            .show_ui(ui, |ui| {
       +                                ui.selectable_value(&mut self.mode, Mode::Normal, "Normal");
       +                                ui.selectable_value(&mut self.mode, Mode::Chars, "Chars only");
       +                                ui.selectable_value(
       +                                    &mut self.mode,
       +                                    Mode::Attributes,
       +                                    "Attribute only",
       +                                );
       +                            });
       +                        ui.end_row();
       +
                                ui.label(fl!(
                                    crate::LANGUAGE_LOADER,
                                    "edit-layer-dialog-is-x-offset-label"
       @@ -126,10 +202,14 @@ impl ModalDialog for EditLayerDialog {
            fn commit(&self, editor: &mut AnsiEditor) -> TerminalResult<bool> {
                let layer = &mut editor.buffer_view.lock().buf.layers[self.layer];
                layer.title = self.title.clone();
       +        layer.color = self.color;
                layer.is_visible = self.is_visible;
                layer.is_locked = self.is_locked;
                layer.is_position_locked = self.is_position_locked;
                layer.offset = Position::new(self.x_offset, self.y_offset);
       +        layer.has_alpha_channel = self.has_alpha_channel;
       +        layer.is_alpha_channel_locked = self.is_alpha_channel_locked;
       +        layer.mode = self.mode;
        
                Ok(true)
            }
   DIR diff --git a/src/ui/layer_view.rs b/src/ui/layer_view.rs
       @@ -1,6 +1,6 @@
        use eframe::{
            egui::{self, RichText},
       -    epaint::Vec2,
       +    epaint::{Vec2, Color32},
        };
        use egui_extras::{Column, TableBuilder};
        use i18n_embed_fl::fl;
       @@ -46,9 +46,9 @@ pub fn show_layer_view(
                })
                .body(|mut body| {
                    for i in 0..max {
       -                let (is_visible, title) = {
       +                let (is_visible, title, color) = {
                            let layer = &editor.buffer_view.lock().buf.layers[i];
       -                    (layer.is_visible, layer.title.clone())
       +                    (layer.is_visible, layer.title.clone(), layer.color)
                        };
        
                        body.row(20.0, |mut row| {
       @@ -80,7 +80,12 @@ pub fn show_layer_view(
                                }
                            });
                            row.col(|ui| {
       -                        let r = ui.selectable_label(i == cur_layer, &title);
       +                        let mut text = RichText::new(title);
       +                        if let Some(color) = color {
       +                            let (r, g, b) = color.into();
       +                            text = text.color(Color32::from_rgb(r, g, b));
       +                        }
       +                        let r = ui.selectable_label(i == cur_layer, text);
                                if r.clicked() {
                                    result = Some(Message::SelectLayer(i));
                                }
   DIR diff --git a/src/ui/main_window.rs b/src/ui/main_window.rs
       @@ -730,10 +730,14 @@ impl eframe::App for MainWindow {
                                    )));
                                }
                                Some(crate::Message::NewLayer) => {
       -                            let w = editor.buffer_view.lock().buf.get_width();
       -                            let h = editor.buffer_view.lock().buf.get_height();
       -                            let new_layer = icy_engine::Layer::new("New Layer", w, h);
       -                            editor.buffer_view.lock().buf.layers.insert(0, new_layer);
       +                            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);
       +                            if buf.layers.is_empty() {
       +                                new_layer.has_alpha_channel = false;
       +                            }
       +
       +                            buf.layers.insert(0, new_layer);
                                }
                                Some(crate::Message::MoveLayerUp(cur_layer)) => {
                                    editor
       @@ -755,9 +759,10 @@ impl eframe::App for MainWindow {
                                }
                                Some(crate::Message::DeleteLayer(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() - 1);
       +                            editor.cur_layer = editor.cur_layer.clamp(
       +                                0,
       +                                editor.buffer_view.lock().buf.layers.len().saturating_sub(1),
       +                            );
                                }
                                Some(crate::Message::ToggleVisibility(cur_layer)) => {
                                    let is_visible =
       @@ -814,7 +819,7 @@ impl eframe::App for MainWindow {
                    self.dialog_open = true;
                    if dialog.show(ctx) {
                        if dialog.create {
       -                    let buf = Buffer::create(dialog.width as usize, dialog.height as usize);
       +                    let buf = Buffer::create((dialog.width, dialog.height));
                            let id = self.create_id();
                            let editor = AnsiEditor::new(&self.gl, id, buf);
                            self.tree.push_to_focused_leaf((None, Box::new(editor)));