From 8d4fff5703e2530869e2d3f0ce94485e2de0de03 Mon Sep 17 00:00:00 2001 From: Francesco Spissu Date: Fri, 5 Aug 2022 08:35:33 +0200 Subject: [PATCH 1/8] live change of theme from preferences --- .../src/browser/contributions/settings.ts | 2 +- .../browser/dialogs/settings/settings-component.tsx | 6 ++++-- .../src/browser/dialogs/settings/settings-dialog.tsx | 2 +- .../src/browser/dialogs/settings/settings.ts | 12 +++++++++++- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/settings.ts b/arduino-ide-extension/src/browser/contributions/settings.ts index bb7c83f00..2b629c619 100644 --- a/arduino-ide-extension/src/browser/contributions/settings.ts +++ b/arduino-ide-extension/src/browser/contributions/settings.ts @@ -32,7 +32,7 @@ export class Settings extends SketchContribution { await this.settingsService.update(settings); await this.settingsService.save(); } else { - await this.settingsService.reset(); + await this.settingsService.reset(true); } }, isEnabled: () => !this.settingsOpened, diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index 6bbc3c4c1..4abb5e704 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -589,9 +589,11 @@ export class SettingsComponent extends React.Component< ): void => { const { selectedIndex } = event.target.options; const theme = ThemeService.get().getThemes()[selectedIndex]; - if (theme) { - this.setState({ themeId: theme.id }); + const prevTheme = ThemeService.get().getCurrentTheme(); + if (theme && prevTheme) { + this.setState({ themeId: theme.id, prevThemeId: prevTheme.id }); } + ThemeService.get().setCurrentTheme(theme.id); }; protected languageDidChange = ( diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx index 7e27def2a..70a8ee49f 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx @@ -114,7 +114,7 @@ export class SettingsDialog extends AbstractDialog> { // calling settingsService.reset() in order to reload the settings from the preferenceService // and update the UI including changes triggered from the command palette - this.settingsService.reset(); + this.settingsService.reset(false); this.widget.activate(); } diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts index 3bd5f13c8..20b19215b 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts @@ -46,6 +46,7 @@ export const SHOW_ALL_FILES_SETTING = `${SKETCHBOOK_SETTING}.showAllFiles`; export interface Settings { editorFontSize: number; // `editor.fontSize` themeId: string; // `workbench.colorTheme` + prevThemeId: string; // `workbench.prevColorTheme` autoSave: Settings.AutoSave; // `files.autoSave` quickSuggestions: Record<'other' | 'comments' | 'strings', boolean>; // `editor.quickSuggestions` @@ -123,6 +124,7 @@ export class SettingsService { currentLanguage, editorFontSize, themeId, + prevThemeId, autoSave, quickSuggestions, autoScaleInterface, @@ -144,6 +146,7 @@ export class SettingsService { ? 'arduino-theme-dark' : 'arduino-theme' ), + this.preferenceService.get('workbench.prevColorTheme', ''), this.preferenceService.get( AUTO_SAVE_SETTING, Settings.AutoSave.DEFAULT_ON @@ -169,6 +172,7 @@ export class SettingsService { return { editorFontSize, themeId, + prevThemeId, languages, currentLanguage, autoSave, @@ -204,10 +208,14 @@ export class SettingsService { } } - async reset(): Promise { + async reset(resetFromDialog: boolean): Promise { + const prevThemeId = this._settings.prevThemeId; const settings = await this.loadSettings(); await this.update(settings, false); this.onDidResetEmitter.fire(this._settings); + if (resetFromDialog && prevThemeId) { + ThemeService.get().setCurrentTheme(prevThemeId); + } } async validate( @@ -259,6 +267,7 @@ export class SettingsService { currentLanguage, editorFontSize, themeId, + prevThemeId, autoSave, quickSuggestions, autoScaleInterface, @@ -283,6 +292,7 @@ export class SettingsService { await this.savePreference('editor.fontSize', editorFontSize); await this.savePreference('workbench.colorTheme', themeId); + await this.savePreference('workbench.prevColorTheme', prevThemeId); await this.savePreference(AUTO_SAVE_SETTING, autoSave); await this.savePreference('editor.quickSuggestions', quickSuggestions); await this.savePreference(AUTO_SCALE_SETTING, autoScaleInterface); From d323b66460ad7c9fc5f4215f09cc0aae09ab8dc3 Mon Sep 17 00:00:00 2001 From: Francesco Spissu Date: Fri, 5 Aug 2022 10:44:33 +0200 Subject: [PATCH 2/8] change reset function --- .../src/browser/contributions/settings.ts | 2 +- .../src/browser/dialogs/settings/settings-dialog.tsx | 2 +- .../src/browser/dialogs/settings/settings.ts | 10 +++++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/settings.ts b/arduino-ide-extension/src/browser/contributions/settings.ts index 2b629c619..09b6b9f17 100644 --- a/arduino-ide-extension/src/browser/contributions/settings.ts +++ b/arduino-ide-extension/src/browser/contributions/settings.ts @@ -32,7 +32,7 @@ export class Settings extends SketchContribution { await this.settingsService.update(settings); await this.settingsService.save(); } else { - await this.settingsService.reset(true); + await this.settingsService.resetFromDialog(); } }, isEnabled: () => !this.settingsOpened, diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx index 70a8ee49f..7e27def2a 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx @@ -114,7 +114,7 @@ export class SettingsDialog extends AbstractDialog> { // calling settingsService.reset() in order to reload the settings from the preferenceService // and update the UI including changes triggered from the command palette - this.settingsService.reset(false); + this.settingsService.reset(); this.widget.activate(); } diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts index 20b19215b..b0e3a2307 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts @@ -208,14 +208,18 @@ export class SettingsService { } } - async reset(resetFromDialog: boolean): Promise { - const prevThemeId = this._settings.prevThemeId; + async reset(): Promise { const settings = await this.loadSettings(); await this.update(settings, false); this.onDidResetEmitter.fire(this._settings); - if (resetFromDialog && prevThemeId) { + } + + async resetFromDialog(): Promise { + const prevThemeId = this._settings.prevThemeId; + if (prevThemeId) { ThemeService.get().setCurrentTheme(prevThemeId); } + this.reset(); } async validate( From 23246b6c90ff76774e2c7e28088cf654a8c572dd Mon Sep 17 00:00:00 2001 From: Francesco Spissu Date: Fri, 5 Aug 2022 11:06:20 +0200 Subject: [PATCH 3/8] correct prevThemeId --- .../src/browser/dialogs/settings/settings-component.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index 4abb5e704..4cab77a4b 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -589,9 +589,10 @@ export class SettingsComponent extends React.Component< ): void => { const { selectedIndex } = event.target.options; const theme = ThemeService.get().getThemes()[selectedIndex]; - const prevTheme = ThemeService.get().getCurrentTheme(); - if (theme && prevTheme) { - this.setState({ themeId: theme.id, prevThemeId: prevTheme.id }); + const prevThemeId = + this.state.prevThemeId || ThemeService.get().getCurrentTheme().id; + if (theme && prevThemeId) { + this.setState({ themeId: theme.id, prevThemeId: prevThemeId }); } ThemeService.get().setCurrentTheme(theme.id); }; From df35cb0e4a9ca7f441a568056d32a2b30a423bab Mon Sep 17 00:00:00 2001 From: Francesco Spissu Date: Fri, 5 Aug 2022 12:19:52 +0200 Subject: [PATCH 4/8] Revert "correct prevThemeId" This reverts commit 23246b6c90ff76774e2c7e28088cf654a8c572dd. --- .../src/browser/dialogs/settings/settings-component.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index 4cab77a4b..4abb5e704 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -589,10 +589,9 @@ export class SettingsComponent extends React.Component< ): void => { const { selectedIndex } = event.target.options; const theme = ThemeService.get().getThemes()[selectedIndex]; - const prevThemeId = - this.state.prevThemeId || ThemeService.get().getCurrentTheme().id; - if (theme && prevThemeId) { - this.setState({ themeId: theme.id, prevThemeId: prevThemeId }); + const prevTheme = ThemeService.get().getCurrentTheme(); + if (theme && prevTheme) { + this.setState({ themeId: theme.id, prevThemeId: prevTheme.id }); } ThemeService.get().setCurrentTheme(theme.id); }; From cdbe468e34c9b1f6022853f364f28e46be07a8d6 Mon Sep 17 00:00:00 2001 From: Francesco Spissu Date: Fri, 5 Aug 2022 12:20:23 +0200 Subject: [PATCH 5/8] Revert "change reset function" This reverts commit d323b66460ad7c9fc5f4215f09cc0aae09ab8dc3. --- .../src/browser/contributions/settings.ts | 2 +- .../src/browser/dialogs/settings/settings-dialog.tsx | 2 +- .../src/browser/dialogs/settings/settings.ts | 10 +++------- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/settings.ts b/arduino-ide-extension/src/browser/contributions/settings.ts index 09b6b9f17..2b629c619 100644 --- a/arduino-ide-extension/src/browser/contributions/settings.ts +++ b/arduino-ide-extension/src/browser/contributions/settings.ts @@ -32,7 +32,7 @@ export class Settings extends SketchContribution { await this.settingsService.update(settings); await this.settingsService.save(); } else { - await this.settingsService.resetFromDialog(); + await this.settingsService.reset(true); } }, isEnabled: () => !this.settingsOpened, diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx index 7e27def2a..70a8ee49f 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx @@ -114,7 +114,7 @@ export class SettingsDialog extends AbstractDialog> { // calling settingsService.reset() in order to reload the settings from the preferenceService // and update the UI including changes triggered from the command palette - this.settingsService.reset(); + this.settingsService.reset(false); this.widget.activate(); } diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts index b0e3a2307..20b19215b 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts @@ -208,18 +208,14 @@ export class SettingsService { } } - async reset(): Promise { + async reset(resetFromDialog: boolean): Promise { + const prevThemeId = this._settings.prevThemeId; const settings = await this.loadSettings(); await this.update(settings, false); this.onDidResetEmitter.fire(this._settings); - } - - async resetFromDialog(): Promise { - const prevThemeId = this._settings.prevThemeId; - if (prevThemeId) { + if (resetFromDialog && prevThemeId) { ThemeService.get().setCurrentTheme(prevThemeId); } - this.reset(); } async validate( From 56fe3d5425b959343d1299834310e2d44ffda19b Mon Sep 17 00:00:00 2001 From: Francesco Spissu Date: Fri, 5 Aug 2022 12:20:31 +0200 Subject: [PATCH 6/8] Revert "live change of theme from preferences" This reverts commit 8d4fff5703e2530869e2d3f0ce94485e2de0de03. --- .../src/browser/contributions/settings.ts | 2 +- .../browser/dialogs/settings/settings-component.tsx | 6 ++---- .../src/browser/dialogs/settings/settings-dialog.tsx | 2 +- .../src/browser/dialogs/settings/settings.ts | 12 +----------- 4 files changed, 5 insertions(+), 17 deletions(-) diff --git a/arduino-ide-extension/src/browser/contributions/settings.ts b/arduino-ide-extension/src/browser/contributions/settings.ts index 2b629c619..bb7c83f00 100644 --- a/arduino-ide-extension/src/browser/contributions/settings.ts +++ b/arduino-ide-extension/src/browser/contributions/settings.ts @@ -32,7 +32,7 @@ export class Settings extends SketchContribution { await this.settingsService.update(settings); await this.settingsService.save(); } else { - await this.settingsService.reset(true); + await this.settingsService.reset(); } }, isEnabled: () => !this.settingsOpened, diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index 4abb5e704..6bbc3c4c1 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -589,11 +589,9 @@ export class SettingsComponent extends React.Component< ): void => { const { selectedIndex } = event.target.options; const theme = ThemeService.get().getThemes()[selectedIndex]; - const prevTheme = ThemeService.get().getCurrentTheme(); - if (theme && prevTheme) { - this.setState({ themeId: theme.id, prevThemeId: prevTheme.id }); + if (theme) { + this.setState({ themeId: theme.id }); } - ThemeService.get().setCurrentTheme(theme.id); }; protected languageDidChange = ( diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx index 70a8ee49f..7e27def2a 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx @@ -114,7 +114,7 @@ export class SettingsDialog extends AbstractDialog> { // calling settingsService.reset() in order to reload the settings from the preferenceService // and update the UI including changes triggered from the command palette - this.settingsService.reset(false); + this.settingsService.reset(); this.widget.activate(); } diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts index 20b19215b..3bd5f13c8 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings.ts +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings.ts @@ -46,7 +46,6 @@ export const SHOW_ALL_FILES_SETTING = `${SKETCHBOOK_SETTING}.showAllFiles`; export interface Settings { editorFontSize: number; // `editor.fontSize` themeId: string; // `workbench.colorTheme` - prevThemeId: string; // `workbench.prevColorTheme` autoSave: Settings.AutoSave; // `files.autoSave` quickSuggestions: Record<'other' | 'comments' | 'strings', boolean>; // `editor.quickSuggestions` @@ -124,7 +123,6 @@ export class SettingsService { currentLanguage, editorFontSize, themeId, - prevThemeId, autoSave, quickSuggestions, autoScaleInterface, @@ -146,7 +144,6 @@ export class SettingsService { ? 'arduino-theme-dark' : 'arduino-theme' ), - this.preferenceService.get('workbench.prevColorTheme', ''), this.preferenceService.get( AUTO_SAVE_SETTING, Settings.AutoSave.DEFAULT_ON @@ -172,7 +169,6 @@ export class SettingsService { return { editorFontSize, themeId, - prevThemeId, languages, currentLanguage, autoSave, @@ -208,14 +204,10 @@ export class SettingsService { } } - async reset(resetFromDialog: boolean): Promise { - const prevThemeId = this._settings.prevThemeId; + async reset(): Promise { const settings = await this.loadSettings(); await this.update(settings, false); this.onDidResetEmitter.fire(this._settings); - if (resetFromDialog && prevThemeId) { - ThemeService.get().setCurrentTheme(prevThemeId); - } } async validate( @@ -267,7 +259,6 @@ export class SettingsService { currentLanguage, editorFontSize, themeId, - prevThemeId, autoSave, quickSuggestions, autoScaleInterface, @@ -292,7 +283,6 @@ export class SettingsService { await this.savePreference('editor.fontSize', editorFontSize); await this.savePreference('workbench.colorTheme', themeId); - await this.savePreference('workbench.prevColorTheme', prevThemeId); await this.savePreference(AUTO_SAVE_SETTING, autoSave); await this.savePreference('editor.quickSuggestions', quickSuggestions); await this.savePreference(AUTO_SCALE_SETTING, autoScaleInterface); From 18264146186f47d5bbe97cd1281feb316f73eb99 Mon Sep 17 00:00:00 2001 From: Akos Kitta Date: Fri, 5 Aug 2022 11:53:57 +0200 Subject: [PATCH 7/8] dirty hack for live theme change Signed-off-by: Akos Kitta --- .../browser/dialogs/settings/settings-component.tsx | 3 +++ .../src/browser/dialogs/settings/settings-dialog.tsx | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index 6bbc3c4c1..d3a64d3cf 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -591,6 +591,9 @@ export class SettingsComponent extends React.Component< const theme = ThemeService.get().getThemes()[selectedIndex]; if (theme) { this.setState({ themeId: theme.id }); + if (ThemeService.get().getCurrentTheme().id !== theme.id) { + ThemeService.get().setCurrentTheme(theme.id); + } } }; diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx index 7e27def2a..62d67859c 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-dialog.tsx @@ -16,6 +16,7 @@ import { SettingsComponent } from './settings-component'; import { AsyncLocalizationProvider } from '@theia/core/lib/common/i18n/localization'; import { AdditionalUrls } from '../../../common/protocol'; import { AbstractDialog } from '../../theia/dialogs/dialogs'; +import { ThemeService } from '@theia/core/lib/browser/theming'; @injectable() export class SettingsWidget extends ReactWidget { @@ -118,6 +119,17 @@ export class SettingsDialog extends AbstractDialog> { this.widget.activate(); } + + override async open(): Promise | undefined> { + const themeIdBeforeOpen = ThemeService.get().getCurrentTheme().id; + const result = await super.open(); + if (!result) { + if (ThemeService.get().getCurrentTheme().id !== themeIdBeforeOpen) { + ThemeService.get().setCurrentTheme(themeIdBeforeOpen); + } + } + return result; + } } export class AdditionalUrlsDialog extends AbstractDialog { From 9b0644ccf835d957e4352a6bc1d4b66357ec52ee Mon Sep 17 00:00:00 2001 From: Francesco Spissu Date: Tue, 9 Aug 2022 08:40:13 +0200 Subject: [PATCH 8/8] change theme dropdown value without referencing the state --- .../src/browser/dialogs/settings/settings-component.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx index d3a64d3cf..dc3d00252 100644 --- a/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx +++ b/arduino-ide-extension/src/browser/dialogs/settings/settings-component.tsx @@ -201,12 +201,7 @@ export class SettingsComponent extends React.Component<