diff --git a/src/view/quickInput/clearTranslationCachePopconfirm.ts b/src/view/quickInput/clearTranslationCachePopconfirm.ts new file mode 100644 index 0000000..3371783 --- /dev/null +++ b/src/view/quickInput/clearTranslationCachePopconfirm.ts @@ -0,0 +1,39 @@ +import { QuickInputButtons, commands, window } from 'vscode' +import { defineQuickPickItems } from './utils' +import { showTranslatePopmenu } from './translatePopmenu' +import { showSettingsPopmenu } from './settingsPopmenu' +import * as meta from '~/generated-meta' +import type { Context } from '~/context' + +export function showClearTranslationCachePopconfirm(ctx: Context) { + const quickPick = window.createQuickPick() + quickPick.title = 'Are you sure to clear translation cache?' + quickPick.matchOnDescription = true + quickPick.matchOnDetail = true + defineQuickPickItems(quickPick, [ + { + label: '$(x) No', + detail: 'Cancel', + callback: () => showSettingsPopmenu(ctx), + }, + { + label: '$(check) Yes', + detail: 'Clear translation cache', + callback: () => commands.executeCommand(meta.commands.clearTranslationCache).then(() => showTranslatePopmenu(ctx)), + }, + ]) + + quickPick.buttons = [ + QuickInputButtons.Back, + ] + quickPick.onDidTriggerButton((button) => { + if (button === QuickInputButtons.Back) + showSettingsPopmenu(ctx) + }) + + quickPick.onDidHide(() => { + quickPick.dispose() + showSettingsPopmenu(ctx) + }) + quickPick.show() +} diff --git a/src/view/quickInput/setKnownPopularWordInput.ts b/src/view/quickInput/setKnownPopularWordInput.ts new file mode 100644 index 0000000..4ea5ac2 --- /dev/null +++ b/src/view/quickInput/setKnownPopularWordInput.ts @@ -0,0 +1,35 @@ +import { QuickInputButtons, window } from 'vscode' +import { showTranslatePopmenu } from './translatePopmenu' +import { showSettingsPopmenu } from './settingsPopmenu' +import { config } from '~/config' +import type { Context } from '~/context' + +export function showSetKnownPopularWordInput(ctx: Context) { + const inputBox = window.createInputBox() + inputBox.title = 'Known Popular Words' + inputBox.value = String(config.knownPopularWordCount || 0) + + inputBox.onDidAccept(() => { + const count = Number(inputBox.value) + if (Number.isNaN(count)) { + window.showErrorMessage('Invalid number') + return + } + config.knownPopularWordCount = count + showTranslatePopmenu(ctx) + }) + + inputBox.buttons = [ + QuickInputButtons.Back, + ] + inputBox.onDidTriggerButton((button) => { + if (button === QuickInputButtons.Back) + showTranslatePopmenu(ctx) + }) + + inputBox.onDidHide(() => { + inputBox.dispose() + showSettingsPopmenu(ctx) + }) + inputBox.show() +} diff --git a/src/view/quickInput/settingsPopmenu.ts b/src/view/quickInput/settingsPopmenu.ts new file mode 100644 index 0000000..033d5c9 --- /dev/null +++ b/src/view/quickInput/settingsPopmenu.ts @@ -0,0 +1,47 @@ +import { QuickInputButtons, commands, window } from 'vscode' +import { defineQuickPickItems } from './utils' +import { showTranslatePopmenu } from './translatePopmenu' +import { showSetKnownPopularWordInput } from './setKnownPopularWordInput' +import { showClearTranslationCachePopconfirm } from './clearTranslationCachePopconfirm' +import type { Context } from '~/context' +import { translationCacheMap } from '~/model/cache' +import { config } from '~/config' +import * as extMeta from '~/generated-meta' + +export function showSettingsPopmenu(ctx: Context) { + const quickPick = window.createQuickPick() + quickPick.title = 'Interline Translate' + let routeJumping = false + quickPick.onDidChangeSelection(() => routeJumping = true) + const numberOfPhrases = Array.from(translationCacheMap.values()).reduce((acc, cache) => acc + cache.size, 0) + defineQuickPickItems(quickPick, [ + { + label: '$(mortar-board) Known popular words', + detail: `${config.knownPopularWordCount} words`, + callback: () => showSetKnownPopularWordInput(ctx), + }, + { + label: '$(database) Clear translation cache', + detail: `${numberOfPhrases} phrases`, + callback: () => showClearTranslationCachePopconfirm(ctx), + }, + { + label: '$(gear) More settings', + detail: 'Configure extension settings', + callback: () => commands.executeCommand('workbench.action.openSettings', extMeta.name).then(() => quickPick.dispose()), + }, + ]) + + quickPick.buttons = [QuickInputButtons.Back] + quickPick.onDidTriggerButton((button) => { + if (button === QuickInputButtons.Back) + showTranslatePopmenu(ctx) + }) + + quickPick.onDidHide(() => { + quickPick.dispose() + if (!routeJumping) + showTranslatePopmenu(ctx) + }) + quickPick.show() +} diff --git a/src/view/quickInput/translatePopmenu.ts b/src/view/quickInput/translatePopmenu.ts index c1aba48..3297e70 100644 --- a/src/view/quickInput/translatePopmenu.ts +++ b/src/view/quickInput/translatePopmenu.ts @@ -2,6 +2,7 @@ import { QuickPickItemKind, commands, window } from 'vscode' import { defineQuickPickItems } from './utils' import { showSetLanguagePopmenu } from './setLanguagePopmenu' import { showSetTranslationService } from './setTranslationService' +import { showSettingsPopmenu } from './settingsPopmenu' import { config, languageOptions } from '~/config' import type { Context } from '~/context' import { useStore } from '~/store' @@ -47,6 +48,11 @@ export function showTranslatePopmenu(ctx: Context) { description: translators[config.translator]?.label || `Unsupported: ${config.translator}`, callback: () => showSetTranslationService(ctx), }, + { + label: '$(gear) Settings', + description: 'Configure extension settings', + callback: () => showSettingsPopmenu(ctx), + }, ]) quickPick.onDidHide(() => quickPick.dispose()) quickPick.show()