[core] Add "merged" pango support

With this commit, it is possible to add pango directives inside every
piece that supports direct output (e.g. defaults/prefix or <module
name>/prefix) and those will be merged - i.e. it is possible to specify
defaults inside "defaults" and override/specify in the particular
modules.
This commit is contained in:
tobi-wan-kenobi 2020-04-05 14:57:52 +02:00
parent e653624f5a
commit 23215303ca
2 changed files with 19 additions and 5 deletions

View file

@ -52,7 +52,6 @@ class block(object):
text = attr.get('full_text', '') text = attr.get('full_text', '')
if 'full_text' in attr: if 'full_text' in attr:
del attr['full_text'] del attr['full_text']
result = '<span ' result = '<span '
for key, value in attr.items(): for key, value in attr.items():
result = '{} {}="{}"'.format(result, key, value) result = '{} {}="{}"'.format(result, key, value)

View file

@ -2,6 +2,7 @@ import os
import io import io
import json import json
import logging import logging
import copy
import core.event import core.event
import util.algorithm import util.algorithm
@ -15,6 +16,17 @@ PATHS=[
os.path.expanduser('~/.config/bumblebee-status/themes'), os.path.expanduser('~/.config/bumblebee-status/themes'),
] ]
def merge_replace(value, new_value, key):
if not isinstance(value, dict):
return new_value
if isinstance(new_value, dict):
util.algorithm.merge(value, new_value)
return value
# right now, merging needs explicit pango support :(
if 'pango' in value:
value['pango']['full_text'] = new_value
return value
class Theme(object): class Theme(object):
def __init__(self, name='default', iconset='auto', raw_data=None): def __init__(self, name='default', iconset='auto', raw_data=None):
self.name = name self.name = name
@ -106,17 +118,20 @@ class Theme(object):
tmp = self.__data[option] tmp = self.__data[option]
if isinstance(tmp, list): if isinstance(tmp, list):
tmp = tmp[self.__widget_count % len(tmp)] tmp = tmp[self.__widget_count % len(tmp)]
value = tmp.get(key, value) value = merge_replace(value, tmp.get(key, value), key)
value = self.__data.get(key, value) if isinstance(value, dict):
value = copy.deepcopy(value)
value = merge_replace(value, self.__data.get(key, value), key)
if widget.module(): if widget.module():
value = self.__get(None, widget.module().name(), {}).get(key, value) value = merge_replace(value, self.__get(None, widget.module().name(), {}).get(key, value), key)
if not key in widget.state(): if not key in widget.state():
for state in widget.state(): for state in widget.state():
theme = self.__get(widget, state, {}) theme = self.__get(widget, state, {})
value = theme.get(key, value) value = merge_replace(value, theme.get(key, value), key)
if not type(value) in (list, dict): if not type(value) in (list, dict):
value = self.__keywords.get(value, value) value = self.__keywords.get(value, value)