Salome HOME
Merge master branch into V9_dev
[modules/gui.git] / tools / CurvePlot / src / python / views / CurveBrowserView.py
1 from pyqtside import QtGui
2 from pyqtside.QtGui import QMenu
3 from pyqtside.QtCore import Qt
4
5 from View import View
6 from CurveTreeDockWidget import CurveTreeDockWidget
7 from utils import Logger
8
9 class CurveBrowserView( View, CurveTreeDockWidget) :
10
11     def __init__( self, controller) :
12         """ Constructor """
13         View.__init__( self, controller)
14         CurveTreeDockWidget.__init__(self)
15         self._noUpdate = False
16         
17         treeWidget = self.getTreeWidget()
18         treeWidget.itemSelectionChanged.connect(self.onItemSelectionChanged)
19         treeWidget.itemDoubleClicked.connect(self.onItemDoubleCliked)
20         treeWidget.setContextMenuPolicy(Qt.CustomContextMenu)
21         treeWidget.customContextMenuRequested.connect(self.openMenu)
22             
23     def update(self):
24         """ Update this view due to model change """
25         if self._model == None or self._noUpdate:
26             return
27           
28         # widget clear and repopulation will trigger onItemSelectionChanged(),
29         # which in turns triggers update() (via setCurrentCurve()). So avoid recursion:
30         self._noUpdate = True
31         
32         treeWidget = self.getTreeWidget()
33         treeWidget.clear()
34         
35         plotSets = self._model._plotSets
36             
37         # The second (hidden) column in the tree bares the ID of the object and its nature (plotset or curve)
38         for p in list(plotSets.values()):
39           item = QtGui.QTreeWidgetItem([str(p.getTitle()), str(p.getID()) + '_set'])
40           treeWidget.addTopLevelItem(item)
41           for c in list(p._curves.values()):
42             chld = QtGui.QTreeWidgetItem([str(c.getTitle()), str(c.getID()) + '_crv'])
43             item.addChild(chld)
44           
45         treeWidget.expandAll()
46         
47         # Finally select the proper item in the tree:
48         cps = self._model.getCurrentPlotSet()
49         if not cps is None:
50           ccv = cps.getCurrentCurve()
51           if ccv is None:
52             key = str(cps.getID()) + '_set'
53           else:
54             key = str(ccv.getID()) + '_crv'
55           listItems = treeWidget.findItems(key, Qt.MatchExactly | Qt.MatchRecursive,1)
56           if len(listItems) > 0:
57             treeWidget.setCurrentItem(listItems[0])
58             
59         self._noUpdate = False
60     
61     def onItemSelectionChanged(self):
62         """
63         Change the current selected XYplot/curve        
64         """
65         if self._noUpdate:
66           return
67         
68         # setCurrentCurve() and setCurrentPlotSet() will trigger update(),
69         # which in turns triggers onItemSelectionChanged(). So avoid recursion:
70         self._noUpdate = True
71         
72         pm = self._controller._plotManager
73         treeWidget = self.getTreeWidget()
74         it = treeWidget.currentItem()
75         if not it is None:
76           objStr = str(it.text(1))   # no unicode here!
77           objID = int(objStr[0:-4])
78           objTyp = objStr[-3:]
79           if objTyp == 'crv':
80             # Find correct plot set:
81             cps = pm.getPlotSetContainingCurve(objID)
82             if not cps is None:
83               cps.setCurrentCurve(objID)
84               pm.setCurrentPlotSet(cps.getID())
85           elif objTyp == 'set':
86             pm.clearAllCurrentCurve()
87             pm.setCurrentPlotSet(objID)
88           else:
89             raise Exception("Internal error - should not happen")
90         else:
91           ps = pm.getCurrentPlotSet()
92           if not ps is None:
93             ps.setCurrentCurve(-1)
94           pm.setCurrentPlotSet(-1)
95           
96         self._noUpdate = False
97     
98     def onItemDoubleCliked(self):
99         Logger.Debug("item doubled clicked")
100     
101     def openMenu(self, position):
102         menu = self._controller._browserContextualMenu
103         treeWidget = self.getTreeWidget()
104         menu.exec_(treeWidget.mapToGlobal(position))