Skip to content

Commit

Permalink
Theme selection combobox
Browse files Browse the repository at this point in the history
fix #1249
sem-ver: feature

Signed-off-by: Gaetan Semet <[email protected]>
  • Loading branch information
gsemet committed Apr 14, 2018
1 parent 21cf658 commit 0779655
Show file tree
Hide file tree
Showing 34 changed files with 550 additions and 199 deletions.
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,15 @@ DEV_IMAGE_DIR:=$(DATA_DIR)/pixmaps
DEV_LOCALE_DIR:=$(localedir)
DEV_GLADE_DIR:=$(DATA_DIR)
DEV_SCHEMA_DIR:=$(DATA_DIR)
DEV_GUAKE_THEME_DIR:=$(DATA_DIR)/themes

datarootdir:=$(prefix)/share
datadir:=$(datarootdir)
localedir:=$(datarootdir)/locale
gsettingsschemadir:=$(datarootdir)/glib-2.0/schemas

SHARE_DIR:=$(datadir)/guake
GUAKE_THEME_DIR:=$(SHARE_DIR)/guake
LOGIN_DESTOP_PATH = $(SHARE_DIR)
IMAGE_DIR:=$(SHARE_DIR)/pixmaps
GLADE_DIR:=$(SHARE_DIR)
Expand Down Expand Up @@ -77,6 +79,7 @@ install-guake:
@sed -i -e 's|{{ LOCALE_DIR }}|$(localedir)|g' guake/paths.py
@sed -i -e 's|{{ IMAGE_DIR }}|$(IMAGE_DIR)|g' guake/paths.py
@sed -i -e 's|{{ GLADE_DIR }}|$(GLADE_DIR)|g' guake/paths.py
@sed -i -e 's|{{ GUAKE_THEME_DIR }}|$(GUAKE_THEME_DIR)|g' guake/paths.py
@sed -i -e 's|{{ SCHEMA_DIR }}|$(SCHEMA_DIR)|g' guake/paths.py
@sed -i -e 's|{{ LOGIN_DESTOP_PATH }}|$(LOGIN_DESTOP_PATH)|g' guake/paths.py
@sed -i -e 's|{{ AUTOSTART_FOLDER }}|$(AUTOSTART_FOLDER)|g' guake/paths.py
Expand Down Expand Up @@ -340,6 +343,7 @@ generate-paths:
# Dev environment:
sed -i -e 's|{{ LOCALE_DIR }}|$(DEV_LOCALE_DIR)|g' guake/paths.py
sed -i -e 's|{{ IMAGE_DIR }}|$(DEV_IMAGE_DIR)|g' guake/paths.py
sed -i -e 's|{{ GUAKE_THEME_DIR }}|$(DEV_GUAKE_THEME_DIR)|g' guake/paths.py
sed -i -e 's|{{ GLADE_DIR }}|$(DEV_GLADE_DIR)|g' guake/paths.py
sed -i -e 's|{{ SCHEMA_DIR }}|$(DEV_SCHEMA_DIR)|g' guake/paths.py

Expand Down
4 changes: 2 additions & 2 deletions guake/data/org.guake.gschema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,8 @@
</key>
<key name="gtk-prefer-dark-theme" type="b">
<default>false</default>
<summary>Prefere Dark Theme for GTK</summary>
<description>Prefere the dark theme version of the theme if available</description>
<summary>Prefer Dark Theme for GTK</summary>
<description>Prefer the dark theme version of the theme if available</description>
</key>
</schema>
<schema id="guake.style" path="/apps/guake/style/">
Expand Down
84 changes: 75 additions & 9 deletions guake/data/prefs.glade
Original file line number Diff line number Diff line change
Expand Up @@ -346,31 +346,97 @@
</packing>
</child>
<child>
<object class="GtkBox" id="box2">
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkLabel" id="label12">
<object class="GtkBox" id="box3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Custom command file path:</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Gtk Theme:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText" id="gtk_theme_name">
<property name="width_request">300</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="active">0</property>
<signal name="changed" handler="on_gtk_theme_name_changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="gtk_prefer_dark_theme">
<property name="label" translatable="yes">Prefer dark theme</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="on_gtk_prefer_dark_theme_toggled" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFileChooserButton" id="custom_command_file_chooser">
<object class="GtkBox" id="box2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Please select a json file</property>
<signal name="file-set" handler="on_custom_command_file_chooser_file_changed" swapped="no"/>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label12">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Custom command file path:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFileChooserButton" id="custom_command_file_chooser">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="title" translatable="yes">Please select a json file</property>
<signal name="file-set" handler="on_custom_command_file_chooser_file_changed" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
Expand Down
15 changes: 2 additions & 13 deletions guake/guake_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
from guake.settings import Settings
from guake.simplegladeapp import SimpleGladeApp
from guake.terminal import GuakeTerminalBox
from guake.theme import select_gtk_theme
from guake.utils import get_server_time
from locale import gettext as _

Expand Down Expand Up @@ -162,7 +163,7 @@ def __init__(self):
self.debug_mode = self.settings.general.get_boolean('debug-mode')
setupLogging(self.debug_mode)

self._select_gtk_theme()
select_gtk_theme(self.settings)
self._patch_theme()

self.prompt_dialog = None
Expand Down Expand Up @@ -424,18 +425,6 @@ def rgba_to_hex(color):
Gdk.Screen.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)

def _select_gtk_theme(self):
gtk_theme_name = self.settings.general.get_string('gtk-theme-name')
log.debug("Wanted GTK theme: %r", gtk_theme_name)
settings = Gtk.Settings.get_default()
if gtk_theme_name and (Path("/usr/share/themes") / gtk_theme_name).exists():
settings.set_property("gtk-theme-name", gtk_theme_name)

prefer_dark_theme = self.settings.general.get_boolean('gtk-prefer-dark-theme')
log.debug("Prefer dark theme: %r", prefer_dark_theme)
if prefer_dark_theme:
settings.set_property("gtk-application-prefer-dark-theme", prefer_dark_theme)

# load the custom commands infrastucture
def load_custom_commands(self):
if self.custom_command_menuitem:
Expand Down
2 changes: 1 addition & 1 deletion guake/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ def main():
if "COLORTERM" in os.environ:
del os.environ['COLORTERM']

log.info("DBus not running, starting it")
log.info("Guake not running, starting it")
# late loading of the Guake object, to speed up dbus comm
from guake.guake_app import Guake
instance = Guake()
Expand Down
1 change: 1 addition & 0 deletions guake/paths.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ LOCALE_DIR = "{{ LOCALE_DIR }}"
IMAGE_DIR = "{{ IMAGE_DIR }}"
GLADE_DIR = "{{ GLADE_DIR }}"
SCHEMA_DIR = "{{ SCHEMA_DIR }}"
GUAKE_THEME_DIR = "{{ GUAKE_THEME_DIR }}"
LOGIN_DESTOP_PATH = "{{ LOGIN_DESTOP_PATH }}"
AUTOSTART_FOLDER = "{{ AUTOSTART_FOLDER }}"
40 changes: 40 additions & 0 deletions guake/prefs.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@
from guake.paths import LOGIN_DESTOP_PATH
from guake.simplegladeapp import SimpleGladeApp
from guake.terminal import GuakeTerminal
from guake.theme import list_all_themes
from guake.theme import select_gtk_theme
from locale import gettext as _

# pylint: disable=unsubscriptable-object
Expand Down Expand Up @@ -340,6 +342,22 @@ def on_prompt_on_close_tab_changed(self, combo):
"""
self.settings.general.set_int('prompt-on-close-tab', combo.get_active())

def on_gtk_theme_name_changed(self, combo):
"""Set the `gtk_theme_name' property in dconf
"""
citer = combo.get_active_iter()
if not citer:
return
theme_name = combo.get_model().get_value(citer, 0)
self.settings.general.set_string('gtk-theme-name', theme_name)
select_gtk_theme(self.settings)

def on_gtk_prefer_dark_theme_toggled(self, chk):
"""Set the `gtk_prefer_dark_theme' property in dconf
"""
self.settings.general.set_boolean('gtk-prefer-dark-theme', chk.get_active())
select_gtk_theme(self.settings)

def on_window_ontop_toggled(self, chk):
"""Changes the activity of window_ontop in dconf
"""
Expand Down Expand Up @@ -691,6 +709,7 @@ def __init__(self, settings):
self.populate_shell_combo()
self.populate_keys_tree()
self.populate_display_n()
self.populate_gtk_theme_names()
self.load_configs()
self.get_widget('config-window').hide()

Expand Down Expand Up @@ -907,13 +926,15 @@ def reload_erase_combos(self, btn=None):
for i in combo.get_model():
if ERASE_BINDINGS.get(i[0]) == binding:
combo.set_active_iter(i.iter)
break

# delete erase binding
combo = self.get_widget('delete-binding-combobox')
binding = self.settings.general.get_string('compat-delete')
for i in combo.get_model():
if ERASE_BINDINGS.get(i[0]) == binding:
combo.set_active_iter(i.iter)
break

def _load_hooks_settings(self):
"""load hooks settings"""
Expand All @@ -932,6 +953,7 @@ def _load_default_shell_settings(self):
for i in combo.get_model():
if i[0] == value:
combo.set_active_iter(i.iter)
break

def _load_screen_settings(self):
"""Load screen settings"""
Expand Down Expand Up @@ -987,6 +1009,18 @@ def load_configs(self):
self.get_widget('prompt_on_close_tab').set_active(value)
self.get_widget('prompt_on_quit').set_sensitive(value != 2)

# gtk theme theme
value = self.settings.general.get_string('gtk-theme-name')
combo = self.get_widget('gtk_theme_name')
for i in combo.get_model():
if i[0] == value:
combo.set_active_iter(i.iter)
break

# prefer gtk theme theme
value = self.settings.general.get_boolean('gtk-prefer-dark-theme')
self.get_widget('gtk_prefer_dark_theme').set_active(value)

# ontop
value = self.settings.general.get_boolean('window-ontop')
self.get_widget('window_ontop').set_active(value)
Expand Down Expand Up @@ -1189,6 +1223,12 @@ def populate_shell_combo(self):
for i in get_binaries_from_path(PYTHONS):
cb.append_text(i)

def populate_gtk_theme_names(self):
cb = self.get_widget('gtk_theme_name')
for name in list_all_themes():
name = name.strip()
cb.append_text(name)

def populate_keys_tree(self):
"""Reads the HOTKEYS global variable and insert all data in
the TreeStore used by the preferences window treeview.
Expand Down
52 changes: 52 additions & 0 deletions guake/theme.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import itertools
import logging
import os

from pathlib import Path

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import GLib
from gi.repository import Gtk

from guake.paths import GUAKE_THEME_DIR

log = logging.getLogger(__name__)

# Reference:
# https://gitlab.gnome.org/GNOME/gnome-tweaks/blob/master/gtweak/utils.py (GPL)


def get_resource_dirs(resource):
"""Returns a list of all known resource dirs for a given resource.
:param str resource:
Name of the resource (e.g. "themes")
:return:
A list of resource dirs
"""
dirs = [
os.path.join(dir, resource) for dir in
itertools.chain(GLib.get_system_data_dirs(), GUAKE_THEME_DIR, GLib.get_user_data_dir())
]
dirs += [os.path.join(os.path.expanduser("~"), ".{}".format(resource))]

return [Path(dir) for dir in dirs if os.path.isdir(dir)]


def list_all_themes():
return sorted(
x.name for theme_dir in get_resource_dirs("themes") for x in theme_dir.iterdir()
if x.is_dir()
)


def select_gtk_theme(settings):
gtk_theme_name = settings.general.get_string('gtk-theme-name')
log.debug("Wanted GTK theme: %r", gtk_theme_name)
gtk_settings = Gtk.Settings.get_default()
gtk_settings.set_property("gtk-theme-name", gtk_theme_name)

prefer_dark_theme = settings.general.get_boolean('gtk-prefer-dark-theme')
log.debug("Prefer dark theme: %r", prefer_dark_theme)
gtk_settings.set_property("gtk-application-prefer-dark-theme", prefer_dark_theme)
8 changes: 8 additions & 0 deletions po/ca.po
Original file line number Diff line number Diff line change
Expand Up @@ -1237,6 +1237,14 @@ msgstr ""
msgid "Start Guake at login"
msgstr ""

#: guake/data/prefs.glade:363
msgid "Gtk Theme:"
msgstr ""

#: guake/data/prefs.glade:387
msgid "Prefer dark theme"
msgstr ""

#~ msgid "key binding error"
#~ msgstr "S'ha produït un error en definir la drecera de teclat"

Expand Down
8 changes: 8 additions & 0 deletions po/cs.po
Original file line number Diff line number Diff line change
Expand Up @@ -1266,6 +1266,14 @@ msgstr ""
msgid "Start Guake at login"
msgstr ""

#: guake/data/prefs.glade:363
msgid "Gtk Theme:"
msgstr ""

#: guake/data/prefs.glade:387
msgid "Prefer dark theme"
msgstr ""

#~ msgid "key binding error"
#~ msgstr "chyba klávesových zkratek"

Expand Down
8 changes: 8 additions & 0 deletions po/de.po
Original file line number Diff line number Diff line change
Expand Up @@ -1271,6 +1271,14 @@ msgstr "Schnell öffnen..."
msgid "Start Guake at login"
msgstr "Guake beim Anmelden starten"

#: guake/data/prefs.glade:363
msgid "Gtk Theme:"
msgstr ""

#: guake/data/prefs.glade:387
msgid "Prefer dark theme"
msgstr ""

#~ msgid "Path to script executed on Guake start:"
#~ msgstr "Pfad zu einem Skript das beim Start ausgeführt wird:"

Expand Down
Loading

0 comments on commit 0779655

Please sign in to comment.