提交 86b91953 编写于 作者: B Benjamin Pasero

quick access - clean up

上级 5d18ad4c
......@@ -1501,9 +1501,13 @@ export class List<T> implements ISpliceable<T>, IDisposable {
}
focusFirst(browserEvent?: UIEvent, filter?: (element: T) => boolean): void {
this.focusNth(0, browserEvent, filter);
}
focusNth(n: number, browserEvent?: UIEvent, filter?: (element: T) => boolean): void {
if (this.length === 0) { return; }
const index = this.findNextIndex(0, false, filter);
const index = this.findNextIndex(n, false, filter);
if (index > -1) {
this.setFocus([index], browserEvent);
......
......@@ -7,7 +7,7 @@ import 'vs/css!./media/quickInput';
import { IQuickPickItem, IPickOptions, IInputOptions, IQuickNavigateConfiguration, IQuickPick, IQuickInput, IQuickInputButton, IInputBox, IQuickPickItemButtonEvent, QuickPickInput, IQuickPickSeparator, IKeyMods, IQuickPickAcceptEvent, NO_KEY_MODS } from 'vs/base/parts/quickinput/common/quickInput';
import * as dom from 'vs/base/browser/dom';
import { CancellationToken } from 'vs/base/common/cancellation';
import { QuickInputList } from './quickInputList';
import { QuickInputList, QuickInputListFocus } from './quickInputList';
import { QuickInputBox } from './quickInputBox';
import { KeyCode } from 'vs/base/common/keyCodes';
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
......@@ -629,7 +629,7 @@ class QuickPick<T extends IQuickPickItem> extends QuickInput implements IQuickPi
private trySelectFirst() {
if (this.autoFocusOnList) {
if (!this.ui.isScreenReaderOptimized() && !this.canSelectMany) {
this.ui.list.focus('First');
this.ui.list.focus(QuickInputListFocus.First);
}
}
}
......@@ -656,7 +656,7 @@ class QuickPick<T extends IQuickPickItem> extends QuickInput implements IQuickPi
this.visibleDisposables.add(this.ui.inputBox.onKeyDown(event => {
switch (event.keyCode) {
case KeyCode.DownArrow:
this.ui.list.focus('Next');
this.ui.list.focus(QuickInputListFocus.Next);
if (this.canSelectMany) {
this.ui.list.domFocus();
}
......@@ -664,9 +664,9 @@ class QuickPick<T extends IQuickPickItem> extends QuickInput implements IQuickPi
break;
case KeyCode.UpArrow:
if (this.ui.list.getFocusedElements().length) {
this.ui.list.focus('Previous');
this.ui.list.focus(QuickInputListFocus.Previous);
} else {
this.ui.list.focus('Last');
this.ui.list.focus(QuickInputListFocus.Last);
}
if (this.canSelectMany) {
this.ui.list.domFocus();
......@@ -675,9 +675,9 @@ class QuickPick<T extends IQuickPickItem> extends QuickInput implements IQuickPi
break;
case KeyCode.PageDown:
if (this.ui.list.getFocusedElements().length) {
this.ui.list.focus('NextPage');
this.ui.list.focus(QuickInputListFocus.NextPage);
} else {
this.ui.list.focus('First');
this.ui.list.focus(QuickInputListFocus.First);
}
if (this.canSelectMany) {
this.ui.list.domFocus();
......@@ -686,9 +686,9 @@ class QuickPick<T extends IQuickPickItem> extends QuickInput implements IQuickPi
break;
case KeyCode.PageUp:
if (this.ui.list.getFocusedElements().length) {
this.ui.list.focus('PreviousPage');
this.ui.list.focus(QuickInputListFocus.PreviousPage);
} else {
this.ui.list.focus('Last');
this.ui.list.focus(QuickInputListFocus.Last);
}
if (this.canSelectMany) {
this.ui.list.domFocus();
......@@ -768,7 +768,7 @@ class QuickPick<T extends IQuickPickItem> extends QuickInput implements IQuickPi
private registerQuickNavigation() {
return dom.addDisposableListener(this.ui.container, dom.EventType.KEY_UP, e => {
if (this.canSelectMany || !this.quickNavigate) {
if (this.canSelectMany || !this._quickNavigate) {
return;
}
......@@ -776,7 +776,7 @@ class QuickPick<T extends IQuickPickItem> extends QuickInput implements IQuickPi
const keyCode = keyboardEvent.keyCode;
// Select element when keys are pressed that signal it
const quickNavKeys = this.quickNavigate.keybindings;
const quickNavKeys = this._quickNavigate.keybindings;
const wasTriggerKeyPressed = quickNavKeys.some(k => {
const [firstPart, chordPart] = k.getParts();
if (chordPart) {
......@@ -850,11 +850,12 @@ class QuickPick<T extends IQuickPickItem> extends QuickInput implements IQuickPi
this.ui.checkAll.checked = this.ui.list.getAllVisibleChecked();
this.ui.visibleCount.setCount(this.ui.list.getVisibleCount());
this.ui.count.setCount(this.ui.list.getCheckedCount());
this.trySelectFirst();
if (this._quickNavigate && previousItemCount === 0 && this.items.length > 1) {
// quick navigate: automatically focus the second entry
// so that upon release the item is picked directly
this.ui.list.focus('Next');
this.ui.list.focus(QuickInputListFocus.Second);
} else {
this.trySelectFirst();
}
}
if (this.ui.container.classList.contains('show-checkboxes') !== !!this.canSelectMany) {
......@@ -1544,7 +1545,7 @@ export class QuickInputController extends Disposable {
navigate(next: boolean, quickNavigate?: IQuickNavigateConfiguration) {
if (this.isDisplayed() && this.getUI().list.isDisplayed()) {
this.getUI().list.focus(next ? 'Next' : 'Previous');
this.getUI().list.focus(next ? QuickInputListFocus.Next : QuickInputListFocus.Previous);
if (quickNavigate && this.controller instanceof QuickPick) {
this.controller.quickNavigate = quickNavigate;
}
......
......@@ -222,6 +222,16 @@ class ListElementDelegate implements IListVirtualDelegate<ListElement> {
}
}
export enum QuickInputListFocus {
First = 1,
Second,
Last,
Next,
Previous,
NextPage,
PreviousPage
}
export class QuickInputList {
readonly id: string;
......@@ -474,18 +484,42 @@ export class QuickInputList {
this.list.getHTMLElement().style.pointerEvents = value ? null : 'none';
}
focus(what: 'First' | 'Last' | 'Next' | 'Previous' | 'NextPage' | 'PreviousPage'): void {
focus(what: QuickInputListFocus): void {
if (!this.list.length) {
return;
}
if ((what === 'Next' || what === 'NextPage') && this.list.getFocus()[0] === this.list.length - 1) {
what = 'First';
if ((what === QuickInputListFocus.Next || what === QuickInputListFocus.NextPage) && this.list.getFocus()[0] === this.list.length - 1) {
what = QuickInputListFocus.First;
}
if ((what === 'Previous' || what === 'PreviousPage') && this.list.getFocus()[0] === 0) {
what = 'Last';
if ((what === QuickInputListFocus.Previous || what === QuickInputListFocus.PreviousPage) && this.list.getFocus()[0] === 0) {
what = QuickInputListFocus.Last;
}
this.list['focus' + what as 'focusFirst' | 'focusLast' | 'focusNext' | 'focusPrevious' | 'focusNextPage' | 'focusPreviousPage']();
switch (what) {
case QuickInputListFocus.First:
this.list.focusFirst();
break;
case QuickInputListFocus.Second:
this.list.focusNth(1);
break;
case QuickInputListFocus.Last:
this.list.focusLast();
break;
case QuickInputListFocus.Next:
this.list.focusNext();
break;
case QuickInputListFocus.Previous:
this.list.focusPrevious();
break;
case QuickInputListFocus.NextPage:
this.list.focusNextPage();
break;
case QuickInputListFocus.PreviousPage:
this.list.focusPreviousPage();
break;
}
this.list.reveal(this.list.getFocus()[0]);
}
......
......@@ -8,10 +8,7 @@ import { IQuickAccessRegistry, Extensions } from 'vs/platform/quickinput/common/
import { Registry } from 'vs/platform/registry/common/platform';
import { HelpQuickAccessProvider } from 'vs/platform/quickinput/browser/helpQuickAccess';
import { ViewQuickAccessProvider } from 'vs/workbench/contrib/quickaccess/browser/viewQuickAccess';
import { QUICK_ACCESS_COMMAND_ID, quickAccessCommand } from 'vs/workbench/contrib/quickaccess/browser/quickAccessCommands';
import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions';
import { CommandsQuickAccessProvider } from 'vs/workbench/contrib/quickaccess/browser/commandsQuickAccess';
import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
const registry = Registry.as<IQuickAccessRegistry>(Extensions.Quickaccess);
......@@ -35,19 +32,3 @@ registry.registerQuickAccessProvider({
placeholder: localize('commandsQuickAccessPlaceholder', "Type the name of a command to run."),
helpEntries: [{ description: localize('commandsQuickAccess', "Show and Run Commands"), needsEditor: false }]
});
MenuRegistry.appendMenuItem(MenuId.CommandPalette, {
command: {
id: QUICK_ACCESS_COMMAND_ID, title: {
value: localize('openQuickAccess', "Open Quick Access"), original: 'Open Quick Access'
},
category: localize('quickAccess', "Quick Access")
}
});
KeybindingsRegistry.registerCommandAndKeybindingRule({
id: QUICK_ACCESS_COMMAND_ID,
weight: KeybindingWeight.WorkbenchContrib,
when: undefined,
handler: quickAccessCommand.handler
});
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput';
import { ICommand } from 'vs/platform/commands/common/commands';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
export const QUICK_ACCESS_COMMAND_ID = 'workbench.action.openQuickAccess';
export const quickAccessCommand: ICommand = {
id: QUICK_ACCESS_COMMAND_ID,
handler: async function (accessor: ServicesAccessor, prefix: string | null = null) {
const quickInputService = accessor.get(IQuickInputService);
quickInputService.quickAccess.show(typeof prefix === 'string' ? prefix : undefined);
},
description: {
description: `Quick access`,
args: [{
name: 'prefix',
schema: {
'type': 'string'
}
}]
}
};
......@@ -62,11 +62,13 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider<IAnyt
constructor(private readonly provider: AnythingQuickAccessProvider) { }
reset(): void {
reset(prepareForSearching: boolean): void {
// Caches
this.fileQueryCache = this.provider.createFileQueryCache();
this.scorerCache = Object.create(null);
if (prepareForSearching) {
this.fileQueryCache = this.provider.createFileQueryCache();
this.scorerCache = Object.create(null);
}
// Other
this.lastOriginalFilter = undefined;
......@@ -111,7 +113,7 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider<IAnyt
provide(picker: IQuickPick<IAnythingQuickPickItem>, token: CancellationToken): IDisposable {
// Reset the pick state for this run
this.pickState.reset();
this.pickState.reset(!picker.quickNavigate);
// Start picker
return super.provide(picker, token);
......@@ -223,7 +225,7 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider<IAnyt
private readonly labelOnlyEditorHistoryPickAccessor = new QuickPickItemScorerAccessor({ skipDescription: true });
protected getEditorHistoryPicks(query: IPreparedQuery): Array<IAnythingQuickPickItem> {
private getEditorHistoryPicks(query: IPreparedQuery): Array<IAnythingQuickPickItem> {
const configuration = this.configuration;
// Just return all history entries if not searching
......@@ -282,7 +284,7 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider<IAnyt
).load();
}
protected async getFilePicks(query: IPreparedQuery, excludes: ResourceMap<boolean>, token: CancellationToken): Promise<Array<IAnythingQuickPickItem>> {
private async getFilePicks(query: IPreparedQuery, excludes: ResourceMap<boolean>, token: CancellationToken): Promise<Array<IAnythingQuickPickItem>> {
if (!query.value) {
return [];
}
......@@ -444,7 +446,7 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider<IAnyt
private symbolsQuickAccess = this._register(this.instantiationService.createInstance(SymbolsQuickAccessProvider));
protected async getSymbolPicks(query: IPreparedQuery, token: CancellationToken): Promise<Array<IAnythingQuickPickItem>> {
private async getSymbolPicks(query: IPreparedQuery, token: CancellationToken): Promise<Array<IAnythingQuickPickItem>> {
const configuration = this.configuration;
if (
!query.value || // we need a value for search for
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册