class Plugin(OomoxExportPlugin): name = 'spotify' display_name = _("Apply Spotif_y Theme…") export_dialog = SpotifyExportDialog theme_model_extra = [ { 'type': 'separator', 'display_name': _('Spotify') }, { 'key': 'SPOTIFY_PROTO_BG', 'type': 'color', 'fallback_key': 'HDR_BG', 'display_name': _('Background'), }, { 'key': 'SPOTIFY_PROTO_FG', 'type': 'color', 'fallback_key': 'HDR_FG', 'display_name': _('Foreground'), }, { 'key': 'SPOTIFY_PROTO_SEL', 'type': 'color', 'fallback_key': 'SEL_BG', 'display_name': _('Accent Color'), }, ]
def __init__(self, transient_for, colorscheme, theme_name, **kwargs): default_themes_path = os.path.join(os.environ['HOME'], '.themes') super().__init__( transient_for=transient_for, colorscheme=colorscheme, theme_name=theme_name, add_options={ OPTION_GTK3_CURRENT_VERSION_ONLY: { 'default': False, 'display_name': _("Generate theme only for the current _GTK+3 version\n" "instead of both 3.18 and 3.20+"), }, OPTION_EXPORT_CINNAMON_THEME: { 'default': False, 'display_name': _("Generate theme for _Cinnamon"), }, OPTION_DEFAULT_PATH: { 'default': default_themes_path, 'display_name': _("Export _path: "), }, }, **kwargs ) self.option_widgets[OPTION_DEFAULT_PATH].set_text( os.path.join( self.export_config[OPTION_DEFAULT_PATH], self.theme_name, ) )
class Plugin(OomoxIconsPlugin): name = 'papirus_icons' display_name = 'Papirus' export_dialog = PapirusIconsExportDialog preview_svg_dir = os.path.join(PLUGIN_DIR, "icon_previews/") theme_model_icons = [ { 'key': 'ICONS_LIGHT_FOLDER', 'type': 'color', 'fallback_key': 'SEL_BG', 'display_name': _('Light Base (Folders)'), }, { 'key': 'ICONS_MEDIUM', 'type': 'color', 'fallback_key': 'BTN_BG', 'display_name': _('Medium Base'), }, { 'key': 'ICONS_DARK', 'type': 'color', 'fallback_key': 'HDR_BG', 'display_name': _('Dark Stroke'), }, { 'key': 'ICONS_SYMBOLIC_ACTION', 'type': 'color', 'fallback_function': lambda colors: mix_theme_colors(colors['MENU_FG'], colors['BTN_FG' ], 0.66), 'display_name': _('Actions Icons'), }, { 'key': 'ICONS_SYMBOLIC_PANEL', 'type': 'color', 'fallback_key': 'FG', 'display_name': _('Panel Icons'), }, ] def preview_transform_function(self, svg_template, colorscheme): return svg_template.replace( "%LIGHT%", colorscheme["ICONS_LIGHT_FOLDER"] or FALLBACK_COLOR).replace( "%MEDIUM%", colorscheme["ICONS_MEDIUM"] or FALLBACK_COLOR).replace( "%DARK%", colorscheme["ICONS_DARK"] or FALLBACK_COLOR).replace( "%SYMBOLIC_ACTION%", colorscheme["ICONS_SYMBOLIC_ACTION"] or FALLBACK_COLOR).replace( "%SYMBOLIC_PANEL%", colorscheme["ICONS_SYMBOLIC_PANEL"] or FALLBACK_COLOR)
def __init__(self, *args, **kwargs): super().__init__( *args, height=800, width=800, headline=_("Base16 Export Options…"), **kwargs ) self.label.set_text(_("Choose export options below and copy-paste the result.")) self.export_config = ExportConfig( config_name='base16', default_config={ ConfigKeys.last_variant: None, ConfigKeys.last_app: None, } ) self.templates_dir = os.path.abspath( os.path.join(PLUGIN_DIR, 'base16_mirror/templates') ) templates_index_path = self.templates_dir + '.yaml' with open(templates_index_path) as templates_index_file: self.templates_homepages = yaml.load(templates_index_file.read()) # APPS self.available_apps = sorted(os.listdir(self.templates_dir)) self.current_app = self.export_config[ConfigKeys.last_app] if not self.current_app: self.current_app = self.export_config[ConfigKeys.last_app] = self.available_apps[0] hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10) apps_label = Gtk.Label(label=_('_Application:'), use_underline=True) self._init_apps_dropdown() apps_label.set_mnemonic_widget(self._apps_dropdown) hbox.add(apps_label) hbox.add(self._apps_dropdown) # VARIANTS variant_label = Gtk.Label(label=_('_Variant:'), use_underline=True) self._init_variants_dropdown() variant_label.set_mnemonic_widget(self._variants_dropdown) hbox.add(variant_label) hbox.add(self._variants_dropdown) # HOMEPAGE self._homepage_button = Gtk.Button(label=_('Open _Homepage'), use_underline=True) self._homepage_button.connect('clicked', self._on_homepage_button) hbox.add(self._homepage_button) self.options_box.add(hbox) self.box.add(self.options_box) self.options_box.show_all()
def __init__(self, *args, **kwargs): default_icons_path = os.path.join(os.environ['HOME'], '.icons') if os.environ.get('XDG_CURRENT_DESKTOP', '').lower() in ('kde', 'lxqt', ): default_icons_path = os.path.join( os.environ.get( 'XDG_DATA_HOME', os.path.join(os.environ['HOME'], '.local/share') ), 'icons', ) super().__init__( *args, export_options={ OPTION_DEFAULT_PATH: { 'default': default_icons_path, 'display_name': _("Export _path: "), }, }, **kwargs ) self.option_widgets[OPTION_DEFAULT_PATH].set_text( os.path.join( self.export_config[OPTION_DEFAULT_PATH], self.theme_name, ) )
def generate_terminal_palette( # pylint: disable=too-many-arguments cls, template_path, image_path, result_callback, ): from oomox_gui.theme_model import get_first_theme_option quality = get_first_theme_option('_PIL_PALETTE_QUALITY', {}).get('fallback_value') use_whole_palette = bool( get_first_theme_option('_PIL_PALETTE_STRICT', {}).get('fallback_value') ) inverse_palette = bool( get_first_theme_option('_PIL_PALETTE_INVERSE', {}).get('fallback_value') ) _id = template_path+image_path+str(quality)+str(use_whole_palette)+str(inverse_palette) def _result_callback(generated_palette): cls._terminal_palette_cache[_id] = generated_palette palette = {} palette.update(cls._terminal_palette_cache[_id]) result_callback(palette) if not cls._terminal_palette_cache.get(_id): _app = cls.get_app() _app.disable(_('Generating terminal palette…')) _app.schedule_task( cls._generate_terminal_palette, template_path, image_path, quality, use_whole_palette, inverse_palette, _result_callback ) _app.enable() else: _result_callback(cls._terminal_palette_cache[_id])
def __init__(self, *args, **kwargs): default_icons_path = os.path.join(os.environ['HOME'], '.icons') if os.environ.get('XDG_CURRENT_DESKTOP', '').lower() in ( 'kde', 'lxqt', ): default_icons_path = os.path.join( os.environ.get( 'XDG_DATA_HOME', os.path.join(os.environ['HOME'], '.local/share')), 'icons', ) super().__init__(*args, export_options={ OPTION_DEFAULT_PATH: { 'default': default_icons_path, 'display_name': _("Export _path: "), }, }, **kwargs) self.option_widgets[OPTION_DEFAULT_PATH].set_text( os.path.join( self.export_config[OPTION_DEFAULT_PATH], self.theme_name, ))
def __init__(self, transient_for, colorscheme, theme_name, **kwargs): super().__init__( transient_for=transient_for, colorscheme=colorscheme, theme_name=theme_name, add_options={ OPTION_GTK3_CURRENT_VERSION_ONLY: { 'default': False, 'display_name': _("Generate theme only for the current _GTK+3 version\n" "instead of both 3.18 and 3.20+"), }, OPTION_EXPORT_CINNAMON_THEME: { 'default': False, 'display_name': _("Generate theme for _Cinnamon"), }, }, **kwargs )
def __init__(self, transient_for, colorscheme, theme_name, **kwargs): super().__init__( transient_for=transient_for, colorscheme=colorscheme, theme_name=theme_name, add_options={ OPTION_GTK3_CURRENT_VERSION_ONLY: { 'default': False, 'display_name': _("Generate theme only for the current _GTK+3 version\n" "instead of both 3.18 and 3.20+"), }, OPTION_EXPORT_CINNAMON_THEME: { 'default': False, 'display_name': _("Generate theme for _Cinnamon"), }, }, **kwargs )
class Plugin(OomoxIconsPlugin): name = 'gnome_colors' display_name = 'Gnome-Colors' export_dialog = GnomeColorsIconsExportDialog preview_svg_dir = os.path.join(PLUGIN_DIR, "icon_previews/") theme_model_icons = [ { 'key': 'ICONS_LIGHT_FOLDER', 'type': 'color', 'fallback_key': 'SEL_BG', 'display_name': _('Light Base (Folders)'), }, { 'key': 'ICONS_LIGHT', 'fallback_key': 'SEL_BG', 'type': 'color', 'display_name': _('Light Base'), }, { 'key': 'ICONS_MEDIUM', 'type': 'color', 'fallback_key': 'BTN_BG', 'display_name': _('Medium Base'), }, { 'key': 'ICONS_DARK', 'type': 'color', 'fallback_key': 'HDR_BG', 'display_name': _('Dark Stroke'), }, ] def preview_transform_function(self, svg_template, colorscheme): return svg_template.replace( "LightFolderBase", colorscheme["ICONS_LIGHT_FOLDER"] or FALLBACK_COLOR).replace( "LightBase", colorscheme["ICONS_LIGHT"] or FALLBACK_COLOR).replace( "MediumBase", colorscheme["ICONS_MEDIUM"] or FALLBACK_COLOR).replace( "DarkStroke", colorscheme["ICONS_DARK"] or FALLBACK_COLOR)
def __init__(self, transient_for, colorscheme, theme_name): super().__init__(transient_for=transient_for, headline=_("Spotify Options"), colorscheme=colorscheme, theme_name=theme_name) self.label.hide() self.export_config = ExportConfig(config_name='spotify', default_config={ OPTION_SPOTIFY_PATH: "/usr/share/spotify/Apps", OPTION_FONT_NAME: "sans-serif", OPTION_FONT_OPTIONS: VALUE_FONT_DEFAULT, }) export_options_headline = Gtk.Label() export_options_headline.set_markup('<b>' + _("Font Options") + '</b>') export_options_headline.set_justify(Gtk.Justification.LEFT) export_options_headline.set_alignment(0.0, 0.0) self.options_box.add(export_options_headline) self._init_radios() hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) spotify_path_label = Gtk.Label(label=_('Spotify _path:'), use_underline=True) self.spotify_path_entry = Gtk.Entry( text=self.export_config[OPTION_SPOTIFY_PATH]) spotify_path_label.set_mnemonic_widget(self.spotify_path_entry) hbox.add(spotify_path_label) hbox.add(self.spotify_path_entry) self.options_box.add(hbox) self.box.add(self.options_box) self.options_box.show_all() self.box.add(self.apply_button) self.apply_button.show()
def __init__(self, transient_for, colorscheme, theme_name, **kwargs): super().__init__(transient_for=transient_for, colorscheme=colorscheme, theme_name=theme_name, override_options={ OPTION_EXPORT_CINNAMON_THEME: { 'default': False, 'display_name': _("Generate theme for _Cinnamon"), }, OPTION_EXPORT_GNOME_SHELL_THEME: { 'default': False, 'display_name': _("Generate theme for Gnome _Shell"), }, OPTION_EXPORT_XFWM_THEME: { 'default': False, 'display_name': _("Generate theme for _Xfwm"), }, }, **kwargs)
def _init_radios(self): self.font_radio_default = \ Gtk.RadioButton.new_with_mnemonic_from_widget( None, _("Don't change _default font") ) self.font_radio_default.connect("toggled", self.on_font_radio_toggled, VALUE_FONT_DEFAULT) self.options_box.add(self.font_radio_default) self.font_radio_normalize = \ Gtk.RadioButton.new_with_mnemonic_from_widget( self.font_radio_default, _("_Normalize font weight") ) self.font_radio_normalize.connect("toggled", self.on_font_radio_toggled, VALUE_FONT_NORMALIZE) self.options_box.add(self.font_radio_normalize) self.font_radio_custom = Gtk.RadioButton.new_with_mnemonic_from_widget( self.font_radio_default, _("Use custom _font:")) self.font_radio_custom.connect("toggled", self.on_font_radio_toggled, VALUE_FONT_CUSTOM) self.options_box.add(self.font_radio_custom) self.font_name_entry = Gtk.Entry( text=self.export_config[OPTION_FONT_NAME]) self.options_box.add(self.font_name_entry) self.font_name_entry.set_sensitive( self.export_config[OPTION_FONT_OPTIONS] == VALUE_FONT_CUSTOM) if self.export_config[OPTION_FONT_OPTIONS] == VALUE_FONT_NORMALIZE: self.font_radio_normalize.set_active(True) if self.export_config[OPTION_FONT_OPTIONS] == VALUE_FONT_CUSTOM: self.font_radio_custom.set_active(True)
def __init__(self, transient_for, colorscheme, theme_name, **kwargs): default_themes_path = os.path.join(os.environ['HOME'], '.themes') super().__init__(transient_for=transient_for, colorscheme=colorscheme, theme_name=theme_name, add_options={ OPTION_DEFAULT_PATH: { 'default': default_themes_path, 'display_name': _("Export _path: "), }, }, **kwargs) self.option_widgets[OPTION_DEFAULT_PATH].set_text( os.path.join( self.export_config[OPTION_DEFAULT_PATH], self.theme_name, ))
def _generate_terminal_palette( # noqa pylint: disable=too-many-arguments,too-many-locals,too-many-branches,too-many-statements cls, template_path, image_path, quality, use_whole_palette, inverse_palette, result_callback, ): start_time = time() _id = cls._generate_palette_id(image_path, quality, use_whole_palette) hex_palette = cls._palette_cache.get(_id) if hex_palette: cls._generate_terminal_palette_callback( hex_palette, template_path, inverse_palette, result_callback ) else: _app = cls.get_app() _app.disable(_('Extracting palette from image…')) _app.schedule_task( cls._generate_terminal_palette_task, template_path, image_path, quality, use_whole_palette, inverse_palette, start_time, result_callback, ) _app.enable()
class Plugin(OomoxIconsPlugin): name = 'archdroid' display_name = 'Archdroid' export_dialog = ArchdroidIconsExportDialog preview_svg_dir = os.path.join(PLUGIN_DIR, "icon_previews/") theme_model_icons = [ { 'key': 'ICONS_ARCHDROID', 'type': 'color', 'fallback_key': 'SEL_BG', 'display_name': _('Icons Color'), }, ] def preview_transform_function(self, svg_template, colorscheme): return svg_template.replace( "%ICONS_ARCHDROID%", colorscheme["ICONS_ARCHDROID"] or FALLBACK_COLOR)
class Plugin(PluginBase): name = 'base16' display_name = _('Base16') user_presets_display_name = _('Base16 User-Imported') export_text = _('Base16-Based Templates…') import_text = _('From Base16 YML Format') export_dialog = Base16ExportDialog file_extensions = ( '.yml', '.yaml', ) plugin_theme_dir = os.path.abspath( os.path.join(PLUGIN_DIR, 'base16_mirror/schemes')) theme_model_import = [ { 'display_name': _('Base16 Import Options'), 'type': 'separator', 'value_filter': { 'FROM_PLUGIN': name, }, }, { 'key': 'BASE16_GENERATE_DARK', 'type': 'bool', 'fallback_value': False, 'display_name': _('Inverse GUI Variant'), 'reload_theme': True, }, { 'key': 'BASE16_INVERT_TERMINAL', 'type': 'bool', 'fallback_value': False, 'display_name': _('Inverse Terminal Colors'), 'reload_theme': True, }, { 'key': 'BASE16_MILD_TERMINAL', 'type': 'bool', 'fallback_value': False, 'display_name': _('Mild Terminal Colors'), 'reload_theme': True, }, { 'display_name': _('Edit Imported Theme'), 'type': 'separator', 'value_filter': { 'FROM_PLUGIN': name, }, }, ] default_theme = { "TERMINAL_THEME_MODE": "manual", } translation_common = {} translation_common.update(OOMOX_TO_BASE16_TRANSLATION) translation_light = { "BG": "base05", "FG": "base00", "HDR_BG": "base04", "HDR_FG": "base01", "SEL_BG": "base0D", "SEL_FG": "base00", "ACCENT_BG": "base0D", "TXT_BG": "base06", "TXT_FG": "base01", "BTN_BG": "base03", "BTN_FG": "base07", "HDR_BTN_BG": "base05", "HDR_BTN_FG": "base01", "ICONS_LIGHT_FOLDER": "base0C", "ICONS_LIGHT": "base0C", "ICONS_MEDIUM": "base0D", "ICONS_DARK": "base03", } translation_dark = { "BG": "base01", "FG": "base06", "HDR_BG": "base00", "HDR_FG": "base05", "SEL_BG": "base0E", "SEL_FG": "base00", "ACCENT_BG": "base0E", "TXT_BG": "base02", "TXT_FG": "base07", "BTN_BG": "base00", "BTN_FG": "base05", "HDR_BTN_BG": "base01", "HDR_BTN_FG": "base05", "ICONS_LIGHT_FOLDER": "base0D", "ICONS_LIGHT": "base0D", "ICONS_MEDIUM": "base0E", "ICONS_DARK": "base00", } translation_terminal_inverse = { "TERMINAL_BACKGROUND": "base06", "TERMINAL_FOREGROUND": "base01", } translation_terminal_mild = { "TERMINAL_COLOR8": "base01", "TERMINAL_COLOR15": "base06", "TERMINAL_BACKGROUND": "base07", "TERMINAL_FOREGROUND": "base02", } translation_terminal_mild_inverse = { "TERMINAL_COLOR8": "base01", "TERMINAL_COLOR15": "base06", "TERMINAL_BACKGROUND": "base02", "TERMINAL_FOREGROUND": "base07", } def read_colorscheme_from_path(self, preset_path): # pylint:disable=bad-option-value,import-outside-toplevel from oomox_gui.theme_model import get_first_theme_option base16_theme = {} with open(preset_path) as preset_file: for line in preset_file.readlines(): try: key, value, *_rest = line.split() key = key.rstrip(':') value = value.strip('\'"').lower() base16_theme[key] = value except Exception: pass oomox_theme = {} oomox_theme.update(self.default_theme) translation = {} translation.update(self.translation_common) if get_first_theme_option('BASE16_GENERATE_DARK', {}).get('fallback_value'): translation.update(self.translation_dark) else: translation.update(self.translation_light) if get_first_theme_option('BASE16_INVERT_TERMINAL', {}).get('fallback_value'): translation.update(self.translation_terminal_inverse) if get_first_theme_option('BASE16_MILD_TERMINAL', {}).get('fallback_value'): if get_first_theme_option('BASE16_INVERT_TERMINAL', {}).get('fallback_value'): translation.update(self.translation_terminal_mild) else: translation.update(self.translation_terminal_mild_inverse) for oomox_key, base16_key in translation.items(): if base16_key in base16_theme: oomox_theme[oomox_key] = base16_theme[base16_key] return oomox_theme
class Plugin(OomoxImportPlugin): name = 'import_base16' display_name = 'Base16 YML format import' file_extensions = ('.yml', ) theme_model_import = [ { 'display_name': _('Import Base16 colortheme:'), 'type': 'separator', 'value_filter': { 'FROM_PLUGIN': 'import_base16', }, }, { 'key': 'BASE16_GENERATE_DARK', 'type': 'bool', 'fallback_value': False, 'display_name': _('Generate dark GUI variant'), 'reload_theme': True, }, { 'display_name': _('Theme options:'), 'type': 'separator', 'value_filter': { 'FROM_PLUGIN': 'import_base16', }, }, ] default_theme = { "TERMINAL_THEME_MODE": "manual", } translation_common = { "NAME": "scheme", "TERMINAL_COLOR0": "base00", "TERMINAL_COLOR1": "base08", "TERMINAL_COLOR2": "base0b", "TERMINAL_COLOR3": "base09", "TERMINAL_COLOR4": "base0d", "TERMINAL_COLOR5": "base0e", "TERMINAL_COLOR6": "base0c", "TERMINAL_COLOR7": "base05", "TERMINAL_COLOR8": "base02", "TERMINAL_COLOR9": "base08", # @TODO: lighter "TERMINAL_COLOR10": "base0b", # @TODO: lighter "TERMINAL_COLOR11": "base0a", "TERMINAL_COLOR12": "base0d", # @TODO: lighter "TERMINAL_COLOR13": "base0e", # @TODO: lighter "TERMINAL_COLOR14": "base0c", # @TODO: lighter "TERMINAL_COLOR15": "base07", "ICONS_LIGHT_FOLDER": "base0c", "ICONS_LIGHT": "base0c", "ICONS_MEDIUM": "base0d", "ICONS_DARK": "base03", } translation_light = { "BG": "base05", "FG": "base00", "MENU_BG": "base04", "MENU_FG": "base01", "SEL_BG": "base0d", "SEL_FG": "base00", "TXT_BG": "base06", "TXT_FG": "base01", "BTN_BG": "base03", "BTN_FG": "base07", "HDR_BTN_BG": "base05", "HDR_BTN_FG": "base01", "TERMINAL_BACKGROUND": "base01", "TERMINAL_FOREGROUND": "base06", "TERMINAL_ACCENT_COLOR": "base0d", } translation_dark = { "BG": "base01", "FG": "base06", "MENU_BG": "base00", "MENU_FG": "base05", "SEL_BG": "base08", "SEL_FG": "base00", "TXT_BG": "base02", "TXT_FG": "base07", "BTN_BG": "base00", "BTN_FG": "base05", "HDR_BTN_BG": "base01", "HDR_BTN_FG": "base05", "TERMINAL_COLOR8": "base01", "TERMINAL_BACKGROUND": "base02", "TERMINAL_FOREGROUND": "base07", "TERMINAL_ACCENT_COLOR": "base08", } def read_colorscheme_from_path(self, preset_path): from oomox_gui.theme_model import THEME_MODEL_BY_KEY base16_theme = {} with open(preset_path) as preset_file: for line in preset_file.readlines(): try: key, value, *_rest = line.split() key = key.rstrip(':').lower() value = value.strip('\'"').lower() base16_theme[key] = value except Exception: pass oomox_theme = {} oomox_theme.update(self.default_theme) translation = {} translation.update(self.translation_common) if THEME_MODEL_BY_KEY.get('BASE16_GENERATE_DARK', {}).get('fallback_value'): translation.update(self.translation_dark) else: translation.update(self.translation_light) for oomox_key, base16_key in translation.items(): if base16_key in base16_theme: oomox_theme[oomox_key] = base16_theme[base16_key] return oomox_theme
class Plugin(OomoxThemePlugin): name = 'materia' display_name = 'Materia' description = ('GTK+2, GTK+3\n' 'Cinnamon, GNOME Shell, Metacity, Unity, Xfwm') export_dialog = MateriaThemeExportDialog gtk_preview_dir = os.path.join(PLUGIN_DIR, "gtk_preview_css/") preview_sizes = { OomoxThemePlugin.PreviewImageboxesNames.CHECKBOX.name: 24, } enabled_keys_gtk = [ 'BG', 'FG', 'HDR_BG', 'HDR_FG', 'SEL_BG', ] enabled_keys_options = [ 'ROUNDNESS', ] theme_model_gtk = [ { 'key': 'MATERIA_VIEW', 'type': 'color', 'fallback_key': 'TXT_BG', 'display_name': _('View'), }, { 'key': 'MATERIA_SURFACE', 'type': 'color', 'fallback_key': 'BTN_BG', 'display_name': _('Surface (like Button, Menu, Popover)'), }, ] theme_model_options = [ { 'key': 'MATERIA_SELECTION_OPACITY', 'type': 'float', 'fallback_value': 0.32, 'max_value': 1.0, 'display_name': _('Selection Opacity'), }, { 'key': 'MATERIA_PANEL_OPACITY', 'type': 'float', 'fallback_value': 0.6, 'max_value': 1.0, 'display_name': _('DE Panel Opacity'), }, { 'key': 'MATERIA_STYLE_COMPACT', 'type': 'bool', 'fallback_value': True, 'display_name': _('Compact Style'), }, ] def preview_before_load_callback(self, preview_object, colorscheme): colorscheme["TXT_FG"] = colorscheme["FG"] colorscheme["WM_BORDER_FOCUS"] = colorscheme["HDR_BG"] colorscheme["WM_BORDER_UNFOCUS"] = colorscheme["MATERIA_SURFACE"] colorscheme["HDR_BTN_FG"] = colorscheme["HDR_FG"] colorscheme["HDR_BTN_BG"] = colorscheme["HDR_BG"] colorscheme["SEL_FG"] = colorscheme["FG"] colorscheme["ACCENT_BG"] = colorscheme["SEL_BG"] colorscheme["BTN_FG"] = colorscheme["FG"] colorscheme["BTN_BG"] = colorscheme["MATERIA_SURFACE"] colorscheme["TXT_BG"] = colorscheme["MATERIA_VIEW"] colorscheme["GRADIENT"] = 0 preview_object.WM_BORDER_WIDTH = 0 _monkeypatch_update_preview_colors(preview_object)
class Plugin(OomoxIconsPlugin): # if not os.path.exists('/usr/share/icons/Numix/'): # raise Exception('Numix icon theme need to be installed first') name = 'numix_icons' display_name = 'Numix' export_dialog = NumixIconsExportDialog preview_svg_dir = os.path.join(PLUGIN_DIR, "icon_previews/0/") theme_model_icons = [ { 'key': 'ICONS_NUMIX_STYLE', 'type': 'options', 'options': [{ 'value': str(style_id), 'display_name': _("Style {number}").format(number=style_id), } for style_id in range(6)], 'display_name': _('Numix Style'), }, # { # 'key': 'ICONS_NUMIX_SHAPE', # 'type': 'options', # 'options': [{ # 'value': 'normal', # 'display_name': 'Normal', # }, { # 'value': 'circle', # 'display_name': 'Circle', # }, { # 'value': 'square', # 'display_name': 'Square', # }], # 'display_name': _('Icons Shape'), # }, { 'key': 'ICONS_LIGHT_FOLDER', 'type': 'color', 'fallback_key': 'SEL_BG', 'display_name': _('Light Base (Folders)'), }, # { # 'key': 'ICONS_LIGHT', # 'fallback_key': 'SEL_BG', # 'type': 'color', # 'display_name': _('Light Base'), # }, { 'key': 'ICONS_MEDIUM', 'type': 'color', 'fallback_key': 'BTN_BG', 'display_name': _('Medium Base'), }, { 'key': 'ICONS_DARK', 'type': 'color', 'fallback_key': 'HDR_BG', 'display_name': _('Dark Stroke'), }, ] def preview_before_load_callback(self, preview_object, colorscheme): self.preview_svg_dir = os.path.join(PLUGIN_DIR, "icon_previews/", colorscheme["ICONS_NUMIX_STYLE"]) preview_object.icons_plugin_name = '_update' def preview_transform_function(self, svg_template, colorscheme): # ).replace( # "00ff00", colorscheme["ICONS_LIGHT"] or FALLBACK_COLOR return svg_template.replace( "%LIGHT%", colorscheme["ICONS_LIGHT_FOLDER"] or FALLBACK_COLOR).replace( "%MEDIUM%", colorscheme["ICONS_MEDIUM"] or FALLBACK_COLOR).replace( "%DARK%", colorscheme["ICONS_DARK"] or FALLBACK_COLOR)
class Plugin(OomoxThemePlugin): name = 'arc' display_name = 'Arc' description = ('GTK+2, GTK+3\n' 'Cinnamon, GNOME Shell, Metacity, Openbox, Unity, Xfwm') export_dialog = ArcThemeExportDialog gtk_preview_dir = os.path.join(PLUGIN_DIR, "gtk_preview_css/") preview_sizes = { OomoxThemePlugin.PreviewImageboxesNames.CHECKBOX.name: 16, } enabled_keys_gtk = [ 'BG', 'FG', 'HDR_BG', 'HDR_FG', 'SEL_BG', 'SEL_FG', 'TXT_BG', 'BTN_BG', 'HDR_BTN_BG', 'ACCENT_BG', ] # enabled_keys_options = [ # 'ROUNDNESS', # ] theme_model_gtk = [ { 'key': 'ARC_WIDGET_BORDER_COLOR', 'fallback_function': lambda colors: mix_theme_colors(colors['BTN_BG'], colors['BTN_FG'], 0.75), 'type': 'color', 'display_name': _('Border'), 'description': _('not supported by GTK+2 theme'), }, ] theme_model_options = [ { 'key': 'ARC_TRANSPARENCY', 'type': 'bool', 'fallback_value': True, 'display_name': _('Enable Theme Transparency'), 'description': _('not supported by GTK+2 theme'), }, # { # 'key': 'GTK3_GENERATE_DARK', # 'type': 'bool', # 'fallback_value': True, # 'display_name': _('(GTK3) Add Dark Variant'), # }, ] def preview_before_load_callback(self, preview_object, colorscheme): colorscheme["TXT_FG"] = colorscheme["FG"] colorscheme["BTN_FG"] = colorscheme["FG"] colorscheme["HDR_BTN_FG"] = colorscheme["HDR_FG"] colorscheme["WM_BORDER_FOCUS"] = colorscheme["HDR_BG"] colorscheme["WM_BORDER_UNFOCUS"] = colorscheme["BTN_BG"] colorscheme["GRADIENT"] = 0 colorscheme["ROUNDNESS"] = 0 preview_object.WM_BORDER_WIDTH = 0 _monkeypatch_update_preview_borders(preview_object)
class Plugin(OomoxImportPlugin): name = 'import_pil' display_name = _('Image colors') import_text = _('Colors from Image') file_extensions = ( '.jpg', '.png', '.gif', ) default_theme = { "TERMINAL_THEME_MODE": "manual", "TERMINAL_THEME_AUTO_BGFG": False, } default_themes = { "lcars": { "TERMINAL_THEME_MODE": "manual", "ROUNDNESS": 20, "ICONS_STYLE": "archdroid", } } translation_common = { "NAME": "scheme", "TERMINAL_COLOR0": "color0", "TERMINAL_COLOR1": "color1", "TERMINAL_COLOR2": "color2", "TERMINAL_COLOR3": "color3", "TERMINAL_COLOR4": "color4", "TERMINAL_COLOR5": "color5", "TERMINAL_COLOR6": "color6", "TERMINAL_COLOR7": "color7", "TERMINAL_COLOR8": "color8", "TERMINAL_COLOR9": "color9", "TERMINAL_COLOR10": "color10", "TERMINAL_COLOR11": "color11", "TERMINAL_COLOR12": "color12", "TERMINAL_COLOR13": "color13", "TERMINAL_COLOR14": "color14", "TERMINAL_COLOR15": "color15", "TERMINAL_BACKGROUND": "background", "TERMINAL_FOREGROUND": "foreground", "TERMINAL_ACCENT_COLOR": "color3", } theme_translations = { "1": { "BG": "color7", "FG": "color0", # "TXT_BG": "foreground", # "TXT_FG": "background", "TXT_BG": "color15", "TXT_FG": "color0", "SEL_BG": "color4", "SEL_FG": "color15", "HDR_BG": "color0", "HDR_FG": "color7", "BTN_BG": "color8", "BTN_FG": "foreground", "HDR_BTN_BG": "background", "HDR_BTN_FG": "foreground", "ICONS_LIGHT_FOLDER": "color12", "ICONS_LIGHT": "color14", "ICONS_MEDIUM": "color6", "ICONS_DARK": "color4", }, "2": { "BG": "color7", "FG": "color0", "TXT_BG": "color15", "TXT_FG": "color0", "SEL_BG": "color1", "SEL_FG": "foreground", "HDR_BG": "color0", "HDR_FG": "color7", "BTN_BG": "color12", "BTN_FG": "color0", "WM_BORDER_FOCUS": "color10", "ICONS_LIGHT_FOLDER": "color13", "ICONS_LIGHT": "color9", "ICONS_MEDIUM": "color1", "ICONS_DARK": "color5", }, "3": { "BG": "color7", "FG": "color0", "TXT_BG": "color15", "TXT_FG": "color0", "SEL_BG": "color3", "SEL_FG": "color0", "HDR_BG": "color0", "HDR_FG": "color7", "BTN_BG": "color12", "BTN_FG": "color0", "WM_BORDER_FOCUS": "color3", "ICONS_LIGHT_FOLDER": "color13", "ICONS_LIGHT": "color9", "ICONS_MEDIUM": "color1", "ICONS_DARK": "color5", }, "4": { "BG": "color5", "FG": "color0", "HDR_BG": "color1", "HDR_FG": "foreground", "SEL_BG": "color4", "SEL_FG": "foreground", "TXT_BG": "color6", "TXT_FG": "color1", "BTN_BG": "color3", "BTN_FG": "color0", "HDR_BTN_BG": "color5", "HDR_BTN_FG": "background", }, "lcars": { "BG": "background", "FG": "foreground", "TXT_BG": "background", "TXT_FG": "color11", "SEL_BG": "color1", "SEL_FG": "background", "HDR_BG": "background", "HDR_FG": "color7", "BTN_BG": "color10", "BTN_FG": "color0", "HDR_BTN_BG": "color12", "HDR_BTN_FG": "background", "WM_BORDER_FOCUS": "color10", "ICONS_ARCHDROID": "color12", }, } theme_model_import = [ { 'display_name': _('Import Colors from Image'), 'type': 'separator', 'value_filter': { 'FROM_PLUGIN': ['import_pil'] }, }, { 'key': '_PIL_PALETTE_QUALITY', 'type': 'options', 'options': [{ 'value': LOW_QUALITY, 'display_name': _('oomox: low quality'), }, { 'value': MEDIUM_QUALITY, 'display_name': _('oomox: medium quality'), }, { 'value': HIGH_QUALITY, 'display_name': _('oomox: high quality'), }], # }, { # 'value': ULTRA_QUALITY, # 'display_name': 'ultra', 'fallback_value': LOW_QUALITY, 'display_name': _('Image Analysis'), 'reload_theme': True, }, { 'key': '_PIL_PALETTE_STYLE', 'type': 'options', 'options': [ {'value': template_name} for template_name in sorted(os.listdir(TERMINAL_TEMPLATE_DIR)) ], # 'fallback_value': 'monovedek_pale_gray', 'fallback_value': 'basic', 'display_name': _('Palette Style'), 'reload_theme': True, }, { 'key': '_PIL_PALETTE_STRICT', 'type': 'bool', 'fallback_value': False, 'display_name': _('Stronger Follow Palette Template'), 'reload_theme': True, 'value_filter': { '_PIL_PALETTE_QUALITY': [LOW_QUALITY, MEDIUM_QUALITY, HIGH_QUALITY] }, }, { 'key': '_PIL_PALETTE_INVERSE', 'type': 'bool', 'fallback_value': False, 'display_name': _('Dark/Light Colors'), 'reload_theme': True, }, { 'key': '_PIL_THEME_TEMPLATE', 'type': 'options', 'options': [ {'value': template_name} for template_name in sorted(theme_translations.keys()) ], 'fallback_value': '1', 'display_name': _('GUI Theme Template'), 'reload_theme': True, }, { 'key': '_PIL_IMAGE_PREVIEW', 'type': 'image_path', 'fallback_value': None, 'display_name': _('Image Thumbnail'), }, { 'display_name': _('Edit Generated Theme'), 'type': 'separator', 'value_filter': { 'FROM_PLUGIN': ['import_pil'] }, }, ] try: import colorz # pylint: disable=import-error theme_model_import[1]['options'] += [{ 'value': 'colorz16', 'display_name': _('colorz lib: low quality'), }, { 'value': 'colorz32', 'display_name': _('colorz lib: medium quality'), }, { 'value': 'colorz64', 'display_name': _('colorz lib: high quality'), }] except: # noqa pylint: disable=bare-except pass try: import colorthief # pylint: disable=import-error theme_model_import[1]['options'] += [{ 'value': 'colorthief16', 'display_name': _('colorthief lib'), }, { 'value': 'colorthief32', 'display_name': _('colorthief lib: doublepass'), }] except: # noqa pylint: disable=bare-except pass try: import haishoku # pylint: disable=import-error # theme_model_import['_PIL_PALETTE_QUALITY']['options'].append({ theme_model_import[1]['options'].append({ 'value': 'haishoku', 'display_name': _('haishoku lib'), }) except: # noqa pylint: disable=bare-except pass try: import colorthief # noqa pylint: disable=import-error import colorz # noqa pylint: disable=import-error import haishoku # noqa pylint: disable=import-error # theme_model_import['_PIL_PALETTE_QUALITY']['options'].append({ theme_model_import[1]['options'] += [{ 'value': 'all_low', 'display_name': _('all available: low quality'), }, { 'value': 'all_medium', 'display_name': _('all available: medium quality'), }] except: # noqa pylint: disable=bare-except pass _terminal_palette_cache = {} _palette_cache = {} @classmethod def get_image_palette(cls, image_path, quality, use_whole_palette): _id = image_path+str(quality)+str(use_whole_palette) if not cls._palette_cache.get(_id): cls._palette_cache[_id] = image_analyzer.get_hex_palette( image_path, quality=quality, use_whole_palette=use_whole_palette ) return cls._palette_cache[_id] @classmethod def _get_haishoku_palette(cls, image_path): from haishoku.haishoku import Haishoku # pylint: disable=import-error palette = Haishoku.getPalette(image_path) hex_palette = [color_hex_from_list(color) for _percentage, color in palette] return hex_palette @classmethod def _get_colorthief_palette(cls, image_path, color_count): from colorthief import ColorThief # pylint: disable=import-error color_thief = ColorThief(image_path) palette = color_thief.get_palette(color_count=color_count) hex_palette = [color_hex_from_list(color) for color in palette] return hex_palette @classmethod def _get_colorz_lib_palette(cls, image_path, color_count): from colorz import colorz # pylint: disable=import-error palette = colorz(open(image_path, 'rb'), color_count, 50, 200) hex_palette = [color_hex_from_list(color) for pair in palette for color in pair] return hex_palette @classmethod def _get_all_available_palettes( cls, image_path, use_whole_palette, quality_per_plugin ): # pylint: disable=too-many-locals hex_palette = [] from colorz import colorz # pylint: disable=import-error from colorthief import ColorThief # pylint: disable=import-error from haishoku.haishoku import Haishoku # pylint: disable=import-error with Pool() as pool: oomox_future = pool.apply_async(apply_chain, ( get_plugin_module, ('ima', os.path.join(PLUGIN_DIR, 'ima.py'), 'get_hex_palette'), (image_path, use_whole_palette, 48, quality_per_plugin[0]) )) from functools import partial _opener = partial(open, image_path, 'rb') colorz_future = pool.apply_async(delayed_partial, ( colorz, ( (_opener, ()), ), (quality_per_plugin[1], 50, 200, ), )) colorthief_future = pool.apply_async(call_method_from_class, ( ColorThief, (image_path, ), 'get_palette', (quality_per_plugin[2], ) )) haishoku_future = pool.apply_async( Haishoku.getPalette, (image_path, ) ) pool.close() hex_palette += oomox_future.get() hex_palette += [ color_hex_from_list(color) for pair in colorz_future.get() for color in pair ] hex_palette += [ color_hex_from_list(color) for color in colorthief_future.get() ] try: hex_palette += [ color_hex_from_list(color) for _percentage, color in haishoku_future.get() ] except Exception: # pylint: disable=broad-except pass pool.join() return hex_palette def read_colorscheme_from_path(self, preset_path): from oomox_gui.theme_model import get_first_theme_option get_first_theme_option('_PIL_IMAGE_PREVIEW')['fallback_value'] = preset_path image_palette = self.generate_terminal_palette( get_first_theme_option('_PIL_PALETTE_STYLE').get('fallback_value'), preset_path ) theme_template = get_first_theme_option( '_PIL_THEME_TEMPLATE', {} ).get('fallback_value') oomox_theme = {} oomox_theme.update(self.default_theme) if theme_template in self.default_themes: oomox_theme.update(self.default_themes[theme_template]) translation = {} translation.update(self.translation_common) translation.update( self.theme_translations[theme_template] ) for oomox_key, image_palette_key in translation.items(): if image_palette_key in image_palette: oomox_theme[oomox_key] = image_palette[image_palette_key] return oomox_theme @classmethod def _generate_terminal_palette( # pylint: disable=too-many-arguments,too-many-locals,too-many-branches cls, template_path, image_path, quality, use_whole_palette, inverse_palette ): start_time = time() if str(quality).startswith('colorz'): hex_palette = cls._get_colorz_lib_palette( image_path, color_count=int(quality.split('colorz')[1]) ) elif str(quality).startswith('colorthief'): hex_palette = cls._get_colorthief_palette( image_path, color_count=int(quality.split('colorthief')[1]) + 1 ) elif quality == 'haishoku': hex_palette = cls._get_haishoku_palette(image_path) elif str(quality).startswith('all_'): _quality = quality.split('_')[1] if _quality == 'low': quality_per_plugin = [100, 16, 16] elif _quality == 'medium': quality_per_plugin = [200, 32, 32] else: raise NotImplementedError() hex_palette = cls._get_all_available_palettes( image_path=image_path, use_whole_palette=use_whole_palette, quality_per_plugin=quality_per_plugin ) else: hex_palette = cls.get_image_palette(image_path, int(quality), use_whole_palette)[:] print("{} quality, {} colors found, took {:.8f}s".format( quality, len(hex_palette), (time() - start_time) )) gray_colors = get_gray_colors(hex_palette) bright_colors = set(hex_palette) bright_colors.difference_update(gray_colors) bright_colors = list(bright_colors) ACCURACY = 40 # pylint: disable=invalid-name hex_palette += [hex_darker(c, ACCURACY) for c in gray_colors] hex_palette += [hex_darker(c, -ACCURACY) for c in gray_colors] reference_palette = import_xcolors(os.path.join(TERMINAL_TEMPLATE_DIR, template_path)) result_palette = {} if inverse_palette: reference_palette['foreground'], reference_palette['background'] = \ reference_palette['background'], reference_palette['foreground'] is_dark_bg = is_dark(reference_palette['background']) max_possible_lightness = 255 * 3 new_bg_color, _diff = find_closest_color(reference_palette['background'], hex_palette) # @TODO: use real lightness from HSV or Lab color model lightness_delta = sum(int_list_from_hex(new_bg_color)) * (1 if is_dark_bg else -1) + \ max_possible_lightness // 4 # max_possible_lightness // 6 min_lightness = max_possible_lightness // 38 max_lightness = max_possible_lightness - min_lightness if is_dark_bg: min_lightness = lightness_delta else: max_lightness = max_possible_lightness - lightness_delta for key, value in reference_palette.items(): if key not in ['color0', 'color7', 'color8', 'color15', 'foreground', 'background']: closest_color, _diff = find_closest_color( value, bright_colors, min_lightness=min_lightness, max_lightness=max_lightness ) else: closest_color, _diff = find_closest_color(value, hex_palette) result_palette[key] = closest_color gc.collect() return result_palette @classmethod def generate_terminal_palette(cls, template_path, image_path): from oomox_gui.theme_model import get_first_theme_option quality = get_first_theme_option('_PIL_PALETTE_QUALITY', {}).get('fallback_value') use_whole_palette = bool( get_first_theme_option('_PIL_PALETTE_STRICT', {}).get('fallback_value') ) inverse_palette = bool( get_first_theme_option('_PIL_PALETTE_INVERSE', {}).get('fallback_value') ) _id = template_path+image_path+str(quality)+str(use_whole_palette)+str(inverse_palette) if not cls._terminal_palette_cache.get(_id): cls._terminal_palette_cache[_id] = cls._generate_terminal_palette( template_path, image_path, quality, use_whole_palette, inverse_palette ) palette = {} palette.update(cls._terminal_palette_cache[_id]) return palette
class Plugin(OomoxThemePlugin): name = 'oomox' display_name = 'Numix-based' description = '(GTK+2, GTK+3, Cinnamon, Metacity, Openbox, Qt5ct, Unity, Xfwm)' export_dialog = OomoxThemeExportDialog gtk_preview_dir = os.path.join(PLUGIN_DIR, "gtk_preview_css/") enabled_keys_gtk = [ 'BG', 'FG', 'MENU_BG', 'MENU_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_options = [ { 'key': 'OUTLINE_WIDTH', 'type': 'int', 'fallback_value': 1, 'display_name': _('(GTK3) Focused outline width'), }, { 'key': 'BTN_OUTLINE_WIDTH', 'type': 'int', 'fallback_value': 1, 'display_name': _('(GTK3) Focused button outline width'), }, { 'key': 'BTN_OUTLINE_OFFSET', 'type': 'int', 'fallback_value': -3, 'min_value': -20, 'display_name': _('(GTK3) Focused button outline offset'), }, # { @TODO: implement value_filter for separators # 'type': 'separator', # 'display_name': _('Text input caret'), # }, { 'key': 'CARET1_FG', 'type': 'color', 'fallback_key': 'TXT_FG', 'display_name': _('Primary caret color'), }, { 'key': 'CARET2_FG', 'type': 'color', 'fallback_key': 'TXT_FG', 'display_name': _('Secondary caret color'), }, { 'key': 'CARET_SIZE', 'type': 'float', 'fallback_value': 0.04, # GTK's default 'display_name': _('Caret aspect ratio'), }, ] theme_model_other = [ { 'key': 'UNITY_DEFAULT_LAUNCHER_STYLE', 'type': 'bool', 'fallback_value': False, 'display_name': _('(Unity) Use default launcher style'), }, { 'key': 'CINNAMON_OPACITY', 'type': 'float', 'fallback_value': 1.0, 'max_value': 1.0, 'display_name': _('(Cinnamon) Opacity'), }, ] theme_model_extra = [ ] def preview_before_load_callback(self, preview_object, colorscheme): preview_object.WM_BORDER_WIDTH = 2
class Plugin(OomoxThemePlugin): name = 'oomox' display_name = 'Oomox (Numix-Based)' description = ( 'GTK+2, GTK+3, Qt5ct\n' 'Cinnamon, Metacity, Openbox, Unity, Xfwm' ) 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': _('Textbox Caret'), }, { 'key': 'CARET2_FG', 'type': 'color', 'fallback_key': 'TXT_FG', 'display_name': _('BiDi Textbox Caret'), }, ] theme_model_options = [ { 'key': 'CARET_SIZE', 'type': 'float', 'fallback_value': 0.04, # GTK's default 'display_name': _('Textbox Caret Aspect Ratio'), }, { 'type': 'separator', 'display_name': _('GTK3 Theme Options'), 'value_filter': { 'THEME_STYLE': 'oomox', }, }, { 'key': 'SPACING', 'type': 'int', 'fallback_value': 3, 'display_name': _('Spacing'), }, { 'key': 'OUTLINE_WIDTH', 'type': 'int', 'fallback_value': 1, 'display_name': _('Focused Outline Width'), }, { 'key': 'BTN_OUTLINE_WIDTH', 'type': 'int', 'fallback_value': 1, 'display_name': _('Focused Button Outline Width'), }, { 'key': 'BTN_OUTLINE_OFFSET', 'type': 'int', 'fallback_value': -3, 'min_value': -20, 'display_name': _('Focused Button Outline Offset'), }, { 'key': 'GTK3_GENERATE_DARK', 'type': 'bool', 'fallback_value': True, 'display_name': _('Add Dark Variant'), }, { 'type': 'separator', 'display_name': _('Desktop Environments'), 'value_filter': { 'THEME_STYLE': 'oomox', }, }, { 'key': 'CINNAMON_OPACITY', 'type': 'float', 'fallback_value': 1.0, 'max_value': 1.0, 'display_name': _('Cinnamon: Opacity'), }, { 'key': 'UNITY_DEFAULT_LAUNCHER_STYLE', 'type': 'bool', 'fallback_value': False, 'display_name': _('Unity: Use Default Launcher Style'), }, ] def preview_before_load_callback(self, preview_object, colorscheme): preview_object.WM_BORDER_WIDTH = 2
class Plugin(OomoxThemePlugin): name = 'arc' display_name = 'Arc' description = '(GTK+2, GTK+3, Cinnamon, Gnome Shell, Metacity, Openbox, Unity, Xfwm)' export_dialog = ArcThemeExportDialog gtk_preview_dir = os.path.join(PLUGIN_DIR, "gtk_preview_css/") preview_sizes = { OomoxThemePlugin.PreviewImageboxesNames.CHECKBOX.name: 24, } enabled_keys_gtk = [ 'BG', 'FG', 'MENU_BG', 'MENU_FG', 'SEL_BG', 'SEL_FG', 'TXT_BG', 'BTN_BG', 'HDR_BTN_BG', 'ACCENT_BG', ] # enabled_keys_options = [ # 'ROUNDNESS', # ] theme_model_gtk = [ { 'key': 'ARC_WIDGET_BORDER_COLOR', 'fallback_function': lambda colors: mix_theme_colors(colors['BTN_BG'], colors['BTN_FG'], 0.75), 'type': 'color', 'display_name': _('(GTK3) Widget border color'), }, ] theme_model_options = [ { 'key': 'ARC_TRANSPARENCY', 'type': 'bool', 'fallback_value': True, 'display_name': _('(GTK3) Enable theme transparency'), }, # { # 'key': 'GTK3_GENERATE_DARK', # 'type': 'bool', # 'fallback_value': True, # 'display_name': _('(GTK3) Add dark variant'), # }, ] """ theme_model_other = [ { 'key': 'GNOME_SHELL_PANEL_OPACITY', 'type': 'float', 'fallback_value': 0.6, 'max_value': 1.0, 'display_name': _('(Gnome Shell) Panel opacity'), }, ] """ def preview_before_load_callback(self, preview_object, colorscheme): colorscheme["TXT_FG"] = colorscheme["FG"] colorscheme["BTN_FG"] = colorscheme["FG"] colorscheme["HDR_BTN_FG"] = colorscheme["MENU_FG"] colorscheme["WM_BORDER_FOCUS"] = colorscheme["MENU_BG"] colorscheme["WM_BORDER_UNFOCUS"] = colorscheme["BTN_BG"] colorscheme["GRADIENT"] = 0 colorscheme["ROUNDNESS"] = 0 preview_object.WM_BORDER_WIDTH = 0 _monkeypatch_update_preview_borders(preview_object)
class Plugin(OomoxIconsPlugin): name = 'suruplus_aspromauros_icons' display_name = 'Suru++ Asprómauros' export_dialog = SuruPlusIconsExportDialog preview_svg_dir = os.path.join(PLUGIN_DIR, "icon_previews/") theme_model_icons = [ { 'key': 'ICONS_SYMBOLIC_ACTION', 'type': 'color', 'fallback_function': lambda colors: mix_theme_colors(colors['MENU_FG'], colors['BTN_FG' ], 0.66), 'display_name': _('Actions Icons'), 'value_filter': { 'SURUPLUS_GRADIENT_ENABLED': False, }, }, { 'key': 'ICONS_SYMBOLIC_PANEL', 'type': 'color', 'fallback_key': 'FG', 'display_name': _('Panel Icons'), }, { 'key': 'SURUPLUS_GRADIENT_ENABLED', 'type': 'bool', 'fallback_value': False, 'reload_options': True, 'display_name': _('Enable Gradients'), }, { 'key': 'SURUPLUS_GRADIENT1', 'type': 'color', 'fallback_key': 'ICONS_SYMBOLIC_ACTION', 'display_name': _('Gradient Start Color'), 'value_filter': { 'SURUPLUS_GRADIENT_ENABLED': True, }, }, { 'key': 'SURUPLUS_GRADIENT2', 'type': 'color', 'fallback_key': 'SEL_BG', 'display_name': _('Gradient End Color'), 'value_filter': { 'SURUPLUS_GRADIENT_ENABLED': True, }, }, ] def preview_transform_function(self, svg_template, colorscheme): icon_preview = svg_template.replace( "%SYMBOLIC_ACTION%", colorscheme["ICONS_SYMBOLIC_ACTION"] or FALLBACK_COLOR).replace( "%SYMBOLIC_PANEL%", colorscheme["ICONS_SYMBOLIC_PANEL"] or FALLBACK_COLOR) if colorscheme[ 'SURUPLUS_GRADIENT_ENABLED'] and 'arrongin' in svg_template: icon_preview = icon_preview.replace( "currentColor", "url(#arrongin)").replace( "%GRADIENT1%", colorscheme["SURUPLUS_GRADIENT1"] or FALLBACK_COLOR).replace( "%GRADIENT2%", colorscheme["SURUPLUS_GRADIENT2"] or FALLBACK_COLOR) return icon_preview
class Plugin(OomoxImportPlugin): name = 'import_pil' display_name = 'Import colors from image' import_text = 'Colors from image' file_extensions = ( '.jpg', '.png', '.gif', ) default_theme = { "TERMINAL_THEME_MODE": "manual", "TERMINAL_THEME_AUTO_BGFG": False, } default_themes = { "lcars": { "TERMINAL_THEME_MODE": "manual", "ROUNDNESS": 20, "ICONS_STYLE": "archdroid", } } translation_common = { "NAME": "scheme", "TERMINAL_COLOR0": "color0", "TERMINAL_COLOR1": "color1", "TERMINAL_COLOR2": "color2", "TERMINAL_COLOR3": "color3", "TERMINAL_COLOR4": "color4", "TERMINAL_COLOR5": "color5", "TERMINAL_COLOR6": "color6", "TERMINAL_COLOR7": "color7", "TERMINAL_COLOR8": "color8", "TERMINAL_COLOR9": "color9", "TERMINAL_COLOR10": "color10", "TERMINAL_COLOR11": "color11", "TERMINAL_COLOR12": "color12", "TERMINAL_COLOR13": "color13", "TERMINAL_COLOR14": "color14", "TERMINAL_COLOR15": "color15", "TERMINAL_BACKGROUND": "background", "TERMINAL_FOREGROUND": "foreground", "TERMINAL_ACCENT_COLOR": "color3", } theme_translations = { "1": { "BG": "color7", "FG": "color0", "TXT_BG": "foreground", "TXT_FG": "background", "SEL_BG": "color4", "SEL_FG": "color15", "MENU_BG": "background", "MENU_FG": "color7", "BTN_BG": "color8", "BTN_FG": "foreground", "HDR_BTN_BG": "background", "HDR_BTN_FG": "foreground", "ICONS_LIGHT_FOLDER": "color12", "ICONS_LIGHT": "color14", "ICONS_MEDIUM": "color6", "ICONS_DARK": "color4", }, "2": { "BG": "color7", "FG": "color0", "TXT_BG": "foreground", "TXT_FG": "color0", "SEL_BG": "color1", "SEL_FG": "foreground", "MENU_BG": "background", "MENU_FG": "color7", "BTN_BG": "color12", "BTN_FG": "color0", "WM_BORDER_FOCUS": "color10", "ICONS_LIGHT_FOLDER": "color13", "ICONS_LIGHT": "color9", "ICONS_MEDIUM": "color1", "ICONS_DARK": "color5", }, "3": { "BG": "color7", "FG": "color0", "TXT_BG": "foreground", "TXT_FG": "color0", "SEL_BG": "color3", "SEL_FG": "color0", "MENU_BG": "background", "MENU_FG": "color7", "BTN_BG": "color12", "BTN_FG": "color0", "WM_BORDER_FOCUS": "color3", "ICONS_LIGHT_FOLDER": "color13", "ICONS_LIGHT": "color9", "ICONS_MEDIUM": "color1", "ICONS_DARK": "color5", }, "4": { "BG": "color5", "FG": "color0", "MENU_BG": "color4", "MENU_FG": "color1", "SEL_BG": "color4", "SEL_FG": "color0", "TXT_BG": "color6", "TXT_FG": "color1", "BTN_BG": "color3", "BTN_FG": "color0", "HDR_BTN_BG": "color5", "HDR_BTN_FG": "color1", }, "lcars": { "BG": "background", "FG": "foreground", "TXT_BG": "background", "TXT_FG": "color11", "SEL_BG": "color1", "SEL_FG": "background", "MENU_BG": "background", "MENU_FG": "color7", "BTN_BG": "color10", "BTN_FG": "color0", "HDR_BTN_BG": "color12", "HDR_BTN_FG": "background", "WM_BORDER_FOCUS": "color10", "ICONS_ARCHDROID": "color12", }, } theme_model_import = [ { 'display_name': _('Import colors from image: '), 'type': 'separator', 'value_filter': { 'FROM_PLUGIN': ['import_pil'] }, }, { 'key': '_PIL_PALETTE_QUALITY', 'type': 'options', 'options': [{ 'value': LOW_QUALITY, 'display_name': 'low', }, { 'value': MEDIUM_QUALITY, 'display_name': 'medium', }, { 'value': HIGH_QUALITY, 'display_name': 'high', }, { 'value': ULTRA_QUALITY, 'display_name': 'ultra', }], 'fallback_value': LOW_QUALITY, 'display_name': _('Image analysis quality'), 'reload_theme': True, }, { 'key': '_PIL_PALETTE_STYLE', 'type': 'options', 'options': [{ 'value': template_name } for template_name in sorted(os.listdir(TERMINAL_TEMPLATE_DIR))], 'fallback_value': 'monovedek_pale_gray', 'display_name': _('Palette style'), 'reload_theme': True, }, { 'key': '_PIL_PALETTE_STRICT', 'type': 'bool', 'fallback_value': False, 'display_name': _('Stronger follow palette template'), 'reload_theme': True, }, { 'key': '_PIL_PALETTE_INVERSE', 'type': 'bool', 'fallback_value': False, 'display_name': _('Dark/Light colors'), 'reload_theme': True, }, { 'key': '_PIL_THEME_TEMPLATE', 'type': 'options', 'options': [{ 'value': template_name } for template_name in sorted(theme_translations.keys())], 'fallback_value': '1', 'display_name': _('GUI theme template'), 'reload_theme': True, }, { 'key': '_PIL_IMAGE_PREVIEW', 'type': 'image_path', 'fallback_value': None, 'display_name': _('Image thumbnail'), }, { 'display_name': _('Theme options: '), 'type': 'separator', 'value_filter': { 'FROM_PLUGIN': ['import_pil'] }, }, ] def read_colorscheme_from_path(self, preset_path): from oomox_gui.theme_model import THEME_MODEL_BY_KEY THEME_MODEL_BY_KEY['_PIL_IMAGE_PREVIEW'][ 'fallback_value'] = preset_path image_palette = self.generate_terminal_palette( THEME_MODEL_BY_KEY.get('_PIL_PALETTE_STYLE', {}).get('fallback_value'), preset_path) inverse_palette = bool( THEME_MODEL_BY_KEY.get('_PIL_PALETTE_INVERSE', {}).get('fallback_value')) theme_template = THEME_MODEL_BY_KEY.get('_PIL_THEME_TEMPLATE', {}).get('fallback_value') oomox_theme = {} oomox_theme.update(self.default_theme) if theme_template in self.default_themes: oomox_theme.update(self.default_themes[theme_template]) translation = {} translation.update(self.translation_common) translation.update(self.theme_translations[theme_template]) for oomox_key, image_palette_key in translation.items(): if image_palette_key in image_palette: oomox_theme[oomox_key] = image_palette[image_palette_key] if inverse_palette: oomox_theme['TERMINAL_FOREGROUND'], oomox_theme['TERMINAL_BACKGROUND'] = \ oomox_theme['TERMINAL_BACKGROUND'], oomox_theme['TERMINAL_FOREGROUND'] return oomox_theme _palette_cache = {} _terminal_palette_cache = {} @classmethod def get_image_palette(cls, image_path, quality, use_whole_palette): _id = image_path + str(quality) + str(use_whole_palette) if not cls._palette_cache.get(_id): cls._palette_cache[_id] = image_analyzer.get_hex_palette( image_path, quality=quality, use_whole_palette=use_whole_palette) return cls._palette_cache[_id] @classmethod def _generate_terminal_palette(cls, template_path, image_path, quality, use_whole_palette): hex_palette = cls.get_image_palette(image_path, quality, use_whole_palette)[:] gray_colors = get_gray_colors(hex_palette) ACCURACY = 40 # pylint: disable=invalid-name hex_palette += [hex_darker(c, ACCURACY) for c in gray_colors] hex_palette += [hex_darker(c, -ACCURACY) for c in gray_colors] reference_palette = import_xcolors( os.path.join(TERMINAL_TEMPLATE_DIR, template_path)) result_palette = {} for key, value in reference_palette.items(): closest_color, _diff = find_closest_color(value, hex_palette) result_palette[key] = closest_color gc.collect() return result_palette @classmethod def generate_terminal_palette(cls, template_path, image_path): from oomox_gui.theme_model import THEME_MODEL_BY_KEY quality = int( THEME_MODEL_BY_KEY.get('_PIL_PALETTE_QUALITY', {}).get('fallback_value')) use_whole_palette = bool( THEME_MODEL_BY_KEY.get('_PIL_PALETTE_STRICT', {}).get('fallback_value')) _id = template_path + image_path + str(quality) + str( use_whole_palette) if not cls._terminal_palette_cache.get(_id): cls._terminal_palette_cache[_id] = cls._generate_terminal_palette( template_path, image_path, quality, use_whole_palette) palette = {} palette.update(cls._terminal_palette_cache[_id]) return palette
class Plugin(OomoxThemePlugin): name = 'materia' display_name = 'Materia' description = '(GTK+2, GTK+3, Cinnamon, Gnome Shell, Metacity, Unity, Xfwm)' export_dialog = MateriaThemeExportDialog gtk_preview_dir = os.path.join(PLUGIN_DIR, "gtk_preview_css/") preview_sizes = { OomoxThemePlugin.PreviewImageboxesNames.CHECKBOX.name: 24, } enabled_keys_gtk = [ 'BG', 'FG', 'MENU_BG', 'MENU_FG', 'SEL_BG', 'SEL_FG', 'ACCENT_BG', 'TXT_BG', 'BTN_BG', 'BTN_FG', ] enabled_keys_options = [ 'ROUNDNESS', ] theme_model_gtk = [] theme_model_options = [ { 'key': 'GTK3_GENERATE_DARK', 'type': 'bool', 'fallback_value': True, 'display_name': _('(GTK3) Add dark variant'), }, { 'key': 'MATERIA_STYLE_COMPACT', 'type': 'bool', 'fallback_value': True, 'display_name': _('Compact style'), }, ] theme_model_other = [ { 'key': 'GNOME_SHELL_PANEL_OPACITY', 'type': 'float', 'fallback_value': 0.6, 'max_value': 1.0, 'display_name': _('(Gnome Shell) Panel opacity'), }, ] def preview_before_load_callback(self, preview_object, colorscheme): colorscheme["TXT_FG"] = colorscheme["FG"] colorscheme["WM_BORDER_FOCUS"] = colorscheme["MENU_BG"] colorscheme["WM_BORDER_UNFOCUS"] = colorscheme["BTN_BG"] colorscheme["HDR_BTN_FG"] = colorscheme["MENU_FG"] colorscheme["HDR_BTN_BG"] = colorscheme["MENU_BG"] colorscheme["GRADIENT"] = 0 preview_object.WM_BORDER_WIDTH = 0