2019-06-08 08:35:43 +02:00
|
|
|
import {Config} from "data";
|
2019-06-27 22:18:40 +02:00
|
|
|
import AddonManager from "./addonmanager";
|
2019-06-09 04:24:05 +02:00
|
|
|
import Settings from "./settingsmanager";
|
2019-06-19 05:09:49 +02:00
|
|
|
import DOMManager from "./dommanager";
|
2019-06-25 22:36:34 +02:00
|
|
|
import Strings from "./strings";
|
2019-06-23 06:11:50 +02:00
|
|
|
|
|
|
|
import Toasts from "../ui/toasts";
|
|
|
|
import Modals from "../ui/modals";
|
|
|
|
import SettingsRenderer from "../ui/settings";
|
2019-05-28 20:19:48 +02:00
|
|
|
|
2019-06-08 08:35:43 +02:00
|
|
|
const path = require("path");
|
2019-05-28 20:19:48 +02:00
|
|
|
|
2019-06-27 22:18:40 +02:00
|
|
|
export default new class ThemeManager extends AddonManager {
|
2019-06-08 08:35:43 +02:00
|
|
|
get name() {return "ThemeManager";}
|
|
|
|
get moduleExtension() {return ".css";}
|
|
|
|
get extension() {return ".theme.css";}
|
2020-10-04 02:59:01 +02:00
|
|
|
get duplicatePattern() {return /\.theme\([0-9]+\)\.css/;}
|
2019-06-27 22:18:40 +02:00
|
|
|
get addonFolder() {return path.resolve(Config.dataPath, "themes");}
|
2019-06-08 08:35:43 +02:00
|
|
|
get prefix() {return "theme";}
|
2019-06-30 07:32:14 +02:00
|
|
|
get language() {return "css";}
|
2019-05-28 20:19:48 +02:00
|
|
|
|
2021-03-18 22:50:47 +01:00
|
|
|
initialize() {
|
|
|
|
const errors = super.initialize();
|
2019-06-27 22:18:40 +02:00
|
|
|
Settings.registerPanel("themes", Strings.Panels.themes, {element: () => SettingsRenderer.getAddonPanel(Strings.Panels.themes, this.addonList, this.state, {
|
2020-11-07 07:03:29 +01:00
|
|
|
type: this.prefix,
|
2019-06-27 22:18:40 +02:00
|
|
|
folder: this.addonFolder,
|
2019-06-10 00:37:46 +02:00
|
|
|
onChange: this.toggleTheme.bind(this),
|
|
|
|
reload: this.reloadTheme.bind(this),
|
2019-06-30 07:32:14 +02:00
|
|
|
refreshList: this.updateThemeList.bind(this),
|
|
|
|
saveAddon: this.saveAddon.bind(this),
|
|
|
|
editAddon: this.editAddon.bind(this),
|
|
|
|
deleteAddon: this.deleteAddon.bind(this),
|
|
|
|
prefix: this.prefix
|
2019-06-10 00:37:46 +02:00
|
|
|
})});
|
2019-06-24 21:47:24 +02:00
|
|
|
return errors;
|
2019-06-09 04:24:05 +02:00
|
|
|
}
|
2019-05-28 20:19:48 +02:00
|
|
|
|
2019-06-24 21:47:24 +02:00
|
|
|
/* Aliases */
|
|
|
|
updateThemeList() {return this.updateList();}
|
2019-06-27 22:18:40 +02:00
|
|
|
loadAllThemes() {return this.loadAllAddons();}
|
2019-06-24 21:47:24 +02:00
|
|
|
|
2019-06-27 22:18:40 +02:00
|
|
|
enableTheme(idOrAddon) {return this.enableAddon(idOrAddon);}
|
|
|
|
disableTheme(idOrAddon) {return this.disableAddon(idOrAddon);}
|
|
|
|
toggleTheme(id) {return this.toggleAddon(id);}
|
2019-05-28 20:19:48 +02:00
|
|
|
|
2019-06-27 22:18:40 +02:00
|
|
|
unloadTheme(idOrFileOrAddon) {return this.unloadAddon(idOrFileOrAddon);}
|
2020-10-06 23:44:10 +02:00
|
|
|
loadTheme(filename) {return this.loadAddon(filename);}
|
2021-03-18 22:50:47 +01:00
|
|
|
reloadTheme(idOrFileOrAddon) {return this.reloadAddon(idOrFileOrAddon);}
|
2019-05-28 20:19:48 +02:00
|
|
|
|
2021-03-18 22:50:47 +01:00
|
|
|
loadAddon(filename) {
|
|
|
|
const error = super.loadAddon(filename);
|
2019-06-27 22:18:40 +02:00
|
|
|
if (error) Modals.showAddonErrors({themes: [error]});
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
|
|
|
|
2019-06-08 08:35:43 +02:00
|
|
|
/* Overrides */
|
2019-06-27 22:18:40 +02:00
|
|
|
getFileModification(module, fileContent, meta) {
|
|
|
|
meta.css = fileContent;
|
2019-06-08 08:35:43 +02:00
|
|
|
return `module.exports = ${JSON.stringify(meta)};`;
|
2019-06-19 21:24:05 +02:00
|
|
|
}
|
2019-06-08 08:35:43 +02:00
|
|
|
|
2019-06-27 22:18:40 +02:00
|
|
|
startAddon(id) {return this.addTheme(id);}
|
|
|
|
stopAddon(id) {return this.removeTheme(id);}
|
2019-06-08 08:35:43 +02:00
|
|
|
|
2019-06-27 22:18:40 +02:00
|
|
|
addTheme(idOrAddon) {
|
|
|
|
const addon = typeof(idOrAddon) == "string" ? this.addonList.find(p => p.id == idOrAddon) : idOrAddon;
|
|
|
|
if (!addon) return;
|
|
|
|
DOMManager.injectTheme(addon.id, addon.css);
|
2020-07-18 04:24:20 +02:00
|
|
|
Toasts.show(Strings.Addons.enabled.format({name: addon.name, version: addon.version}));
|
2019-05-28 20:19:48 +02:00
|
|
|
}
|
|
|
|
|
2019-06-27 22:18:40 +02:00
|
|
|
removeTheme(idOrAddon) {
|
|
|
|
const addon = typeof(idOrAddon) == "string" ? this.addonList.find(p => p.id == idOrAddon) : idOrAddon;
|
|
|
|
if (!addon) return;
|
|
|
|
DOMManager.removeTheme(addon.id);
|
2020-07-18 04:24:20 +02:00
|
|
|
Toasts.show(Strings.Addons.disabled.format({name: addon.name, version: addon.version}));
|
2019-06-08 08:35:43 +02:00
|
|
|
}
|
|
|
|
};
|