2023-05-20 00:37:21 +02:00
import path from "path" ;
import Config from "@data/config" ;
import AddonError from "@structs/addonerror" ;
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
2023-05-20 00:37:21 +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-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 extension ( ) { return ".theme.css" ; }
2021-04-05 07:43:30 +02:00
get duplicatePattern ( ) { return /\.theme\s?\([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 ( ) ;
2022-10-03 10:40:18 +02:00
Settings . registerPanel ( "themes" , Strings . Panels . themes , {
order : 4 ,
2023-03-20 04:41:39 +01:00
element : SettingsRenderer . getAddonPanel ( Strings . Panels . themes , this . addonList , this . state , {
2022-10-03 10:40:18 +02:00
type : this . prefix ,
folder : this . addonFolder ,
onChange : this . toggleTheme . bind ( this ) ,
reload : this . reloadTheme . bind ( this ) ,
refreshList : this . updateThemeList . bind ( this ) ,
saveAddon : this . saveAddon . bind ( this ) ,
editAddon : this . editAddon . bind ( this ) ,
deleteAddon : this . deleteAddon . bind ( this ) ,
2024-02-22 06:06:30 +01:00
enableAll : this . enableAllAddons . bind ( this ) ,
disableAll : this . disableAllAddons . bind ( this ) ,
2022-10-03 10:40:18 +02:00
prefix : this . prefix
} )
} ) ;
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-04-06 20:09:43 +02:00
loadAddon ( filename , shouldCTE = true ) {
2021-04-07 03:40:19 +02:00
const error = super . loadAddon ( filename , shouldCTE ) ;
2021-04-06 20:09:43 +02:00
if ( error && shouldCTE ) Modals . showAddonErrors ( { themes : [ error ] } ) ;
return error ;
2019-05-28 20:19:48 +02:00
}
2019-06-08 08:35:43 +02:00
/* Overrides */
2022-07-08 16:42:04 +02:00
initializeAddon ( addon ) {
if ( ! addon . name || ! addon . author || ! addon . description || ! addon . version ) return new AddonError ( addon . name || addon . filename , addon . filename , "Addon is missing name, author, description, or version" , { message : "Addon must provide name, author, description, and version." , stack : "" } , this . prefix ) ;
}
requireAddon ( filename ) {
const addon = super . requireAddon ( filename ) ;
addon . css = addon . fileContent ;
delete addon . fileContent ;
if ( addon . format == "json" ) addon . css = addon . css . split ( "\n" ) . slice ( 1 ) . join ( "\n" ) ;
return addon ;
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 ;
2022-07-08 16:42:04 +02:00
DOMManager . injectTheme ( addon . slug + "-theme-container" , 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 ;
2022-07-08 16:42:04 +02:00
DOMManager . removeTheme ( addon . slug + "-theme-container" ) ;
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
}
} ;