From 1d4c7fa5b7412c1e444865ae84927b662c9c7402 Mon Sep 17 00:00:00 2001 From: SteVen Batten Date: Fri, 22 Mar 2019 15:45:29 -0700 Subject: [PATCH] some dialog fixes --- src/vs/base/browser/ui/dialog/dialog.ts | 36 ++++++++++++------- .../dialogs/electron-browser/dialogService.ts | 36 +++++++++++++++++++ 2 files changed, 60 insertions(+), 12 deletions(-) diff --git a/src/vs/base/browser/ui/dialog/dialog.ts b/src/vs/base/browser/ui/dialog/dialog.ts index e6d7ea77819..61311f4aedd 100644 --- a/src/vs/base/browser/ui/dialog/dialog.ts +++ b/src/vs/base/browser/ui/dialog/dialog.ts @@ -35,6 +35,7 @@ export class Dialog extends Disposable { private iconElement: HTMLElement | undefined; private toolbarContainer: HTMLElement | undefined; private buttonGroup: ButtonGroup | undefined; + private styles: IDialogStyles | undefined; constructor(private container: HTMLElement, private message: string, private buttons: string[], private options: IDialogOptions) { super(); @@ -93,11 +94,11 @@ export class Dialog extends Disposable { } if (this.buttonGroup) { - if ((evt.shiftKey && evt.equals(KeyCode.Tab)) || evt.equals(KeyCode.RightArrow)) { + if ((evt.shiftKey && evt.equals(KeyCode.Tab)) || evt.equals(KeyCode.LeftArrow)) { focusedButton = focusedButton + this.buttonGroup.buttons.length - 1; focusedButton = focusedButton % this.buttonGroup.buttons.length; this.buttonGroup.buttons[focusedButton].focus(); - } else if (evt.equals(KeyCode.Tab) || evt.equals(KeyCode.LeftArrow)) { + } else if (evt.equals(KeyCode.Tab) || evt.equals(KeyCode.RightArrow)) { focusedButton++; focusedButton = focusedButton % this.buttonGroup.buttons.length; this.buttonGroup.buttons[focusedButton].focus(); @@ -142,6 +143,8 @@ export class Dialog extends Disposable { actionBar.push(action, { icon: true, label: false, }); + this.applyStyles(); + show(this.element); // Focus first element @@ -149,22 +152,31 @@ export class Dialog extends Disposable { }); } - style(style: IDialogStyles): void { - const fgColor = style.dialogForeground ? `${style.dialogForeground}` : null; - const bgColor = style.dialogBackground ? `${style.dialogBackground}` : null; - const shadowColor = style.dialogShadow ? `0 0px 8px ${style.dialogShadow}` : null; + private applyStyles() { + if (this.styles) { + const style = this.styles; - if (this.element) { - this.element.style.color = fgColor; - this.element.style.backgroundColor = bgColor; - this.element.style.boxShadow = shadowColor; + const fgColor = style.dialogForeground ? `${style.dialogForeground}` : null; + const bgColor = style.dialogBackground ? `${style.dialogBackground}` : null; + const shadowColor = style.dialogShadow ? `0 0px 8px ${style.dialogShadow}` : null; - if (this.buttonGroup) { - this.buttonGroup.buttons.forEach(button => button.style(style)); + if (this.element) { + this.element.style.color = fgColor; + this.element.style.backgroundColor = bgColor; + this.element.style.boxShadow = shadowColor; + + if (this.buttonGroup) { + this.buttonGroup.buttons.forEach(button => button.style(style)); + } } } } + style(style: IDialogStyles): void { + this.styles = style; + this.applyStyles(); + } + dispose(): void { super.dispose(); if (this.modal) { diff --git a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts index 1eb57c6c736..fa330caeddf 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts @@ -10,10 +10,14 @@ import { isLinux, isWindows } from 'vs/base/common/platform'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { IDialogService, IConfirmation, IConfirmationResult, IDialogOptions } from 'vs/platform/dialogs/common/dialogs'; +import { DialogService as HTMLDialogService } from 'vs/platform/dialogs/browser/dialogService'; import { ILogService } from 'vs/platform/log/common/log'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { DialogChannel } from 'vs/platform/dialogs/node/dialogIpc'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; interface IMassagedMessageBoxOptions { @@ -31,6 +35,38 @@ interface IMassagedMessageBoxOptions { } export class DialogService implements IDialogService { + _serviceBrand: any; + + private impl: IDialogService; + + constructor( + @IConfigurationService configurationService: IConfigurationService, + @ILogService logService: ILogService, + @ILayoutService layoutService: ILayoutService, + @IThemeService themeService: IThemeService, + @IWindowService windowService: IWindowService, + @ISharedProcessService sharedProcessService: ISharedProcessService + ) { + + // Use HTML based dialogs + if (configurationService.getValue('workbench.dialogs.customEnabled') === true) { + this.impl = new HTMLDialogService(logService, layoutService, themeService); + } + // Electron dialog service + else { + this.impl = new NativeDialogService(windowService, logService, sharedProcessService); + } + } + + confirm(confirmation: IConfirmation): Promise { + return this.impl.confirm(confirmation); + } + show(severity: Severity, message: string, buttons: string[], options?: IDialogOptions | undefined): Promise { + return this.impl.show(severity, message, buttons, options); + } +} + +class NativeDialogService implements IDialogService { _serviceBrand: any; -- GitLab