diff --git a/packages/tui/src/component/prompt/autocomplete.tsx b/packages/tui/src/component/prompt/autocomplete.tsx index 862e0db1934..50d71a5d5a8 100644 --- a/packages/tui/src/component/prompt/autocomplete.tsx +++ b/packages/tui/src/component/prompt/autocomplete.tsx @@ -87,7 +87,6 @@ export function Autocomplete(props: { index: 0, selected: 0, visible: false as AutocompleteRef["visible"], - input: "keyboard" as "keyboard" | "mouse", }) const [positionTick, setPositionTick] = createSignal(0) @@ -151,14 +150,6 @@ export function Autocomplete(props: { setSearch(next ? next : "") }) - // When the filter changes due to how TUI works, the mousemove might still be triggered - // via a synthetic event as the layout moves underneath the cursor. This is a workaround to make sure the input mode remains keyboard so - // that the mouseover event doesn't trigger when filtering. - createEffect(() => { - filter() - setStore("input", "keyboard") - }) - function insertPart( text: string, part: @@ -724,7 +715,6 @@ export function Autocomplete(props: { title: "Previous autocomplete item", group: "Autocomplete", run() { - setStore("input", "keyboard") move(-1) }, }, @@ -733,7 +723,6 @@ export function Autocomplete(props: { title: "Next autocomplete item", group: "Autocomplete", run() { - setStore("input", "keyboard") move(1) }, }, @@ -942,17 +931,8 @@ export function Autocomplete(props: { : undefined } flexDirection="row" - onMouseMove={() => { - setStore("input", "mouse") - }} - onMouseOver={() => { - if (store.input !== "mouse") return - moveTo(index) - }} - onMouseDown={() => { - setStore("input", "mouse") - moveTo(index) - }} + onMouseMove={() => moveTo(index)} + onMouseDown={() => moveTo(index)} onMouseUp={() => select()} > setState((previous) => formSetSelected(previous, index()))} + onMouseMove={() => setState((previous) => formSetSelected(previous, index()))} backgroundColor={active() ? props.theme.formfieldFocusedBg : "transparent"} onMouseUp={() => choose(index())} > diff --git a/packages/tui/src/mini/footer.permission.tsx b/packages/tui/src/mini/footer.permission.tsx index 4ba6aabd51c..6f11e8573a0 100644 --- a/packages/tui/src/mini/footer.permission.tsx +++ b/packages/tui/src/mini/footer.permission.tsx @@ -54,7 +54,7 @@ function buttons( paddingLeft={1} paddingRight={1} backgroundColor={option === selected ? theme.actionFocusedBg : transparent} - onMouseOver={() => { + onMouseMove={() => { if (!disabled) onHover(option) }} onMouseUp={() => { diff --git a/packages/tui/src/routes/session/composer/shell-tab.tsx b/packages/tui/src/routes/session/composer/shell-tab.tsx index 0d46cfe4339..74176374256 100644 --- a/packages/tui/src/routes/session/composer/shell-tab.tsx +++ b/packages/tui/src/routes/session/composer/shell-tab.tsx @@ -125,7 +125,7 @@ export function ShellTab(props: { sessionID: string }) { backgroundColor={ active() ? theme.background.action.primary.focused : theme.background.action.primary.default } - onMouseOver={() => setStore("selected", index())} + onMouseMove={() => setStore("selected", index())} onMouseUp={() => { setStore("selected", index()) open() diff --git a/packages/tui/src/routes/session/composer/subagents-tab.tsx b/packages/tui/src/routes/session/composer/subagents-tab.tsx index b9e69557fd8..4d8a15251e4 100644 --- a/packages/tui/src/routes/session/composer/subagents-tab.tsx +++ b/packages/tui/src/routes/session/composer/subagents-tab.tsx @@ -215,7 +215,7 @@ export function SubagentsTab(props: { sessionID: string }) { ? theme.background.action.primary.selected : theme.background.action.primary.default } - onMouseOver={() => setStore("selected", index())} + onMouseMove={() => setStore("selected", index())} onMouseUp={() => { setStore("selected", index()) navigate({ type: "session", sessionID: entry.sessionID }) diff --git a/packages/tui/src/routes/session/composer/terminals-tab.tsx b/packages/tui/src/routes/session/composer/terminals-tab.tsx index e2d2714a4b2..6cdb97f983f 100644 --- a/packages/tui/src/routes/session/composer/terminals-tab.tsx +++ b/packages/tui/src/routes/session/composer/terminals-tab.tsx @@ -84,7 +84,7 @@ export function TerminalsTab(props: { sessionID: string; visibleTerminalID?: str ? theme.background.action.primary.selected : theme.background.action.primary.default } - onMouseOver={() => setSelected(index())} + onMouseMove={() => setSelected(index())} onMouseUp={() => { setSelected(index()) select() diff --git a/packages/tui/src/routes/session/form.tsx b/packages/tui/src/routes/session/form.tsx index 2e45791a682..1d53fcb9bea 100644 --- a/packages/tui/src/routes/session/form.tsx +++ b/packages/tui/src/routes/session/form.tsx @@ -907,7 +907,7 @@ export function FormPrompt(props: { form: FormWithLocation }) { } return ( setStore("selected", i())} + onMouseMove={() => setStore("selected", i())} onMouseDown={() => setStore("selected", i())} onMouseUp={() => { if (renderer.getSelection()?.getSelectedText()) return @@ -961,7 +961,7 @@ export function FormPrompt(props: { form: FormWithLocation }) { setStore("selected", rows().length)} + onMouseMove={() => setStore("selected", rows().length)} onMouseDown={() => setStore("selected", rows().length)} onMouseUp={() => { if (renderer.getSelection()?.getSelectedText()) return diff --git a/packages/tui/src/routes/session/permission.tsx b/packages/tui/src/routes/session/permission.tsx index 4b46d829bfd..9b126896589 100644 --- a/packages/tui/src/routes/session/permission.tsx +++ b/packages/tui/src/routes/session/permission.tsx @@ -591,7 +591,7 @@ export function SessionQuestion>(props: { ? theme.background.action.primary.focused : theme.background.action.primary.default } - onMouseOver={() => setStore("selected", option)} + onMouseMove={() => setStore("selected", option)} onMouseUp={() => { setStore("selected", option) props.onSelect(option) diff --git a/packages/tui/src/ui/dialog-select.tsx b/packages/tui/src/ui/dialog-select.tsx index c1757be85ff..08698731034 100644 --- a/packages/tui/src/ui/dialog-select.tsx +++ b/packages/tui/src/ui/dialog-select.tsx @@ -112,7 +112,6 @@ export function DialogSelect(props: DialogSelectProps) { const [store, setStore] = createStore({ selected: 0, filter: "", - input: "keyboard" as "keyboard" | "mouse", }) const [focusedAction, setFocusedAction] = createSignal() const actionFocused = createMemo(() => focusedAction() !== undefined) @@ -201,12 +200,8 @@ export function DialogSelect(props: DialogSelectProps) { return result }) - // When the filter changes due to how TUI works, the mousemove might still be triggered - // via a synthetic event as the layout moves underneath the cursor. This is a workaround to make sure the input mode remains keyboard - // that the mouseover event doesn't trigger when filtering. createEffect(() => { filtered() - setStore("input", "keyboard") setFocusedAction(undefined) }) @@ -384,7 +379,6 @@ export function DialogSelect(props: DialogSelectProps) { function submit() { if (props.locked) return - setStore("input", "keyboard") const index = focusedAction() if (index !== undefined) { trigger(actionItems()[index]) @@ -418,7 +412,6 @@ export function DialogSelect(props: DialogSelectProps) { title: "Previous item", group: "Dialog", run() { - setStore("input", "keyboard") move(-1) }, }, @@ -427,7 +420,6 @@ export function DialogSelect(props: DialogSelectProps) { title: "Next item", group: "Dialog", run() { - setStore("input", "keyboard") move(1) }, }, @@ -436,7 +428,6 @@ export function DialogSelect(props: DialogSelectProps) { title: "Page up", group: "Dialog", run() { - setStore("input", "keyboard") move(-10) }, }, @@ -445,7 +436,6 @@ export function DialogSelect(props: DialogSelectProps) { title: "Page down", group: "Dialog", run() { - setStore("input", "keyboard") move(10) }, }, @@ -455,7 +445,6 @@ export function DialogSelect(props: DialogSelectProps) { group: "Dialog", run() { if (props.locked) return - setStore("input", "keyboard") moveTo(0) }, }, @@ -465,7 +454,6 @@ export function DialogSelect(props: DialogSelectProps) { group: "Dialog", run() { if (props.locked) return - setStore("input", "keyboard") moveTo(flat().length - 1) }, }, @@ -538,7 +526,6 @@ export function DialogSelect(props: DialogSelectProps) { function trigger(item: Action | undefined) { if (props.locked || !item || isActionDisabled(item)) return - setStore("input", "keyboard") if (item.selection === "none") { item.onTrigger() return @@ -709,21 +696,16 @@ export function DialogSelect(props: DialogSelectProps) { position="relative" onMouseMove={() => { if (props.locked) return - setStore("input", "mouse") setFocusedAction(undefined) + const index = flat().findIndex((x) => isDeepEqual(x.value, option.value)) + if (index === -1 || index === store.selected) return + moveTo(index) }} onMouseUp={() => { if (props.locked) return option.onSelect?.(dialog) props.onSelect?.(option) }} - onMouseOver={() => { - if (props.locked) return - if (store.input !== "mouse") return - const index = flat().findIndex((x) => isDeepEqual(x.value, option.value)) - if (index === -1) return - moveTo(index) - }} onMouseDown={() => { if (props.locked) return const index = flat().findIndex((x) => isDeepEqual(x.value, option.value))