mirror of
https://github.com/imarkoff/Marble-shell-theme.git
synced 2025-09-17 00:38:39 -07:00
- 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.
90 lines
2.7 KiB
Python
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() |