Fix selector mouse routing against linked SelectList

This commit is contained in:
can1357
2026-06-27 01:40:11 +02:00
parent f366e7bea8
commit 72ebd7dcae
6 changed files with 45 additions and 10 deletions
@@ -7,6 +7,7 @@
import { Container, type SelectItem, SelectList, type SgrMouseEvent } from "@oh-my-pi/pi-tui";
import { getSelectListTheme } from "../theme/theme";
import { DynamicBorder } from "./dynamic-border";
import { routeSelectListMouseWithTopBorder } from "./select-list-mouse-routing";
export interface PluginSelectorCallbacks {
onSelect: (pluginName: string, marketplace: string, scope?: "user" | "project") => void;
@@ -84,8 +85,7 @@ export class PluginSelectorComponent extends Container {
}
routeMouse(event: SgrMouseEvent, line: number, col: number): void {
const topBorderRows = 1;
this.#selectList.routeMouse(event, line - topBorderRows, col);
routeSelectListMouseWithTopBorder(this.#selectList, event, line, col);
}
}
@@ -1,6 +1,7 @@
import { Container, type SelectItem, SelectList, type SgrMouseEvent } from "@oh-my-pi/pi-tui";
import { getSelectListTheme } from "../../modes/theme/theme";
import { DynamicBorder } from "./dynamic-border";
import { routeSelectListMouseWithTopBorder } from "./select-list-mouse-routing";
/**
* Component that renders a queue mode selector with borders
@@ -55,7 +56,6 @@ export class QueueModeSelectorComponent extends Container {
}
routeMouse(event: SgrMouseEvent, line: number, col: number): void {
const topBorderRows = 1;
this.#selectList.routeMouse(event, line - topBorderRows, col);
routeSelectListMouseWithTopBorder(this.#selectList, event, line, col);
}
}
@@ -0,0 +1,35 @@
import type { SelectList, SgrMouseEvent } from "@oh-my-pi/pi-tui";
interface RoutableSelectList {
routeMouse?: (event: SgrMouseEvent, line: number, col: number) => void;
handleWheel(delta: -1 | 1): void;
hitTest(line: number): number | undefined;
setHoverIndex(index: number | null): void;
clickItem(index: number): void;
}
export function routeSelectListMouseWithTopBorder(
selectList: SelectList,
event: SgrMouseEvent,
line: number,
col: number,
): void {
const localLine = line - 1;
const target = selectList as RoutableSelectList;
if (typeof target.routeMouse === "function") {
target.routeMouse(event, localLine, col);
return;
}
if (event.wheel !== null) {
target.handleWheel(event.wheel);
return;
}
const index = target.hitTest(localLine);
if (event.motion) {
target.setHoverIndex(index ?? null);
return;
}
if (event.leftClick && index !== undefined) {
target.clickItem(index);
}
}
@@ -1,6 +1,7 @@
import { Container, type SelectItem, SelectList, type SgrMouseEvent } from "@oh-my-pi/pi-tui";
import { getSelectListTheme } from "../../modes/theme/theme";
import { DynamicBorder } from "./dynamic-border";
import { routeSelectListMouseWithTopBorder } from "./select-list-mouse-routing";
/**
* Component that renders a show images selector with borders
@@ -44,7 +45,6 @@ export class ShowImagesSelectorComponent extends Container {
}
routeMouse(event: SgrMouseEvent, line: number, col: number): void {
const topBorderRows = 1;
this.#selectList.routeMouse(event, line - topBorderRows, col);
routeSelectListMouseWithTopBorder(this.#selectList, event, line, col);
}
}
@@ -1,6 +1,7 @@
import { Container, type SelectItem, SelectList, type SgrMouseEvent } from "@oh-my-pi/pi-tui";
import { getSelectListTheme } from "../../modes/theme/theme";
import { DynamicBorder } from "./dynamic-border";
import { routeSelectListMouseWithTopBorder } from "./select-list-mouse-routing";
/**
* Component that renders a theme selector.
@@ -62,7 +63,6 @@ export class ThemeSelectorComponent extends Container {
}
routeMouse(event: SgrMouseEvent, line: number, col: number): void {
const topBorderRows = 1;
this.#selectList.routeMouse(event, line - topBorderRows, col);
routeSelectListMouseWithTopBorder(this.#selectList, event, line, col);
}
}
@@ -3,6 +3,7 @@ import { Container, type SelectItem, SelectList, type SgrMouseEvent } from "@oh-
import { getSelectListTheme } from "../../modes/theme/theme";
import { getThinkingLevelMetadata } from "../../thinking";
import { DynamicBorder } from "./dynamic-border";
import { routeSelectListMouseWithTopBorder } from "./select-list-mouse-routing";
/**
* Component that renders a thinking level selector with borders
@@ -51,7 +52,6 @@ export class ThinkingSelectorComponent extends Container {
}
routeMouse(event: SgrMouseEvent, line: number, col: number): void {
const topBorderRows = 1;
this.#selectList.routeMouse(event, line - topBorderRows, col);
routeSelectListMouseWithTopBorder(this.#selectList, event, line, col);
}
}