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.style_manager import StyleManager 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 scripts.utils.theme.theme_temp_manager import ThemeTempManager 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 not None: return file_manager = ThemeTempManager(self.temp_folder) style_manager = StyleManager(self.main_styles) self.preparation = ThemePreparation(self.source_folder, file_manager=file_manager, style_manager=style_manager) 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)