From 72ebd7dcae50d51da037231c2a1e00d2dcf754b2 Mon Sep 17 00:00:00 2001 From: can1357 Date: Sat, 27 Jun 2026 01:25:00 +0200 Subject: [PATCH] Fix selector mouse routing against linked SelectList --- .../src/modes/components/plugin-selector.ts | 4 +-- .../modes/components/queue-mode-selector.ts | 4 +-- .../components/select-list-mouse-routing.ts | 35 +++++++++++++++++++ .../modes/components/show-images-selector.ts | 4 +-- .../src/modes/components/theme-selector.ts | 4 +-- .../src/modes/components/thinking-selector.ts | 4 +-- 6 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 packages/coding-agent/src/modes/components/select-list-mouse-routing.ts diff --git a/packages/coding-agent/src/modes/components/plugin-selector.ts b/packages/coding-agent/src/modes/components/plugin-selector.ts index 68613193f..36da35277 100644 --- a/packages/coding-agent/src/modes/components/plugin-selector.ts +++ b/packages/coding-agent/src/modes/components/plugin-selector.ts @@ -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); } } diff --git a/packages/coding-agent/src/modes/components/queue-mode-selector.ts b/packages/coding-agent/src/modes/components/queue-mode-selector.ts index d283a88d7..cb7d43cdd 100644 --- a/packages/coding-agent/src/modes/components/queue-mode-selector.ts +++ b/packages/coding-agent/src/modes/components/queue-mode-selector.ts @@ -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); } } diff --git a/packages/coding-agent/src/modes/components/select-list-mouse-routing.ts b/packages/coding-agent/src/modes/components/select-list-mouse-routing.ts new file mode 100644 index 000000000..c0788d9a2 --- /dev/null +++ b/packages/coding-agent/src/modes/components/select-list-mouse-routing.ts @@ -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); + } +} diff --git a/packages/coding-agent/src/modes/components/show-images-selector.ts b/packages/coding-agent/src/modes/components/show-images-selector.ts index 63da97a8b..2a1060080 100644 --- a/packages/coding-agent/src/modes/components/show-images-selector.ts +++ b/packages/coding-agent/src/modes/components/show-images-selector.ts @@ -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); } } diff --git a/packages/coding-agent/src/modes/components/theme-selector.ts b/packages/coding-agent/src/modes/components/theme-selector.ts index 905e549b2..77165e62e 100644 --- a/packages/coding-agent/src/modes/components/theme-selector.ts +++ b/packages/coding-agent/src/modes/components/theme-selector.ts @@ -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); } } diff --git a/packages/coding-agent/src/modes/components/thinking-selector.ts b/packages/coding-agent/src/modes/components/thinking-selector.ts index d2b7c2236..fe33959ac 100644 --- a/packages/coding-agent/src/modes/components/thinking-selector.ts +++ b/packages/coding-agent/src/modes/components/thinking-selector.ts @@ -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); } }