diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index b8a8da107c0..7b7b91e4755 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -720,6 +720,11 @@ declare module 'vscode' { * An event signaling when the selection state changes. */ readonly onDidChangeSelection: Event; + + /** + * Whether the input box is hidden. + */ + hideInputBox: boolean; } //#endregion diff --git a/src/vs/workbench/api/electron-browser/mainThreadSCM.ts b/src/vs/workbench/api/electron-browser/mainThreadSCM.ts index b1e2f934120..9a06495036e 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSCM.ts @@ -119,6 +119,7 @@ class MainThreadSCMProvider implements ISCMProvider { get acceptInputCommand(): Command | undefined { return this.features.acceptInputCommand; } get statusBarCommands(): Command[] | undefined { return this.features.statusBarCommands; } get count(): number | undefined { return this.features.count; } + get hideInputBox(): boolean | undefined { return this.features.hideInputBox; } private _onDidChangeCommitTemplate = new Emitter(); get onDidChangeCommitTemplate(): Event { return this._onDidChangeCommitTemplate.event; } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index bb31f02ce45..4c27fb51882 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -535,6 +535,7 @@ export interface SCMProviderFeatures { commitTemplate?: string; acceptInputCommand?: modes.Command; statusBarCommands?: modes.Command[]; + hideInputBox?: boolean; } export interface SCMGroupFeatures { diff --git a/src/vs/workbench/api/node/extHostSCM.ts b/src/vs/workbench/api/node/extHostSCM.ts index e0bf0ca9a11..c98852392d3 100644 --- a/src/vs/workbench/api/node/extHostSCM.ts +++ b/src/vs/workbench/api/node/extHostSCM.ts @@ -439,6 +439,17 @@ class ExtHostSourceControl implements vscode.SourceControl { return this._selected; } + private _hideInputBox: boolean = false; + + get hideInputBox(): boolean { + return this._hideInputBox; + } + + set hideInputBox(hideInputBox: boolean | undefined) { + this._hideInputBox = hideInputBox; + this._proxy.$updateSourceControl(this.handle, { hideInputBox: !!hideInputBox }); + } + private _onDidChangeSelection = new Emitter(); readonly onDidChangeSelection = this._onDidChangeSelection.event; diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts index d2329cf192e..360940f0b3f 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts @@ -814,57 +814,59 @@ export class RepositoryPanel extends ViewletPanel { this.disposables.push(focusTracker); // Input - this.inputBoxContainer = append(container, $('.scm-editor')); + if (!this.repository.provider.hideInputBox) { + this.inputBoxContainer = append(container, $('.scm-editor')); - const updatePlaceholder = () => { - const binding = this.keybindingService.lookupKeybinding('scm.acceptInput'); - const label = binding ? binding.getLabel() : (platform.isMacintosh ? 'Cmd+Enter' : 'Ctrl+Enter'); - const placeholder = format(this.repository.input.placeholder, label); + const updatePlaceholder = () => { + const binding = this.keybindingService.lookupKeybinding('scm.acceptInput'); + const label = binding ? binding.getLabel() : (platform.isMacintosh ? 'Cmd+Enter' : 'Ctrl+Enter'); + const placeholder = format(this.repository.input.placeholder, label); - this.inputBox.setPlaceHolder(placeholder); - }; + this.inputBox.setPlaceHolder(placeholder); + }; - const validationDelayer = new ThrottledDelayer(200); - const validate = () => { - return this.repository.input.validateInput(this.inputBox.value, this.inputBox.inputElement.selectionStart).then(result => { - if (!result) { - this.inputBox.inputElement.removeAttribute('aria-invalid'); - this.inputBox.hideMessage(); - } else { - this.inputBox.inputElement.setAttribute('aria-invalid', 'true'); - this.inputBox.showMessage({ content: result.message, type: convertValidationType(result.type) }); - } - }); - }; + const validationDelayer = new ThrottledDelayer(200); + const validate = () => { + return this.repository.input.validateInput(this.inputBox.value, this.inputBox.inputElement.selectionStart).then(result => { + if (!result) { + this.inputBox.inputElement.removeAttribute('aria-invalid'); + this.inputBox.hideMessage(); + } else { + this.inputBox.inputElement.setAttribute('aria-invalid', 'true'); + this.inputBox.showMessage({ content: result.message, type: convertValidationType(result.type) }); + } + }); + }; - const triggerValidation = () => validationDelayer.trigger(validate); + const triggerValidation = () => validationDelayer.trigger(validate); - this.inputBox = new InputBox(this.inputBoxContainer, this.contextViewService, { flexibleHeight: true }); - this.disposables.push(attachInputBoxStyler(this.inputBox, this.themeService)); - this.disposables.push(this.inputBox); + this.inputBox = new InputBox(this.inputBoxContainer, this.contextViewService, { flexibleHeight: true }); + this.disposables.push(attachInputBoxStyler(this.inputBox, this.themeService)); + this.disposables.push(this.inputBox); - this.inputBox.onDidChange(triggerValidation, null, this.disposables); + this.inputBox.onDidChange(triggerValidation, null, this.disposables); - const onKeyUp = domEvent(this.inputBox.inputElement, 'keyup'); - const onMouseUp = domEvent(this.inputBox.inputElement, 'mouseup'); - anyEvent(onKeyUp, onMouseUp)(triggerValidation, null, this.disposables); + const onKeyUp = domEvent(this.inputBox.inputElement, 'keyup'); + const onMouseUp = domEvent(this.inputBox.inputElement, 'mouseup'); + anyEvent(onKeyUp, onMouseUp)(triggerValidation, null, this.disposables); - this.inputBox.value = this.repository.input.value; - this.inputBox.onDidChange(value => this.repository.input.value = value, null, this.disposables); - this.repository.input.onDidChange(value => this.inputBox.value = value, null, this.disposables); + this.inputBox.value = this.repository.input.value; + this.inputBox.onDidChange(value => this.repository.input.value = value, null, this.disposables); + this.repository.input.onDidChange(value => this.inputBox.value = value, null, this.disposables); - updatePlaceholder(); - this.repository.input.onDidChangePlaceholder(updatePlaceholder, null, this.disposables); - this.keybindingService.onDidUpdateKeybindings(updatePlaceholder, null, this.disposables); + updatePlaceholder(); + this.repository.input.onDidChangePlaceholder(updatePlaceholder, null, this.disposables); + this.keybindingService.onDidUpdateKeybindings(updatePlaceholder, null, this.disposables); - this.disposables.push(this.inputBox.onDidHeightChange(() => this.layoutBody())); + this.disposables.push(this.inputBox.onDidHeightChange(() => this.layoutBody())); - if (this.repository.provider.onDidChangeCommitTemplate) { - this.repository.provider.onDidChangeCommitTemplate(this.updateInputBox, this, this.disposables); + if (this.repository.provider.onDidChangeCommitTemplate) { + this.repository.provider.onDidChangeCommitTemplate(this.updateInputBox, this, this.disposables); + } + + this.updateInputBox(); } - this.updateInputBox(); - // List this.listContainer = append(container, $('.scm-status.show-file-icons')); @@ -918,20 +920,24 @@ export class RepositoryPanel extends ViewletPanel { } this.cachedHeight = height; - this.inputBox.layout(); + if (this.inputBox) { + this.inputBox.layout(); + } - const editorHeight = this.inputBox.height; - const listHeight = height - (editorHeight + 12 /* margin */); + const editorHeight = this.inputBox ? this.inputBox.height : 0; + const listHeight = height - (editorHeight + (editorHeight ? 12 : 0) /* margin */); this.listContainer.style.height = `${listHeight}px`; this.list.layout(listHeight); - toggleClass(this.inputBoxContainer, 'scroll', editorHeight >= 134); + if (this.inputBoxContainer) { + toggleClass(this.inputBoxContainer, 'scroll', editorHeight >= 134); + } } focus(): void { super.focus(); - if (this.isExpanded()) { + if (this.isExpanded() && this.inputBox) { this.inputBox.focus(); } } @@ -991,7 +997,7 @@ export class RepositoryPanel extends ViewletPanel { } private updateInputBox(): void { - if (typeof this.repository.provider.commitTemplate === 'undefined' || this.inputBox.value) { + if (typeof this.repository.provider.commitTemplate === 'undefined' || !this.inputBox || this.inputBox.value) { return; } diff --git a/src/vs/workbench/services/scm/common/scm.ts b/src/vs/workbench/services/scm/common/scm.ts index b359fd41ff2..54427b69fcb 100644 --- a/src/vs/workbench/services/scm/common/scm.ts +++ b/src/vs/workbench/services/scm/common/scm.ts @@ -63,6 +63,8 @@ export interface ISCMProvider extends IDisposable { readonly statusBarCommands?: Command[]; readonly onDidChange: Event; + readonly hideInputBox?: boolean | undefined; + getOriginalResource(uri: URI): TPromise; }