diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index 8fd4be9b..046dc5d9 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -498,10 +498,10 @@ export const SidebarChat = () => { {/* bottom row */}
{/* submit options */} -
+
diff --git a/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx b/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx index adeb6930..504b88d2 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/util/inputs.tsx @@ -5,7 +5,7 @@ import React, { useCallback, useEffect, useRef } from 'react'; import { useService } from '../util/services.js'; -import { , InputBox } from '../../../../../../../base/browser/ui/inputbox/inputBox.js'; +import { IInputBoxStyles, InputBox } from '../../../../../../../base/browser/ui/inputbox/inputBox.js'; import { defaultInputBoxStyles, defaultSelectBoxStyles } from '../../../../../../../platform/theme/browser/defaultStyles.js'; import { SelectBox } from '../../../../../../../base/browser/ui/selectBox/selectBox.js'; import { IDisposable } from '../../../../../../../base/common/lifecycle.js'; @@ -14,13 +14,14 @@ import { ScrollableElementCreationOptions } from '../../../../../../../base/brow -export const WidgetComponent = ({ ctor, propsFn, dispose, onCreateInstance, children } +export const WidgetComponent = ({ ctor, propsFn, dispose, onCreateInstance, children, className } : { ctor: { new(...params: CtorParams): Instance }, propsFn: (container: HTMLDivElement) => CtorParams, onCreateInstance: (instance: Instance) => IDisposable[], dispose: (instance: Instance) => void, children?: React.ReactNode, + className?: string } ) => { const containerRef = useRef(null); @@ -34,7 +35,7 @@ export const WidgetComponent = ({ ctor, prop } }, [ctor, propsFn, dispose, onCreateInstance, containerRef]) - return
{children}
+ return
{children}
} @@ -105,6 +106,7 @@ export const VoidSelectBox = ({ onChangeSelection, onCreateInstance, selectB let containerRef = useRef(null); return { containerRef.current = container diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx index 8144c76f..2edc0137 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-settings-tsx/Settings.tsx @@ -4,6 +4,7 @@ import { ProviderName, SettingName, displayInfoOfSettingName, titleOfProviderNam import ErrorBoundary from '../sidebar-tsx/ErrorBoundary.js' import { VoidInputBox, VoidSelectBox } from '../util/inputs.js' import { useIsDark, useRefreshModelState, useService, useSettingsState } from '../util/services.js' +import { X } from 'lucide-react' @@ -18,10 +19,10 @@ const RefreshableModels = () => { if (!settingsState.settingsOfProvider.ollama.enabled) return null - return <> + return
{refreshModelState === 'loading' ? 'loading...' : 'good!'} - +
} @@ -110,16 +111,16 @@ export const ModelDump = () => { const settingsState = useSettingsState() // a dump of all the enabled providers' models - const modelDump: (ModelInfo & { providerName: ProviderName })[] = [] + const modelDump: (ModelInfo & { providerName: ProviderName, providerEnabled: boolean })[] = [] for (let providerName of providerNames) { const providerSettings = settingsState.settingsOfProvider[providerName] - if (!providerSettings.enabled) continue - modelDump.push(...providerSettings.models.map(model => ({ ...model, providerName }))) + // if (!providerSettings.enabled) continue + modelDump.push(...providerSettings.models.map(model => ({ ...model, providerName, providerEnabled: providerSettings.enabled }))) } return
{modelDump.map(m => { - const { isHidden, isDefault, modelName, providerName } = m + const { isHidden, isDefault, modelName, providerName, providerEnabled } = m return
{/* left part is width:full */} @@ -129,9 +130,9 @@ export const ModelDump = () => { {/* right part is anything that fits */}
{isDefault ? '' : '(custom model)'} -
{ settingsStateService.toggleModelHidden(providerName, modelName) }}>{isHidden ? '❌' : '✅'}
-
- {isDefault ? null : } + +
+ {isDefault ? null : }
@@ -190,7 +191,7 @@ const SettingsForProvider = ({ providerName }: { providerName: ProviderName }) =

{titleOfProviderName(providerName)}

- { voidSettingsService.setSettingOfProvider(providerName, 'enabled', !enabled) }}>{enabled ? '✅' : '❌'} +
{/* settings besides models (e.g. api key) */} {Object.keys(others).map((sName, i) => { @@ -248,7 +249,7 @@ export const Settings = () => {
-

Models

+

Models

@@ -257,7 +258,7 @@ export const Settings = () => {
-

{ setTab('providers') }}>Providers

+

{ setTab('providers') }}>Providers

diff --git a/src/vs/workbench/contrib/void/browser/voidSettingsPane.ts b/src/vs/workbench/contrib/void/browser/voidSettingsPane.ts index 6d522842..7974fd4c 100644 --- a/src/vs/workbench/contrib/void/browser/voidSettingsPane.ts +++ b/src/vs/workbench/contrib/void/browser/voidSettingsPane.ts @@ -27,6 +27,7 @@ import { mountVoidSettings } from './react/out/void-settings-tsx/index.js' import { getReactServices } from './helpers/reactServicesHelper.js'; import { Codicon } from '../../../../base/common/codicons.js'; import { IDisposable } from '../../../../base/common/lifecycle.js'; +import { DomScrollableElement } from '../../../../base/browser/ui/scrollbar/scrollableElement.js'; // refer to preferences.contribution.ts keybindings editor @@ -62,6 +63,8 @@ class VoidSettingsInput extends EditorInput { class VoidSettingsPane extends EditorPane { static readonly ID = 'workbench.test.myCustomPane'; + private _scrollbar: DomScrollableElement | undefined; + constructor( group: IEditorGroup, @ITelemetryService telemetryService: ITelemetryService, @@ -73,31 +76,43 @@ class VoidSettingsPane extends EditorPane { } protected createEditor(parent: HTMLElement): void { - // parent.style.overflow = 'auto' - parent.style.userSelect = 'text' + parent.style.height = '100%'; + parent.style.width = '100%'; + const scrollableContent = document.createElement('div'); + scrollableContent.style.height = '100%'; + scrollableContent.style.width = '100%'; - // gets set immediately + this._scrollbar = this._register(new DomScrollableElement(scrollableContent, {})); + parent.appendChild(this._scrollbar.getDomNode()); + this._scrollbar.scanDomNode(); + + // Mount React into the scrollable content this.instantiationService.invokeFunction(accessor => { - const services = getReactServices(accessor) - const disposables: IDisposable[] | undefined = mountVoidSettings(parent, services); - disposables?.forEach(d => this._register(d)) - }) + const services = getReactServices(accessor); + const disposables: IDisposable[] | undefined = mountVoidSettings(scrollableContent, services); + + setTimeout(() => { // this is a complete hack and I don't really understand how scrollbar works here + this._scrollbar?.scanDomNode(); + }, 1000) + disposables?.forEach(d => this._register(d)); + }); } layout(dimension: Dimension): void { - const container = this.getContainer(); - if (!container) return; + if (!this._scrollbar) return; + + this._scrollbar.getDomNode().style.height = `${dimension.height}px`; + this._scrollbar.getDomNode().style.width = `${dimension.width}px`; + this._scrollbar.scanDomNode(); - container.style.width = `${dimension.width}px`; - container.style.height = `${dimension.height}px`; } - override get minimumWidth() { return 512 } + + override get minimumWidth() { return 700 } } - // register Settings pane Registry.as(EditorExtensions.EditorPane).registerEditorPane( EditorPaneDescriptor.create(VoidSettingsPane, VoidSettingsPane.ID, nls.localize('VoidSettingsPane', "Void Settings Pane")),