Salome HOME
merge from branch DEV tag mergeto_trunk_04apr08
[modules/yacs.git] / src / pyqt / gui / Tree.py
1 # -*- coding: iso-8859-15 -*-
2 """Ce module permet de créer des vues sous forme d'arbre
3    Ces vues sont construites à partir des informations
4    fournies par un modèle
5 """
6
7 import sys
8 from qt import *
9 import Icons
10 import CONNECTOR
11
12 class Tree(QListView):
13   """Tree(parent=None)
14      Classe pour faire une vue d'un arbre
15   """
16   def __init__(self,parent=None,onSelect=None,onDblSelect=None):
17     QListView.__init__(self,parent)
18     self.setCaption("Tree")
19     self.setRootIsDecorated(1)
20     self.setSorting(-1)
21     self.addColumn("Name")
22     self.children=[]
23     self.last=None
24     self.onSelect=onSelect
25     self.onDblSelect=onDblSelect
26     self.connect(self,SIGNAL('selectionChanged(QListViewItem *)'),
27                      self.handleSelected)
28     self.connect(self,SIGNAL('doubleClicked(QListViewItem *, const QPoint &, int)'),
29                      self.handleDblSelected)
30
31   def handleSelected(self,node):
32     node.item.selected()
33     if self.onSelect:
34       self.onSelect(node.item)
35
36   def handleDblSelected(self,node,point,col):
37     node.item.dblselected()
38     if self.onDblSelect:
39       self.onDblSelect(node.item)
40
41   def additem(self,item):
42     node=Node(self,item.label,item,self.last)
43     self.last=node
44     self.children.append(node)
45     CONNECTOR.Connect(item,"selected",self.selectItem,())
46     CONNECTOR.Connect(item,"add",node.addNode,())
47     return node
48
49   def selectNodeItem(self,item,node):
50     #print "selectNodeItem",node,item
51     self.setSelected(node,True)
52
53   def selectItem(self,item):
54     #print "selectItem",item
55     node=self.selectedItem()
56     if node.item is item:
57       #print "item has been selected at item level"
58       return
59
60     #print "item has not been selected at item level"
61     #try another way
62     #find its father ???
63     it = QListViewItemIterator(self)
64     node = it.current()
65     while node:
66       if node.item is item:
67         break
68       it += 1
69       node = it.current()
70
71     if node:
72       self.setSelected(node,True)
73
74 class Node(QListViewItem):
75   """Node(parent,text,item,after)
76        Classe pour faire une vue d'un noeud d'un arbre
77   """
78   def __init__(self,parent,text,item,after=None):
79     if after is None:
80       QListViewItem.__init__(self,parent,text)
81     else:
82       QListViewItem.__init__(self,parent,after,text)
83     self.item=item
84     self.setPixmap(0,Icons.get_image(item.getIconName()))
85     self.setExpandable(self.item.isExpandable())
86     self.children = []
87
88   def selectNode(self,item):
89     self.listView().setSelected(self,True)
90
91   def addNode(self,item):
92     #print "Tree.addNode",item
93     self.additem(item)
94
95   def delNode(self,node):
96     #print "Tree.delNode",node,node.item
97     CONNECTOR.Disconnect(node.item,"selected",node.selectNode,())
98     CONNECTOR.Disconnect(node.item,"add",node.addNode,())
99     CONNECTOR.Disconnect(node.item,"remove",self.delNode,(node,))
100     self.takeItem(node)
101     self.children.remove(node)
102
103   def additem(self,item):
104     if self.children:
105       node=Node(self,item.label,item,self.children[-1])
106     else:
107       node=Node(self,item.label,item)
108     self.children.append(node)
109     #CONNECTOR.Connect(item,"selected",self.listView().selectNodeItem,(node,))
110     CONNECTOR.Connect(item,"selected",node.selectNode,())
111     CONNECTOR.Connect(item,"add",node.addNode,())
112     CONNECTOR.Connect(item,"remove",self.delNode,(node,))
113     return node
114
115   def setOpen(self,o):
116     if o and not self.childCount():
117       for child in self.item.getChildren():
118         self.additem(child)
119     QListViewItem.setOpen(self,o)
120
121   def setOpen_old(self,o):
122     if o:
123       #open
124       for child in self.item.getChildren():
125         self.additem(child)
126     else:
127       #close
128       for node in self.children:
129         #CONNECTOR.Disconnect(node.item,"selected",self.listView().selectNodeItem,(node,))
130         CONNECTOR.Disconnect(node.item,"selected",node.selectNode,())
131         CONNECTOR.Disconnect(node.item,"add",node.addNode,())
132         self.takeItem(node)
133         del node
134       self.children=[]
135     QListViewItem.setOpen(self,o)
136        
137
138 if __name__ == "__main__":
139   from Item import Item
140   app = QApplication(sys.argv)
141   t=Tree()
142   t.additem(Item("item1"))
143   #n=t.additem(Item("item2"))
144   #n.additem(Item("item3"))
145   app.setMainWidget(t)
146   t.show()
147   app.exec_loop()
148