[core/theme] Add ~/.config/bumblebee-status/themes to theme directories

Allow users to create themes outside the main theme tree.

see #203
This commit is contained in:
Tobias Witek 2017-11-05 09:08:01 +01:00
parent 760cc4252f
commit f72ac0ca99

View file

@ -12,14 +12,18 @@ import bumblebee.error
def theme_path(): def theme_path():
"""Return the path of the theme directory""" """Return the path of the theme directory"""
return os.path.dirname("{}/../themes/".format(os.path.dirname(os.path.realpath(__file__)))) return [
os.path.dirname("{}/../themes/".format(os.path.dirname(os.path.realpath(__file__)))),
os.path.dirname(os.path.expanduser("~/.config/bumblebee-status/themes/")),
]
def themes(): def themes():
result = [] result = []
for filename in glob.iglob("{}/*.json".format(theme_path())): for path in theme_path():
if "test" not in filename: for filename in glob.iglob("{}/*.json".format(path)):
result.append(os.path.basename(filename).replace(".json", "")) if "test" not in filename:
result.append(os.path.basename(filename).replace(".json", ""))
return result return result
class Theme(object): class Theme(object):
@ -119,21 +123,26 @@ class Theme(object):
def _load_icons(self, name): def _load_icons(self, name):
"""Load icons for a theme""" """Load icons for a theme"""
path = "{}/icons/".format(theme_path()) result = {}
return self.load(name, path=path) for path in theme_path():
self._merge(result, self.load(name, path="{}/icons/".format(path)))
return result
def load(self, name, path=theme_path()): def load(self, name, path=theme_path()):
"""Load and parse a theme file""" """Load and parse a theme file"""
themefile = "{}/{}.json".format(path, name) if not isinstance(path, list):
path = [path]
for p in path:
themefile = "{}/{}.json".format(p, name)
if os.path.isfile(themefile): if os.path.isfile(themefile):
try: try:
with io.open(themefile, encoding="utf-8") as data: with io.open(themefile, encoding="utf-8") as data:
return json.load(data) return json.load(data)
except ValueError as exception: except ValueError as exception:
raise bumblebee.error.ThemeLoadError("JSON error: {}".format(exception)) raise bumblebee.error.ThemeLoadError("JSON error: {}".format(exception))
else:
raise bumblebee.error.ThemeLoadError("no such theme: {}".format(name)) return {}
def _get(self, widget, name, default=None): def _get(self, widget, name, default=None):
"""Return the config value 'name' for 'widget'""" """Return the config value 'name' for 'widget'"""