def addProbeWidget( self, layout ):
     self.pointSelector = PointSelectionWidget([ 3, 5 ])
     layout.addWidget( self.pointSelector )
     self.pointSelector.setSelectionCallback( self.setPoint )
class SliceWidget(QtGui.QWidget):

    def __init__( self, parent, hcomm ):
        super( SliceWidget, self ).__init__( parent ) 
        self.widgets = {}
        self.comm = hcomm
        self.point = None
        self.createTabLayout()
        self.leveling_tab_index, tab_layout = self.addTab( 'Slice Controls' )
        self.sLonIndex = self.addSlider( "Longitude", tab_layout , min_value=0, max_value=360, init_value=180 )
        self.sLatIndex = self.addSlider( "Latitude", tab_layout , min_value=-90, max_value=90, init_value=0 )
        self.sLevIndex = self.addSlider( "Level", tab_layout , min_value=0, max_value=100, init_value=0 )
        self.sTimeIndex = self.addSlider( "Time", tab_layout , min_value=0, max_value=100, init_value=0 )
        self.probe_tab_index, probe_tab_layout = self.addTab( 'Probe' )
        self.addProbeWidget( probe_tab_layout )
        self.probe_tab_index, probe_tab_layout = self.addTab( 'ROI' )
        self.addROIWidget( probe_tab_layout )
#        print "Starting SliceWidget, rank = %d, nproc = %d" % ( self.comm.rank, self.comm.size )

    def addProbeWidget( self, layout ):
        self.pointSelector = PointSelectionWidget([ 3, 5 ])
        layout.addWidget( self.pointSelector )
        self.pointSelector.setSelectionCallback( self.setPoint )

    def addROIWidget( self, layout ):
        self.roiSelector = ROISelectionWidget(self)
        layout.addWidget( self.roiSelector )
        self.connect( self.roiSelector, QtCore.SIGNAL('roiSelected'), self.setSelectedROI )

    def setPoint(self, rel_point, button ):
        self.point = rel_point
        print "Relative Selection Point: ", str( self.point )    
        if self.comm:
            self.comm.post( { 'type': 'Probe', 'point' : self.point, 'button' : button } )

    def setSelectedROI(self, roi ):
        self.roi = roi
        print "Set ROI: ", str( self.roi )    
        if self.comm:
            self.comm.post( { 'type': 'Subset', 'roi' : self.roi } )
            
    def addSlider(self, label, layout, **args ):
        slider_index = len( self.widgets ) 
        slider = LabeledSliderWidget( slider_index, label, **args )
        self.connect( slider, QtCore.SIGNAL('ConfigCmd'), self.processSliderConfigCmd )
        layout.addWidget( slider  ) 
        self.widgets[slider_index] = slider
        return slider_index
    
    def processSliderConfigCmd( self, cmd, slider_index, values=None  ):
#        print "Slider[%d] Config Cmd ( %s ): %s " % ( slider_index, cmd, str(values) )
        if self.comm:
            self.comm.post( { 'type': 'Slider', 'index' : slider_index, 'cmd' : cmd, 'values' : values } )
        
    def processConfig( self, config_data ):
        if self.comm:
            self.comm.post( { 'type': 'Config',  'data' : config_data } )
    
    def updateTabPanel( self, index ):
        pass

    def addTab( self, tabname ):
        self.tabWidget.setEnabled(True)
        tabContents = QtGui.QWidget( self.tabWidget )
        layout = QtGui.QVBoxLayout()
        tabContents.setLayout(layout)
        tab_index = self.tabWidget.addTab( tabContents, tabname )
        return tab_index, layout
    
    def getCurrentTabIndex(self):
        return self.tabWidget.currentIndex() 

    def createTabLayout(self):
        if self.layout() == None:
            self.setLayout(QtGui.QVBoxLayout())
#             title_label = QtGui.QLabel( self.getName()  )
#             self.layout().addWidget( title_label  )
            self.tabWidget = QtGui.QTabWidget(self)
            self.layout().addWidget( self.tabWidget )
            self.connect( self.tabWidget,  QtCore.SIGNAL('currentChanged(int)'), self.updateTabPanel )
            self.addButtonLayout()
            self.setMinimumWidth(450)

    def addButtonLayout(self):
        self.buttonLayout = QtGui.QHBoxLayout()
        self.buttonLayout.setContentsMargins(-1, 3, -1, 3)
        
        self.btnOK = QtGui.QPushButton('OK')
        self.btnCancel = QtGui.QPushButton('Cancel')

        self.buttonLayout.addWidget(self.btnOK)
        self.buttonLayout.addWidget(self.btnCancel)
        
        self.layout().addLayout(self.buttonLayout)
        
        self.btnCancel.setShortcut('Esc')
        self.connect(self.btnOK, QtCore.SIGNAL('clicked(bool)'),      self.ok )
        self.connect(self.btnCancel, QtCore.SIGNAL('clicked(bool)'),  self.cancel )
        
    def ok(self):
        self.parent().close()

    def cancel(self):
        self.parent().close()

    def terminate(self):
        if self.comm: self.comm.stop()        
        self.close()