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'),
        },
    ]
Exemplo n.º 2
0
 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,
         )
     )
Exemplo n.º 3
0
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()
Exemplo n.º 5
0
 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,
         )
     )
Exemplo n.º 6
0
    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])
Exemplo n.º 7
0
 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,
         ))
Exemplo n.º 8
0
 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
     )
Exemplo n.º 9
0
 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
     )
Exemplo n.º 10
0
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()
Exemplo n.º 12
0
 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)
Exemplo n.º 14
0
 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,
         ))
Exemplo n.º 15
0
 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)
Exemplo n.º 17
0
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
Exemplo n.º 18
0
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
Exemplo n.º 19
0
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)
Exemplo n.º 20
0
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)
Exemplo n.º 21
0
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)
Exemplo n.º 22
0
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
Exemplo n.º 23
0
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
Exemplo n.º 24
0
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
Exemplo n.º 25
0
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)
Exemplo n.º 26
0
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
Exemplo n.º 27
0
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
Exemplo n.º 28
0
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