def get_bbox(self): """ recompute and relayout the component and return it's bbox """ if self.modified: new_children = [] x, y = self.get_location() width, height = self.get_size() rows, cols = self.canvas.to_rowcol(width - 4, height) r_height, r_width = self.canvas.from_rowcol(1, 1) for text, color in self.series_labels: new_children.append( display_list.Rect(x, y, x + 1, y + 1, color)) text = text.strip() while text and rows: if len(text) > cols: s_idx = cols while s_idx > 0: if text[s_idx] == ' ': break s_idx -= 1 if s_idx <= 0: s_idx = cols else: s_idx = cols new_children.append( display_list.Text(x + 4, y, text[:s_idx], self.canvas.white)) rows -= 1 y += r_height text = text[s_idx:].lstrip() self.set_children(new_children) return GraphElement.get_bbox(self)
def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] x, y = self.get_location() width, height = self.get_size() new_children.append( display_list.Rect(x, y, x + width, y + height, self.canvas.black, fill=True)) self.set_children(new_children) return GraphElement.get_bbox(self)
def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] if self.x_axis.modified: self.x_axis.get_bbox() if self.y_axis.modified: self.y_axis.get_bbox() x_min, x_max, x_scale, x_dx = self.x_axis.get_range() y_min, y_max, y_scale = self.y_axis.get_range() x_values = self.x_axis.get_values() x, y = self.get_location() width, height = self.get_size() y = y + height n_series = len(self.parent.get_series()) i_series = self.parent.get_series().index(self.series) bar_width = max(1.0, (x_dx / n_series)) series_x_offset = (n_series - (i_series + 1)) * bar_width x += series_x_offset if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() column = self.series.data.get_column(self.series.column) idx = 0 for c in data_table.ColumnIterator(column): if not self.parent.is_top() or idx in top_indexes: y_value = c.get_float_value() if self.parent.is_top(): x_value = x_values[top_indexes.index(idx)][0] else: x_value = x_values[idx][0] scaled_x = (x_value - x_min) * x_scale scaled_y = (y_value - y_min) * y_scale new_children.append( display_list.Rect( x + scaled_x - (bar_width / 2), y, min(x + scaled_x + (bar_width / 2), x + width), y - scaled_y, self.series.color, True)) idx += 1 self.set_children(new_children) return GraphElement.get_bbox(self)
def __init__(self, parent): GraphElement.__init__(self, parent) self.add_child(display_list.Rect(0, 0, 0, 0, self.canvas.white))
def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] y_values = self.parent.get_series() self.range_min = -1 self.range_max = -1 self.dy = 0 if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() for series in y_values: column = series.data.get_column(series.column) for idx in top_indexes: c = column.get(idx) value = c.get_float_value() if self.range_min < 0 or value < self.range_min: self.range_min = value if self.range_max < 0 or value > self.range_max: self.range_max = value else: for series in y_values: column = series.data.get_column(series.column) for c in data_table.ColumnIterator(column): value = c.get_float_value() if self.range_min < 0 or value < self.range_min: self.range_min = value if self.range_max < 0 or value > self.range_max: self.range_max = value if self.range_min <= 0: self.range_min = 0 if self.range_max <= 0: self.range_max = 1 tick_size = max(1.0, (self.range_max - self.range_min)) / 5 if tick_size > 1: tick_size = round(tick_size) self.range_max += tick_size r_height, r_width = self.canvas.from_rowcol(1, 1) width, height = self.get_size() ox, oy = self.get_location() new_children.append( display_list.Rect(ox, oy, ox + width, oy + height, self.canvas.black, fill=True)) oy += height ox += (width - 1) self.sy = height / max(1.0, (self.range_max - self.range_min)) x = ox y = oy points = [(x, y)] labels = [] for data_y in float_range(self.range_min, self.range_max, tick_size): scaled_y = (data_y - self.range_min) * self.sy label = data_table.format_float(float(data_y)) if label.endswith(".00"): label = label[:-3] t_x, t_y = self.canvas.round_text_position( x - 3, oy - scaled_y) if t_y <= y: l_height, l_width = self.canvas.from_rowcol( 1, len(label) + 1) points.append((x, t_y)) points.append((t_x, t_y)) points.append((x, t_y)) labels.append((t_x - l_width, t_y - (l_height / 2), label)) y = t_y - l_height if points[-1][1] > oy - height: points.append((x, oy - height)) new_children.append( display_list.PolyLine(points, self.canvas.green)) for x, y, label in labels: new_children.append( display_list.Text(x, y, label, self.canvas.green)) self.set_children(new_children) return GraphElement.get_bbox(self)
def get_bbox(self): """ compute the bounding box """ if self.modified: new_children = [] x_values = self.parent.get_xvalues() column = x_values.data.get_column(x_values.column) type = None for c in data_table.ColumnIterator(column): if not type or type == data_table.blank_type: type = c.get_type() elif type != c.get_type(): type = 'mixed' self.range_min = -1 self.range_max = -1 self.sx = 0 self.dx = 0 self.values = [] if self.parent.is_top(): top_indexes = self.parent.get_top_indexes() if type in [ data_table.blank_type, data_table.string_type, 'mixed' ]: if self.parent.is_top(): self.range_min = 0 self.range_max = len(top_indexes) ii = 0 for ix in top_indexes: c = column.get(ix) self.values.append((ii, str(c))) ii += 1 else: self.range_min = 0 self.range_max = column.size() ix = 0 for c in data_table.ColumnIterator(column): self.values.append((ix, str(c))) ix += 1 else: self.range_min = None self.range_max = None if self.parent.is_top(): for ix in top_indexes: c = column.get(ix) value = c.get_float_value() if self.range_min == None or value < self.range_min: self.range_min = value if self.range_max == None or value > self.range_max: self.range_max = value self.values.append((value, str(c))) else: for c in data_table.ColumnIterator(column): value = c.get_float_value() if self.range_min == None or value < self.range_min: self.range_min = value if self.range_max == None or value > self.range_max: self.range_max = value self.values.append((value, str(c))) if len(self.values) >= 2: extra_value = self.values[-1][0] + ( self.values[-1][0] - self.values[-2][0]) self.values.append((extra_value, " ")) if extra_value > self.range_max: self.range_max = extra_value r_height, r_width = self.canvas.from_rowcol(1, 1) width, height = self.get_size() ox, oy = self.get_location() self.sx = width / max(1.0, (self.range_max - self.range_min)) x = ox y = oy new_children.append( display_list.Rect(x, y, x + width, y + height, self.canvas.black, fill=True)) points = [(x, y)] labels = [] prev_scaled_x = None total_dx = 0 prev_label = None for v, label in self.values: if label.endswith(".00"): label = label[:-3] force = False if prev_label: prev_parts = prev_label.split(' ') cur_parts = label.split(' ') new_label = '' no_match = False idx = 0 while idx < min(len(prev_parts), len(cur_parts)): if no_match or prev_parts[idx] != cur_parts[idx]: if idx == 0: force = True new_label += cur_parts[idx] + ' ' no_match = True idx += 1 while idx < len(cur_parts): new_label += cur_parts[idx] + ' ' idx += 1 prev_label = label label = new_label else: prev_label = label scaled_x = (v - self.range_min) * self.sx if prev_scaled_x != None: total_dx += (scaled_x - prev_scaled_x) prev_scaled_x = scaled_x t_x, t_y = self.canvas.round_text_position( ox + scaled_x, y + 1) if t_x >= x or force: points.append((t_x, y)) points.append((t_x, t_y)) points.append((t_x, y)) labels.append((t_x, t_y, label)) l_height, l_width = self.canvas.from_rowcol( 1, len(label) + 1) x = t_x + l_width if points[-1][0] < ox + width: points.append((ox + width, y)) self.dx = total_dx / len(self.values) new_children.append( display_list.PolyLine(points, self.canvas.green)) for x, y, label in labels: new_children.append( display_list.Text(x, y, label, self.canvas.green)) self.set_children(new_children) return GraphElement.get_bbox(self)
def main(stdscr): screen_size(40, 100) stdscr.clear() stdscr.refresh() python_path = os.path.dirname(os.path.dirname(request.fspath)) c = canvas.Canvas(stdscr) max_x, max_y = c.get_maxxy() d = display_list.DisplayList(canvas=c) r = 1 for ix in range(5): for iy in range(5): x = ix * 11 y = iy * 11 d.add_child( display_list.Rect(x, y, x + 10, y + 10, curses.color_pair(8 + r * 5), True)) r = r + 1 d.render() dashboard_test_case(stdscr, "dl_rect", python_path) c.clear() r = 1 for ix in range(5): for iy in range(5): x = 65 + (ix * (11 * 1.5)) + 5 y = (iy * 11) + 5 d.add_child( display_list.Circle(x, y, 5, curses.color_pair(8 + r * 5), True)) r = r + 1 d.render() dashboard_test_case(stdscr, "dl_circle", python_path) c.clear() a = 0 ia = [20, 15, 40, 110, 45, 25, 80, 25] r = 1 for ac in ia: d.add_child( display_list.Arc(100, 40, 40, a, a + ac, curses.color_pair(8 * r * 5), True)) a = a + ac r = r + 1 d.render() dashboard_test_case(stdscr, "dl_arc", python_path) c.clear() r = 0 for ix in range(5): for iy in range(5): d.add_child( display_list.Text(ix * 10, (iy * 10) + (ix * 2), "Text %d,%d" % (ix, iy), curses.color_pair(8 * r * 5))) r = r + 1 d.render() dashboard_test_case(stdscr, "dl_text", python_path) c.clear() points = [] for a in range(0, 360, 72): points.append(angle_point(0, 0, a, 20)) points.append(angle_point(0, 0, a + 36, 10)) points.append(points[0]) r = 50 d.add_child( display_list.PolyLine([(x + 100, y + 40) for x, y in points], curses.color_pair(8 + r * 8))) d.render() dashboard_test_case(stdscr, "dl_polyline", python_path) c.clear() r += 25 d.add_child( display_list.Polygon([(x + 102, y + 42) for x, y in points], curses.color_pair(8 + r * 8), True)) d.render() dashboard_test_case(stdscr, "dl_polygon", python_path) c.clear()