Skip to content

Commit f8d15ab

Browse files
committed
Support additional toggles in quick pick, adopt in terminal
1 parent 33b3a48 commit f8d15ab

File tree

5 files changed

+69
-39
lines changed

5 files changed

+69
-39
lines changed

src/vs/base/browser/ui/findinput/findInput.ts

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { Emitter, Event } from 'vs/base/common/event';
1616
import { KeyCode } from 'vs/base/common/keyCodes';
1717
import 'vs/css!./findInput';
1818
import * as nls from 'vs/nls';
19+
import { DisposableStore } from 'vs/base/common/lifecycle';
1920

2021

2122
export interface IFindInputOptions extends IFindInputStyles {
@@ -52,6 +53,7 @@ export class FindInput extends Widget {
5253
private label: string;
5354
private fixFocusOnOptionClickEnabled = true;
5455
private imeSessionInProgress = false;
56+
private additionalTogglesDisposables: DisposableStore = new DisposableStore();
5557

5658
protected inputActiveOptionBorder?: Color;
5759
protected inputActiveOptionForeground?: Color;
@@ -252,27 +254,7 @@ export class FindInput extends Widget {
252254
this.regex.domNode.style.display = 'none';
253255
}
254256

255-
for (const toggle of options?.additionalToggles ?? []) {
256-
this._register(toggle);
257-
this.controls.appendChild(toggle.domNode);
258-
259-
this._register(toggle.onChange(viaKeyboard => {
260-
this._onDidOptionChange.fire(viaKeyboard);
261-
if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) {
262-
this.inputBox.focus();
263-
}
264-
}));
265-
266-
this.additionalToggles.push(toggle);
267-
}
268-
269-
if (this.additionalToggles.length > 0) {
270-
this.controls.style.display = 'block';
271-
}
272-
273-
this.inputBox.paddingRight =
274-
(this._showOptionButtons ? this.caseSensitive.width() + this.wholeWords.width() + this.regex.width() : 0)
275-
+ this.additionalToggles.reduce((r, t) => r + t.width(), 0);
257+
this.setAdditionalToggles(options?.additionalToggles);
276258

277259
this.domNode.appendChild(this.controls);
278260

@@ -336,6 +318,37 @@ export class FindInput extends Widget {
336318
}
337319
}
338320

321+
public setAdditionalToggles(toggles: Toggle[] | undefined): void {
322+
for (const currentToggle of this.additionalToggles) {
323+
currentToggle.domNode.remove();
324+
}
325+
this.additionalToggles = [];
326+
this.additionalTogglesDisposables.dispose();
327+
this.additionalTogglesDisposables = new DisposableStore();
328+
329+
for (const toggle of toggles ?? []) {
330+
this.additionalTogglesDisposables.add(toggle);
331+
this.controls.appendChild(toggle.domNode);
332+
333+
this.additionalTogglesDisposables.add(toggle.onChange(viaKeyboard => {
334+
this._onDidOptionChange.fire(viaKeyboard);
335+
if (!viaKeyboard && this.fixFocusOnOptionClickEnabled) {
336+
this.inputBox.focus();
337+
}
338+
}));
339+
340+
this.additionalToggles.push(toggle);
341+
}
342+
343+
if (this.additionalToggles.length > 0) {
344+
this.controls.style.display = 'block';
345+
}
346+
347+
this.inputBox.paddingRight =
348+
(this._showOptionButtons ? this.caseSensitive.width() + this.wholeWords.width() + this.regex.width() : 0)
349+
+ this.additionalToggles.reduce((r, t) => r + t.width(), 0);
350+
}
351+
339352
public clear(): void {
340353
this.clearValidation();
341354
this.setValue('');

src/vs/base/parts/quickinput/browser/quickInput.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { IKeybindingLabelStyles } from 'vs/base/browser/ui/keybindingLabel/keybi
1515
import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list';
1616
import { IListOptions, IListStyles, List } from 'vs/base/browser/ui/list/listWidget';
1717
import { IProgressBarStyles, ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar';
18+
import { Toggle } from 'vs/base/browser/ui/toggle/toggle';
1819
import { Action } from 'vs/base/common/actions';
1920
import { equals } from 'vs/base/common/arrays';
2021
import { TimeoutTimer } from 'vs/base/common/async';
@@ -740,6 +741,10 @@ class QuickPick<T extends IQuickPickItem> extends QuickInput implements IQuickPi
740741
this.update();
741742
}
742743

744+
set additionalToggles(toggles: Toggle[] | undefined) {
745+
this.ui.inputBox.additionalToggles = toggles;
746+
}
747+
743748
onDidChangeSelection = this.onDidChangeSelectionEmitter.event;
744749

745750
onDidTriggerItemButton = this.onDidTriggerItemButtonEmitter.event;

src/vs/base/parts/quickinput/browser/quickInputBox.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
88
import { StandardMouseEvent } from 'vs/base/browser/mouseEvent';
99
import { FindInput } from 'vs/base/browser/ui/findinput/findInput';
1010
import { IInputBoxStyles, IRange, MessageType } from 'vs/base/browser/ui/inputbox/inputBox';
11+
import { Toggle } from 'vs/base/browser/ui/toggle/toggle';
1112
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
1213
import Severity from 'vs/base/common/severity';
1314
import 'vs/css!./media/quickInput';
@@ -24,9 +25,7 @@ export class QuickInputBox extends Disposable {
2425
) {
2526
super();
2627
this.container = dom.append(this.parent, $('.quick-input-box'));
27-
this.findInput = this._register(new FindInput(this.container, undefined, false, {
28-
label: ''
29-
}));
28+
this.findInput = this._register(new FindInput(this.container, undefined, false, { label: '' }));
3029
}
3130

3231
onKeyDown = (handler: (event: StandardKeyboardEvent) => void): IDisposable => {
@@ -93,6 +92,10 @@ export class QuickInputBox extends Disposable {
9392
this.findInput.setEnabled(enabled);
9493
}
9594

95+
set additionalToggles(toggles: Toggle[] | undefined) {
96+
this.findInput.setAdditionalToggles(toggles);
97+
}
98+
9699
hasFocus(): boolean {
97100
return this.findInput.inputBox.hasFocus();
98101
}

src/vs/base/parts/quickinput/common/quickInput.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6+
import { Toggle } from 'vs/base/browser/ui/toggle/toggle';
67
import { Event } from 'vs/base/common/event';
78
import { IMatch } from 'vs/base/common/filters';
89
import { IItemAccessor } from 'vs/base/common/fuzzyScorer';
@@ -340,6 +341,8 @@ export interface IQuickPick<T extends IQuickPickItem> extends IQuickInput {
340341
hideInput: boolean;
341342

342343
hideCheckAll: boolean;
344+
345+
additionalToggles: Toggle[] | undefined;
343346
}
344347

345348
export interface IInputBox extends IQuickInput {

src/vs/workbench/contrib/terminal/browser/terminalInstance.ts

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ import { ITerminalCommand, TerminalCapability } from 'vs/platform/terminal/commo
4848
import { TerminalCapabilityStoreMultiplexer } from 'vs/platform/terminal/common/capabilities/terminalCapabilityStore';
4949
import { IProcessDataEvent, IProcessPropertyMap, IReconnectionProperties, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, PosixShellType, ProcessPropertyType, ShellIntegrationStatus, TerminalExitReason, TerminalIcon, TerminalLocation, TerminalSettingId, TerminalShellType, TitleEventSource, WindowsShellType } from 'vs/platform/terminal/common/terminal';
5050
import { escapeNonWindowsPath, collapseTildePath } from 'vs/platform/terminal/common/terminalEnvironment';
51-
import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry';
51+
import { activeContrastBorder, inputActiveOptionBackground, inputActiveOptionBorder, inputActiveOptionForeground, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry';
5252
import { IColorTheme, ICssStyleCollector, IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService';
5353
import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
5454
import { IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/workspaceTrust';
@@ -90,6 +90,7 @@ import { getIconRegistry } from 'vs/platform/theme/common/iconRegistry';
9090
import { TaskSettingId } from 'vs/workbench/contrib/tasks/common/tasks';
9191
import { TerminalStorageKeys } from 'vs/workbench/contrib/terminal/common/terminalStorageKeys';
9292
import { showWithPinnedItems } from 'vs/platform/quickinput/browser/quickPickPin';
93+
import { Toggle } from 'vs/base/browser/ui/toggle/toggle';
9394

9495
const enum Constants {
9596
/**
@@ -1010,27 +1011,32 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
10101011
if (items.length === 0) {
10111012
return;
10121013
}
1014+
// TODO: Toggling fuzzy shows pinned again
1015+
const fuzzySearchToggle = new Toggle({
1016+
title: 'Fuzzy search',
1017+
icon: Codicon.searchFuzzy,
1018+
isChecked: filterMode === 'fuzzy',
1019+
inputActiveOptionBorder: this._themeService.getColorTheme().getColor(inputActiveOptionBorder),
1020+
inputActiveOptionForeground: this._themeService.getColorTheme().getColor(inputActiveOptionForeground),
1021+
inputActiveOptionBackground: this._themeService.getColorTheme().getColor(inputActiveOptionBackground)
1022+
});
1023+
fuzzySearchToggle.onChange(() => {
1024+
if (fuzzySearchToggle.checked) {
1025+
quickPick.hide();
1026+
this.runRecent(type, 'fuzzy', quickPick.value);
1027+
} else {
1028+
quickPick.hide();
1029+
this.runRecent(type, 'contiguous', quickPick.value);
1030+
}
1031+
});
10131032
const outputProvider = this._instantiationService.createInstance(TerminalOutputProvider);
10141033
const quickPick = this._quickInputService.createQuickPick<IQuickPickItem & { rawLabel: string }>();
10151034
const originalItems = items;
10161035
quickPick.items = [...originalItems];
10171036
quickPick.sortByLabel = false;
10181037
quickPick.placeholder = placeholder;
1019-
quickPick.customButton = true;
10201038
quickPick.matchOnLabelMode = filterMode || 'contiguous';
1021-
if (filterMode === 'fuzzy') {
1022-
quickPick.customLabel = nls.localize('terminal.contiguousSearch', 'Use Contiguous Search');
1023-
quickPick.onDidCustom(() => {
1024-
quickPick.hide();
1025-
this.runRecent(type, 'contiguous', quickPick.value);
1026-
});
1027-
} else {
1028-
quickPick.customLabel = nls.localize('terminal.fuzzySearch', 'Use Fuzzy Search');
1029-
quickPick.onDidCustom(() => {
1030-
quickPick.hide();
1031-
this.runRecent(type, 'fuzzy', quickPick.value);
1032-
});
1033-
}
1039+
quickPick.additionalToggles = [fuzzySearchToggle];
10341040
quickPick.onDidTriggerItemButton(async e => {
10351041
if (e.button === removeFromCommandHistoryButton) {
10361042
if (type === 'command') {

0 commit comments

Comments
 (0)