import os.path from scripts import config from scripts.install.colors_definer import ColorsDefiner from scripts.utils.color_converter import ColorConverterImpl from scripts.utils.logger.console import Console from scripts.utils.theme.theme import Theme from scripts.utils.theme.theme_color_applier import ColorReplacementGenerator, ThemeColorApplier from scripts.utils.theme.theme_installer import ThemeInstaller from scripts.utils.theme.theme_path_provider import ThemePathProvider from scripts.utils.theme.theme_preparation import ThemePreparation from theme import SourceFolder class GnomeShellThemeBuilder: """ Builder for creating a Gnome Shell theme. Example: builder = GnomeShellThemeBuilder(colors_provider) theme = builder.with_mode("dark").filled().build() theme.prepare() theme.install(hue=200, name="MyTheme") """ def __init__(self, colors_provider: ColorsDefiner): self.theme_name = "gnome-shell" self.colors_provider = colors_provider self.source_folder = SourceFolder().gnome_shell self._base_temp_folder = config.temp_folder self.destination_folder = config.themes_folder self.mode = None self.is_filled = False self.temp_folder = os.path.join(self._base_temp_folder, self.theme_name) self.main_styles = os.path.join(self.temp_folder, f"{self.theme_name}.css") self.preparation: ThemePreparation | None = None self.installer: ThemeInstaller | None = None def __update_paths(self): """Update derived paths when base folder or theme name changes""" self.temp_folder = os.path.join(self._base_temp_folder, self.theme_name) self.main_styles = os.path.join(self.temp_folder, f"{self.theme_name}.css") def with_temp_folder(self, temp_folder: str): """Set the base temporary folder""" self._base_temp_folder = temp_folder self.__update_paths() return self def with_theme_name(self, theme_name: str): """Set the theme name""" self.theme_name = theme_name self.__update_paths() return self def with_mode(self, mode): self.mode = mode return self def filled(self, filled = True): self.is_filled = filled return self def build(self) -> "Theme": """ Constructs and returns a Theme instance using the configured properties. This method resolves all necessary dependencies for the theme's preparation and installation. The returned Theme will have the mode and filled options set according to the builder's configuration. :return: Theme instance ready for preparation and installation """ self._resolve_preparation() self._resolve_installer() return Theme(self.preparation, self.installer, self.mode, self.is_filled) def _resolve_preparation(self): if self.preparation is None: self.preparation = ThemePreparation(self.source_folder, self.temp_folder, self.main_styles) def _resolve_installer(self): if self.installer is not None: return color_converter = ColorConverterImpl() color_replacement_generator = ColorReplacementGenerator( colors_provider=self.colors_provider, color_converter=color_converter) color_applier = ThemeColorApplier(color_replacement_generator=color_replacement_generator) logger_factory = Console() path_provider = ThemePathProvider() self.installer = ThemeInstaller(self.theme_name, self.temp_folder, self.destination_folder, logger_factory=logger_factory, color_applier=color_applier, path_provider=path_provider)