-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Ui.input_mut & InputState.ignore_key #1212
Changes from 11 commits
ab3cbca
3c61075
b118aa0
18defca
7a4c751
7b89764
a7b394c
d0d8856
1ef87ad
1aa5f45
48dac3a
11050bd
f195c20
6a9f1ec
cb4fcd4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -117,59 +117,30 @@ impl EasyMarkEditor { | |
|
||
fn shortcuts(ui: &Ui, code: &mut dyn TextBuffer, ccursor_range: &mut CCursorRange) -> bool { | ||
let mut any_change = false; | ||
for event in &ui.input().events { | ||
if let Event::Key { | ||
for (key, surrounding) in [ | ||
(Key::B, "*"), // *bold* | ||
(Key::C, "`"), // `code` | ||
(Key::I, "/"), // /italics/ | ||
(Key::L, "$"), // $subscript$ | ||
(Key::R, "^"), // ^superscript^ | ||
(Key::S, "~"), // ~strikethrough~ | ||
(Key::U, "_"), // _underline_ | ||
] { | ||
if ui.input_mut().consume_key( | ||
key, | ||
pressed: true, | ||
modifiers, | ||
} = event | ||
{ | ||
if modifiers.command_only() { | ||
match &key { | ||
// toggle *bold* | ||
Key::B => { | ||
toggle_surrounding(code, ccursor_range, "*"); | ||
any_change = true; | ||
} | ||
// toggle `code` | ||
Key::C => { | ||
toggle_surrounding(code, ccursor_range, "`"); | ||
any_change = true; | ||
} | ||
// toggle /italics/ | ||
Key::I => { | ||
toggle_surrounding(code, ccursor_range, "/"); | ||
any_change = true; | ||
} | ||
// toggle $lowered$ | ||
Key::L => { | ||
toggle_surrounding(code, ccursor_range, "$"); | ||
any_change = true; | ||
} | ||
// toggle ^raised^ | ||
Key::R => { | ||
toggle_surrounding(code, ccursor_range, "^"); | ||
any_change = true; | ||
} | ||
// toggle ~strikethrough~ | ||
Key::S => { | ||
toggle_surrounding(code, ccursor_range, "~"); | ||
any_change = true; | ||
} | ||
// toggle _underline_ | ||
Key::U => { | ||
toggle_surrounding(code, ccursor_range, "_"); | ||
any_change = true; | ||
} | ||
_ => {} | ||
} | ||
} | ||
} | ||
egui::Modifiers { | ||
command: true, | ||
..Default::default() | ||
}, | ||
) { | ||
toggle_surrounding(code, ccursor_range, surrounding); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. According to the docs of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It only returns true when the key was pressed but it will remove the release event too, so triggering only once. Also in the built app it seems to only trigger once (on Windows & Ubuntu) - do you see differently? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I haven't run in since last review :) But then the docs for |
||
any_change = true; | ||
}; | ||
} | ||
any_change | ||
} | ||
|
||
/// E.g. toggle *strong* with `toggle(&mut text, &mut cursor, "*")` | ||
/// E.g. toggle *strong* with `toggle_surrounding(&mut text, &mut cursor, "*")` | ||
fn toggle_surrounding( | ||
code: &mut dyn TextBuffer, | ||
ccursor_range: &mut CCursorRange, | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can make this even nicer by switching the argument order and adding some helpers to
Modifiers
:There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nice, i added it as a builder api but lmk if you prefer classmethods + operator overloading instead
vs
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Another way to do this more generally could be to have a
consume_event
+ some helper to easily make the event from key and modifier combo likeEvent::from_key(modifier, key)
ormodifier.event_with_key(key)
or viceversa. Not sure if that would need a bunch of refactoring of code that makes the convenience properties from the events to keep the invariants maintained