import os from typing import TYPE_CHECKING from gi.repository import Gtk from oomox_gui.export_common import CommonGtkThemeExportDialog, CommonGtkThemeExportDialogOptions from oomox_gui.i18n import translate from oomox_gui.plugin_api import OomoxThemePlugin if TYPE_CHECKING: from typing import Any, Final from oomox_gui.preview import ThemePreview from oomox_gui.theme_file import ThemeT PLUGIN_DIR: "Final" = os.path.dirname(os.path.realpath(__file__)) GTK_THEME_DIR: "Final" = PLUGIN_DIR class OomoxThemeExportDialogOptions(CommonGtkThemeExportDialogOptions): GTK3_CURRENT_VERSION_ONLY = "self.OPTIONS.GTK3_CURRENT_VERSION_ONLY" EXPORT_CINNAMON_THEME = "self.OPTIONS.EXPORT_CINNAMON_THEME" class OomoxThemeExportDialog(CommonGtkThemeExportDialog): OPTIONS = OomoxThemeExportDialogOptions() timeout = 100 config_name = "gtk_theme_oomox" def do_export(self) -> None: export_path = os.path.expanduser( self.option_widgets[self.OPTIONS.DEFAULT_PATH].get_text(), ) new_destination_dir, theme_name = export_path.rsplit("/", 1) self.command = [ "bash", os.path.join(GTK_THEME_DIR, "change_color.sh"), "--hidpi", str(self.export_config[self.OPTIONS.GTK2_HIDPI]), "--target-dir", new_destination_dir, "--output", theme_name, self.temp_theme_path, ] make_opts = [] if self.export_config[self.OPTIONS.GTK3_CURRENT_VERSION_ONLY]: if Gtk.get_minor_version() >= 20: # noqa: PLR2004 make_opts += ["gtk320"] else: make_opts += ["gtk3"] else: make_opts += ["gtk3", "gtk320"] if self.export_config[self.OPTIONS.EXPORT_CINNAMON_THEME]: make_opts += ["css_cinnamon"] if make_opts: self.command += [ "--make-opts", " ".join(make_opts), ] super().do_export() def __init__( self, transient_for: Gtk.Window, colorscheme: "ThemeT", theme_name: str, **kwargs: "Any", ) -> None: super().__init__( transient_for=transient_for, colorscheme=colorscheme, theme_name=theme_name, add_options={ self.OPTIONS.GTK3_CURRENT_VERSION_ONLY: { "default": False, "display_name": translate( "Generate theme only for the current _GTK+3 version\n" "instead of both 3.18 and 3.20+", ), }, self.OPTIONS.EXPORT_CINNAMON_THEME: { "default": False, "display_name": translate("Generate theme for _Cinnamon"), }, }, **kwargs, ) class Plugin(OomoxThemePlugin): name = "oomox" display_name = "Oomox" description = ( "GTK+2, GTK+3, Qt5ct, Qt6ct\n" "Cinnamon, Metacity, Openbox, Unity, Xfwm" ) about_text = translate("The default theme, originally based on Numix GTK theme.") about_links = [ { "name": translate("Homepage"), "url": "https://github.com/themix-project/oomox-gtk-theme/", }, ] export_dialog = OomoxThemeExportDialog gtk_preview_dir = os.path.join(PLUGIN_DIR, "gtk_preview_css/") enabled_keys_gtk = [ "BG", "FG", "HDR_BG", "HDR_FG", "SEL_BG", "SEL_FG", "ACCENT_BG", "TXT_BG", "TXT_FG", "BTN_BG", "BTN_FG", "HDR_BTN_BG", "HDR_BTN_FG", "WM_BORDER_FOCUS", "WM_BORDER_UNFOCUS", ] enabled_keys_options = [ "ROUNDNESS", "SPACING", "GRADIENT", "GTK3_GENERATE_DARK", ] theme_model_gtk = [ { "key": "CARET1_FG", "type": "color", "fallback_key": "TXT_FG", "display_name": translate("Textbox Caret"), }, { "key": "CARET2_FG", "type": "color", "fallback_key": "TXT_FG", "display_name": translate("BiDi Textbox Caret"), }, ] theme_model_options = [ { "key": "CARET_SIZE", "type": "float", "fallback_value": 0.04, # GTK's default "display_name": translate("Textbox Caret Aspect Ratio"), }, { "type": "separator", "display_name": translate("GTK3 Theme Options"), "value_filter": { "THEME_STYLE": "oomox", }, }, { "key": "SPACING", "type": "int", "fallback_value": 3, "display_name": translate("Spacing"), }, { "key": "OUTLINE_WIDTH", "type": "int", "fallback_value": 1, "display_name": translate("Focused Outline Width"), }, { "key": "BTN_OUTLINE_WIDTH", "type": "int", "fallback_value": 1, "display_name": translate("Focused Button Outline Width"), }, { "key": "BTN_OUTLINE_OFFSET", "type": "int", "fallback_value": -3, "min_value": -20, "display_name": translate("Focused Button Outline Offset"), }, { "key": "GTK3_GENERATE_DARK", "type": "bool", "fallback_value": True, "display_name": translate("Add Dark Variant"), }, { "type": "separator", "display_name": translate("Desktop Environments"), "value_filter": { "THEME_STYLE": "oomox", }, }, { "key": "CINNAMON_OPACITY", "type": "float", "fallback_value": 1.0, "max_value": 1.0, "display_name": translate("Cinnamon: Opacity"), }, { "key": "UNITY_DEFAULT_LAUNCHER_STYLE", "type": "bool", "fallback_value": False, "display_name": translate("Unity: Use Default Launcher Style"), }, ] def preview_before_load_callback( self, preview_object: "ThemePreview", colorscheme: "ThemeT", # noqa: ARG002 ) -> None: preview_object.WM_BORDER_WIDTH = 2