From c9c83bfce49aa064584753bb1fa29b006102f403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Guth?= Date: Thu, 20 Dec 2018 15:26:35 +0100 Subject: [PATCH] added dynamic color support for cpu_usage (#376) * added dynamic color support for cpu_usage * some minor fixes to pass build tests * added new PyPI requirement to documentation * removed explicit setting self.color in CpuUsage as a response to @facetoe removed explicitly setting self.color and instead set the class wide variable color to #FFFFFF to not have the output been shown in black. --- i3pystatus/cpu_usage.py | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/i3pystatus/cpu_usage.py b/i3pystatus/cpu_usage.py index bd44d85..689c52e 100644 --- a/i3pystatus/cpu_usage.py +++ b/i3pystatus/cpu_usage.py @@ -1,7 +1,9 @@ from collections import defaultdict from string import Formatter +import re from i3pystatus import IntervalModule +from i3pystatus.core.color import ColorRangeModule try: from natsort import natsorted as sorted @@ -9,12 +11,13 @@ except ImportError: pass -class CpuUsage(IntervalModule): +class CpuUsage(IntervalModule, ColorRangeModule): """ Shows CPU usage. The first output will be inacurate. Linux only + Requires the PyPI package 'colour'. .. rubric:: Available formatters @@ -28,14 +31,19 @@ class CpuUsage(IntervalModule): format_all = "{core}:{usage:02}%" exclude_average = False interval = 1 - color = None + color = '#FFFFFF' + dynamic_color = False + upper_limit = 100 settings = ( ("format", "format string."), ("format_all", ("format string used for {usage_all} per core. " "Available formaters are {core} and {usage}. ")), ("exclude_average", ("If True usage average of all cores will " "not be in format_all.")), - ("color", "HTML color code #RRGGBB") + ("color", "HTML color code #RRGGBB"), + ("dynamic_color", "Set color dynamically based on CPU usage. Note: this overrides color_up"), + ("start_color", "Hex or English name for start of color range, eg '#00FF00' or 'green'"), + ("end_color", "Hex or English name for end of color range, eg '#FF0000' or 'red'") ) def init(self): @@ -43,6 +51,17 @@ class CpuUsage(IntervalModule): self.prev_busy = defaultdict(int) self.formatter = Formatter() + self.key = re.findall('usage_cpu\d+', self.format) + if len(self.key) == 1: + self.key = self.key[0] + else: + self.key = 'usage_cpu' + + if not self.dynamic_color: + self.start_color = self.color + self.end_color = self.color + self.colors = self.get_hex_color_range(self.start_color, self.end_color, int(self.upper_limit)) + def get_cpu_timings(self): """ reads and parses /proc/stat @@ -118,8 +137,10 @@ class CpuUsage(IntervalModule): usage = self.get_usage() usage['usage_all'] = self.gen_format_all(usage) + color = self.get_gradient(usage[self.key], self.colors, int(self.upper_limit)) + self.data = usage self.output = { "full_text": self.format.format_map(usage), - "color": self.color + "color": color }