HotKey can set focus

- Fix AbstractView to return focus info for hotkey handler
- TerminalUI sets focus from returned key handling
  for hotkeys
- Fixes #881
This commit is contained in:
Janne Valkealahti
2023-10-08 09:19:47 +01:00
parent edddc0b2e8
commit b6d1958949
4 changed files with 57 additions and 1 deletions

View File

@@ -273,6 +273,9 @@ public class TerminalUI implements ViewService {
if (handler != null) {
KeyHandlerResult result = handler.handle(KeyHandler.argsOf(event));
if (result.consumed()) {
if (result.focus() != null) {
setFocus(result.focus());
}
return;
}
}

View File

@@ -189,16 +189,18 @@ public abstract class AbstractView extends AbstractControl implements View {
log.trace("getHotKeyHandler() {}", this);
KeyHandler handler = args -> {
KeyEvent event = args.event();
View view = null;
boolean consumed = false;
Integer key = event.key();
if (key != null) {
KeyBindingValue keyBindingValue = getHotKeyBindings().get(key);
if (keyBindingValue != null) {
view = this;
consumed = dispatchKeyRunCommand(event, keyBindingValue);
}
}
return KeyHandler.resultOf(event, consumed, null);
return KeyHandler.resultOf(event, consumed, view);
};
return handler;
}

View File

@@ -106,6 +106,14 @@ public class AbstractViewTests {
return view.getKeyHandler().handle(KeyHandler.argsOf(key));
}
protected KeyHandlerResult handleHotKey(View view, Integer key) {
return handleHotKeyEvent(view, KeyEvent.of(key));
}
protected KeyHandlerResult handleHotKeyEvent(View view, KeyEvent key) {
return view.getHotKeyHandler().handle(KeyHandler.argsOf(key));
}
protected MouseEvent mouseClick(int x, int y) {
return MouseEvent.of(x, y, MouseEvent.Type.Released | MouseEvent.Button.Button1);
}

View File

@@ -15,12 +15,15 @@
*/
package org.springframework.shell.component.view.control;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.shell.component.view.control.MenuBarView.MenuBarItem;
import org.springframework.shell.component.view.control.MenuView.MenuItem;
import org.springframework.shell.component.view.event.KeyEvent;
import org.springframework.shell.component.view.event.KeyEvent.Key;
import org.springframework.shell.component.view.event.KeyHandler.KeyHandlerResult;
import org.springframework.shell.component.view.event.MouseEvent;
import org.springframework.shell.component.view.event.MouseHandler;
import org.springframework.shell.component.view.event.MouseHandler.MouseHandlerResult;
@@ -58,6 +61,46 @@ class MenuBarViewTests extends AbstractViewTests {
}
}
@Nested
class Events {
MenuBarView view;
@BeforeEach
void setup() {
MenuItem menuItem = new MenuView.MenuItem("sub1");
MenuBarItem menuBarItem = new MenuBarView.MenuBarItem("menu1", new MenuView.MenuItem[] { menuItem });
menuBarItem.setHotKey(Key.q);
view = new MenuBarView(new MenuBarView.MenuBarItem[] { menuBarItem });
view.setRect(0, 0, 10, 10);
configure(view);
}
@Test
void mouseClickGetsFocus() {
MouseEvent click = mouseClick(0, 0);
MouseHandlerResult result = view.getMouseHandler().handle(MouseHandler.argsOf(click));
assertThat(result).isNotNull().satisfies(r -> {
assertThat(r.event()).isEqualTo(click);
assertThat(r.consumed()).isTrue();
assertThat(r.focus()).isEqualTo(view);
assertThat(r.capture()).isEqualTo(view);
});
}
@Test
void hotKeyGetsFocus() {
KeyHandlerResult result = handleHotKey(view, KeyEvent.Key.q);
assertThat(result).isNotNull().satisfies(r -> {
assertThat(r.event()).isNotNull();
assertThat(r.consumed()).isTrue();
assertThat(r.focus()).isEqualTo(view);
});
}
}
@Nested
class Styling {