Extracted installation methods, created a new class for theme installers
This commit is contained in:
@@ -0,0 +1 @@
|
||||
from scripts.install.arguments_definer import ArgumentsDefiner
|
||||
@@ -0,0 +1,73 @@
|
||||
import argparse
|
||||
import textwrap
|
||||
from typing import Any
|
||||
|
||||
from scripts.tweaks_manager import TweaksManager
|
||||
|
||||
|
||||
class ArgumentsDefiner:
|
||||
def __init__(self, colors: dict[str, Any]):
|
||||
self._parser = argparse.ArgumentParser(prog="python install.py",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog=self._get_epilog())
|
||||
|
||||
self._define_default_arguments()
|
||||
self._define_color_arguments(colors)
|
||||
self._define_custom_color_arguments()
|
||||
self._define_theme_styles_arguments()
|
||||
self._define_color_tweaks_arguments()
|
||||
self._define_gdm_arguments()
|
||||
self._define_tweaks_arguments()
|
||||
|
||||
def parse(self) -> argparse.Namespace:
|
||||
return self._parser.parse_args()
|
||||
|
||||
@staticmethod
|
||||
def _get_epilog():
|
||||
return textwrap.dedent('''
|
||||
Examples:
|
||||
-a all accent colors, light & dark mode
|
||||
--all --mode dark all accent colors, dark mode
|
||||
--purple --mode=light purple accent color, light mode
|
||||
--hue 150 --name coldgreen custom coldgreen accent color, light & dark mode
|
||||
--red --green --sat=70 red, green accent colors, 70% of stock saturation
|
||||
--hue=200 --name=grayblue --sat=50 --mode=dark
|
||||
custom grayblue accent color, 50% of stock saturation, dark mode
|
||||
''')
|
||||
|
||||
def _define_default_arguments(self):
|
||||
self._parser.add_argument('-r', '--remove', action='store_true', help='remove Marble themes')
|
||||
self._parser.add_argument('-ri', '--reinstall', action='store_true', help='reinstall Marble themes')
|
||||
|
||||
def _define_color_arguments(self, colors: dict[str, Any]):
|
||||
default_args = self._parser.add_argument_group('Install default theme')
|
||||
default_args.add_argument('-a', '--all', action='store_true', help='all available accent colors')
|
||||
|
||||
for color in colors:
|
||||
default_args.add_argument(f'--{color}', action='store_true', help=f'{color} theme only')
|
||||
|
||||
def _define_custom_color_arguments(self):
|
||||
custom_args = self._parser.add_argument_group('Install custom color theme')
|
||||
custom_args.add_argument('--hue', type=int, choices=range(0, 361), help='generate theme from Hue prompt',
|
||||
metavar='(0 - 360)')
|
||||
custom_args.add_argument('--name', nargs='?', help='theme name (optional)')
|
||||
|
||||
def _define_theme_styles_arguments(self):
|
||||
color_styles = self._parser.add_argument_group("Theme color styles")
|
||||
color_styles.add_argument("--filled", action="store_true", help="make accent color more vibrant")
|
||||
|
||||
def _define_color_tweaks_arguments(self):
|
||||
color_tweaks = self._parser.add_argument_group('Optional theme tweaks')
|
||||
color_tweaks.add_argument('--mode', choices=['light', 'dark'], help='select a specific theme mode to install')
|
||||
color_tweaks.add_argument('--sat', type=int, choices=range(0, 251),
|
||||
help='custom color saturation (<100%% - reduce, >100%% - increase)',
|
||||
metavar='(0 - 250)')
|
||||
|
||||
def _define_gdm_arguments(self):
|
||||
gdm_theming = self._parser.add_argument_group('GDM theming')
|
||||
gdm_theming.add_argument('--gdm', action='store_true', help='install GDM theme. \
|
||||
Requires root privileges. You must specify a specific color.')
|
||||
|
||||
def _define_tweaks_arguments(self):
|
||||
tweaks_manager = TweaksManager()
|
||||
tweaks_manager.define_arguments(self._parser)
|
||||
@@ -0,0 +1,17 @@
|
||||
import json
|
||||
|
||||
|
||||
class ColorsDefiner:
|
||||
# TODO: Create a class for each replacer
|
||||
replacers: dict[ str, # ACCENT-COLOR
|
||||
dict[ str, # default, light/dark
|
||||
str | dict[str, int] # random string, s/l/a
|
||||
]
|
||||
]
|
||||
# TODO: Create a class for each color
|
||||
colors: dict[str, dict[str, int]]
|
||||
|
||||
def __init__(self, filename):
|
||||
colors_dict = json.load(open(filename))
|
||||
self.replacers = colors_dict["elements"]
|
||||
self.colors = colors_dict["colors"]
|
||||
@@ -0,0 +1,28 @@
|
||||
import os
|
||||
|
||||
from scripts import config
|
||||
from scripts.gdm import GlobalTheme
|
||||
from scripts.install.theme_installer import ThemeInstaller
|
||||
|
||||
|
||||
class GlobalThemeInstaller(ThemeInstaller):
|
||||
theme: GlobalTheme
|
||||
|
||||
def remove(self):
|
||||
gdm_rm_status = self.theme.remove()
|
||||
if gdm_rm_status == 0:
|
||||
print("GDM theme removed successfully.")
|
||||
|
||||
def _define_theme(self):
|
||||
gdm_temp = os.path.join(config.temp_folder, config.gdm_folder)
|
||||
self.theme = GlobalTheme(self.colors, f"{config.raw_theme_folder}/{config.gnome_folder}",
|
||||
config.global_gnome_shell_theme, config.gnome_shell_gresource,
|
||||
gdm_temp, mode=self.args.mode, is_filled=self.args.filled)
|
||||
|
||||
def _install_theme(self, hue, theme_name, sat):
|
||||
self.theme.prepare()
|
||||
self.theme.install(hue, sat)
|
||||
|
||||
def _apply_tweaks_to_theme(self):
|
||||
for theme in self.theme.themes:
|
||||
self._apply_tweaks(theme.theme)
|
||||
@@ -0,0 +1,31 @@
|
||||
import os.path
|
||||
|
||||
from scripts import config
|
||||
from scripts.install.theme_installer import ThemeInstaller
|
||||
from scripts.theme import Theme
|
||||
from scripts.utils import remove_files
|
||||
|
||||
|
||||
class LocalThemeInstaller(ThemeInstaller):
|
||||
theme: Theme
|
||||
|
||||
def remove(self):
|
||||
args = self.args
|
||||
colors = self.colors.colors
|
||||
if args.remove or args.reinstall:
|
||||
remove_files(args, colors)
|
||||
if not args.reinstall:
|
||||
return
|
||||
|
||||
def _define_theme(self):
|
||||
theme_folder = os.path.join(config.raw_theme_folder, config.gnome_folder)
|
||||
self.theme = Theme("gnome-shell", self.colors, theme_folder,
|
||||
config.themes_folder, config.temp_folder,
|
||||
mode=self.args.mode, is_filled=self.args.filled)
|
||||
|
||||
def _install_theme(self, hue, theme_name, sat):
|
||||
self.theme.prepare()
|
||||
self.theme.install(hue, theme_name, sat)
|
||||
|
||||
def _apply_tweaks_to_theme(self):
|
||||
self._apply_tweaks(self.theme)
|
||||
@@ -0,0 +1,74 @@
|
||||
import argparse
|
||||
|
||||
from scripts.install.colors_definer import ColorsDefiner
|
||||
from scripts.theme import Theme
|
||||
from scripts.tweaks_manager import TweaksManager
|
||||
|
||||
|
||||
class ThemeInstaller:
|
||||
theme: Theme
|
||||
|
||||
def __init__(self, args: argparse.Namespace, colors: ColorsDefiner):
|
||||
self.args = args
|
||||
self.colors = colors
|
||||
self.stop_after_first_installed_color = False
|
||||
self._define_theme()
|
||||
|
||||
def remove(self):
|
||||
pass
|
||||
|
||||
def install(self):
|
||||
self.theme.prepare()
|
||||
self._apply_tweaks_to_theme()
|
||||
self._apply_colors()
|
||||
|
||||
def _define_theme(self):
|
||||
pass
|
||||
|
||||
def _install_theme(self, hue, theme_name, sat):
|
||||
pass
|
||||
|
||||
def _apply_tweaks_to_theme(self):
|
||||
pass
|
||||
|
||||
def _apply_tweaks(self, theme):
|
||||
tweaks_manager = TweaksManager()
|
||||
tweaks_manager.apply_tweaks(self.args, theme, self.colors)
|
||||
|
||||
def _apply_colors(self):
|
||||
installed_any = False
|
||||
|
||||
if self.args.hue:
|
||||
installed_any = True
|
||||
self._apply_custom_color()
|
||||
else:
|
||||
installed_any = self._apply_default_color()
|
||||
|
||||
if not installed_any:
|
||||
raise Exception('No color arguments specified. Use -h or --help to see the available options.')
|
||||
|
||||
def _apply_custom_color(self):
|
||||
name = self.args.name
|
||||
hue = self.args.hue
|
||||
sat = self.args.sat
|
||||
|
||||
theme_name = name if name else f'hue{hue}'
|
||||
self._install_theme(hue, theme_name, sat)
|
||||
|
||||
def _apply_default_color(self) -> bool:
|
||||
colors = self.colors.colors
|
||||
args = self.args
|
||||
installed_any = False
|
||||
|
||||
for color, values in colors.items():
|
||||
if self.args.all or getattr(self.args, color, False):
|
||||
hue = values.get('h')
|
||||
sat = values.get('s', args.sat) # if saturation already defined in color (gray)
|
||||
|
||||
self._install_theme(hue, color, sat)
|
||||
installed_any = True
|
||||
|
||||
if self.stop_after_first_installed_color:
|
||||
break
|
||||
|
||||
return installed_any
|
||||
Reference in New Issue
Block a user