Move focus between form fields with tab

This commit is contained in:
Georg Bauer
2026-07-26 10:07:39 +02:00
parent f2133d561b
commit a0c3a72f4e

View File

@@ -133,6 +133,10 @@ pub(crate) enum Message {
WindowOpened(window::Id), WindowOpened(window::Id),
WindowClosed(window::Id), WindowClosed(window::Id),
DismissPanel, DismissPanel,
/// Tab and shift-tab: iced leaves the key to the application, so the fields
/// of a form are only linked once we move the focus ourselves.
FocusNext,
FocusPrevious,
PreferenceModelChanged(ModelChoice), PreferenceModelChanged(ModelChoice),
PreferenceDsparkChanged(bool), PreferenceDsparkChanged(bool),
PreferenceTimeoutChanged(String), PreferenceTimeoutChanged(String),
@@ -447,6 +451,8 @@ impl App {
self.error = None; self.error = None;
} }
} }
Message::FocusNext => return iced::widget::focus_next(),
Message::FocusPrevious => return iced::widget::focus_previous(),
Message::ShowChat => self.detail_tab = DetailTab::Chat, Message::ShowChat => self.detail_tab = DetailTab::Chat,
Message::ShowStats => { Message::ShowStats => {
self.detail_tab = DetailTab::Stats; self.detail_tab = DetailTab::Stats;
@@ -1200,6 +1206,11 @@ fn shortcut(key: keyboard::Key, modifiers: keyboard::Modifiers) -> Option<Messag
Some(Message::OpenModelManager) Some(Message::OpenModelManager)
} }
keyboard::Key::Named(keyboard::key::Named::Escape) => Some(Message::DismissPanel), keyboard::Key::Named(keyboard::key::Named::Escape) => Some(Message::DismissPanel),
keyboard::Key::Named(keyboard::key::Named::Tab) => Some(if modifiers.shift() {
Message::FocusPrevious
} else {
Message::FocusNext
}),
_ => None, _ => None,
} }
} }
@@ -1318,6 +1329,15 @@ mod tests {
keyboard::Modifiers::COMMAND | keyboard::Modifiers::SHIFT, keyboard::Modifiers::COMMAND | keyboard::Modifiers::SHIFT,
); );
assert!(matches!(message, Some(Message::OpenModelManager))); assert!(matches!(message, Some(Message::OpenModelManager)));
let tab = keyboard::Key::Named(keyboard::key::Named::Tab);
assert!(matches!(
shortcut(tab.clone(), keyboard::Modifiers::empty()),
Some(Message::FocusNext)
));
assert!(matches!(
shortcut(tab, keyboard::Modifiers::SHIFT),
Some(Message::FocusPrevious)
));
assert!(ModelChoice::DeepSeekV4Flash.supports_dspark()); assert!(ModelChoice::DeepSeekV4Flash.supports_dspark());
assert!(!ModelChoice::DeepSeekV4Pro.supports_dspark()); assert!(!ModelChoice::DeepSeekV4Pro.supports_dspark());
assert!(!ModelChoice::Glm52.supports_dspark()); assert!(!ModelChoice::Glm52.supports_dspark());