From fe8c8646a18df934bd37ac07ecbe5908480360cb Mon Sep 17 00:00:00 2001 From: Janne Valkealahti Date: Sun, 23 Jul 2023 14:05:09 +0100 Subject: [PATCH] Mouse click selects in ListView - Add binding to click and select item from index if it's in bounds. - Relates #806 --- .../shell/component/view/control/ListView.java | 9 ++++++++- .../component/view/control/ListViewTests.java | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/spring-shell-core/src/main/java/org/springframework/shell/component/view/control/ListView.java b/spring-shell-core/src/main/java/org/springframework/shell/component/view/control/ListView.java index 15576052..4a64870b 100644 --- a/spring-shell-core/src/main/java/org/springframework/shell/component/view/control/ListView.java +++ b/spring-shell-core/src/main/java/org/springframework/shell/component/view/control/ListView.java @@ -103,7 +103,7 @@ public class ListView extends BoxView { registerMouseBinding(MouseEvent.Type.Wheel | MouseEvent.Button.WheelUp, () -> up()); registerMouseBinding(MouseEvent.Type.Wheel | MouseEvent.Button.WheelDown, () -> down()); - registerMouseBinding(MouseEvent.Type.Released | MouseEvent.Button.Button1, () -> {}); + registerMouseBinding(MouseEvent.Type.Released | MouseEvent.Button.Button1, event -> click(event)); } private void up() { @@ -121,6 +121,13 @@ public class ListView extends BoxView { dispatch(ShellMessageBuilder.ofView(this, ListViewOpenSelectedItemEvent.of(this, selectedItem()))); } + private void click(MouseEvent event) { + int index = event.y() - getInnerRect().y(); + if (index > -1 && index < items.size()) { + setSelected(index); + } + } + public void setSelected(int selected) { if (this.selected != selected) { this.selected = selected; diff --git a/spring-shell-core/src/test/java/org/springframework/shell/component/view/control/ListViewTests.java b/spring-shell-core/src/test/java/org/springframework/shell/component/view/control/ListViewTests.java index 51f8318f..5fed7a46 100644 --- a/spring-shell-core/src/test/java/org/springframework/shell/component/view/control/ListViewTests.java +++ b/spring-shell-core/src/test/java/org/springframework/shell/component/view/control/ListViewTests.java @@ -94,6 +94,22 @@ class ListViewTests extends AbstractViewTests { assertThat(selected(view)).isEqualTo(0); } + @Test + void mouseClickMoveSelection() { + ListView view = new ListView<>(); + configure(view); + view.setRect(0, 0, 80, 24); + view.setItems(Arrays.asList("item1", "item2")); + assertThat(selected(view)).isEqualTo(-1); + + MouseEvent event00 = mouseClick(0, 0); + MouseEvent event01 = mouseClick(0, 1); + view.getMouseHandler().handle(MouseHandler.argsOf(event00)); + assertThat(selected(view)).isEqualTo(0); + view.getMouseHandler().handle(MouseHandler.argsOf(event01)); + assertThat(selected(view)).isEqualTo(1); + } + static int selected(ListView view) { return (int) ReflectionTestUtils.getField(view, "selected"); }