From 296d26f432a6ca1c97979cb6926ee876e0586c67 Mon Sep 17 00:00:00 2001 From: facetoe Date: Sun, 12 Oct 2014 11:58:52 +0800 Subject: [PATCH 1/4] Prevent division by zero errors. --- i3pystatus/cpu_usage.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/i3pystatus/cpu_usage.py b/i3pystatus/cpu_usage.py index a1f8e82..57e2083 100644 --- a/i3pystatus/cpu_usage.py +++ b/i3pystatus/cpu_usage.py @@ -67,7 +67,10 @@ class CpuUsage(IntervalModule): self.prev_total[cpu] = total self.prev_busy[cpu] = busy - return int(diff_busy / diff_total * 100) + if diff_total == 0: + return 0 + else: + return int(diff_busy / diff_total * 100) def gen_format_all(self, usage): """ From 55810e14310a6a54f703b1e1899799a910e383f2 Mon Sep 17 00:00:00 2001 From: facetoe Date: Sun, 12 Oct 2014 12:01:40 +0800 Subject: [PATCH 2/4] Added method to draw a vertical bar made of Unicode characters. --- i3pystatus/core/util.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/i3pystatus/core/util.py b/i3pystatus/core/util.py index 55d3364..54d3cea 100644 --- a/i3pystatus/core/util.py +++ b/i3pystatus/core/util.py @@ -389,6 +389,26 @@ def make_graph(values, upper_limit=100.0): for n in values[:len(values)-1]) # Don't show the upper limit value. return graph + +def make_vertical_bar(percentage, width=1): + """ + Draws a vertical bar made of unicode characters. + + :param value: A value between 0 and 100 + :param width: How many characters wide the bar should be. + :returns: Bar as a String + """ + bar = u' _▁▂▃▄▅▆▇█' + percentage //= 10 + if percentage < 0: + output = bar[0] + elif percentage >= len(bar): + output = bar[-1] + else: + output = bar[percentage] + return output * width + + def make_bar(percentage): """ Draws a bar made of unicode box characters. From fbd852b79b6ff0100b9c58cd2cb1384b4e355cc4 Mon Sep 17 00:00:00 2001 From: facetoe Date: Sun, 12 Oct 2014 12:03:25 +0800 Subject: [PATCH 3/4] Modified CpuUsageBar to show either a vertical or horizontal bar. --- i3pystatus/cpu_usage_bar.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/i3pystatus/cpu_usage_bar.py b/i3pystatus/cpu_usage_bar.py index 2c3b037..c5fef33 100644 --- a/i3pystatus/cpu_usage_bar.py +++ b/i3pystatus/cpu_usage_bar.py @@ -1,15 +1,18 @@ # -*- coding:utf-8 -*- - +from i3pystatus.core.color import ColorRangeModule from i3pystatus.cpu_usage import CpuUsage -from i3pystatus.core.util import make_bar +from i3pystatus.core.util import make_bar, make_vertical_bar -class CpuUsageBar(CpuUsage): + +class CpuUsageBar(CpuUsage, ColorRangeModule): """ Shows CPU usage as a bar (made with unicode box characters). The first output will be inacurate. Linux only + Requires the PyPI package `colour`. + Available formatters: * {usage_bar} usage average of all cores @@ -19,10 +22,23 @@ class CpuUsageBar(CpuUsage): """ format = "{usage_bar}" + bar_type = 'horizontal' + cpu = 'usage_bar' + settings = ( ("format", "format string"), + ("bar_type", "whether the bar should be vertical or horizontal. " + "Allowed values: `vertical` or `horizontal`"), + ("cpu", "cpu to base the colors on. Choices are 'usage_cpu' for all or 'usage_cpu*'." + " Replace '*' by core number starting at 0."), + ("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): + super().init() + self.colors = self.get_hex_color_range(self.start_color, self.end_color, 100) + def run(self): cpu_usage = self.get_usage() @@ -30,7 +46,12 @@ class CpuUsageBar(CpuUsage): for core, usage in cpu_usage.items(): core = core.replace('usage', 'usage_bar') - cpu_usage_bar[core] = make_bar(usage) + if self.bar_type == 'horizontal': + cpu_usage_bar[core] = make_bar(usage) + elif self.bar_type == 'vertical': + cpu_usage_bar[core] = make_vertical_bar(usage) + else: + raise Exception("bar_type must be 'horizontal' or 'vertical'!") cpu_usage.update(cpu_usage_bar) @@ -38,6 +59,6 @@ class CpuUsageBar(CpuUsage): cpu_usage['usage_bar'] = cpu_usage['usage_bar_cpu'] self.output = { - "full_text": self.format.format_map(cpu_usage) + "full_text": self.format.format_map(cpu_usage), + 'color': self.get_gradient(cpu_usage[self.cpu], self.colors, 100) } - From a789b31d6d0b4c0dc2be5c82ae0bb6b2ee0bf534 Mon Sep 17 00:00:00 2001 From: facetoe Date: Sun, 12 Oct 2014 15:33:04 +0800 Subject: [PATCH 4/4] Added multi_colors option to MemBar. --- i3pystatus/mem_bar.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/i3pystatus/mem_bar.py b/i3pystatus/mem_bar.py index cd3689b..61989fa 100644 --- a/i3pystatus/mem_bar.py +++ b/i3pystatus/mem_bar.py @@ -1,16 +1,17 @@ from i3pystatus import IntervalModule from psutil import virtual_memory +from i3pystatus.core.color import ColorRangeModule from i3pystatus.core.util import make_bar -class MemBar(IntervalModule): +class MemBar(IntervalModule, ColorRangeModule): """ Shows memory load as a bar. Available formatters: * {used_mem_bar} - Requires psutil (from PyPI) + Requires psutil and colour (from PyPI) """ format = "{used_mem_bar}" @@ -19,6 +20,10 @@ class MemBar(IntervalModule): alert_color = "#FF0000" warn_percentage = 50 alert_percentage = 80 + multi_colors = False + + def init(self): + self.colors = self.get_hex_color_range(self.color, self.alert_color, 100) settings = ( ("format", "format string used for output."), @@ -29,14 +34,16 @@ class MemBar(IntervalModule): "defines the color used wann warn percentage ist exceeded"), ("alert_color", "defines the color used when alert percentage is exceeded"), + ("multi_colors", "whether to use range of colors from 'color' to 'alert_color' based on memory usage."), ) def run(self): memory_usage = virtual_memory() - if memory_usage.percent >= self.alert_percentage: + if self.multi_colors: + color = self.get_gradient(memory_usage.percent, self.colors) + elif memory_usage.percent >= self.alert_percentage: color = self.alert_color - elif memory_usage.percent >= self.warn_percentage: color = self.warn_color else: