Example #1
0
 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)
Example #2
0
 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)
Example #3
0
    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)
Example #4
0
 def __init__(self, parent):
     GraphElement.__init__(self, parent)
     self.add_child(display_list.Rect(0, 0, 0, 0, self.canvas.white))
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
        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()