From 82db7a87a2db8772e2ddb60fd2146de5331fc030 Mon Sep 17 00:00:00 2001 From: Matus Telgarsky Date: Wed, 28 Jan 2015 16:54:42 -0500 Subject: [PATCH] more braille styles (ideas from drawille) added 'braille-peak' and 'braille-snake'. 'braille-peak' renders only the top point, and 'braille-snake' fills some in. I should have stressed earlier that I only got the braille drawing ideas after coming across drawille ( https://github.com/asciimoo/drawille ). --- i3pystatus/core/util.py | 43 ++++++++++++++++++++++++++--------- i3pystatus/cpu_usage_graph.py | 2 +- i3pystatus/network.py | 2 +- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/i3pystatus/core/util.py b/i3pystatus/core/util.py index 0b0a876..d705b8d 100644 --- a/i3pystatus/core/util.py +++ b/i3pystatus/core/util.py @@ -371,7 +371,7 @@ def make_graph(values, upper_limit=100.0, style="blocks"): :param values: An array of values to graph. :param upper_limit: Maximum value for the y axis. - :param style: Drawing style (currently 'blocks' or 'braille'). + :param style: Drawing style ('blocks', 'braille-fill', 'braille-peak', or 'braille-snake'). :returns: Bar as a string """ values = [float(n) for n in values] @@ -384,19 +384,40 @@ def make_graph(values, upper_limit=100.0, style="blocks"): graph = '_' * len(values) else: graph = ''.join(bar[int((n - mn) / extent * bar_count)] for n in values) - elif style == 'braille': + elif style in ['braille-fill', 'braille-peak', 'braille-snake']: # idea from https://github.com/asciimoo/drawille # unicode values from http://en.wikipedia.org/wiki/Braille - v2 = values if len(values) % 2 == 0 else values + [mn] - l = len(v2) // 2 - if extent == 0: - graph = chr(0x2800) * l # should be visually equiv to ' ' + + vpad = values if len(values) % 2 == 0 else values + [mn] + vscale = [round(4 * (vp - mn) / extent) for vp in vpad] + l = len(vscale) // 2 + + # do the 2-character collapse separately for clarity + if 'fill' in style: + vbits = [[0, 0x40, 0x44, 0x46, 0x47][vs] for vs in vscale] + elif 'peak' in style: + vbits = [[0, 0x40, 0x04, 0x02, 0x01][vs] for vs in vscale] else: - graph = '' - for i in range(0, l, 2): - b1 = [0, 0x40, 0x44, 0x46, 0x47][round(4 * (v2[i] - mn) / extent)] - b2 = [0, 0x80, 0xa0, 0xb0, 0xb8][round(4 * (v2[i + 1] - mn) / extent)] - graph += chr(0x2800 + b1 + b2) + assert('snake' in style) + # there are a few choices for what to put last in vb2. + # arguable vscale[-1] from the _previous_ call is best. + vb2 = [vscale[0]] + vscale + [0] + vbits = [] + for i in range(1, l + 1): + c = 0 + for j in range(min(vb2[i - 1], vb2[i], vb2[i + 1]), vb2[i] + 1): + c |= [0, 0x40, 0x04, 0x02, 0x01][j] + vbits.append(c) + + # 2-character collapse + graph = '' + for i in range(0, l, 2): + b1 = vbits[i] + b2 = vbits[i + 1] + if b2 & 0x40: + b2 = b2 - 0x30 + b2 = b2 << 3 + graph += chr(0x2800 + b1 + b2) else: raise NotImplementedError("Graph drawing style '%s' unimplemented." % style) return graph diff --git a/i3pystatus/cpu_usage_graph.py b/i3pystatus/cpu_usage_graph.py index d8a99e5..e648db1 100644 --- a/i3pystatus/cpu_usage_graph.py +++ b/i3pystatus/cpu_usage_graph.py @@ -26,7 +26,7 @@ class CpuUsageGraph(CpuUsage, ColorRangeModule): ("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'"), ("graph_width", "Width of the cpu usage graph"), - ("graph_style", "Graph style, currently 'blocks' or 'braille'"), + ("graph_style", "Graph style ('blocks', 'braille-fill', 'braille-peak', or 'braille-snake')"), ) graph_width = 15 diff --git a/i3pystatus/network.py b/i3pystatus/network.py index 85103fd..303838d 100644 --- a/i3pystatus/network.py +++ b/i3pystatus/network.py @@ -254,7 +254,7 @@ class Network(IntervalModule, ColorRangeModule): ("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'"), ("graph_width", "Width of the network traffic graph"), - ("graph_style", "Graph style, currently 'blocks' or 'braille'"), + ("graph_style", "Graph style ('blocks', 'braille-fill', 'braille-peak', or 'braille-snake')"), ("upper_limit", "Expected max kb/s. This value controls how the network traffic graph is drawn and in what color"), ("graph_type", "Whether to draw the network traffic graph for input or output. "