diff --git a/.github/ISSUE_TEMPLATE/Custom.md b/.github/ISSUE_TEMPLATE/Custom.md index 18074d2..32ceae5 100644 --- a/.github/ISSUE_TEMPLATE/Custom.md +++ b/.github/ISSUE_TEMPLATE/Custom.md @@ -4,4 +4,5 @@ about: Give us your feedback about this extension --- - + diff --git a/extensions/commands/theme-icons/index.ts b/extensions/commands/theme-icons/index.ts index 563fd7d..4c31aef 100644 --- a/extensions/commands/theme-icons/index.ts +++ b/extensions/commands/theme-icons/index.ts @@ -11,8 +11,7 @@ import { import { isAccent, getCustomSettings, - isMaterialTheme, - setCustomSetting + isMaterialTheme } from './../../helpers/settings'; import {getCurrentThemeID, setIconsID, getCurrentThemeIconsID, reloadWindow} from './../../helpers/vscode'; import {CHARSET} from './../../consts/files'; @@ -30,6 +29,8 @@ const replaceIconPathWithAccent = (iconPath: string, accentName: string): string return iconPath.replace('.svg', `.accent.${ accentName }.svg`); }; +let fixIconsRunning: boolean = false; + /** * Fix icons when flag auto-fix is active and current theme is Material */ @@ -40,6 +41,10 @@ export default async () => { deferred.reject = reject; }); + if (fixIconsRunning) { + return deferred.resolve(); + } + // Current theme id set on VSCode ("label" of the package.json) const themeLabel = getCurrentThemeID(); @@ -48,7 +53,7 @@ export default async () => { return deferred.resolve(); } - await setCustomSetting('fixIconsRunning', true); + fixIconsRunning = true; const DEFAULTS = getDefaultValues(); const CUSTOM_SETTINGS = getCustomSettings(); @@ -92,7 +97,7 @@ export default async () => { return; } - await setCustomSetting('fixIconsRunning', false); + fixIconsRunning = false; deferred.resolve(); }); diff --git a/extensions/defaults.json b/extensions/defaults.json index bea1892..9d939a9 100644 --- a/extensions/defaults.json +++ b/extensions/defaults.json @@ -108,6 +108,10 @@ "menubar.selectionForeground": { "alpha": 100, "value": null + }, + "settings.headerForeground": { + "alpha": 100, + "value": null } }, "changelog": { @@ -288,4 +292,4 @@ "_folder_dark", "_folder_light" ] -} +} \ No newline at end of file diff --git a/extensions/helpers/check-installation.ts b/extensions/helpers/check-installation.ts new file mode 100644 index 0000000..fc52488 --- /dev/null +++ b/extensions/helpers/check-installation.ts @@ -0,0 +1,34 @@ +import {getDefaultValues, getPackageJSON} from './fs'; +import {IInstallationType} from '../interfaces/iinstallation-type'; + +const splitVersion = (input: string): {major: number; minor: number; patch: number} => { + const [major, minor, patch] = input.split('.').map(i => parseInt(i, 10)); + return {major, minor, patch}; +}; + +export default (): IInstallationType => { + const out: IInstallationType = { + isUpdate: false, + isFirstInstall: false + }; + + const defaults = getDefaultValues(); + const packageJSON = getPackageJSON(); + + const isFirstInstall = defaults.changelog === undefined || + (defaults.changelog !== undefined && typeof defaults.changelog.lastversion !== 'string'); + + if (isFirstInstall) { + return {...out, isFirstInstall}; + } + + const versionCurrent = splitVersion(packageJSON.version); + const versionOld = isFirstInstall ? null : splitVersion(defaults.changelog.lastversion); + + const isUpdate = !versionOld || + versionCurrent.major > versionOld.major || + versionCurrent.minor > versionOld.minor || + versionCurrent.patch > versionOld.patch; + + return {...out, isUpdate}; +}; diff --git a/extensions/helpers/configuration-change.ts b/extensions/helpers/configuration-change.ts index ef1e1aa..537e401 100644 --- a/extensions/helpers/configuration-change.ts +++ b/extensions/helpers/configuration-change.ts @@ -1,42 +1,25 @@ import { ConfigurationChangeEvent } from 'vscode'; -import {getCustomSettings, isMaterialThemeIcons, isAutoApplyEnable, isMaterialTheme} from './settings'; +import {isMaterialThemeIcons, isMaterialTheme} from './settings'; import {getCurrentThemeIconsID, getCurrentThemeID} from './vscode'; -import * as ThemeCommands from './../commands'; -import {infoMessage} from './messages'; - -const icons = () => isAutoApplyEnable() ? ThemeCommands.fixIcons() : infoMessage(); +import handleAutoapply from './handle-autoapply'; const onIconsChanged = () => { - const customSettings = getCustomSettings(); - if (customSettings.fixIconsRunning) { - return; - } - const currentIconsTheme = getCurrentThemeIconsID(); - if (isMaterialThemeIcons(currentIconsTheme)) { - return icons(); - } + return handleAutoapply(isMaterialThemeIcons(currentIconsTheme)); }; const onThemeChanged = () => { const currentTheme = getCurrentThemeID(); - if (isMaterialTheme(currentTheme)) { - return icons(); - } + return handleAutoapply(isMaterialTheme(currentTheme)); }; export const onChangeConfiguration = (event: ConfigurationChangeEvent) => { const isColorTheme = event.affectsConfiguration('workbench.colorTheme'); const isIconTheme = event.affectsConfiguration('workbench.iconTheme'); - if (isIconTheme) { - return onIconsChanged(); - } - - if (isColorTheme) { - return onThemeChanged(); - } + return isIconTheme ? onIconsChanged() : + isColorTheme ? onThemeChanged() : null; }; diff --git a/extensions/helpers/handle-autoapply.ts b/extensions/helpers/handle-autoapply.ts new file mode 100644 index 0000000..0aa0c50 --- /dev/null +++ b/extensions/helpers/handle-autoapply.ts @@ -0,0 +1,23 @@ +import {isAutoApplyEnable, isReloadNotificationEnable} from './settings'; +import {infoMessage} from './messages'; +import {fixIcons} from '../commands'; + +export default async (doubleCheck: boolean) => { + if (!doubleCheck) { + return; + } + + if (isAutoApplyEnable()) { + return fixIcons(); + } + + if (!isReloadNotificationEnable()) { + return; + } + + const result = await infoMessage(); + + if (result.reload) { + return fixIcons(); + } +}; diff --git a/extensions/helpers/messages.ts b/extensions/helpers/messages.ts index c68c9d8..c4371b3 100644 --- a/extensions/helpers/messages.ts +++ b/extensions/helpers/messages.ts @@ -2,24 +2,46 @@ import { window as Window } from 'vscode'; -import * as ThemeCommands from './../commands'; - const MESSAGES = { INFO: { message: 'Do you want to reload to apply Material Theme Icons to enjoy the full experience?', - options: {ok: 'Yeah, releoad', cancel: 'No, thank you'} + options: {ok: 'Yeah, reload', cancel: 'No, thank you'} }, CHANGELOG: { message: 'Material Theme was updated. Check the release notes for more details.', options: {ok: 'Show me', cancel: 'Maybe later'} + }, + INSTALLATION: { + message: 'Thank you for installing Material Theme! Would you like to enable the auto-application (with window reload when needed) of the Material Theme icons?', + options: {ok: 'Sure!', cancel: 'Nope :('} } }; export const infoMessage = async () => { - if (await Window.showInformationMessage(MESSAGES.INFO.message, MESSAGES.INFO.options.ok, MESSAGES.INFO.options.cancel) === MESSAGES.INFO.options.ok) { - ThemeCommands.fixIcons(); + const result = await Window.showInformationMessage( + MESSAGES.INFO.message, + MESSAGES.INFO.options.ok, + MESSAGES.INFO.options.cancel + ); + + switch (result) { + case MESSAGES.INFO.options.ok: + return {reload: true}; + default: + return {}; } }; export const changelogMessage = async () => - await Window.showInformationMessage(MESSAGES.CHANGELOG.message, MESSAGES.CHANGELOG.options.ok, MESSAGES.CHANGELOG.options.cancel) === MESSAGES.CHANGELOG.options.ok; + await Window.showInformationMessage( + MESSAGES.CHANGELOG.message, + MESSAGES.CHANGELOG.options.ok, + MESSAGES.CHANGELOG.options.cancel + ) === MESSAGES.CHANGELOG.options.ok; + +export const installationMessage = async () => + await Window.showInformationMessage( + MESSAGES.INSTALLATION.message, + MESSAGES.INSTALLATION.options.ok, + MESSAGES.INSTALLATION.options.cancel, + ) === MESSAGES.INSTALLATION.options.ok; diff --git a/extensions/helpers/settings.ts b/extensions/helpers/settings.ts index 1c2073b..ac4454b 100644 --- a/extensions/helpers/settings.ts +++ b/extensions/helpers/settings.ts @@ -22,7 +22,14 @@ export function getCustomSettings(): IThemeCustomProperties { * Get autoApplyIcons */ export function isAutoApplyEnable(): boolean { - return vscode.workspace.getConfiguration().get('materialTheme.autoApplyIcons', true); + return vscode.workspace.getConfiguration().get('materialTheme.autoApplyIcons'); +} + +/** + * Get showReloadNotification + */ +export function isReloadNotificationEnable(): boolean { + return vscode.workspace.getConfiguration().get('materialTheme.showReloadNotification'); } /** @@ -59,7 +66,5 @@ export function setCustomSetting(settingName: string, value: any): Thenable { - const prevAccent = getAccent(); - return setCustomSetting('accentPrevious', prevAccent) - .then(() => setCustomSetting('accent', accentName)); + return setCustomSetting('accent', accentName); } diff --git a/extensions/helpers/should-show-changelog.ts b/extensions/helpers/should-show-changelog.ts deleted file mode 100644 index f05b780..0000000 --- a/extensions/helpers/should-show-changelog.ts +++ /dev/null @@ -1,35 +0,0 @@ -import * as path from 'path'; - -import {IDefaults} from './../interfaces/idefaults'; - -import {getDefaultValues, getPackageJSON, writeFile} from './fs'; - -const splitVersion = (input: string): {major: number; minor: number; patch: number} => { - const [major, minor, patch] = input.split('.').map(i => parseInt(i, 10)); - return {major, minor, patch}; -}; - -const writeDefaults = (defaults: IDefaults) => - writeFile(path.join('./extensions/defaults.json'), JSON.stringify(defaults, null, 2)); - -export default (): boolean => { - const defaults = getDefaultValues(); - const packageJSON = getPackageJSON(); - - const defaultsNotPresent = defaults.changelog === undefined || - (defaults.changelog !== undefined && typeof defaults.changelog.lastversion !== 'string'); - - const versionCurrent = splitVersion(packageJSON.version); - const versionOld = defaultsNotPresent ? null : splitVersion(defaults.changelog.lastversion); - - const out = !versionOld || - versionCurrent.major > versionOld.major || - versionCurrent.minor > versionOld.minor || - versionCurrent.patch > versionOld.patch; - - const newChangelog = {...defaults.changelog, lastversion: packageJSON.version}; - const newDefaults = {...defaults, changelog: newChangelog}; - writeDefaults(newDefaults); - - return out; -}; diff --git a/extensions/helpers/write-changelog.ts b/extensions/helpers/write-changelog.ts new file mode 100644 index 0000000..53fa129 --- /dev/null +++ b/extensions/helpers/write-changelog.ts @@ -0,0 +1,16 @@ +import * as path from 'path'; +import {getDefaultValues, getPackageJSON, writeFile} from './fs'; + +import {IDefaults} from './../interfaces/idefaults'; + +const writeDefaults = (defaults: IDefaults) => + writeFile(path.join('./extensions/defaults.json'), JSON.stringify(defaults, null, 2)); + +export default (): void => { + const defaults = getDefaultValues(); + const packageJSON = getPackageJSON(); + + const newChangelog = {...defaults.changelog, lastversion: packageJSON.version}; + const newDefaults = {...defaults, changelog: newChangelog}; + writeDefaults(newDefaults); +}; diff --git a/extensions/interfaces/iinstallation-type.ts b/extensions/interfaces/iinstallation-type.ts new file mode 100644 index 0000000..b3d6325 --- /dev/null +++ b/extensions/interfaces/iinstallation-type.ts @@ -0,0 +1,4 @@ +export interface IInstallationType { + isUpdate: boolean; + isFirstInstall: boolean; +} diff --git a/extensions/interfaces/itheme-custom-properties.ts b/extensions/interfaces/itheme-custom-properties.ts index a836c2d..39b7c79 100644 --- a/extensions/interfaces/itheme-custom-properties.ts +++ b/extensions/interfaces/itheme-custom-properties.ts @@ -1,6 +1,4 @@ export interface IThemeCustomProperties { accent?: string; - accentPrevious?: string; autoApplyIcons?: boolean; - fixIconsRunning?: boolean; } diff --git a/extensions/material.theme.config.ts b/extensions/material.theme.config.ts index e3086e9..900b75f 100644 --- a/extensions/material.theme.config.ts +++ b/extensions/material.theme.config.ts @@ -4,13 +4,18 @@ import { } from 'vscode'; import * as ThemeCommands from './commands'; -import {isAutoApplyEnable} from './helpers/settings'; +import {setCustomSetting} from './helpers/settings'; import {onChangeConfiguration} from './helpers/configuration-change'; -import {infoMessage, changelogMessage} from './helpers/messages'; -import shouldShowChangelog from './helpers/should-show-changelog'; +import {changelogMessage, installationMessage} from './helpers/messages'; +import checkInstallation from './helpers/check-installation'; +import writeChangelog from './helpers/write-changelog'; +import handleAutoapply from './helpers/handle-autoapply'; export async function activate() { const config = Workspace.getConfiguration(); + const installationType = checkInstallation(); + + writeChangelog(); // Listen on set theme: when the theme is Material Theme, just adjust icon and accent. Workspace.onDidChangeConfiguration(onChangeConfiguration); @@ -20,20 +25,22 @@ export async function activate() { config.update('materialTheme.cache.workbench', undefined, true); } - if (shouldShowChangelog()) { - const show = await changelogMessage(); - if (show) { - ThemeCommands.showChangelog(); - } + if (installationType.isFirstInstall) { + const enableAutoApply = await installationMessage(); + await setCustomSetting('autoApplyIcons', enableAutoApply); + // Set true always on new installation + await setCustomSetting('showReloadNotification', true); + } + + const shouldShowChangelog = (installationType.isFirstInstall || installationType.isUpdate) && await changelogMessage(); + if (shouldShowChangelog) { + ThemeCommands.showChangelog(); } // Registering commands Commands.registerCommand('materialTheme.setAccent', async () => { const wasSet = await ThemeCommands.accentsSetter(); - - if (wasSet) { - return isAutoApplyEnable() ? ThemeCommands.fixIcons() : infoMessage(); - } + handleAutoapply(wasSet); }); Commands.registerCommand('materialTheme.fixIcons', () => ThemeCommands.fixIcons()); Commands.registerCommand('materialTheme.toggleApplyIcons', () => ThemeCommands.toggleApplyIcons()); diff --git a/package.json b/package.json index 4e1a2cf..3a1d72e 100644 --- a/package.json +++ b/package.json @@ -85,21 +85,39 @@ "properties": { "materialTheme.accent": { "type": "string", - "description": "Current accent color selected" - }, - "materialTheme.accentPrevious": { - "type": "string", - "description": "Previous accent color selected" + "default": "Blue", + "enum": [ + "Acid Lime", + "Blue", + "Breaking Bad", + "Bright Teal", + "Cyan", + "Graphite", + "Indigo", + "Lime", + "Orange", + "Pink", + "Purple", + "Red", + "Sky", + "Tomato", + "Teal", + "Yellow" + ], + "description": "Current accent color selected", + "scope": "window" }, "materialTheme.autoApplyIcons": { "type": "boolean", - "description": "Enable/disable auto-apply of Material Theme icons", - "default": true + "description": "Enable/disable auto-apply of Material Theme icons with window reload when needed", + "default": false, + "scope": "window" }, - "materialTheme.fixIconsRunning": { + "materialTheme.showReloadNotification": { "type": "boolean", - "description": "For checking if the command is currently acting", - "default": false + "description": "Useful when autoApplyIcons is false and you want to be asked to reload the window when needed", + "default": true, + "scope": "window" } } }, diff --git a/src/themes/settings/specific/darker-hc.json b/src/themes/settings/specific/darker-hc.json index 120a3f9..a88a13d 100644 --- a/src/themes/settings/specific/darker-hc.json +++ b/src/themes/settings/specific/darker-hc.json @@ -19,7 +19,7 @@ "lineHighlight": "#000000", "selection": "#61616150", "shadow": "#00000030", - "inputBackground": "#FFFFFF05", + "inputBackground": "#2B2B2B", "inputForeground": "#EEFFFF", "inputBorder": "#FFFFFF10", "scrollbarsHover": "#00000030", diff --git a/src/themes/settings/specific/darker.json b/src/themes/settings/specific/darker.json index 7c1e6c9..9eeee5b 100644 --- a/src/themes/settings/specific/darker.json +++ b/src/themes/settings/specific/darker.json @@ -17,7 +17,7 @@ "lineHighlight": "#000000", "selection": "#61616150", "shadow": "#00000030", - "inputBackground": "#FFFFFF05", + "inputBackground": "#2B2B2B", "inputForeground": "#EEFFFF", "inputBorder": "#FFFFFF10", "scrollbars": "#00000050", diff --git a/src/themes/settings/specific/default-hc.json b/src/themes/settings/specific/default-hc.json index 013fae0..c569e63 100644 --- a/src/themes/settings/specific/default-hc.json +++ b/src/themes/settings/specific/default-hc.json @@ -19,7 +19,7 @@ "lineHighlight": "#000000", "selection": "#80CBC420", "shadow": "#00000030", - "inputBackground": "#FFFFFF05", + "inputBackground": "#303C41", "inputForeground": "#EEFFFF", "inputBorder": "#FFFFFF10", "scrollbarsHover": "#00000030", diff --git a/src/themes/settings/specific/default.json b/src/themes/settings/specific/default.json index cee0445..dea4bab 100644 --- a/src/themes/settings/specific/default.json +++ b/src/themes/settings/specific/default.json @@ -17,7 +17,7 @@ "lineHighlight": "#000000", "selection": "#80CBC420", "shadow": "#00000030", - "inputBackground": "#FFFFFF05", + "inputBackground": "#303C41", "inputForeground": "#EEFFFF", "inputBorder": "#FFFFFF10", "scrollbars": "#00000050", diff --git a/src/themes/settings/specific/lighter-hc.json b/src/themes/settings/specific/lighter-hc.json index 09e31c4..a300351 100644 --- a/src/themes/settings/specific/lighter-hc.json +++ b/src/themes/settings/specific/lighter-hc.json @@ -19,7 +19,7 @@ "lineHighlight": "#CCD7DA", "selection": "#80CBC440", "shadow": "#00000020", - "inputBackground": "#00000005", + "inputBackground": "#EEEEEE", "inputForeground": "#90A4AE", "inputBorder": "#00000010", "scrollbarsHover": "#00000030", diff --git a/src/themes/settings/specific/lighter.json b/src/themes/settings/specific/lighter.json index 0e694dc..226cd1c 100644 --- a/src/themes/settings/specific/lighter.json +++ b/src/themes/settings/specific/lighter.json @@ -17,7 +17,7 @@ "lineHighlight": "#CCD7DA", "selection": "#80CBC440", "shadow": "#00000020", - "inputBackground": "#00000005", + "inputBackground": "#EEEEEE", "inputForeground": "#90A4AE", "inputBorder": "#00000010", "scrollbars": "#00000050", diff --git a/src/themes/settings/specific/ocean-hc.json b/src/themes/settings/specific/ocean-hc.json index cb47930..29f7b62 100644 --- a/src/themes/settings/specific/ocean-hc.json +++ b/src/themes/settings/specific/ocean-hc.json @@ -17,7 +17,7 @@ "lineHighlight": "#000000", "selection": "#717CB450", "shadow": "#00000030", - "inputBackground": "#FFFFFF05", + "inputBackground": "#1A1C25", "inputForeground": "#EEFFFF", "inputBorder": "#FFFFFF10", "scrollbars": "#00000050", diff --git a/src/themes/settings/specific/ocean.json b/src/themes/settings/specific/ocean.json index 522bf0d..4c2a0a3 100644 --- a/src/themes/settings/specific/ocean.json +++ b/src/themes/settings/specific/ocean.json @@ -17,7 +17,7 @@ "lineHighlight": "#000000", "selection": "#717CB450", "shadow": "#00000030", - "inputBackground": "#FFFFFF05", + "inputBackground": "#1A1C25", "inputForeground": "#EEFFFF", "inputBorder": "#FFFFFF10", "scrollbars": "#00000050", diff --git a/src/themes/settings/specific/palenight-hc.json b/src/themes/settings/specific/palenight-hc.json index 5a99295..cd55031 100644 --- a/src/themes/settings/specific/palenight-hc.json +++ b/src/themes/settings/specific/palenight-hc.json @@ -19,7 +19,7 @@ "lineHighlight": "#000000", "selection": "#717CB450", "shadow": "#00000030", - "inputBackground": "#FFFFFF05", + "inputBackground": "#333747", "inputForeground": "#EEFFFF", "inputBorder": "#FFFFFF10", "scrollbarsHover": "#00000030", diff --git a/src/themes/settings/specific/palenight.json b/src/themes/settings/specific/palenight.json index 867a080..c6fb208 100644 --- a/src/themes/settings/specific/palenight.json +++ b/src/themes/settings/specific/palenight.json @@ -17,7 +17,7 @@ "lineHighlight": "#000000", "selection": "#717CB450", "shadow": "#00000030", - "inputBackground": "#FFFFFF05", + "inputBackground": "#333747", "inputForeground": "#EEFFFF", "inputBorder": "#FFFFFF10", "scrollbars": "#00000050", diff --git a/src/themes/theme-template-color-theme.json b/src/themes/theme-template-color-theme.json index 1ad3368..8ed5c23 100644 --- a/src/themes/theme-template-color-theme.json +++ b/src/themes/theme-template-color-theme.json @@ -829,12 +829,19 @@ "breadcrumb.activeSelectionForeground": "{{commons.accents.Teal}}", "breadcrumbPicker.background": "{{variant.scheme.backgroundAlt}}", "menu.background": "{{variant.scheme.background}}", - "menu.foreground": "{{variant.scheme.sidebarForeground}}", + "menu.foreground": "{{variant.scheme.foreground}}", "menu.selectionBackground": "{{variant.scheme.inactiveSelectionBackground}}", "menu.selectionForeground": "{{commons.accents.Teal}}", "menu.selectionBorder": "{{variant.scheme.inactiveSelectionBackground}}", "menubar.selectionBackground": "{{variant.scheme.inactiveSelectionBackground}}", "menubar.selectionForeground": "{{commons.accents.Teal}}", - "menubar.selectionBorder": "{{variant.scheme.inactiveSelectionBackground}}" + "menubar.selectionBorder": "{{variant.scheme.inactiveSelectionBackground}}", + "settings.dropdownForeground": "{{variant.scheme.foreground}}", + "settings.dropdownBackground": "{{variant.scheme.backgroundAlt}}", + "settings.numberInputForeground": "{{variant.scheme.foreground}}", + "settings.numberInputBackground": "{{variant.scheme.backgroundAlt}}", + "settings.textInputForeground": "{{variant.scheme.foreground}}", + "settings.textInputBackground": "{{variant.scheme.backgroundAlt}}", + "settings.headerForeground": "{{commons.accents.Teal}}" } }