Mouse click selects in ListView

- Add binding to click and select item from index
  if it's in bounds.
- Relates #806
This commit is contained in:
Janne Valkealahti
2023-07-23 14:05:09 +01:00
parent d4bfe610a9
commit fe8c8646a1
2 changed files with 24 additions and 1 deletions

View File

@@ -103,7 +103,7 @@ public class ListView<T> 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<T> 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;

View File

@@ -94,6 +94,22 @@ class ListViewTests extends AbstractViewTests {
assertThat(selected(view)).isEqualTo(0);
}
@Test
void mouseClickMoveSelection() {
ListView<String> 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");
}