Reviewers: ,


Please review this at http://codereview.tryton.org/417002/

Affected files:
  M CHANGELOG
  M tryton/gui/window/view_form/view/graph_gtk/line.py


Index: CHANGELOG
===================================================================

--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,4 @@
+* Add constant interpolation on line graph
 * Make Import/Export Data no-modal
 * Deactivate switch view button when there is only 1 view
 * Manage create/delete field access

Index: tryton/gui/window/view_form/view/graph_gtk/line.py
===================================================================

--- a/tryton/gui/window/view_form/view/graph_gtk/line.py
+++ b/tryton/gui/window/view_form/view/graph_gtk/line.py
@@ -47,19 +47,50 @@

     def drawGraph(self, cr, width, height):
         key2fill = {}
+        key2interpolation = {}
         for yfield in self.yfields:
-            key2fill[yfield.get('key', yfield['name'])] = \
-                    bool(safe_eval(yfield.get('fill', '0')))
+            key = yfield.get('key', yfield['name'])
+            key2fill[key] = bool(safe_eval(yfield.get('fill', '0')))
+            key2interpolation[key] = yfield.get('interpolation', 'linear')

         def preparePath(key):
+            interpolation = key2interpolation[key]
+            points = (p for p in self.points if p.yname == key)
+            zero = 1.0 + self.minyval * self.yscale
             cr.new_path()
-            cr.move_to(self.area.x, self.area.y + self.area.h)
-            for point in self.points:
-                if point.yname == key:
+
+            cr.move_to(self.area.x, zero * self.area.h + self.area.y)
+            if interpolation == 'linear':
+                for point in points:
                     cr.line_to(point.x * self.area.w + self.area.x,
-                            point.y * self.area.h + self.area.y)
- cr.line_to(self.area.x + self.area.w, self.area.y + self.area.h)
-            cr.move_to(self.area.x, self.area.y + self.area.h)
+                        point.y * self.area.h + self.area.y)
+            else:
+                previous = Point(0, zero, None, None, None, None)
+
+                def breakage(previous, point):
+                    if interpolation == 'constant-center':
+                        return previous.x + ((point.x - previous.x) / 2.0)
+                    elif interpolation == 'constant-left':
+                        return point.x
+                    elif interpolation == 'constant-right':
+                        return previous.x
+                for point in points:
+                    cr.line_to(
+ breakage(previous, point) * self.area.w + self.area.x,
+                        previous.y * self.area.h + self.area.y)
+                    cr.line_to(
+ breakage(previous, point) * self.area.w + self.area.x,
+                        point.y * self.area.h + self.area.y)
+                    cr.line_to(point.x * self.area.w + self.area.x,
+                        point.y * self.area.h + self.area.y)
+                    previous = point
+                cr.line_to(breakage(previous,
+                        Point(1, zero, None, None, None, None))
+                    * self.area.w + self.area.x,
+                    previous.y * self.area.h + self.area.y)
+            cr.line_to(self.area.w + self.area.x,
+                zero * self.area.h + self.area.y)
+            cr.move_to(self.area.x, zero * self.area.h + self.area.y)

             if key2fill[key]:
                 cr.close_path()



--
[email protected] mailing list

Reply via email to