From fecc3efc411c923cb7e5618a812994a384372f20 Mon Sep 17 00:00:00 2001 From: Jas Singh Date: Sat, 24 Aug 2024 17:07:15 -0700 Subject: [PATCH] Consolidate theme importing code. (#178) --- globals/useTheme.ts | 58 ++------------- widget/settings/shared/FileChooser.ts | 102 ++++++++++++++------------ 2 files changed, 63 insertions(+), 97 deletions(-) diff --git a/globals/useTheme.ts b/globals/useTheme.ts index f87f01a..eecf3ac 100644 --- a/globals/useTheme.ts +++ b/globals/useTheme.ts @@ -1,59 +1,22 @@ import Gio from "gi://Gio" import { bash, Notify } from "lib/utils"; import icons from "lib/icons" +import { filterConfigForThemeOnly, loadJsonFile, saveConfigToFile } from "widget/settings/shared/FileChooser"; globalThis.useTheme = (filePath: string): void => { - const themeOnly = true; - let file = Gio.File.new_for_path(filePath as string); - let [success, content] = file.load_contents(null); + let importedConfig = loadJsonFile(filePath); - if (!success) { - console.error(`Failed to import: ${filePath}`); + if (!importedConfig) { return; } Notify({ - summary: `Importing ${themeOnly ? "Theme" : "Config"}`, + summary: `Importing Theme`, body: `Importing: ${filePath}`, iconName: icons.ui.info, timeout: 7000 }); - let jsonString = new TextDecoder("utf-8").decode(content); - let importedConfig = JSON.parse(jsonString); - - const hexColorPattern = /^#([0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/; - - const saveConfigToFile = (config: object, filePath: string) => { - let file = Gio.File.new_for_path(filePath); - let outputStream = file.replace(null, false, Gio.FileCreateFlags.NONE, null); - let dataOutputStream = new Gio.DataOutputStream({ base_stream: outputStream }); - - let jsonString = JSON.stringify(config, null, 2); - dataOutputStream.put_string(jsonString, null); - dataOutputStream.close(null); - }; - - const filterConfigForThemeOnly = (config: object) => { - let filteredConfig = {}; - for (let key in config) { - if (typeof config[key] === 'string' && hexColorPattern.test(config[key])) { - filteredConfig[key] = config[key]; - } - } - return filteredConfig; - }; - - const filterConfigForNonTheme = (config: object) => { - let filteredConfig = {}; - for (let key in config) { - if (!(typeof config[key] === 'string' && hexColorPattern.test(config[key]))) { - filteredConfig[key] = config[key]; - } - } - return filteredConfig; - }; - let tmpConfigFile = Gio.File.new_for_path(`${TMP}/config.json`); let optionsConfigFile = Gio.File.new_for_path(OPTIONS); @@ -68,17 +31,12 @@ globalThis.useTheme = (filePath: string): void => { let tmpConfig = JSON.parse(new TextDecoder("utf-8").decode(tmpContent)); let optionsConfig = JSON.parse(new TextDecoder("utf-8").decode(optionsContent)); - if (themeOnly) { - const filteredConfig = filterConfigForThemeOnly(importedConfig); - tmpConfig = { ...tmpConfig, ...filteredConfig }; - optionsConfig = { ...optionsConfig, ...filteredConfig }; - } else { - const filteredConfig = filterConfigForNonTheme(importedConfig); - tmpConfig = { ...tmpConfig, ...filteredConfig }; - optionsConfig = { ...optionsConfig, ...filteredConfig }; - } + const filteredConfig = filterConfigForThemeOnly(importedConfig); + tmpConfig = { ...tmpConfig, ...filteredConfig }; + optionsConfig = { ...optionsConfig, ...filteredConfig }; saveConfigToFile(tmpConfig, `${TMP}/config.json`); saveConfigToFile(optionsConfig, OPTIONS); bash("pkill ags && ags"); } + diff --git a/widget/settings/shared/FileChooser.ts b/widget/settings/shared/FileChooser.ts index 2acdb25..395d763 100644 --- a/widget/settings/shared/FileChooser.ts +++ b/widget/settings/shared/FileChooser.ts @@ -7,6 +7,59 @@ const whiteListedThemeProp = [ "theme.bar.buttons.style" ]; + +// Helper functions +export const loadJsonFile = (filePath: string): object | null => { + let file = Gio.File.new_for_path(filePath as string); + let [success, content] = file.load_contents(null); + + if (!success) { + console.error(`Failed to import: ${filePath}`); + return null; + } + + let jsonString = new TextDecoder("utf-8").decode(content); + return JSON.parse(jsonString); +} + +export const saveConfigToFile = (config: object, filePath: string): void => { + let file = Gio.File.new_for_path(filePath); + let outputStream = file.replace(null, false, Gio.FileCreateFlags.NONE, null); + let dataOutputStream = new Gio.DataOutputStream({ base_stream: outputStream }); + + let jsonString = JSON.stringify(config, null, 2); + dataOutputStream.put_string(jsonString, null); + dataOutputStream.close(null); +} + +export const hexColorPattern = /^#([0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/; + +export const filterConfigForThemeOnly = (config: object) => { + let filteredConfig = {}; + + for (let key in config) { + if (typeof config[key] === 'string' && hexColorPattern.test(config[key])) { + filteredConfig[key] = config[key]; + } else if (whiteListedThemeProp.includes(key)) { + filteredConfig[key] = config[key]; + } + } + return filteredConfig; +}; + +export const filterConfigForNonTheme = (config: object) => { + let filteredConfig = {}; + for (let key in config) { + if (whiteListedThemeProp.includes(key)) { + continue; + } + if (!(typeof config[key] === 'string' && hexColorPattern.test(config[key]))) { + filteredConfig[key] = config[key]; + } + } + return filteredConfig; +}; + export const saveFileDialog = (filePath: string, themeOnly: boolean): void => { const original_file_path = filePath; @@ -134,18 +187,15 @@ export const importFiles = (themeOnly: boolean = false): void => { let response = dialog.run(); - if (response === Gtk.ResponseType.CANCEL) { dialog.destroy(); return; } if (response === Gtk.ResponseType.ACCEPT) { let filePath = dialog.get_filename(); - let file = Gio.File.new_for_path(filePath as string); - let [success, content] = file.load_contents(null); + let importedConfig = loadJsonFile(filePath as string); - if (!success) { - console.error(`Failed to import: ${filePath}`); + if (!importedConfig) { dialog.destroy(); return; } @@ -157,48 +207,6 @@ export const importFiles = (themeOnly: boolean = false): void => { timeout: 7000 }); - let jsonString = new TextDecoder("utf-8").decode(content); - let importedConfig = JSON.parse(jsonString); - - const hexColorPattern = /^#([0-9A-Fa-f]{6}|[0-9A-Fa-f]{8})$/; - - const saveConfigToFile = (config: object, filePath: string) => { - let file = Gio.File.new_for_path(filePath); - let outputStream = file.replace(null, false, Gio.FileCreateFlags.NONE, null); - let dataOutputStream = new Gio.DataOutputStream({ base_stream: outputStream }); - - let jsonString = JSON.stringify(config, null, 2); - dataOutputStream.put_string(jsonString, null); - dataOutputStream.close(null); - }; - - const filterConfigForThemeOnly = (config: object) => { - let filteredConfig = {}; - - for (let key in config) { - if (typeof config[key] === 'string' && hexColorPattern.test(config[key])) { - filteredConfig[key] = config[key]; - } else if (whiteListedThemeProp.includes(key)) { - filteredConfig[key] = config[key]; - } - } - return filteredConfig; - }; - - const filterConfigForNonTheme = (config: object) => { - let filteredConfig = {}; - for (let key in config) { - // do not add key-value pair if its in whiteListedThemeProp - if (whiteListedThemeProp.includes(key)) { - continue; - } - if (!(typeof config[key] === 'string' && hexColorPattern.test(config[key]))) { - filteredConfig[key] = config[key]; - } - } - return filteredConfig; - }; - let tmpConfigFile = Gio.File.new_for_path(`${TMP}/config.json`); let optionsConfigFile = Gio.File.new_for_path(OPTIONS);