forked from Slicer/SlicerGitSVNArchive
/
EditColor.py
144 lines (120 loc) · 4.87 KB
/
EditColor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import slicer
from __main__ import qt
from __main__ import vtk
import ColorBox
from EditUtil import EditUtil
#########################################################
#
#
comment = """
EditColor is a wrapper around a set of Qt widgets and other
structures to manage the current paint color
# TODO :
"""
#
#########################################################
class EditColor(object):
def __init__(self, parent=0, parameter='label',colorNode=None):
self.observerTags = []
self.parameterNode = None
self.parameterNodeTag = None
self.parameter = parameter
self.colorBox = None
self.colorNode = colorNode
if parent == 0:
self.parent = slicer.qMRMLWidget()
self.parent.setLayout(qt.QVBoxLayout())
self.parent.setMRMLScene(slicer.mrmlScene)
self.create()
self.parent.show()
else:
self.parent = parent
self.create()
def __del__(self):
self.cleanup()
def cleanup(self, QObject=None):
if self.parameterNode:
self.parameterNode.RemoveObserver(self.parameterNodeTag)
for tagpair in self.observerTags:
tagpair[0].RemoveObserver(tagpair[1])
def create(self):
self.frame = qt.QFrame(self.parent)
self.frame.objectName = 'EditColorFrame'
self.frame.setLayout(qt.QHBoxLayout())
self.parent.layout().addWidget(self.frame)
self.label = qt.QLabel(self.frame)
self.label.setText("Label: ")
self.frame.layout().addWidget(self.label)
self.labelName = qt.QLabel(self.frame)
self.labelName.setText("")
self.frame.layout().addWidget(self.labelName)
self.colorSpin = qt.QSpinBox(self.frame)
self.colorSpin.objectName = 'ColorSpinBox'
self.colorSpin.setMaximum( 64000)
self.colorSpin.setValue( EditUtil.getLabel() )
self.colorSpin.setToolTip( "Click colored patch at right to bring up color selection pop up window. Use the 'c' key to bring up color popup menu." )
self.frame.layout().addWidget(self.colorSpin)
self.colorPatch = qt.QPushButton(self.frame)
self.colorPatch.setObjectName('ColorPatchButton')
self.frame.layout().addWidget(self.colorPatch)
self.updateParameterNode(slicer.mrmlScene, vtk.vtkCommand.ModifiedEvent)
self.updateGUIFromMRML(self.parameterNode, vtk.vtkCommand.ModifiedEvent)
self.frame.connect( 'destroyed()', self.cleanup)
self.colorSpin.connect( 'valueChanged(int)', self.updateMRMLFromGUI)
self.colorPatch.connect( 'clicked()', self.showColorBox )
# TODO: change this to look for specfic events (added, removed...)
# but this requires being able to access events by number from wrapped code
tag = slicer.mrmlScene.AddObserver(vtk.vtkCommand.ModifiedEvent, self.updateParameterNode)
self.observerTags.append( (slicer.mrmlScene, tag) )
#
# update the parameter node when the scene changes
#
def updateParameterNode(self, caller, event):
#
# observe the scene to know when to get the parameter node
#
parameterNode = EditUtil.getParameterNode()
if parameterNode != self.parameterNode:
if self.parameterNode:
self.parameterNode.RemoveObserver(self.parameterNodeTag)
self.parameterNode = parameterNode
self.parameterNodeTag = self.parameterNode.AddObserver(vtk.vtkCommand.ModifiedEvent, self.updateGUIFromMRML)
#
# update the GUI for the given label
#
def updateMRMLFromGUI(self, label):
self.parameterNode.SetParameter(self.parameter, str(label))
#
# update the GUI from MRML
#
def updateGUIFromMRML(self,caller,event):
if self.parameterNode.GetParameter(self.parameter) == '':
# parameter does not exist - probably intializing
return
label = int(self.parameterNode.GetParameter(self.parameter))
self.colorNode = EditUtil.getColorNode()
if self.colorNode:
self.frame.setDisabled(0)
self.labelName.setText( self.colorNode.GetColorName( label ) )
lut = self.colorNode.GetLookupTable()
rgb = lut.GetTableValue( label )
self.colorPatch.setStyleSheet(
"background-color: rgb(%s,%s,%s)" % (rgb[0]*255, rgb[1]*255, rgb[2]*255) )
self.colorSpin.setMaximum( self.colorNode.GetNumberOfColors()-1 )
else:
self.frame.setDisabled(1)
try:
self.colorSpin.setValue(label)
except ValueError:
# TODO: why does the python class still exist if the widget is destroyed?
# - this only happens when reloading the module. The owner of the
# instance is gone and the widgets are gone, but this instance still
# has observer on the parameter node - this indicates memory leaks
# that need to be fixed
self.cleanup()
return
def showColorBox(self):
self.colorNode = EditUtil.getColorNode()
if not self.colorBox:
self.colorBox = ColorBox.ColorBox(parameterNode=self.parameterNode, parameter=self.parameter, colorNode=self.colorNode)
self.colorBox.show(parameterNode=self.parameterNode, parameter=self.parameter, colorNode=self.colorNode)