import os import json import glob def getpath(): return os.path.dirname("{}/themes/".format(os.path.dirname(os.path.realpath(__file__)))) def themes(): d = getpath() return [ os.path.basename(f).replace(".json", "") for f in glob.iglob("{}/*.json".format(d)) ] class Theme: # TODO: cycle handling def __init__(self, config): with open("{}/{}.json".format(getpath(), config.theme())) as f: self._data = json.load(f) self._defaults = self._data.get("defaults", {}) self._cycle = {} def begin(self): pass def next_widget(self): pass def prefix(self, widget): pass def suffix(self, widget): pass def color(self, widget): result = self._get(widget, "fg") if widget.warning(): result = self._get(widget, "fg-warning") if widget.critical(): result = self._get(widget, "fg-critical") return result def background(self, widget): pass def separator(self, widget): pass def separator_color(self, widget): pass def separator_background(self, widget): pass def default_separators(self, widget): pass def separator_block_width(self, widget): pass def _get(self, widget, name): module = widget.module() state = widget.state() module_theme = self._data.get(module, {}) state_theme = module_theme.get("states", {}).get(state, {}) value = None value = self._defaults.get(name, value) value = self._cycle.get(name, value) value = module_theme.get(name, value) value = state_theme.get(name, value) if type(value) is list: # if the value is a list, cycle through it # TODO pass return value #class Theme: # _cycle_index = 0 # _cycle = None # def __init__(self, config): # self._data = None # path = os.path.dirname(os.path.realpath(__file__)) # with open("{}/{}.json".format(getpath(), config.theme())) as f: # self._data = json.load(f) # self._defaults = self._data.get("defaults", {}) # self._cycle = self._defaults.get("cycle", []) # self._modules = {} # # self.reset() # # def _gettheme(self, obj, key): # module = obj.__module__.split(".")[-1] # module_theme = self._data.get(module, {}) # # value = getattr(obj, key)() if hasattr(obj, key) else None # value = self._defaults.get(key, value) # if len(self._cycle) > 0: # value = self._defaults["cycle"][self._cycle_index].get(key, value) # value = module_theme.get(key, value) # # if hasattr(obj, "state"): # state = getattr(obj, "state")() # state_theme = module_theme.get("states", {}).get(state, {}) # # value = state_theme.get(key, value) # # if type(value) is list: # # cycle through the values # if not obj in self._modules: # self._modules[obj] = { "idx": 0 } # else: # self._modules[obj]["idx"] += 1 # if self._modules[obj]["idx"] >= len(value): # self._modules[obj]["idx"] = 0 # value = value[self._modules[obj]["idx"]] # # return value # # def reset(self): # self._cycle_index = 0 # self._previous_background = None # self._background = None # # def urgent(self, obj): # self._gettheme(obj, "urgent") # # def next(self): # self._cycle_index += 1 # self._previous_background = self._background # if self._cycle_index >= len(self._cycle): # self._cycle_index = 0 # # def color(self, obj): # fg = None # if obj.warning(): # fg = self._gettheme(obj, "fg-warning") # if obj.critical(): # fg = self._gettheme(obj, "fg-critical") # if fg == None: # fg = self._gettheme(obj, "fg") # return fg # # def background(self, obj): # self._background = None # if obj.warning(): # self._background = self._gettheme(obj, "bg-warning") # if obj.critical(): # self._background = self._gettheme(obj, "bg-critical") # # if self._background == None: # self._background = self._gettheme(obj, "bg") # # return self._background # # def previous_background(self): # return self._previous_background # # def separator(self, obj): # return self._gettheme(obj, "separator") # # def default_separators(self, obj): # return self._gettheme(obj, "default_separators") # # def prefix(self, obj): # return self._gettheme(obj, "prefix") # # def suffix(self, obj): # return self._gettheme(obj, "suffix") # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4