Files
Marble-shell-theme/scripts/install/theme_installer.py
Vladyslav Hroshev ca4e4d4cbe Refactor GDM module to correspond SOLID principles
- I don't know how I will support this hell ahh code;
- Added some methods to gnome_shell_theme_builder.py;
- Added "color" property "install" method from theme_base.py.
2025-04-12 23:30:34 +03:00

90 lines
2.7 KiB
Python

import argparse
import concurrent.futures
from abc import ABC, abstractmethod
from scripts.install.colors_definer import ColorsDefiner
from scripts.types.theme_base import ThemeBase
from scripts.tweaks_manager import TweaksManager
class ThemeInstaller(ABC):
"""Base class for theme installers"""
theme: ThemeBase
def __init__(self, args: argparse.Namespace, colors: ColorsDefiner):
self.args = args
self.colors = colors
self._define_theme()
@abstractmethod
def remove(self):
"""Method for removing already installed themes"""
pass
def install(self):
self.theme.prepare()
self._apply_tweaks_to_theme()
self._apply_colors()
self._after_install()
@abstractmethod
def _define_theme(self):
"""Here is the place to define the theme object"""
pass
@abstractmethod
def _apply_tweaks_to_theme(self):
"""Should apply the tweaks for prepared theme"""
pass
@abstractmethod
def _after_install(self):
"""Method to be called after the theme is installed. Can be used for logging or other actions"""
pass
def _apply_tweaks(self, theme):
"""This method should be called in the _apply_tweaks_to_theme method"""
tweaks_manager = TweaksManager()
tweaks_manager.apply_tweaks(self.args, theme, self.colors)
def _apply_colors(self):
if self.args.hue:
self._apply_custom_color()
return
if self._apply_default_color():
return
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.theme.install(hue, theme_name, sat)
def _apply_default_color(self) -> bool:
colors = self.colors.colors
args = self.args
colors_to_install = []
for color, values in colors.items():
if args.all or getattr(args, color, False):
hue = values.get('h')
sat = values.get('s', args.sat)
colors_to_install.append((hue, color, sat))
if not colors_to_install:
return False
self._run_concurrent_installation(colors_to_install)
return True
def _run_concurrent_installation(self, colors_to_install):
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = [executor.submit(self.theme.install, hue, color, sat)
for hue, color, sat in colors_to_install]
for future in concurrent.futures.as_completed(futures):
future.result()