From defcabd0691c13772a95d20ed7be32c02dd94646 Mon Sep 17 00:00:00 2001 From: Halit Can Date: Wed, 15 Jul 2026 17:59:32 +0300 Subject: [PATCH] feat(iced): add all keyboard shortcuts from egui --- hcie-iced-app/crates/hcie-iced-gui/src/app.rs | 87 +++++++++++++++++-- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/hcie-iced-app/crates/hcie-iced-gui/src/app.rs b/hcie-iced-app/crates/hcie-iced-gui/src/app.rs index eec8f79..97a59eb 100644 --- a/hcie-iced-app/crates/hcie-iced-gui/src/app.rs +++ b/hcie-iced-app/crates/hcie-iced-gui/src/app.rs @@ -3883,10 +3883,11 @@ impl HcieIcedApp { /// Subscriptions — keyboard events for shortcuts. /// - /// Handles common keyboard shortcuts: + /// Handles all keyboard shortcuts matching the egui GUI: /// - Ctrl+Z: Undo /// - Ctrl+Y / Ctrl+Shift+Z: Redo /// - Ctrl+S: Save + /// - Ctrl+Shift+S: Save As /// - Ctrl+N: New /// - Ctrl+O: Open /// - Ctrl+C: Copy @@ -3895,19 +3896,29 @@ impl HcieIcedApp { /// - Ctrl+A: Select All /// - Ctrl+D: Deselect /// - 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 { let keyboard = iced::keyboard::on_key_press(|key, modifiers| { let ctrl = modifiers.control() || modifiers.logo(); let shift = modifiers.shift(); match key { + // ── Modifier combos (Ctrl+...) ─────────────── // Ctrl+Z = Undo iced::keyboard::Key::Character(ref c) if c.as_str() == "z" && ctrl && !shift => { Some(Message::Undo) } // 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) } iced::keyboard::Key::Character(ref c) if c.as_str() == "z" && ctrl && shift => { @@ -3915,14 +3926,18 @@ impl HcieIcedApp { } // Ctrl+S = Save 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) } // 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)) } // 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) } // Ctrl+C = Copy @@ -3949,7 +3964,67 @@ impl HcieIcedApp { iced::keyboard::Key::Character(ref c) if c.as_str() == "i" && ctrl && shift => { 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) => { Some(Message::ViewerPrev) }