Skip to content

Commit 4b0d6f3

Browse files
authored
Support find widget in lists/trees (microsoft#152481)
* replace list type filter and tree type label controller with list type navigation and tree find. use proper FindInput widget * make sure vim doesn't break * polish outline use case * 💄 * remove unused import
1 parent 34507a8 commit 4b0d6f3

File tree

29 files changed

+619
-581
lines changed

29 files changed

+619
-581
lines changed

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

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import * as dom from 'vs/base/browser/dom';
77
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
88
import { IMouseEvent } from 'vs/base/browser/mouseEvent';
9-
import { IToggleStyles } from 'vs/base/browser/ui/toggle/toggle';
9+
import { IToggleStyles, Toggle } from 'vs/base/browser/ui/toggle/toggle';
1010
import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview';
1111
import { CaseSensitiveToggle, RegexToggle, WholeWordsToggle } from 'vs/base/browser/ui/findinput/findInputToggles';
1212
import { HistoryInputBox, IInputBoxStyles, IInputValidator, IMessage as InputBoxMessage } from 'vs/base/browser/ui/inputbox/inputBox';
@@ -31,6 +31,7 @@ export interface IFindInputOptions extends IFindInputStyles {
3131
readonly appendWholeWordsLabel?: string;
3232
readonly appendRegexLabel?: string;
3333
readonly history?: string[];
34+
readonly additionalToggles?: Toggle[];
3435
readonly showHistoryHint?: () => boolean;
3536
}
3637

@@ -74,6 +75,7 @@ export class FindInput extends Widget {
7475
protected regex: RegexToggle;
7576
protected wholeWords: WholeWordsToggle;
7677
protected caseSensitive: CaseSensitiveToggle;
78+
protected additionalToggles: Toggle[] = [];
7779
public domNode: HTMLElement;
7880
public inputBox: HistoryInputBox;
7981

@@ -209,10 +211,6 @@ export class FindInput extends Widget {
209211
this._onCaseSensitiveKeyDown.fire(e);
210212
}));
211213

212-
if (this._showOptionButtons) {
213-
this.inputBox.paddingRight = this.caseSensitive.width() + this.wholeWords.width() + this.regex.width();
214-
}
215-
216214
// Arrow-Key support to navigate between options
217215
const indexes = [this.caseSensitive.domNode, this.wholeWords.domNode, this.regex.domNode];
218216
this.onkeydown(this.domNode, (event: IKeyboardEvent) => {
@@ -250,6 +248,34 @@ export class FindInput extends Widget {
250248
this.controls.appendChild(this.wholeWords.domNode);
251249
this.controls.appendChild(this.regex.domNode);
252250

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

255281
parent?.appendChild(this.domNode);
@@ -282,6 +308,10 @@ export class FindInput extends Widget {
282308
this.regex.enable();
283309
this.wholeWords.enable();
284310
this.caseSensitive.enable();
311+
312+
for (const toggle of this.additionalToggles) {
313+
toggle.enable();
314+
}
285315
}
286316

287317
public disable(): void {
@@ -290,6 +320,10 @@ export class FindInput extends Widget {
290320
this.regex.disable();
291321
this.wholeWords.disable();
292322
this.caseSensitive.disable();
323+
324+
for (const toggle of this.additionalToggles) {
325+
toggle.disable();
326+
}
293327
}
294328

295329
public setFocusInputOnOptionClick(value: boolean): void {
@@ -356,6 +390,10 @@ export class FindInput extends Widget {
356390
this.wholeWords.style(toggleStyles);
357391
this.caseSensitive.style(toggleStyles);
358392

393+
for (const toggle of this.additionalToggles) {
394+
toggle.style(toggleStyles);
395+
}
396+
359397
const inputBoxStyles: IInputBoxStyles = {
360398
inputBackground: this.inputBackground,
361399
inputForeground: this.inputForeground,

src/vs/base/browser/ui/list/list.css

Lines changed: 1 addition & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -65,72 +65,7 @@
6565
z-index: 1000;
6666
}
6767

68-
/* Type filter */
69-
70-
.monaco-list-type-filter {
71-
display: flex;
72-
align-items: center;
73-
position: absolute;
74-
border-radius: 2px;
75-
padding: 0px 3px;
76-
max-width: calc(100% - 10px);
77-
text-overflow: ellipsis;
78-
overflow: hidden;
79-
text-align: right;
80-
box-sizing: border-box;
81-
cursor: all-scroll;
82-
font-size: 13px;
83-
line-height: 18px;
84-
height: 20px;
85-
z-index: 1;
86-
top: 4px;
87-
}
88-
89-
.monaco-list-type-filter.dragging {
90-
transition: top 0.2s, left 0.2s;
91-
}
92-
93-
.monaco-list-type-filter.ne {
94-
right: 4px;
95-
}
96-
97-
.monaco-list-type-filter.nw {
98-
left: 4px;
99-
}
100-
101-
.monaco-list-type-filter > .controls {
102-
display: flex;
103-
align-items: center;
104-
box-sizing: border-box;
105-
transition: width 0.2s;
106-
width: 0;
107-
}
108-
109-
.monaco-list-type-filter.dragging > .controls,
110-
.monaco-list-type-filter:hover > .controls {
111-
width: 36px;
112-
}
113-
114-
.monaco-list-type-filter > .controls > * {
115-
border: none;
116-
box-sizing: border-box;
117-
-webkit-appearance: none;
118-
-moz-appearance: none;
119-
background: none;
120-
width: 16px;
121-
height: 16px;
122-
flex-shrink: 0;
123-
margin: 0;
124-
padding: 0;
125-
display: flex;
126-
align-items: center;
127-
justify-content: center;
128-
cursor: pointer;
129-
}
130-
131-
.monaco-list-type-filter > .controls > .filter {
132-
margin-left: 4px;
133-
}
68+
/* Filter */
13469

13570
.monaco-list-type-filter-message {
13671
position: absolute;
@@ -149,13 +84,3 @@
14984
.monaco-list-type-filter-message:empty {
15085
display: none;
15186
}
152-
153-
/* Electron */
154-
155-
.monaco-list-type-filter {
156-
cursor: grab;
157-
}
158-
159-
.monaco-list-type-filter.dragging {
160-
cursor: grabbing;
161-
}

src/vs/base/browser/ui/list/listPaging.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { ScrollbarVisibility } from 'vs/base/common/scrollable';
1212
import { IThemable } from 'vs/base/common/styler';
1313
import 'vs/css!./list';
1414
import { IListContextMenuEvent, IListEvent, IListMouseEvent, IListRenderer, IListVirtualDelegate } from './list';
15-
import { IListAccessibilityProvider, IListOptions, IListOptionsUpdate, IListStyles, List } from './listWidget';
15+
import { IListAccessibilityProvider, IListOptions, IListOptionsUpdate, IListStyles, List, TypeNavigationMode } from './listWidget';
1616

1717
export interface IPagedRenderer<TElement, TTemplateData> extends IListRenderer<TElement, TTemplateData> {
1818
renderPlaceholder(index: number, templateData: TTemplateData): void;
@@ -95,8 +95,8 @@ class PagedAccessibilityProvider<T> implements IListAccessibilityProvider<number
9595
}
9696

9797
export interface IPagedListOptions<T> {
98-
readonly enableKeyboardNavigation?: boolean;
99-
readonly automaticKeyboardNavigation?: boolean;
98+
readonly typeNavigationEnabled?: boolean;
99+
readonly typeNavigationMode?: TypeNavigationMode;
100100
readonly ariaLabel?: string;
101101
readonly keyboardSupport?: boolean;
102102
readonly multipleSelectionSupport?: boolean;
@@ -282,8 +282,8 @@ export class PagedList<T> implements IThemable, IDisposable {
282282
this.list.layout(height, width);
283283
}
284284

285-
toggleKeyboardNavigation(): void {
286-
this.list.toggleKeyboardNavigation();
285+
triggerTypeNavigation(): void {
286+
this.list.triggerTypeNavigation();
287287
}
288288

289289
reveal(index: number, relativeTop?: number): void {

0 commit comments

Comments
 (0)