feat(iced): add all keyboard shortcuts from egui
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user