[egui_web] Call prevent_default for arrow keys when entering text
Closes https://github.com/emilk/egui/issues/58
This commit is contained in:
parent
718eec4b89
commit
b869db728b
3 changed files with 36 additions and 19 deletions
|
@ -15,6 +15,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
* Slightly improved alpha-blending (work-around for non-existing linear-space blending).
|
* Slightly improved alpha-blending (work-around for non-existing linear-space blending).
|
||||||
|
|
||||||
|
### Fixed ⭐
|
||||||
|
|
||||||
|
* Call prevent_default for arrow keys when entering text
|
||||||
|
|
||||||
|
|
||||||
## 0.7.0 - 2021-01-04
|
## 0.7.0 - 2021-01-04
|
||||||
|
|
||||||
|
|
|
@ -154,6 +154,10 @@ impl AppRunner {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn egui_ctx(&self) -> &egui::CtxRef {
|
||||||
|
&self.web_backend.ctx
|
||||||
|
}
|
||||||
|
|
||||||
pub fn auto_save(&mut self) {
|
pub fn auto_save(&mut self) {
|
||||||
let now = now_sec();
|
let now = now_sec();
|
||||||
let time_since_last_save = now - self.last_save_time;
|
let time_since_last_save = now - self.last_save_time;
|
||||||
|
|
|
@ -452,25 +452,34 @@ fn install_document_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> {
|
||||||
}
|
}
|
||||||
runner_lock.needs_repaint.set_true();
|
runner_lock.needs_repaint.set_true();
|
||||||
|
|
||||||
// So, shall we call prevent_default?
|
let egui_wants_keyboard = runner_lock.egui_ctx().wants_keyboard_input();
|
||||||
// YES:
|
|
||||||
// * Tab (move to next text field)
|
let prevent_default = if matches!(event.key().as_str(), "Tab") {
|
||||||
//
|
// Always prevent moving cursor to url bar.
|
||||||
// SOMETIMES:
|
// Egui wants to use tab to move to the next text field.
|
||||||
// * Backspace - when entering text we don't want to go back one page.
|
true
|
||||||
//
|
} else if egui_wants_keyboard {
|
||||||
// NO:
|
matches!(
|
||||||
// * F5 / cmd-R (refresh)
|
event.key().as_str(),
|
||||||
// * cmd-shift-C (debug tools)
|
"Backspace" // so we don't go back to previous page when deleting text
|
||||||
// * ...
|
| "ArrowDown" | "ArrowLeft" | "ArrowRight" | "ArrowUp" // cmd-left is "back" on Mac (https://github.com/emilk/egui/issues/58)
|
||||||
//
|
)
|
||||||
// NOTE: if we call prevent_default for cmd-c/v/x, we will prevent copy/paste/cut events.
|
} else {
|
||||||
// Let's do things manually for now:
|
// We never want to prevent:
|
||||||
if matches!(
|
// * F5 / cmd-R (refresh)
|
||||||
event.key().as_str(),
|
// * cmd-shift-C (debug tools)
|
||||||
"Backspace" // so we don't go back to previous page when deleting text
|
// * cmd/ctrl-c/v/x (or we stop copy/past/cut events)
|
||||||
| "Tab" // so that e.g. tab doesn't move focus to url bar
|
false
|
||||||
) {
|
};
|
||||||
|
|
||||||
|
// console_log(format!(
|
||||||
|
// "On key-down {:?}, egui_wants_keyboard: {}, prevent_default: {}",
|
||||||
|
// event.key().as_str(),
|
||||||
|
// egui_wants_keyboard,
|
||||||
|
// prevent_default
|
||||||
|
// ));
|
||||||
|
|
||||||
|
if prevent_default {
|
||||||
event.prevent_default();
|
event.prevent_default();
|
||||||
}
|
}
|
||||||
}) as Box<dyn FnMut(_)>);
|
}) as Box<dyn FnMut(_)>);
|
||||||
|
|
Loading…
Reference in a new issue