feat(iced): add all keyboard shortcuts from egui

This commit is contained in:
2026-07-15 17:59:32 +03:00
parent 13f6a62085
commit defcabd069
+81 -6
View File
@@ -3883,10 +3883,11 @@ impl HcieIcedApp {
/// Subscriptions — keyboard events for shortcuts. /// Subscriptions — keyboard events for shortcuts.
/// ///
/// Handles common keyboard shortcuts: /// Handles all keyboard shortcuts matching the egui GUI:
/// - Ctrl+Z: Undo /// - Ctrl+Z: Undo
/// - Ctrl+Y / Ctrl+Shift+Z: Redo /// - Ctrl+Y / Ctrl+Shift+Z: Redo
/// - Ctrl+S: Save /// - Ctrl+S: Save
/// - Ctrl+Shift+S: Save As
/// - Ctrl+N: New /// - Ctrl+N: New
/// - Ctrl+O: Open /// - Ctrl+O: Open
/// - Ctrl+C: Copy /// - Ctrl+C: Copy
@@ -3895,19 +3896,29 @@ impl HcieIcedApp {
/// - Ctrl+A: Select All /// - Ctrl+A: Select All
/// - Ctrl+D: Deselect /// - Ctrl+D: Deselect
/// - Ctrl+Shift+I: Inverse Selection /// - Ctrl+Shift+I: Inverse Selection
/// - Escape: Close dialog /// - Ctrl++: Zoom In
/// - Ctrl+-: Zoom Out
/// - Ctrl+0: Fit to Screen
/// - Ctrl+1: 100% Zoom
/// - Delete: Clear selection
/// - F11: Fullscreen toggle
/// - B: Brush, E: Eraser, V: Move, M: Marquee, L: Lasso
/// - W: Magic Wand, T: Text, U: Shape (Vector Rectangle)
/// - Escape: Close dialog / exit viewer
/// - Enter: Confirm / open in viewer
pub fn subscription(&self) -> iced::Subscription<Message> { pub fn subscription(&self) -> iced::Subscription<Message> {
let keyboard = iced::keyboard::on_key_press(|key, modifiers| { let keyboard = iced::keyboard::on_key_press(|key, modifiers| {
let ctrl = modifiers.control() || modifiers.logo(); let ctrl = modifiers.control() || modifiers.logo();
let shift = modifiers.shift(); let shift = modifiers.shift();
match key { match key {
// ── Modifier combos (Ctrl+...) ───────────────
// Ctrl+Z = Undo // Ctrl+Z = Undo
iced::keyboard::Key::Character(ref c) if c.as_str() == "z" && ctrl && !shift => { iced::keyboard::Key::Character(ref c) if c.as_str() == "z" && ctrl && !shift => {
Some(Message::Undo) Some(Message::Undo)
} }
// Ctrl+Y or Ctrl+Shift+Z = Redo // Ctrl+Y or Ctrl+Shift+Z = Redo
iced::keyboard::Key::Character(ref c) if c.as_str() == "y" && ctrl => { iced::keyboard::Key::Character(ref c) if c.as_str() == "y" && ctrl && !shift => {
Some(Message::Redo) Some(Message::Redo)
} }
iced::keyboard::Key::Character(ref c) if c.as_str() == "z" && ctrl && shift => { iced::keyboard::Key::Character(ref c) if c.as_str() == "z" && ctrl && shift => {
@@ -3915,14 +3926,18 @@ impl HcieIcedApp {
} }
// Ctrl+S = Save // Ctrl+S = Save
iced::keyboard::Key::Character(ref c) if c.as_str() == "s" && ctrl && !shift => { iced::keyboard::Key::Character(ref c) if c.as_str() == "s" && ctrl && !shift => {
Some(Message::SaveFile)
}
// Ctrl+Shift+S = Save As
iced::keyboard::Key::Character(ref c) if c.as_str() == "s" && ctrl && shift => {
Some(Message::SaveFileAs) Some(Message::SaveFileAs)
} }
// Ctrl+N = New // Ctrl+N = New
iced::keyboard::Key::Character(ref c) if c.as_str() == "n" && ctrl => { iced::keyboard::Key::Character(ref c) if c.as_str() == "n" && ctrl && !shift => {
Some(Message::DialogOpen(ActiveDialog::NewImage)) Some(Message::DialogOpen(ActiveDialog::NewImage))
} }
// Ctrl+O = Open // Ctrl+O = Open
iced::keyboard::Key::Character(ref c) if c.as_str() == "o" && ctrl => { iced::keyboard::Key::Character(ref c) if c.as_str() == "o" && ctrl && !shift => {
Some(Message::OpenFileRfd) Some(Message::OpenFileRfd)
} }
// Ctrl+C = Copy // Ctrl+C = Copy
@@ -3949,7 +3964,67 @@ impl HcieIcedApp {
iced::keyboard::Key::Character(ref c) if c.as_str() == "i" && ctrl && shift => { iced::keyboard::Key::Character(ref c) if c.as_str() == "i" && ctrl && shift => {
Some(Message::SelectInverse) Some(Message::SelectInverse)
} }
// Arrow keys — viewer navigation or no-op // Ctrl++ = Zoom In
iced::keyboard::Key::Character(ref c) if (c.as_str() == "=" || c.as_str() == "+") && ctrl && !shift => {
Some(Message::CanvasZoomRelative(1.1))
}
// Ctrl+- = Zoom Out
iced::keyboard::Key::Character(ref c) if c.as_str() == "-" && ctrl && !shift => {
Some(Message::CanvasZoomRelative(1.0 / 1.1))
}
// Ctrl+0 = Fit to Screen (reset zoom to 100%)
iced::keyboard::Key::Character(ref c) if c.as_str() == "0" && ctrl && !shift => {
Some(Message::CanvasZoomSet(1.0))
}
// Ctrl+1 = 100% Zoom
iced::keyboard::Key::Character(ref c) if c.as_str() == "1" && ctrl && !shift => {
Some(Message::CanvasZoomSet(1.0))
}
// ── Single-key tool shortcuts (no modifiers) ──
// B = Brush Tool
iced::keyboard::Key::Character(ref c) if c.as_str() == "b" && !ctrl && !shift => {
Some(Message::ToolSelected(Tool::Brush))
}
// E = Eraser Tool
iced::keyboard::Key::Character(ref c) if c.as_str() == "e" && !ctrl && !shift => {
Some(Message::ToolSelected(Tool::Eraser))
}
// V = Move Tool
iced::keyboard::Key::Character(ref c) if c.as_str() == "v" && !ctrl && !shift => {
Some(Message::ToolSelected(Tool::Move))
}
// M = Marquee (Rect Select) Tool
iced::keyboard::Key::Character(ref c) if c.as_str() == "m" && !ctrl && !shift => {
Some(Message::ToolSelected(Tool::Select))
}
// L = Lasso Tool
iced::keyboard::Key::Character(ref c) if c.as_str() == "l" && !ctrl && !shift => {
Some(Message::ToolSelected(Tool::Lasso))
}
// W = Magic Wand
iced::keyboard::Key::Character(ref c) if c.as_str() == "w" && !ctrl && !shift => {
Some(Message::ToolSelected(Tool::MagicWand))
}
// T = Text Tool
iced::keyboard::Key::Character(ref c) if c.as_str() == "t" && !ctrl && !shift => {
Some(Message::ToolSelected(Tool::Text))
}
// U = Shape Tool (Vector Rectangle)
iced::keyboard::Key::Character(ref c) if c.as_str() == "u" && !ctrl && !shift => {
Some(Message::ToolSelected(Tool::VectorRect))
}
// ── Named keys ───────────────────────────────
// Delete = Clear selection / deselect
iced::keyboard::Key::Named(iced::keyboard::key::Named::Delete) => {
Some(Message::Deselect)
}
// F11 = Fullscreen toggle
iced::keyboard::Key::Named(iced::keyboard::key::Named::F11) => {
Some(Message::WindowMaximize)
}
// Arrow keys — viewer navigation
iced::keyboard::Key::Named(iced::keyboard::key::Named::ArrowLeft) => { iced::keyboard::Key::Named(iced::keyboard::key::Named::ArrowLeft) => {
Some(Message::ViewerPrev) Some(Message::ViewerPrev)
} }