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 }