Skip to content

Commit f7f41dc

Browse files
authored
fix(tui): apply scroll configuration uniformly across all scrollboxes (#14735)
1 parent 1fcfb69 commit f7f41dc

7 files changed

Lines changed: 49 additions & 22 deletions

File tree

packages/opencode/src/cli/cmd/tui/component/error-component.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Clipboard } from "@tui/util/clipboard"
44
import { createSignal } from "solid-js"
55
import { Installation } from "@/installation"
66
import { win32FlushInputBuffer } from "../win32"
7+
import { getScrollAcceleration } from "../util/scroll"
78

89
export function ErrorComponent(props: {
910
error: Error
@@ -82,7 +83,7 @@ export function ErrorComponent(props: {
8283
<text fg={colors.bg}>Exit</text>
8384
</box>
8485
</box>
85-
<scrollbox height={Math.floor(term().height * 0.7)}>
86+
<scrollbox height={Math.floor(term().height * 0.7)} scrollAcceleration={getScrollAcceleration()}>
8687
<text fg={colors.muted}>{props.error.stack}</text>
8788
</scrollbox>
8889
<text fg={colors.text}>{props.error.message}</text>

packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { createMemo, createResource, createEffect, onMount, onCleanup, Index, Sh
66
import { createStore } from "solid-js/store"
77
import { useSDK } from "@tui/context/sdk"
88
import { useSync } from "@tui/context/sync"
9+
import { getScrollAcceleration } from "../../util/scroll"
10+
import { useTuiConfig } from "../../context/tui-config"
911
import { useTheme, selectedForeground } from "@tui/context/theme"
1012
import { SplitBorder } from "@tui/component/border"
1113
import { useCommandDialog } from "@tui/component/dialog-command"
@@ -81,6 +83,7 @@ export function Autocomplete(props: {
8183
const { theme } = useTheme()
8284
const dimensions = useTerminalDimensions()
8385
const frecency = useFrecency()
86+
const tuiConfig = useTuiConfig()
8487

8588
const [store, setStore] = createStore({
8689
index: 0,
@@ -605,6 +608,7 @@ export function Autocomplete(props: {
605608
})
606609

607610
let scroll: ScrollBoxRenderable
611+
const scrollAcceleration = createMemo(() => getScrollAcceleration(tuiConfig))
608612

609613
return (
610614
<box
@@ -622,6 +626,7 @@ export function Autocomplete(props: {
622626
backgroundColor={theme.backgroundMenu}
623627
height={height()}
624628
scrollbarOptions={{ visible: false }}
629+
scrollAcceleration={scrollAcceleration()}
625630
>
626631
<Index
627632
each={options()}

packages/opencode/src/cli/cmd/tui/routes/session/index.tsx

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,7 @@ import { UI } from "@/cli/ui.ts"
8282
import { useTuiConfig } from "../../context/tui-config"
8383

8484
addDefaultParsers(parsers.parsers)
85-
86-
class CustomSpeedScroll implements ScrollAcceleration {
87-
constructor(private speed: number) {}
88-
89-
tick(_now?: number): number {
90-
return this.speed
91-
}
92-
93-
reset(): void {}
94-
}
85+
import { getScrollAcceleration } from "../../util/scroll"
9586

9687
const context = createContext<{
9788
width: number
@@ -168,17 +159,7 @@ export function Session() {
168159
const showTimestamps = createMemo(() => timestamps() === "show")
169160
const contentWidth = createMemo(() => dimensions().width - (sidebarVisible() ? 42 : 0) - 4)
170161

171-
const scrollAcceleration = createMemo(() => {
172-
const tui = tuiConfig
173-
if (tui?.scroll_acceleration?.enabled) {
174-
return new MacOSScrollAccel()
175-
}
176-
if (tui?.scroll_speed) {
177-
return new CustomSpeedScroll(tui.scroll_speed)
178-
}
179-
180-
return new CustomSpeedScroll(3)
181-
})
162+
const scrollAcceleration = createMemo(() => getScrollAcceleration(tuiConfig))
182163

183164
createEffect(() => {
184165
if (session()?.workspaceID) {

packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { Keybind } from "@/util/keybind"
1515
import { Locale } from "@/util/locale"
1616
import { Global } from "@/global"
1717
import { useDialog } from "../../ui/dialog"
18+
import { getScrollAcceleration } from "../../util/scroll"
1819
import { useTuiConfig } from "../../context/tui-config"
1920

2021
type PermissionStage = "permission" | "always" | "reject"
@@ -62,12 +63,14 @@ function EditBody(props: { request: PermissionRequest }) {
6263
})
6364

6465
const ft = createMemo(() => filetype(filepath()))
66+
const scrollAcceleration = createMemo(() => getScrollAcceleration(config))
6567

6668
return (
6769
<box flexDirection="column" gap={1}>
6870
<Show when={diff()}>
6971
<scrollbox
7072
height="100%"
73+
scrollAcceleration={scrollAcceleration()}
7174
verticalScrollbarOptions={{
7275
trackOptions: {
7376
backgroundColor: theme.background,

packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
import { useSync } from "@tui/context/sync"
22
import { createMemo, Show } from "solid-js"
33
import { useTheme } from "../../context/theme"
4+
import { useTuiConfig } from "../../context/tui-config"
45
import { Installation } from "@/installation"
56
import { TuiPluginRuntime } from "../../plugin"
67

8+
import { getScrollAcceleration } from "../../util/scroll"
9+
710
export function Sidebar(props: { sessionID: string; overlay?: boolean }) {
811
const sync = useSync()
912
const { theme } = useTheme()
13+
const tuiConfig = useTuiConfig()
1014
const session = createMemo(() => sync.session.get(props.sessionID))
15+
const scrollAcceleration = createMemo(() => getScrollAcceleration(tuiConfig))
1116

1217
return (
1318
<Show when={session()}>
@@ -23,6 +28,7 @@ export function Sidebar(props: { sessionID: string; overlay?: boolean }) {
2328
>
2429
<scrollbox
2530
flexGrow={1}
31+
scrollAcceleration={scrollAcceleration()}
2632
verticalScrollbarOptions={{
2733
trackOptions: {
2834
backgroundColor: theme.background,

packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import { useDialog, type DialogContext } from "@tui/ui/dialog"
1010
import { useKeybind } from "@tui/context/keybind"
1111
import { Keybind } from "@/util/keybind"
1212
import { Locale } from "@/util/locale"
13+
import { useSync } from "@tui/context/sync"
14+
import { getScrollAcceleration } from "../util/scroll"
15+
import { useTuiConfig } from "../context/tui-config"
1316

1417
export interface DialogSelectProps<T> {
1518
title: string
@@ -50,6 +53,10 @@ export type DialogSelectRef<T> = {
5053
export function DialogSelect<T>(props: DialogSelectProps<T>) {
5154
const dialog = useDialog()
5255
const { theme } = useTheme()
56+
const sync = useSync()
57+
const tuiConfig = useTuiConfig()
58+
const scrollAcceleration = createMemo(() => getScrollAcceleration(tuiConfig))
59+
5360
const [store, setStore] = createStore({
5461
selected: 0,
5562
filter: "",
@@ -276,6 +283,7 @@ export function DialogSelect<T>(props: DialogSelectProps<T>) {
276283
paddingLeft={1}
277284
paddingRight={1}
278285
scrollbarOptions={{ visible: false }}
286+
scrollAcceleration={scrollAcceleration()}
279287
ref={(r: ScrollBoxRenderable) => (scroll = r)}
280288
maxHeight={height()}
281289
>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { MacOSScrollAccel, type ScrollAcceleration } from "@opentui/core"
2+
import { TuiConfig } from "@/config/tui"
3+
4+
export class CustomSpeedScroll implements ScrollAcceleration {
5+
constructor(private speed: number) {}
6+
7+
tick(_now?: number): number {
8+
return this.speed
9+
}
10+
11+
reset(): void {}
12+
}
13+
14+
export function getScrollAcceleration(tuiConfig?: TuiConfig.Info): ScrollAcceleration {
15+
if (tuiConfig?.scroll_acceleration?.enabled) {
16+
return new MacOSScrollAccel()
17+
}
18+
if (tuiConfig?.scroll_speed) {
19+
return new CustomSpeedScroll(tuiConfig.scroll_speed)
20+
}
21+
22+
return new CustomSpeedScroll(3)
23+
}

0 commit comments

Comments
 (0)