Skip to content

Commit f82e52b

Browse files
author
colin-grant-work
authored
Check renderer schema when updating preference renderers (#12347)
1 parent 6cd4223 commit f82e52b

File tree

6 files changed

+25
-27
lines changed

6 files changed

+25
-27
lines changed

packages/core/src/browser/icon-theme-service.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,11 @@ export class IconThemeService {
198198
const preference = this.schemaProvider.getSchemaProperty(ICON_THEME_PREFERENCE_KEY);
199199
if (preference) {
200200
const sortedThemes = Array.from(this.definitions).sort((a, b) => a.label.localeCompare(b.label));
201-
preference.enum = sortedThemes.map(e => e.id);
202-
preference.enumItemLabels = sortedThemes.map(e => e.label);
203-
this.schemaProvider.updateSchemaProperty(ICON_THEME_PREFERENCE_KEY, preference);
201+
this.schemaProvider.updateSchemaProperty(ICON_THEME_PREFERENCE_KEY, {
202+
...preference,
203+
enum: sortedThemes.map(e => e.id),
204+
enumItemLabels: sortedThemes.map(e => e.label)
205+
});
204206
}
205207
}
206208

packages/core/src/browser/preferences/preference-contribution.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,10 @@ export class PreferenceSchemaProvider extends PreferenceProvider {
360360
return this.combinedSchema.properties[key];
361361
}
362362

363+
/**
364+
* {@link property} will be assigned to field {@link key} in the schema.
365+
* Pass a new object to invalidate old schema.
366+
*/
363367
updateSchemaProperty(key: string, property: PreferenceDataProperty): void {
364368
this.updateSchemaProps(key, property);
365369
this.fireDidPreferenceSchemaChanged();

packages/core/src/browser/theming.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,11 @@ export class ThemeService {
9191
const preference = this.schemaProvider.getSchemaProperty(COLOR_THEME_PREFERENCE_KEY);
9292
if (preference) {
9393
const sortedThemes = this.getThemes().sort((a, b) => a.label.localeCompare(b.label));
94-
preference.enum = sortedThemes.map(e => e.id);
95-
preference.enumItemLabels = sortedThemes.map(e => e.label);
96-
this.schemaProvider.updateSchemaProperty(COLOR_THEME_PREFERENCE_KEY, preference);
94+
this.schemaProvider.updateSchemaProperty(COLOR_THEME_PREFERENCE_KEY, {
95+
...preference,
96+
enum: sortedThemes.map(e => e.id),
97+
enumItemLabels: sortedThemes.map(e => e.label)
98+
});
9799
}
98100
}
99101

packages/preferences/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"@theia/userstorage": "1.35.0",
1212
"@theia/workspace": "1.35.0",
1313
"async-mutex": "^0.3.1",
14+
"fast-deep-equal": "^3.1.3",
1415
"jsonc-parser": "^2.2.0",
1516
"p-debounce": "^2.1.0"
1617
},

packages/preferences/src/browser/views/components/preference-node-renderer.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import { injectable, inject, postConstruct } from '@theia/core/shared/inversify';
1818
import {
1919
PreferenceService, ContextMenuRenderer, PreferenceInspection,
20-
PreferenceScope, PreferenceProvider, codicon, OpenerService, open
20+
PreferenceScope, PreferenceProvider, codicon, OpenerService, open, PreferenceDataProperty
2121
} from '@theia/core/lib/browser';
2222
import { Preference, PreferenceMenus } from '../../util/preference-types';
2323
import { PreferenceTreeLabelProvider } from '../../util/preference-tree-label-provider';
@@ -39,6 +39,7 @@ export const SUBHEADER_CLASS = 'settings-section-subcategory-title';
3939
export interface GeneralPreferenceNodeRenderer extends Disposable {
4040
node: HTMLElement;
4141
id: string;
42+
schema?: PreferenceDataProperty;
4243
group: string;
4344
nodeId: string;
4445
visible: boolean;
@@ -170,6 +171,10 @@ export abstract class PreferenceLeafNodeRenderer<ValueType extends JSONValue, In
170171
protected isModifiedFromDefault = false;
171172
protected markdownRenderer: markdownit;
172173

174+
get schema(): PreferenceDataProperty {
175+
return this.preferenceNode.preference.data;
176+
}
177+
173178
@postConstruct()
174179
protected override init(): void {
175180
this.setId();

packages/preferences/src/browser/views/preference-editor-widget.ts

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
/* eslint-disable @typescript-eslint/no-explicit-any */
1818
import { postConstruct, injectable, inject } from '@theia/core/shared/inversify';
1919
import throttle = require('@theia/core/shared/lodash.throttle');
20+
import * as deepEqual from 'fast-deep-equal';
2021
import {
2122
PreferenceService,
2223
CompositeTreeNode,
@@ -35,7 +36,6 @@ import { Preference } from '../util/preference-types';
3536
import { COMMONLY_USED_SECTION_PREFIX } from '../util/preference-tree-generator';
3637
import { PreferencesScopeTabBar } from './preference-scope-tabbar-widget';
3738
import { PreferenceNodeRendererCreatorRegistry } from './components/preference-node-renderer-creator';
38-
import stableJsonStringify = require('fast-json-stable-stringify');
3939

4040
export interface PreferencesEditorState {
4141
firstVisibleChildID: string,
@@ -127,7 +127,7 @@ export class PreferencesEditorWidget extends BaseWidget implements StatefulWidge
127127
protected handleSchemaChange(isFiltered: boolean): void {
128128
for (const [id, renderer, collection] of this.allRenderers()) {
129129
const node = this.model.getNode(renderer.nodeId);
130-
if (!node || (Preference.LeafNode.is(node) && this.hasSchemaChanged(node))) {
130+
if (!node || (Preference.LeafNode.is(node) && this.hasSchemaChanged(renderer, node))) {
131131
renderer.dispose();
132132
collection.delete(id);
133133
}
@@ -143,9 +143,6 @@ export class PreferencesEditorWidget extends BaseWidget implements StatefulWidge
143143
this.hideIfFailsFilters(renderer, isFiltered);
144144
collection.set(id, renderer);
145145
}
146-
if (!this.preferenceDataKeys.has(node.id) && Preference.LeafNode.is(node)) {
147-
this.setSchemaPropertyKey(node);
148-
}
149146
if (nextNode !== renderer.node) {
150147
if (nextNode) {
151148
renderer.insertBefore(nextNode);
@@ -169,21 +166,8 @@ export class PreferencesEditorWidget extends BaseWidget implements StatefulWidge
169166
}
170167
}
171168

172-
protected hasSchemaChanged(leafNode: Preference.LeafNode): boolean {
173-
const oldKey = this.preferenceDataKeys.get(leafNode.id);
174-
const newKey = this.setSchemaPropertyKey(leafNode);
175-
return oldKey !== newKey;
176-
}
177-
178-
protected setSchemaPropertyKey(leafNode: Preference.LeafNode): string | undefined {
179-
const schemaProperty = this.schemaProvider.getSchemaProperty(leafNode.preferenceId);
180-
if (schemaProperty) {
181-
const key = stableJsonStringify(schemaProperty);
182-
this.preferenceDataKeys.set(leafNode.id, key);
183-
return key;
184-
} else {
185-
return undefined;
186-
}
169+
protected hasSchemaChanged(renderer: GeneralPreferenceNodeRenderer, node: Preference.LeafNode): boolean {
170+
return !deepEqual(renderer.schema, node.preference.data);
187171
}
188172

189173
protected handleSearchChange(isFiltered: boolean, leavesAreVisible: boolean): void {

0 commit comments

Comments
 (0)