Add option in settings to enable autocompletion

This commit is contained in:
Roipoussiere 2023-06-09 16:38:48 +02:00
parent 6f04a1b8fa
commit 2d2d0cabb3
4 changed files with 36 additions and 4 deletions

View File

@ -103,6 +103,7 @@ export default function CodeMirror({
theme, theme,
keybindings, keybindings,
isLineNumbersDisplayed, isLineNumbersDisplayed,
isAutoCompletionEnabled,
fontSize = 18, fontSize = 18,
fontFamily = 'monospace', fontFamily = 'monospace',
options, options,
@ -114,12 +115,14 @@ export default function CodeMirror({
}, },
[onChange], [onChange],
); );
const handleOnCreateEditor = useCallback( const handleOnCreateEditor = useCallback(
(view) => { (view) => {
onViewChanged?.(view); onViewChanged?.(view);
}, },
[onViewChanged], [onViewChanged],
); );
const handleOnUpdate = useCallback( const handleOnUpdate = useCallback(
(viewUpdate) => { (viewUpdate) => {
if (viewUpdate.selectionSet && onSelectionChange) { if (viewUpdate.selectionSet && onSelectionChange) {
@ -128,6 +131,7 @@ export default function CodeMirror({
}, },
[onSelectionChange], [onSelectionChange],
); );
const extensions = useMemo(() => { const extensions = useMemo(() => {
let bindings = { let bindings = {
vim, vim,
@ -138,6 +142,11 @@ export default function CodeMirror({
} }
return staticExtensions; return staticExtensions;
}, [keybindings]); }, [keybindings]);
const setAutoCompletion = isAutoCompletionEnabled => isAutoCompletionEnabled ?
javascriptLanguage.data.of({ autocomplete: strudelAutocomplete }) :
autocompletion({ override: [] })
return ( return (
<div style={{ fontSize, fontFamily }} className="w-full"> <div style={{ fontSize, fontFamily }} className="w-full">
<_CodeMirror <_CodeMirror
@ -146,7 +155,7 @@ export default function CodeMirror({
onChange={handleOnChange} onChange={handleOnChange}
onCreateEditor={handleOnCreateEditor} onCreateEditor={handleOnCreateEditor}
onUpdate={handleOnUpdate} onUpdate={handleOnUpdate}
extensions={extensions} extensions={[ ...extensions, setAutoCompletion(isAutoCompletionEnabled) ]}
basicSetup={{ lineNumbers: isLineNumbersDisplayed }} basicSetup={{ lineNumbers: isLineNumbersDisplayed }}
/> />
</div> </div>

View File

@ -364,7 +364,15 @@ const fontFamilyOptions = {
}; };
function SettingsTab({ scheduler }) { function SettingsTab({ scheduler }) {
const { theme, keybindings, isLineNumbersDisplayed, fontSize, fontFamily } = useSettings(); const {
theme,
keybindings,
isLineNumbersDisplayed,
isAutoCompletionEnabled,
fontSize,
fontFamily
} = useSettings();
return ( return (
<div className="text-foreground p-4 space-y-4"> <div className="text-foreground p-4 space-y-4">
{/* <FormItem label="Tempo"> {/* <FormItem label="Tempo">
@ -406,7 +414,7 @@ function SettingsTab({ scheduler }) {
/> />
</FormItem> </FormItem>
</div> </div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4"> <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
<FormItem label="Keybindings"> <FormItem label="Keybindings">
<ButtonGroup <ButtonGroup
value={keybindings} value={keybindings}
@ -419,6 +427,11 @@ function SettingsTab({ scheduler }) {
onChange={(cbEvent) => settingsMap.setKey('isLineNumbersDisplayed', cbEvent.target.checked)} onChange={(cbEvent) => settingsMap.setKey('isLineNumbersDisplayed', cbEvent.target.checked)}
value={isLineNumbersDisplayed} value={isLineNumbersDisplayed}
/> />
<Checkbox
label="Enable auto-completion"
onChange={(cbEvent) => settingsMap.setKey('isAutoCompletionEnabled', cbEvent.target.checked)}
value={isAutoCompletionEnabled}
/>
</div> </div>
<FormItem label="Reset Settings"> <FormItem label="Reset Settings">
<button <button

View File

@ -105,7 +105,14 @@ export function Repl({ embedded = false }) {
const [lastShared, setLastShared] = useState(); const [lastShared, setLastShared] = useState();
const [pending, setPending] = useState(true); const [pending, setPending] = useState(true);
const { theme, keybindings, fontSize, fontFamily, isLineNumbersDisplayed } = useSettings(); const {
theme,
keybindings,
fontSize,
fontFamily,
isLineNumbersDisplayed,
isAutoCompletionEnabled
} = useSettings();
const { code, setCode, scheduler, evaluate, activateCode, isDirty, activeCode, pattern, started, stop, error } = const { code, setCode, scheduler, evaluate, activateCode, isDirty, activeCode, pattern, started, stop, error } =
useStrudel({ useStrudel({
@ -272,6 +279,7 @@ export function Repl({ embedded = false }) {
value={code} value={code}
keybindings={keybindings} keybindings={keybindings}
isLineNumbersDisplayed={isLineNumbersDisplayed} isLineNumbersDisplayed={isLineNumbersDisplayed}
isAutoCompletionEnabled={isAutoCompletionEnabled}
fontSize={fontSize} fontSize={fontSize}
fontFamily={fontFamily} fontFamily={fontFamily}
onChange={handleChangeCode} onChange={handleChangeCode}

View File

@ -5,6 +5,7 @@ export const defaultSettings = {
activeFooter: 'intro', activeFooter: 'intro',
keybindings: 'codemirror', keybindings: 'codemirror',
isLineNumbersDisplayed: true, isLineNumbersDisplayed: true,
isAutoCompletionEnabled: false,
theme: 'strudelTheme', theme: 'strudelTheme',
fontFamily: 'monospace', fontFamily: 'monospace',
fontSize: 18, fontSize: 18,
@ -21,6 +22,7 @@ export function useSettings() {
...state, ...state,
isZen: [true, 'true'].includes(state.isZen) ? true : false, isZen: [true, 'true'].includes(state.isZen) ? true : false,
isLineNumbersDisplayed: [true, 'true'].includes(state.isLineNumbersDisplayed) ? true : false, isLineNumbersDisplayed: [true, 'true'].includes(state.isLineNumbersDisplayed) ? true : false,
isAutoCompletionEnabled: [true, 'true'].includes(state.isAutoCompletionEnabled) ? true : false,
fontSize: Number(state.fontSize), fontSize: Number(state.fontSize),
}; };
} }