io/router,app: add support for directional focus moves

Implement support for up/down/right/left directional focus moves
and map Android directional pad keys to focus moves.

Fixes: https://todo.sr.ht/~eliasnaur/gio/195
References: https://github.com/tailscale/tailscale/issues/1611
Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2022-02-27 10:33:22 +01:00
parent 2e9df04a7b
commit 73eabb352d
6 changed files with 205 additions and 20 deletions
+12 -8
View File
@@ -897,14 +897,6 @@ func runInJVM(jvm *C.JavaVM, f func(env *C.JNIEnv)) {
func convertKeyCode(code C.jint) (string, bool) {
var n string
switch code {
case C.AKEYCODE_DPAD_UP:
n = key.NameUpArrow
case C.AKEYCODE_DPAD_DOWN:
n = key.NameDownArrow
case C.AKEYCODE_DPAD_LEFT:
n = key.NameLeftArrow
case C.AKEYCODE_DPAD_RIGHT:
n = key.NameRightArrow
case C.AKEYCODE_FORWARD_DEL:
n = key.NameDeleteForward
case C.AKEYCODE_DEL:
@@ -930,6 +922,18 @@ func convertKeyCode(code C.jint) (string, bool) {
//export Java_org_gioui_GioView_onKeyEvent
func Java_org_gioui_GioView_onKeyEvent(env *C.JNIEnv, class C.jclass, handle C.jlong, keyCode, r C.jint, pressed C.jboolean, t C.jlong) {
w := views[handle]
if pressed == C.JNI_TRUE {
switch keyCode {
case C.AKEYCODE_DPAD_UP:
w.callbacks.MoveFocus(router.FocusUp)
case C.AKEYCODE_DPAD_DOWN:
w.callbacks.MoveFocus(router.FocusDown)
case C.AKEYCODE_DPAD_LEFT:
w.callbacks.MoveFocus(router.FocusLeft)
case C.AKEYCODE_DPAD_RIGHT:
w.callbacks.MoveFocus(router.FocusRight)
}
}
if n, ok := convertKeyCode(keyCode); ok {
state := key.Release
if pressed == C.JNI_TRUE {
+6
View File
@@ -504,6 +504,12 @@ func (c *callbacks) SetEditorSnippet(r key.Range) {
c.Event(key.SnippetEvent(r))
}
func (c *callbacks) MoveFocus(dir router.FocusDirection) {
c.w.queue.q.MoveFocus(dir)
c.w.setNextFrame(time.Time{})
c.w.updateAnimation(c.d)
}
func (e *editorState) Replace(r key.Range, text string) {
if r.Start > r.End {
r.Start, r.End = r.End, r.Start