Make size column configurable graph

This commit makes the size column configurable to graphs by
configuration file. And this commit adds color styles by thresholds
which are configurable.

Change-Id: Ifdc6961efbb178cc314c0fbd4d948a1ba19dcdd6
This commit is contained in:
Masayuki Igawa 2016-09-30 16:14:43 -07:00 committed by James E. Blair
parent 45e8402f31
commit a34fdef1ed
4 changed files with 113 additions and 3 deletions

View File

@ -143,3 +143,12 @@ reviewkeys:
- key: 'meta 4'
approvals: []
message: "recheck"
# 'size-column' is a set of customize parameters for the 'Size' column
# on your dashboard.
# 'type' must be 'graph' or 'number'. Default is 'graph'.
# 'thresholds' is for bar graphs width (when graph) or color styles
# (when number).
size-column:
type: 'graph'
thresholds: [1, 10, 100, 1000]

View File

@ -111,6 +111,11 @@ class ConfigSchema(object):
keymaps = [keymap]
thresholds = [int, int, int, int, int, int, int, int]
size_column = {v.Required('type'): v.Any('graph', 'splitGraph', 'number',
'disabled', None),
v.Optional('thresholds'): thresholds}
def getSchema(self, data):
schema = v.Schema({v.Required('servers'): self.servers,
'palettes': self.palettes,
@ -129,6 +134,7 @@ class ConfigSchema(object):
'breadcrumbs': bool,
'change-list-options': self.change_list_options,
'expire-age': str,
'size-column': self.size_column,
})
return schema
@ -250,6 +256,15 @@ class Config(object):
self.expire_age = self.config.get('expire-age', '2 months')
self.size_column = self.config.get('size-column', {})
self.size_column['type'] = self.size_column.get('type', 'graph')
if self.size_column['type'] == 'graph':
self.size_column['thresholds'] = self.size_column.get('thresholds',
[1, 10, 100, 1000])
else:
self.size_column['thresholds'] = self.size_column.get('thresholds',
[1, 10, 100, 200, 400, 600, 800, 1000])
def getServer(self, name=None):
for server in self.config['servers']:
if name is None or name == server['name']:

View File

@ -98,6 +98,22 @@ DEFAULT_PALETTE={
'added-removed-graph': ['dark green', 'dark red'],
'focused-added-graph': ['default,standout', 'dark green'],
'focused-removed-graph': ['default,standout', 'dark red'],
'line-count-threshold-1': ['light green', ''],
'focused-line-count-threshold-1': ['light green,standout', ''],
'line-count-threshold-2': ['light cyan', ''],
'focused-line-count-threshold-2': ['light cyan,standout', ''],
'line-count-threshold-3': ['light blue', ''],
'focused-line-count-threshold-3': ['light blue,standout', ''],
'line-count-threshold-4': ['yellow', ''],
'focused-line-count-threshold-4': ['yellow,standout', ''],
'line-count-threshold-5': ['dark magenta', ''],
'focused-line-count-threshold-5': ['dark magenta,standout', ''],
'line-count-threshold-6': ['light magenta', ''],
'focused-line-count-threshold-6': ['light magenta,standout', ''],
'line-count-threshold-7': ['dark red', ''],
'focused-line-count-threshold-7': ['dark red,standout', ''],
'line-count-threshold-8': ['light red', ''],
'focused-line-count-threshold-8': ['light red,standout', ''],
}
# A delta from the default palette

View File

@ -104,6 +104,15 @@ class ChangeRow(urwid.Button, ChangeListColumns):
'added-graph': 'focused-added-graph',
'removed-graph': 'focused-removed-graph',
'line-count-threshold-1': 'focused-line-count-threshold-1',
'line-count-threshold-2': 'focused-line-count-threshold-2',
'line-count-threshold-3': 'focused-line-count-threshold-3',
'line-count-threshold-4': 'focused-line-count-threshold-4',
'line-count-threshold-5': 'focused-line-count-threshold-5',
'line-count-threshold-6': 'focused-line-count-threshold-6',
'line-count-threshold-7': 'focused-line-count-threshold-7',
'line-count-threshold-8': 'focused-line-count-threshold-8',
}
def selectable(self):
@ -148,7 +157,7 @@ class ChangeRow(urwid.Button, ChangeListColumns):
return True
return False
def _makeSize(self, added, removed):
def _makeSizeGraph(self, added, removed):
# Removed is a red graph on top, added is a green graph on bottom.
#
# The graph is 4 cells wide. If both the red and green graphs
@ -165,7 +174,9 @@ class ChangeRow(urwid.Button, ChangeListColumns):
ret = []
# The graph is logarithmic -- one cell for each order of
# magnitude.
for threshold in [1, 10, 100, 1000]:
conf_thresholds = self.app.config.size_column['thresholds']
# for threshold in [1, 10, 100, 1000]:
for threshold in conf_thresholds:
color = []
if (added > threshold and removed > threshold):
ret.append(('added-removed-graph', lower_box))
@ -177,6 +188,36 @@ class ChangeRow(urwid.Button, ChangeListColumns):
ret.append(' ')
return ret
def _makeSizeSplitGraph(self, added, removed):
# Removed is a red graph on right, added is a green graph on left.
# conf_thresholds[7]: Full block,
# conf_thresholds[6]: Left seven eighths block,
# ...., conf_thresholds[0]: Left one eighth block.
# You can see the character table at the wikipedia[1] or somewhere.
# [1] https://en.wikipedia.org/wiki/Block_Elements#Character_table
conf_thresholds = self.app.config.size_column['thresholds']
thresholds = [(conf_thresholds[7], u'\u2588'),
(conf_thresholds[6], u'\u2589'),
(conf_thresholds[5], u'\u258a'),
(conf_thresholds[4], u'\u258b'),
(conf_thresholds[3], u'\u258c'),
(conf_thresholds[2], u'\u258d'),
(conf_thresholds[1], u'\u258e'),
(conf_thresholds[0], u'\u258f')]
ret = []
# The graph is logarithmic -- one cell for each order of
# magnitude.
for diff in [[added, 'added-graph'], [removed, 'removed-graph']]:
for threshold in thresholds:
if (diff[0] == 0):
ret.append(' ')
break
if (diff[0] >= threshold[0]):
ret.append((diff[1], threshold[1]))
break
ret.append(' ')
return ret
def update(self, change, categories):
if change.reviewed or change.hidden:
style = 'reviewed-change'
@ -217,7 +258,32 @@ class ChangeRow(urwid.Button, ChangeListColumns):
continue
total_added += rfile.inserted or 0
total_removed += rfile.deleted or 0
self.size.set_text(self._makeSize(total_added, total_removed))
if self.app.config.size_column['type'] == 'number':
total_added_removed = total_added + total_removed
thresholds = self.app.config.size_column['thresholds']
size_style = 'line-count-threshold-1'
if (total_added_removed >= thresholds[7]):
size_style = 'line-count-threshold-8'
elif (total_added_removed >= thresholds[6]):
size_style = 'line-count-threshold-7'
elif (total_added_removed >= thresholds[5]):
size_style = 'line-count-threshold-6'
elif (total_added_removed >= thresholds[4]):
size_style = 'line-count-threshold-5'
elif (total_added_removed >= thresholds[3]):
size_style = 'line-count-threshold-4'
elif (total_added_removed >= thresholds[2]):
size_style = 'line-count-threshold-3'
elif (total_added_removed >= thresholds[1]):
size_style = 'line-count-threshold-2'
elif (total_added_removed >= thresholds[0]):
size_style = 'line-count-threshold-1'
self.size.set_text((size_style, str(total_added_removed)))
elif self.app.config.size_column['type'] == 'splitGraph':
self.size.set_text(self._makeSizeSplitGraph(total_added,
total_removed))
else:
self.size.set_text(self._makeSizeGraph(total_added, total_removed))
self.category_columns = []
for category in categories:
@ -267,6 +333,7 @@ class ChangeListHeader(urwid.WidgetWrap, ChangeListColumns):
@mouse_scroll_decorator.ScrollByWheel
class ChangeListView(urwid.WidgetWrap, mywid.Searchable):
required_columns = set(['Number', 'Subject', 'Updated'])
# FIXME(masayukig): Disable 'Size' column when configured
optional_columns = set(['Topic', 'Branch', 'Size'])
def getCommands(self):
@ -344,6 +411,9 @@ class ChangeListView(urwid.WidgetWrap, mywid.Searchable):
# not.
self.enabled_columns.discard('Owner')
self.disabled_columns.add('Owner')
if app.config.size_column['type'] == 'disabled':
self.enabled_columns.discard('Size')
self.disabled_columns.add('Size')
self.sort_by = sort_by or app.config.change_list_options['sort-by']
if reverse is not None:
self.reverse = reverse