提交 8539f481 编写于 作者: R Rob Lourens

Fix #57506 - when setting link is clicked, reveal setting at same position as the clicked setting

上级 07280158
......@@ -38,7 +38,7 @@ import { attachSuggestEnabledInputBoxStyler, SuggestEnabledInput } from 'vs/work
import { PreferencesEditor } from 'vs/workbench/parts/preferences/browser/preferencesEditor';
import { SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets';
import { commonlyUsedData, tocData } from 'vs/workbench/parts/preferences/browser/settingsLayout';
import { resolveExtensionsSettings, resolveSettingsTree, SettingsDataSource, SettingsRenderer, SettingsTree, SimplePagedDataSource } from 'vs/workbench/parts/preferences/browser/settingsTree';
import { resolveExtensionsSettings, resolveSettingsTree, SettingsDataSource, SettingsRenderer, SettingsTree, SimplePagedDataSource, ISettingLinkClickEvent } from 'vs/workbench/parts/preferences/browser/settingsTree';
import { countSettingGroupChildrenWithPredicate, ISettingsEditorViewState, MODIFIED_SETTING_TAG, ONLINE_SERVICES_SETTING_TAG, parseQuery, SearchResultIdx, SearchResultModel, SettingsTreeGroupElement, SettingsTreeModel, SettingsTreeSettingElement } from 'vs/workbench/parts/preferences/browser/settingsTreeModels';
import { settingsTextInputBorder } from 'vs/workbench/parts/preferences/browser/settingsWidgets';
import { TOCRenderer, TOCTree, TOCTreeModel } from 'vs/workbench/parts/preferences/browser/tocTree';
......@@ -330,12 +330,13 @@ export class SettingsEditor2 extends BaseEditor {
this.toolbar.context = <ISettingsToolbarContext>{ target: this.settingsTargetsWidget.settingsTarget };
}
private revealSettingByKey(settingKey: string): void {
const elements = this.currentSettingsModel.getElementsByName(settingKey);
private onDidClickSetting(evt: ISettingLinkClickEvent): void {
const elements = this.currentSettingsModel.getElementsByName(evt.targetKey);
if (elements && elements[0]) {
this.settingsTree.reveal(elements[0]);
const sourceTop = this.settingsTree.getRelativeTop(evt.source);
this.settingsTree.reveal(elements[0], sourceTop);
const domElements = this.settingsTreeRenderer.getDOMElementsForSettingKey(this.settingsTree.getHTMLElement(), settingKey);
const domElements = this.settingsTreeRenderer.getDOMElementsForSettingKey(this.settingsTree.getHTMLElement(), evt.targetKey);
if (domElements && domElements[0]) {
const control = domElements[0].querySelector(SettingsRenderer.CONTROL_SELECTOR);
if (control) {
......@@ -470,7 +471,7 @@ export class SettingsEditor2 extends BaseEditor {
}
});
}));
this._register(this.settingsTreeRenderer.onDidClickSettingLink(settingName => this.revealSettingByKey(settingName)));
this._register(this.settingsTreeRenderer.onDidClickSettingLink(settingName => this.onDidClickSetting(settingName)));
this._register(this.settingsTreeRenderer.onDidFocusSetting(element => {
this.settingsTree.reveal(element);
}));
......
......@@ -331,6 +331,11 @@ export interface ISettingChangeEvent {
value: any; // undefined => reset/unconfigure
}
export interface ISettingLinkClickEvent {
source: SettingsTreeSettingElement;
targetKey: string;
}
export class SettingsRenderer implements ITreeRenderer {
public static readonly CONTROL_CLASS = 'setting-control-focus-target';
......@@ -344,8 +349,8 @@ export class SettingsRenderer implements ITreeRenderer {
private readonly _onDidOpenSettings: Emitter<string> = new Emitter<string>();
public readonly onDidOpenSettings: Event<string> = this._onDidOpenSettings.event;
private readonly _onDidClickSettingLink: Emitter<string> = new Emitter<string>();
public readonly onDidClickSettingLink: Event<string> = this._onDidClickSettingLink.event;
private readonly _onDidClickSettingLink: Emitter<ISettingLinkClickEvent> = new Emitter<ISettingLinkClickEvent>();
public readonly onDidClickSettingLink: Event<ISettingLinkClickEvent> = this._onDidClickSettingLink.event;
private readonly _onDidFocusSetting: Emitter<SettingsTreeSettingElement> = new Emitter<SettingsTreeSettingElement>();
public readonly onDidFocusSetting: Event<SettingsTreeSettingElement> = this._onDidFocusSetting.event;
......@@ -1019,7 +1024,7 @@ export class SettingsRenderer implements ITreeRenderer {
this.renderValue(element, templateId, <ISettingItemTemplate>template);
template.descriptionElement.innerHTML = '';
if (element.setting.descriptionIsMarkdown) {
const renderedDescription = this.renderDescriptionMarkdown(element.description, template.toDispose);
const renderedDescription = this.renderDescriptionMarkdown(element, element.description, template.toDispose);
template.descriptionElement.appendChild(renderedDescription);
} else {
template.descriptionElement.innerText = element.description;
......@@ -1050,7 +1055,7 @@ export class SettingsRenderer implements ITreeRenderer {
template.containerElement.parentElement.removeAttribute('aria-setsize');
}
private renderDescriptionMarkdown(text: string, disposeables: IDisposable[]): HTMLElement {
private renderDescriptionMarkdown(element: SettingsTreeSettingElement, text: string, disposeables: IDisposable[]): HTMLElement {
// Rewrite `#editor.fontSize#` to link format
text = fixSettingLinks(text);
......@@ -1058,7 +1063,11 @@ export class SettingsRenderer implements ITreeRenderer {
actionHandler: {
callback: (content: string) => {
if (startsWith(content, '#')) {
this._onDidClickSettingLink.fire(content.substr(1));
const e: ISettingLinkClickEvent = {
source: element,
targetKey: content.substr(1)
};
this._onDidClickSettingLink.fire(e);
} else {
this.openerService.open(URI.parse(content)).then(void 0, onUnexpectedError);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册