diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 9aa6aff5ea78f78c78799dadd5119e4e89542c5a..4b46a5d856cb67b3f5a2a0ad07f6bac262466dd3 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -64,6 +64,7 @@ const vscodeResources = [ 'out-build/paths.js', 'out-build/vs/**/*.{svg,png,html}', '!out-build/vs/code/browser/**/*.html', + '!out-build/vs/editor/standalone/**/*.svg', 'out-build/vs/base/common/performance.js', 'out-build/vs/base/node/languagePacks.js', 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}', diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index 4a4090f4c942ab2bde9f39f14526137757de18dc..1e72361f58f00fc8649a7fd1563e7a7788c7ebf3 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -224,23 +224,23 @@ export class ExtensionEditor extends BaseEditor { builtin.textContent = localize('builtin', "Built-in"); const subtitle = append(details, $('.subtitle')); - const publisher = append(subtitle, $('span.publisher.clickable', { title: localize('publisher', "Publisher name"), tabIndex: 0 })); + const publisher = append(append(subtitle, $('.subtitle-entry')), $('span.publisher.clickable', { title: localize('publisher', "Publisher name"), tabIndex: 0 })); - const installCount = append(subtitle, $('span.install', { title: localize('install count', "Install count"), tabIndex: 0 })); + const installCount = append(append(subtitle, $('.subtitle-entry')), $('span.install', { title: localize('install count', "Install count"), tabIndex: 0 })); - const rating = append(subtitle, $('span.rating.clickable', { title: localize('rating', "Rating"), tabIndex: 0 })); + const rating = append(append(subtitle, $('.subtitle-entry')), $('span.rating.clickable', { title: localize('rating', "Rating"), tabIndex: 0 })); - const repository = append(subtitle, $('span.repository.clickable')); + const repository = append(append(subtitle, $('.subtitle-entry')), $('span.repository.clickable')); repository.textContent = localize('repository', 'Repository'); repository.style.display = 'none'; repository.tabIndex = 0; - const license = append(subtitle, $('span.license.clickable')); + const license = append(append(subtitle, $('.subtitle-entry')), $('span.license.clickable')); license.textContent = localize('license', 'License'); license.style.display = 'none'; license.tabIndex = 0; - const version = append(subtitle, $('span.version')); + const version = append(append(subtitle, $('.subtitle-entry')), $('span.version')); version.textContent = localize('version', 'Version'); const description = append(details, $('.description')); diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css b/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css index a6293c6dda0fd3a07010d36703ab6df07b000a26..3270a34f18ed8bc46b07cba5e04313b9ce81d67c 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionEditor.css @@ -113,7 +113,7 @@ line-height: 20px; } -.extension-editor > .header > .details > .subtitle > .publisher { +.extension-editor > .header > .details > .subtitle .publisher { font-size: 18px; } @@ -124,12 +124,11 @@ align-items: center; } -.extension-editor > .header > .details > .subtitle > .install > .count { +.extension-editor > .header > .details > .subtitle .install > .count { margin-left: 6px; } -.extension-editor > .header > .details > .subtitle > span:not(:first-child):not(:empty), -.extension-editor > .header > .details > .subtitle > a:not(:first-child):not(:empty) { +.extension-editor > .header > .details > .subtitle > div:not(:first-child):not(:empty) { border-left: 1px solid rgba(128, 128, 128, 0.7); margin-left: 14px; padding-left: 14px; diff --git a/src/vs/workbench/contrib/views/browser/treeView.ts b/src/vs/workbench/contrib/views/browser/treeView.ts index a9626ba711c27a7f8445d94527be5e7e4b9b5596..10e0efdbfa14ae4827cae389f345811f0748d6ab 100644 --- a/src/vs/workbench/contrib/views/browser/treeView.ts +++ b/src/vs/workbench/contrib/views/browser/treeView.ts @@ -38,7 +38,7 @@ import { FuzzyScore, createMatches } from 'vs/base/common/filters'; import { CollapseAllAction } from 'vs/base/browser/ui/tree/treeDefaults'; import { isFalsyOrWhitespace } from 'vs/base/common/strings'; import { SIDE_BAR_BACKGROUND, PANEL_BACKGROUND } from 'vs/workbench/common/theme'; -import { IHoverService } from 'vs/workbench/services/hover/browser/hover'; +import { IHoverService, IHoverOptions } from 'vs/workbench/services/hover/browser/hover'; class Root implements ITreeItem { label = { label: 'root' }; @@ -795,6 +795,7 @@ class TreeRenderer extends Disposable implements ITreeRendererjson.parse(model.getValue()); + if (userKeybindingEntries.every(e => !this.areSame(e, entry))) { + this.applyEditsToBuffer(setProperty(model.getValue(), [-1], entry, { tabSize, insertSpaces, eol })[0], model); + } } } @@ -196,6 +201,26 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding return object; } + private areSame(a: IUserFriendlyKeybinding, b: IUserFriendlyKeybinding): boolean { + if (a.command !== b.command) { + return false; + } + if (a.key !== b.key) { + return false; + } + const whenA = ContextKeyExpr.deserialize(a.when); + const whenB = ContextKeyExpr.deserialize(b.when); + if ((whenA && !whenB) || (!whenA && whenB)) { + return false; + } + if (whenA && whenB && !whenA.equals(whenB)) { + return false; + } + if (!objects.equals(a.args, b.args)) { + return false; + } + return true; + } private applyEditsToBuffer(edit: Edit, model: ITextModel): void { const startPosition = model.getPositionAt(edit.offset); @@ -206,7 +231,6 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding model.pushEditOperations([new Selection(startPosition.lineNumber, startPosition.column, startPosition.lineNumber, startPosition.column)], [editOperation], () => []); } - private resolveModelReference(): Promise> { return this.fileService.exists(this.resource) .then(exists => { diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts index 0fd8abac93b5e14716e30155fd5d4692de742311..cd493c726b695e0cef2d359c5888f9870774ab84 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts @@ -220,6 +220,16 @@ suite('KeybindingsEditing', () => { .then(() => assert.deepEqual(getUserKeybindings(), expected)); }); + test('remove a default keybinding should not ad duplicate entries', async () => { + const expected: IUserFriendlyKeybinding[] = [{ key: 'alt+c', command: '-a' }]; + await testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'a', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } } })); + await testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'a', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } } })); + await testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'a', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } } })); + await testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'a', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } } })); + await testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'a', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } } })); + assert.deepEqual(getUserKeybindings(), expected); + }); + test('remove a user keybinding', () => { writeToKeybindingsFile({ key: 'alt+c', command: 'b' }); return testObject.removeKeybinding(aResolvedKeybindingItem({ command: 'b', firstPart: { keyCode: KeyCode.KEY_C, modifiers: { altKey: true } }, isDefault: false }))