URI: 
       move_layer_imp.rs - 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
       ---
       move_layer_imp.rs (3879B)
       ---
            1 use super::{Event, MKey, Position, Tool};
            2 use crate::{to_message, AnsiEditor, Message};
            3 use eframe::egui;
            4 use i18n_embed_fl::fl;
            5 use icy_engine_egui::TerminalCalc;
            6 
            7 #[derive(Default)]
            8 pub struct MoveLayer {
            9     start_offset: Position,
           10     drag_started: bool,
           11     drag_offset: Position,
           12 }
           13 
           14 impl MoveLayer {}
           15 
           16 impl Tool for MoveLayer {
           17     fn get_icon(&self) -> &egui::Image<'static> {
           18         &super::icons::MOVE_SVG
           19     }
           20 
           21     fn tool_name(&self) -> String {
           22         fl!(crate::LANGUAGE_LOADER, "tool-move_layer_name")
           23     }
           24 
           25     fn tooltip(&self) -> String {
           26         fl!(crate::LANGUAGE_LOADER, "tool-move_layer_tooltip")
           27     }
           28 
           29     fn use_caret(&self, _editor: &AnsiEditor) -> bool {
           30         false
           31     }
           32     fn use_selection(&self) -> bool {
           33         false
           34     }
           35     fn show_ui(&mut self, _ctx: &egui::Context, _ui: &mut egui::Ui, _editor_opt: Option<&mut AnsiEditor>) -> Option<Message> {
           36         None
           37     }
           38 
           39     fn handle_drag_begin(&mut self, editor: &mut AnsiEditor, _response: &egui::Response) -> Event {
           40         self.drag_started = false;
           41 
           42         if let Some(layer) = editor.buffer_view.lock().get_edit_state_mut().get_cur_layer_mut() {
           43             self.start_offset = layer.get_offset();
           44             self.drag_offset = self.start_offset;
           45             self.drag_started = true;
           46         }
           47         Event::None
           48     }
           49 
           50     fn handle_drag(&mut self, _ui: &egui::Ui, response: egui::Response, editor: &mut AnsiEditor, _calc: &TerminalCalc) -> egui::Response {
           51         if !self.drag_started {
           52             return response;
           53         }
           54         if let Some(layer) = editor.buffer_view.lock().get_edit_state_mut().get_cur_layer_mut() {
           55             self.drag_offset = self.start_offset + editor.drag_pos.cur_abs - editor.drag_pos.start_abs;
           56             layer.set_preview_offset(Some(self.drag_offset));
           57         }
           58         response.on_hover_cursor(egui::CursorIcon::Grabbing)
           59     }
           60 
           61     fn get_toolbar_location_text(&self, editor: &AnsiEditor) -> String {
           62         get_layer_offset_text(editor)
           63     }
           64 
           65     fn handle_hover(&mut self, _ui: &egui::Ui, response: egui::Response, _editor: &mut AnsiEditor, _cur: Position, _cur_abs: Position) -> egui::Response {
           66         response.on_hover_cursor(egui::CursorIcon::Move)
           67     }
           68 
           69     fn handle_drag_end(&mut self, editor: &mut AnsiEditor) -> Option<Message> {
           70         if !self.drag_started {
           71             return None;
           72         }
           73         to_message(editor.buffer_view.lock().get_edit_state_mut().move_layer(self.drag_offset))
           74     }
           75 
           76     fn handle_key(&mut self, editor: &mut AnsiEditor, key: MKey, modifier: super::MModifiers) -> Event {
           77         let offset = if let Some(layer) = editor.buffer_view.lock().get_edit_state_mut().get_cur_layer_mut() {
           78             layer.get_offset()
           79         } else {
           80             return Event::None;
           81         };
           82         let i = if matches!(modifier, super::MModifiers::Shift) { 2 } else { 1 };
           83 
           84         match key {
           85             MKey::Down => {
           86                 let _ = editor.buffer_view.lock().get_edit_state_mut().move_layer(offset + Position::new(0, i));
           87             }
           88             MKey::Up => {
           89                 let _ = editor.buffer_view.lock().get_edit_state_mut().move_layer(offset - Position::new(0, i));
           90             }
           91             MKey::Left => {
           92                 let _ = editor.buffer_view.lock().get_edit_state_mut().move_layer(offset - Position::new(i, 0));
           93             }
           94             MKey::Right => {
           95                 let _ = editor.buffer_view.lock().get_edit_state_mut().move_layer(offset + Position::new(i, 0));
           96             }
           97             _ => {}
           98         }
           99         Event::None
          100     }
          101 }
          102 
          103 pub(super) fn get_layer_offset_text(editor: &AnsiEditor) -> String {
          104     if let Some(layer) = editor.buffer_view.lock().get_edit_state_mut().get_cur_layer() {
          105         let pos = layer.get_offset();
          106         fl!(crate::LANGUAGE_LOADER, "toolbar-layer_offset", line = pos.y, column = pos.x)
          107     } else {
          108         String::new()
          109     }
          110 }