提交 0abbd7e4 编写于 作者: R Rob Lourens

Settings editor - implement scroll on right based on left

上级 efef7903
......@@ -11,7 +11,6 @@ import { CancellationToken } from 'vs/base/common/cancellation';
import { Color } from 'vs/base/common/color';
import { getErrorMessage, isPromiseCanceledError } from 'vs/base/common/errors';
import { KeyCode } from 'vs/base/common/keyCodes';
import { escapeRegExpCharacters } from 'vs/base/common/strings';
import { TPromise } from 'vs/base/common/winjs.base';
import { ITree, ITreeConfiguration } from 'vs/base/parts/tree/browser/tree';
import { DefaultTreestyler } from 'vs/base/parts/tree/browser/treeDefaults';
......@@ -31,10 +30,10 @@ import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
import { EditorOptions, IEditor } from 'vs/workbench/common/editor';
import { SearchWidget, SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets';
import { tocData } from 'vs/workbench/parts/preferences/browser/settingsLayout';
import { ISettingsEditorViewState, SearchResultIdx, SearchResultModel, SettingsAccessibilityProvider, SettingsDataSource, SettingsRenderer, SettingsTreeController, SettingsTreeFilter, TreeElement, isTOCLeaf } from 'vs/workbench/parts/preferences/browser/settingsTree';
import { TOCDataSource, TOCRenderer } from 'vs/workbench/parts/preferences/browser/tocTree';
import { ISettingsEditorViewState, SearchResultIdx, SearchResultModel, SettingsAccessibilityProvider, SettingsDataSource, SettingsRenderer, SettingsTreeController, SettingsTreeElement, SettingsTreeFilter, SettingsTreeModel } from 'vs/workbench/parts/preferences/browser/settingsTree';
import { getTOCElement, TOCDataSource, TOCRenderer } from 'vs/workbench/parts/preferences/browser/tocTree';
import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, IPreferencesSearchService, ISearchProvider } from 'vs/workbench/parts/preferences/common/preferences';
import { IPreferencesService, ISearchResult, ISetting, ISettingsEditorModel } from 'vs/workbench/services/preferences/common/preferences';
import { IPreferencesService, ISearchResult, ISettingsEditorModel } from 'vs/workbench/services/preferences/common/preferences';
import { SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput';
import { DefaultSettingsEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels';
......@@ -56,10 +55,10 @@ export class SettingsEditor2 extends BaseEditor {
private settingsTreeContainer: HTMLElement;
private settingsTree: WorkbenchTree;
private treeDataSource: SettingsDataSource;
private settingsTreeModel: SettingsTreeModel;
private tocTreeContainer: HTMLElement;
private tocTree: WorkbenchTree;
private resolvedTocData: IResolvedTOCEntry;
private delayedFilterLogging: Delayer<void>;
private localSearchDelayer: Delayer<void>;
......@@ -69,7 +68,7 @@ export class SettingsEditor2 extends BaseEditor {
private settingUpdateDelayer: Delayer<void>;
private pendingSettingUpdate: { key: string, value: any };
private selectedElement: TreeElement;
private selectedElement: SettingsTreeElement;
private viewState: ISettingsEditorViewState;
private searchResultModel: SearchResultModel;
......@@ -240,7 +239,8 @@ export class SettingsEditor2 extends BaseEditor {
});
this._register(this.tocTree.onDidChangeSelection(e => {
this.settingsTree.reveal(e.selection[0], .1);
const element = this.settingsTreeModel.getElementById(e.selection[0] && e.selection[0].id);
this.settingsTree.reveal(element, 0);
}));
}
......@@ -445,12 +445,12 @@ export class SettingsEditor2 extends BaseEditor {
this.defaultSettingsEditorModel = model;
// if (!this.settingsTree.getInput()) {
this.resolvedTocData = resolveSettingsTree(tocData, this.defaultSettingsEditorModel);
this.tocTree.setInput(this.resolvedTocData);
this.settingsTree.setInput(this.resolvedTocData);
this.tocTree.setInput(getTOCElement(tocData));
this.expandAll(this.settingsTree);
this.expandAll(this.tocTree);
this.settingsTreeModel = this.instantiationService.createInstance(SettingsTreeModel, this.viewState, tocData, this.defaultSettingsEditorModel.settingsGroups.slice(1));
this.settingsTree.setInput(this.settingsTreeModel.root);
this.expandAll(this.settingsTree);
this.expandAll(this.tocTree);
// }
});
}
......@@ -505,7 +505,7 @@ export class SettingsEditor2 extends BaseEditor {
}
this.searchResultModel = null;
this.settingsTree.setInput(this.resolvedTocData);
this.settingsTree.setInput(this.settingsTreeModel.root);
this.expandAll(this.settingsTree);
this.expandAll(this.tocTree);
......@@ -634,75 +634,3 @@ export class SettingsEditor2 extends BaseEditor {
this.tocTree.layout(listHeight, 200);
}
}
export interface ITOCEntry<T> {
id: string;
label: string;
}
export interface ITOCGroupEntry<T> extends ITOCEntry<T> {
children?: ITOCEntry<T>[];
}
export interface ITOCLeafEntry<T> extends ITOCEntry<T> {
settings?: T[];
}
export type IRawTOCEntry = ITOCGroupEntry<string> | ITOCLeafEntry<string>;
export type IResolvedTOCEntry = ITOCGroupEntry<ISetting> | ITOCLeafEntry<ISetting>;
function resolveSettingsTree(tocData: IRawTOCEntry, defaultSettings: DefaultSettingsEditorModel): IResolvedTOCEntry {
return _resolveSettingsTree(tocData, getAllSettings(defaultSettings));
}
function _resolveSettingsTree(tocData: IRawTOCEntry, allSettings: Set<ISetting>): IResolvedTOCEntry {
if (isTOCLeaf(tocData)) {
return <IResolvedTOCEntry>{
id: tocData.id,
label: tocData.label,
settings: arrays.flatten(tocData.settings.map(pattern => getMatchingSettings(allSettings, pattern)))
};
} else {
return <IResolvedTOCEntry>{
id: tocData.id,
label: tocData.label,
children: tocData.children.map(child => _resolveSettingsTree(child, allSettings))
};
}
}
function getMatchingSettings(allSettings: Set<ISetting>, pattern: string): ISetting[] {
const result: ISetting[] = [];
allSettings.forEach(s => {
if (settingMatches(s, pattern)) {
result.push(s);
allSettings.delete(s);
}
});
return result.sort((a, b) => a.key.localeCompare(b.key));
}
function settingMatches(s: ISetting, pattern: string): boolean {
pattern = escapeRegExpCharacters(pattern)
.replace(/\\\*/g, '.*');
const regexp = new RegExp(`^${pattern}`, 'i');
return regexp.test(s.key);
}
function getAllSettings(defaultSettings: DefaultSettingsEditorModel) {
const result: Set<ISetting> = new Set();
for (let group of defaultSettings.settingsGroups.slice(1)) {
for (let section of group.sections) {
for (let s of section.settings) {
result.add(s);
}
}
}
return result;
}
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IRawTOCEntry } from 'vs/workbench/parts/preferences/browser/settingsEditor2';
import { ITOCEntry } from 'vs/workbench/parts/preferences/browser/tocTree';
export const tocData: IRawTOCEntry = {
id: 'root',
label: 'root',
children: [
export const tocData: ITOCEntry = {
id: 'root',
label: 'root',
children: [
{
id: 'editor',
label: 'Text Editor',
children: [
{
id: 'editor.cursor',
label: 'Cursor',
settings: ['editor.cursor*']
},
{
id: 'editor.find',
label: 'Find',
settings: ['editor.find.*']
},
{
id: 'editor.font',
label: 'Font',
settings: ['editor.font*']
},
{
id: 'editor.format',
label: 'Format',
settings: ['editor.format*']
},
{
id: 'editor.diff',
label: 'Diff Editor',
settings: ['diffEditor.*']
},
{
id: 'editor.minimap',
label: 'Minimap',
settings: ['editor.minimap.*']
},
{
id: 'editor.suggestions',
label: 'Suggestions',
settings: ['editor.*suggestion*']
},
{
id: 'editor.files',
label: 'Files',
settings: ['files.*']
},
{
id: 'editor.editor',
label: 'Editor',
settings: ['editor.*']
}
]
},
{
id: 'workbench',
label: 'Workbench',
children: [
{
id: 'workbench.appearance',
label: 'Appearance',
settings: ['workbench.activityBar.*', 'workbench.*color*', 'workbench.fontAliasing', 'workbench.iconTheme', 'workbench.sidebar.location', 'workbench.*.visible', 'workbench.tips.enabled', 'workbench.tree.*', 'workbench.view.*']
},
{
id: 'workbench.editor',
label: 'Editor Management',
settings: ['workbench.editor.*']
},
{
id: 'workbench.zenmode',
label: 'Zen Mode',
settings: ['zenmode.*']
},
{
id: 'workbench.workbench',
label: 'Workbench',
settings: ['workbench.*']
}
]
},
{
id: 'window',
label: 'Window',
children: [
{
id: 'window.newWindow',
label: 'New Window',
settings: ['window.*newwindow*']
},
{
id: 'window.window',
label: 'Window',
settings: ['window.*']
}
]
},
{
id: 'features',
label: 'Features',
children: [
{
id: 'features.explorer',
label: 'File Explorer',
settings: ['explorer.*', 'outline.*']
},
{
id: 'features.search',
label: 'Search',
settings: ['search.*']
}
,
{
id: 'features.debug',
label: 'Debug',
settings: ['debug.*', 'launch']
},
{
id: 'features.scm',
label: 'Source Control Management',
settings: ['scm.*']
},
{
id: 'features.extensions',
label: 'Extension Viewlet',
settings: ['extensions.*']
},
{
id: 'features.terminal',
label: 'Terminal',
settings: ['terminal.*']
},
{
id: 'features.problems',
label: 'Problems',
settings: ['problems.*']
}
]
},
{
id: 'application',
label: 'Application',
children: [
{
id: 'application.http',
label: 'Proxy',
settings: ['http.*']
},
{
id: 'application.keyboard',
label: 'Keyboard',
settings: ['keyboard.*']
},
{
id: 'application.update',
label: 'Update',
settings: ['update.*']
},
{
id: 'application.telemetry',
label: 'Telemetry',
settings: ['telemetry.*']
}
]
},
{
id: 'extensions',
label: 'Extensions',
settings: ['*']
}
]
id: 'editor',
label: 'Text Editor',
children: [
{
id: 'editor/cursor',
label: 'Cursor',
settings: ['editor.cursor*']
},
{
id: 'editor/find',
label: 'Find',
settings: ['editor.find.*']
},
{
id: 'editor/font',
label: 'Font',
settings: ['editor.font*']
},
{
id: 'editor/format',
label: 'Format',
settings: ['editor.format*']
},
{
id: 'editor/diff',
label: 'Diff Editor',
settings: ['diffEditor.*']
},
{
id: 'editor/minimap',
label: 'Minimap',
settings: ['editor.minimap.*']
},
{
id: 'editor/suggestions',
label: 'Suggestions',
settings: ['editor.*suggestion*']
},
{
id: 'editor/files',
label: 'Files',
settings: ['files.*']
},
{
id: 'editor/editor',
label: 'Editor',
settings: ['editor.*']
}
]
},
{
id: 'workbench',
label: 'Workbench',
children: [
{
id: 'workbench/appearance',
label: 'Appearance',
settings: ['workbench.activityBar.*', 'workbench.*color*', 'workbench.fontAliasing', 'workbench.iconTheme', 'workbench.sidebar.location', 'workbench.*.visible', 'workbench.tips.enabled', 'workbench.tree.*', 'workbench.view.*']
},
{
id: 'workbench/editor',
label: 'Editor Management',
settings: ['workbench.editor.*']
},
{
id: 'workbench/zenmode',
label: 'Zen Mode',
settings: ['zenmode.*']
},
{
id: 'workbench/workbench',
label: 'Workbench',
settings: ['workbench.*']
}
]
},
{
id: 'window',
label: 'Window',
children: [
{
id: 'window/newWindow',
label: 'New Window',
settings: ['window.*newwindow*']
},
{
id: 'window/window',
label: 'Window',
settings: ['window.*']
}
]
},
{
id: 'features',
label: 'Features',
children: [
{
id: 'features/explorer',
label: 'File Explorer',
settings: ['explorer.*', 'outline.*']
},
{
id: 'features/search',
label: 'Search',
settings: ['search.*']
}
,
{
id: 'features/debug',
label: 'Debug',
settings: ['debug.*', 'launch']
},
{
id: 'features/scm',
label: 'Source Control Management',
settings: ['scm.*']
},
{
id: 'features/extensions',
label: 'Extension Viewlet',
settings: ['extensions.*']
},
{
id: 'features/terminal',
label: 'Terminal',
settings: ['terminal.*']
},
{
id: 'features/problems',
label: 'Problems',
settings: ['problems.*']
}
]
},
{
id: 'application',
label: 'Application',
children: [
{
id: 'application/http',
label: 'Proxy',
settings: ['http.*']
},
{
id: 'application/keyboard',
label: 'Keyboard',
settings: ['keyboard.*']
},
{
id: 'application/update',
label: 'Update',
settings: ['update.*']
},
{
id: 'application/telemetry',
label: 'Telemetry',
settings: ['telemetry.*']
}
]
},
{
id: 'extensions',
label: 'Extensions',
settings: ['*']
}
]
};
......@@ -6,32 +6,53 @@
import * as DOM from 'vs/base/browser/dom';
import { TPromise } from 'vs/base/common/winjs.base';
import { IDataSource, IRenderer, ITree } from 'vs/base/parts/tree/browser/tree';
import { IResolvedTOCEntry, ITOCGroupEntry } from 'vs/workbench/parts/preferences/browser/settingsEditor2';
import { ISetting } from 'vs/workbench/services/preferences/common/preferences';
import { isTOCLeaf } from 'vs/workbench/parts/preferences/browser/settingsTree';
const $ = DOM.$;
// export interface ITOCRoot {
// id: string;
// children: ITOCEntry[];
// }
export interface ITOCEntry {
id: string;
label: string;
children?: ITOCEntry[];
settings?: (string | ISetting)[];
}
export class TOCElement {
id: string;
label: string;
parent?: TOCElement;
children?: TOCElement[];
}
export function getTOCElement(tocRoot: ITOCEntry, parent?: TOCElement): TOCElement {
const element = new TOCElement();
element.id = tocRoot.id;
element.label = tocRoot.label;
element.parent = parent;
if (tocRoot.children) {
element.children = tocRoot.children.map(child => getTOCElement(child, element));
}
return element;
}
export class TOCDataSource implements IDataSource {
getId(tree: ITree, element: IResolvedTOCEntry): string {
getId(tree: ITree, element: TOCElement): string {
return element.id;
}
hasChildren(tree: ITree, element: IResolvedTOCEntry): boolean {
return !isTOCLeaf(element) && element.children.length && typeof element.children[0] !== 'string';
hasChildren(tree: ITree, element: TOCElement): boolean {
return !!(element.children && element.children.length);
}
getChildren(tree: ITree, element: ITOCGroupEntry<ISetting>): TPromise<IResolvedTOCEntry[], any> {
return TPromise.as(<IResolvedTOCEntry[]>element.children);
getChildren(tree: ITree, element: TOCElement): TPromise<TOCElement[], any> {
return TPromise.as(<TOCElement[]>element.children);
}
getParent(tree: ITree, element: IResolvedTOCEntry): TPromise<any, any> {
return TPromise.wrap(null); // ??
getParent(tree: ITree, element: TOCElement): TPromise<any, any> {
return TPromise.wrap(element.parent);
}
}
......@@ -42,11 +63,11 @@ interface ITOCEntryTemplate {
}
export class TOCRenderer implements IRenderer {
getHeight(tree: ITree, element: IResolvedTOCEntry): number {
getHeight(tree: ITree, element: TOCElement): number {
return 22;
}
getTemplateId(tree: ITree, element: IResolvedTOCEntry): string {
getTemplateId(tree: ITree, element: TOCElement): string {
return TOC_ENTRY_TEMPLATE_ID;
}
......@@ -56,7 +77,7 @@ export class TOCRenderer implements IRenderer {
};
}
renderElement(tree: ITree, element: IResolvedTOCEntry, templateId: string, template: ITOCEntryTemplate): void {
renderElement(tree: ITree, element: TOCElement, templateId: string, template: ITOCEntryTemplate): void {
template.element.textContent = element.label;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册