Extracted installation methods, created a new class for theme installers

This commit is contained in:
Vladyslav Hroshev
2025-03-31 23:53:14 +03:00
parent 1bd1b781db
commit 860cacaa2c
10 changed files with 296 additions and 236 deletions
+1
View File
@@ -0,0 +1 @@
from scripts.install.arguments_definer import ArgumentsDefiner
+73
View File
@@ -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)
+17
View File
@@ -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"]
+28
View File
@@ -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)
+31
View File
@@ -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)
+74
View File
@@ -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