diff --git a/tryton/gui/window/view_form/view/graph_gtk/bar.py b/tryton/gui/window/view_form/view/graph_gtk/bar.py index 3c7f3e0a7e..08086657bf 100644 --- a/tryton/gui/window/view_form/view/graph_gtk/bar.py +++ b/tryton/gui/window/view_form/view/graph_gtk/bar.py @@ -86,6 +86,13 @@ class Bar(Graph): self.queue_draw_area(minx - 1, miny - 1, maxx - minx + 2, maxy - miny + 2) + def action(self, window): + super(Bar, self).action(window) + for bar in self.bars: + if bar.highlight: + ids = self.ids[bar.xname] + self.action_keyword(ids, window) + class VerticalBar(Bar): 'Vertical Bar Graph' diff --git a/tryton/gui/window/view_form/view/graph_gtk/graph.py b/tryton/gui/window/view_form/view/graph_gtk/graph.py index 5aa24216ba..0be8d7c233 100644 --- a/tryton/gui/window/view_form/view/graph_gtk/graph.py +++ b/tryton/gui/window/view_form/view/graph_gtk/graph.py @@ -7,6 +7,7 @@ import mx.DateTime import time import tryton.rpc as rpc import cairo +from tryton.action import Action class Popup(object): @@ -61,7 +62,7 @@ class Graph(gtk.DrawingArea): __gsignals__ = { "expose-event": "override" } - def __init__(self, xfield, yfields, attrs): + def __init__(self, xfield, yfields, attrs, model): super(Graph, self).__init__() self.xfield = xfield self.yfields = yfields @@ -75,6 +76,7 @@ class Graph(gtk.DrawingArea): self.connect('leave-notify-event', self.leave) self.popup = Popup(self) self.attrs = attrs + self.model = model def destroy(self): self.popup.destroy() @@ -118,6 +120,24 @@ class Graph(gtk.DrawingArea): self.queue_draw() + def action(self, window): + self.popup.hide() + + def action_keyword(self, ids, window): + if not ids: + return + ctx = self.models.context.copy() + if 'active_ids' in ctx: + del ctx['active_ids'] + if 'active_id' in ctx: + del ctx['active_id'] + return Action.exec_keyword('graph_open', { + 'model': self.model, + 'id': ids[0], + 'ids': ids, + 'window': window, + }, context=ctx, warning=False) + def drawBackground(self, cr, width, height): # Fill the background with gray cr.save() @@ -303,6 +323,7 @@ class Graph(gtk.DrawingArea): self.datas = {} self.labels = {} self.ids = {} + self.models = models minx = None maxx = None for model in models: diff --git a/tryton/gui/window/view_form/view/graph_gtk/line.py b/tryton/gui/window/view_form/view/graph_gtk/line.py index 8ce4a01925..e9fed87e24 100644 --- a/tryton/gui/window/view_form/view/graph_gtk/line.py +++ b/tryton/gui/window/view_form/view/graph_gtk/line.py @@ -163,6 +163,13 @@ class Line(Graph): super(Line, self).drawAxis(cr, width, height) self.drawLine(cr, 1.0, 0) + def action(self, window): + super(Line, self).action(window) + for point in self.points: + if point.highlight: + ids = self.ids[point.xname] + self.action_keyword(ids, window) + class Point(object): diff --git a/tryton/gui/window/view_form/view/graph_gtk/parser.py b/tryton/gui/window/view_form/view/graph_gtk/parser.py index 075be57c56..c9662119df 100644 --- a/tryton/gui/window/view_form/view/graph_gtk/parser.py +++ b/tryton/gui/window/view_form/view/graph_gtk/parser.py @@ -100,6 +100,8 @@ def button_press(widget, event, graph, window): menu.append(item) menu.popup(None, None, None, event.button, event.time) return True + elif event.button == 1: + graph.action(window) class ParserGraph(ParserInterface): @@ -131,7 +133,7 @@ class ParserGraph(ParserInterface): yattrs['string'] = fields[yattrs['name']]['string'] yfields.append(yattrs) - widget = GRAPH_TYPE[attrs.get('type', 'vbar')](xfield, yfields, attrs) + widget = GRAPH_TYPE[attrs.get('type', 'vbar')](xfield, yfields, attrs, model) event = gtk.EventBox() event.add(widget) event.connect('button-press-event', button_press, widget, self.window) diff --git a/tryton/gui/window/view_form/view/graph_gtk/pie.py b/tryton/gui/window/view_form/view/graph_gtk/pie.py index d86b90c17d..96b05ee872 100644 --- a/tryton/gui/window/view_form/view/graph_gtk/pie.py +++ b/tryton/gui/window/view_form/view/graph_gtk/pie.py @@ -154,6 +154,13 @@ class Pie(Graph): slice.highlight = False self.queue_draw() + def action(self, window): + super(Pie, self).action(window) + for slice in self.slices: + if slice.highlight: + ids = self.ids[slice.xname] + self.action_keyword(ids, window) + class Slice(object):