diff options
author | 2023-08-02 22:27:38 +0200 | |
---|---|---|
committer | 2023-08-02 22:27:38 +0200 | |
commit | 1b355f528a95e9d12cc2c3f9349715514d0b9d63 (patch) | |
tree | c863a0fe79793b03e885f20e831ce45678db9cd0 | |
parent | f7ca420817a2d3f892534bc7bd21f74ed77132e2 (diff) | |
parent | 983764db6a65cad673d35d3112145a8e40e82be0 (diff) | |
download | iced-1b355f528a95e9d12cc2c3f9349715514d0b9d63.tar.gz iced-1b355f528a95e9d12cc2c3f9349715514d0b9d63.tar.bz2 iced-1b355f528a95e9d12cc2c3f9349715514d0b9d63.zip |
Merge pull request #1991 from casperstorm/feat/comobox-cycle
cycle `combo_box` with keybinds
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | widget/src/combo_box.rs | 43 |
2 files changed, 35 insertions, 9 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index c94c5de3..b2ffbed4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Nix instructions to `DEPENDENCIES.md`. [#1859](https://github.com/iced-rs/iced/pull/1859) - Loading spinners example. [#1902](https://github.com/iced-rs/iced/pull/1902) - Workflow that verifies `CHANGELOG` is always up-to-date. [#1970](https://github.com/iced-rs/iced/pull/1970) +- Keybinds to cycle `ComboBox` options. [#1991](https://github.com/iced-rs/iced/pull/1991) ### Changed - Updated `wgpu` to `0.16`. [#1807](https://github.com/iced-rs/iced/pull/1807) diff --git a/widget/src/combo_box.rs b/widget/src/combo_box.rs index 93fc92b9..5e36ec57 100644 --- a/widget/src/combo_box.rs +++ b/widget/src/combo_box.rs @@ -468,11 +468,13 @@ where if let Event::Keyboard(keyboard::Event::KeyPressed { key_code, + modifiers, .. }) = event { - match key_code { - keyboard::KeyCode::Enter => { + let shift_modifer = modifiers.shift(); + match (key_code, shift_modifer) { + (keyboard::KeyCode::Enter, _) => { if let Some(index) = &menu.hovered_option { if let Some(option) = state.filtered_options.options.get(*index) @@ -483,9 +485,19 @@ where event_status = event::Status::Captured; } - keyboard::KeyCode::Up => { + + (keyboard::KeyCode::Up, _) + | (keyboard::KeyCode::Tab, true) => { if let Some(index) = &mut menu.hovered_option { - *index = index.saturating_sub(1); + if *index == 0 { + *index = state + .filtered_options + .options + .len() + .saturating_sub(1); + } else { + *index = index.saturating_sub(1); + } } else { menu.hovered_option = Some(0); } @@ -511,15 +523,28 @@ where event_status = event::Status::Captured; } - keyboard::KeyCode::Down => { + (keyboard::KeyCode::Down, _) + | (keyboard::KeyCode::Tab, false) + if !modifiers.shift() => + { if let Some(index) = &mut menu.hovered_option { - *index = index.saturating_add(1).min( - state + if *index + >= state .filtered_options .options .len() - .saturating_sub(1), - ); + .saturating_sub(1) + { + *index = 0; + } else { + *index = index.saturating_add(1).min( + state + .filtered_options + .options + .len() + .saturating_sub(1), + ); + } } else { menu.hovered_option = Some(0); } |