Example #1
0
    def setupOptionsFrame(self):

        # Autoscroll range slider
        self.autoscrollRangeSlider = slicer.qMRMLSliderWidget()
        self.autoscrollRangeSlider.setMRMLScene(slicer.mrmlScene)
        self.autoscrollRangeSlider.minimum = 0
        self.autoscrollRangeSlider.maximum = 10
        self.autoscrollRangeSlider.value = 5
        self.autoscrollRangeSlider.setToolTip(
            'How many slices you would like to autoscroll up and down')
        self.scriptedEffect.addLabeledOptionsWidget("Slice range:",
                                                    self.autoscrollRangeSlider)

        # Autoscroll speed slider
        self.autoscrollSpeedSlider = slicer.qMRMLSliderWidget()
        self.autoscrollSpeedSlider.setMRMLScene(slicer.mrmlScene)
        self.autoscrollSpeedSlider.minimum = 1
        self.autoscrollSpeedSlider.maximum = 100
        self.autoscrollSpeedSlider.value = 20
        self.autoscrollSpeedSlider.setToolTip(
            'How many slices you want to autoscroll per second')
        self.scriptedEffect.addLabeledOptionsWidget("Slice speed:",
                                                    self.autoscrollSpeedSlider)

        # Input view selector
        self.sliceNodeSelector = qt.QComboBox()
        self.sliceNodeSelector.setToolTip(
            "This slice will be excluded during autoscrolling.")
        self.scriptedEffect.addLabeledOptionsWidget("Exclude view:",
                                                    self.sliceNodeSelector)

        # Start button
        self.applyButton = qt.QPushButton("Start")
        self.applyButton.objectName = self.__class__.__name__ + 'Start'
        self.applyButton.setToolTip("Start/Stop autoscrolling (Alt+C)")
        self.scriptedEffect.addOptionsWidget(self.applyButton)

        # Set Hotkeys
        self.hotkey = qt.QShortcut(qt.QKeySequence("Alt+C"),
                                   slicer.util.mainWindow())
        self.hotkey2 = qt.QShortcut(qt.QKeySequence("Ctrl+Alt+C"),
                                    slicer.util.mainWindow())

        # Connections
        self.applyButton.connect('clicked()', self.onApply)
        self.sliceNodeSelector.connect("currentIndexChanged(int)",
                                       self.updateGUIFromMRML)
        self.hotkey.connect('activated()', self.autoscrollHotkey)
        self.hotkey2.connect('activated()', self.openSettings)

        # Initialize variables
        self.setupVariables()
Example #2
0
    def setup(self):
        self.coefficientsSlider = slicer.qMRMLSliderWidget()
        self.coefficientsSlider.singleStep = 0.01
        self.coefficientsSlider.maximum = 2
        self.coefficientsSlider.value = self.getDefaultValue('coefficients')
        self.layout.addRow('Coefficients: ', self.coefficientsSlider)

        self.orderSpinBox = qt.QSpinBox()
        self.orderSpinBox.maximum = 6
        self.orderSpinBox.value = self.getDefaultValue('order')
        self.layout.addRow('Polynomial order: ', self.orderSpinBox)
    def setup(self):
        self.numSpikesSpinBox = qt.QSpinBox()
        self.numSpikesSpinBox.maximum = 10
        self.numSpikesSpinBox.value = self.getDefaultValue('num_spikes')
        self.layout.addRow('Spikes: ', self.numSpikesSpinBox)

        self.intensitySlider = slicer.qMRMLSliderWidget()
        self.intensitySlider.singleStep = 0.01
        self.intensitySlider.maximum = 5
        self.intensitySlider.value = np.mean(self.getDefaultValue('intensity'))
        self.layout.addRow('Intensity: ', self.intensitySlider)
    def setup(self):
        self.numGhostsSpinBox = qt.QSpinBox()
        self.numGhostsSpinBox.maximum = 50
        default = int(np.mean(self.getDefaultValue('num_ghosts')))
        self.numGhostsSpinBox.value = default
        self.layout.addRow('Ghosts: ', self.numGhostsSpinBox)

        self.axesLayout, self.axesDict = self.makeAxesLayout()
        self.layout.addRow('Axes: ', self.axesLayout)

        self.intensitySlider = slicer.qMRMLSliderWidget()
        self.intensitySlider.singleStep = 0.01
        self.intensitySlider.maximum = 1
        self.intensitySlider.value = np.mean(self.getDefaultValue('intensity'))
        self.layout.addRow('Intensity: ', self.intensitySlider)
Example #5
0
    def setupOptionsFrame(self):
        AbstractScriptedSegmentEditorAutoCompleteEffect.setupOptionsFrame(self)

        # Object scale slider
        self.objectScaleMmSlider = slicer.qMRMLSliderWidget()
        self.objectScaleMmSlider.setMRMLScene(slicer.mrmlScene)
        self.objectScaleMmSlider.quantity = "length"  # get unit, precision, etc. from MRML unit node
        self.objectScaleMmSlider.minimum = 0
        self.objectScaleMmSlider.maximum = 10
        self.objectScaleMmSlider.value = 2.0
        self.objectScaleMmSlider.setToolTip(
            'Increasing this value smooths the segmentation and reduces leaks. This is the sigma used for edge detection.'
        )
        self.scriptedEffect.addLabeledOptionsWidget("Object scale:",
                                                    self.objectScaleMmSlider)
        self.objectScaleMmSlider.connect('valueChanged(double)',
                                         self.updateAlgorithmParameterFromGUI)
Example #6
0
  def setupOptionsFrame(self):

     # Object scale slider
    self.objectScaleMmSlider = slicer.qMRMLSliderWidget()
    self.objectScaleMmSlider.setMRMLScene(slicer.mrmlScene)
    self.objectScaleMmSlider.quantity = "length" # get unit, precision, etc. from MRML unit node
    self.objectScaleMmSlider.minimum = 0
    self.objectScaleMmSlider.maximum = 10
    self.objectScaleMmSlider.value = 2.0
    self.objectScaleMmSlider.setToolTip('Increasing this value smooths the segmentation and reduces leaks. This is the sigma used for edge detection.')
    self.scriptedEffect.addLabeledOptionsWidget("Object scale:", self.objectScaleMmSlider)
    self.objectScaleMmSlider.connect('valueChanged(double)', self.updateMRMLFromGUI)

    # Apply button
    self.applyButton = qt.QPushButton("Apply")
    self.applyButton.objectName = self.__class__.__name__ + 'Apply'
    self.applyButton.setToolTip("Accept previewed result")
    self.scriptedEffect.addOptionsWidget(self.applyButton)
    self.applyButton.connect('clicked()', self.onApply)
Example #7
0
  def setupOptionsFrame(self):

     # Object scale slider
    self.objectScaleMmSlider = slicer.qMRMLSliderWidget()
    self.objectScaleMmSlider.setMRMLScene(slicer.mrmlScene)
    self.objectScaleMmSlider.quantity = "length" # get unit, precision, etc. from MRML unit node
    self.objectScaleMmSlider.minimum = 0
    self.objectScaleMmSlider.maximum = 10
    self.objectScaleMmSlider.value = 2.0
    self.objectScaleMmSlider.setToolTip('Increasing this value smooths the segmentation and reduces leaks. This is the sigma used for edge detection.')
    self.scriptedEffect.addLabeledOptionsWidget("Object scale:", self.objectScaleMmSlider)
    self.objectScaleMmSlider.connect('valueChanged(double)', self.updateMRMLFromGUI)

    # Apply button
    self.applyButton = qt.QPushButton("Apply")
    self.applyButton.objectName = self.__class__.__name__ + 'Apply'
    self.applyButton.setToolTip("Accept previewed result")
    self.scriptedEffect.addOptionsWidget(self.applyButton)
    self.applyButton.connect('clicked()', self.onApply)
    def setupOptionsFrame(self):
        AbstractScriptedSegmentEditorAutoCompleteEffect.setupOptionsFrame(self)

        # Object scale slider
        self.seedLocalityFactorSlider = slicer.qMRMLSliderWidget()
        self.seedLocalityFactorSlider.setMRMLScene(slicer.mrmlScene)
        self.seedLocalityFactorSlider.minimum = 0
        self.seedLocalityFactorSlider.maximum = 10
        self.seedLocalityFactorSlider.value = 0.0
        self.seedLocalityFactorSlider.decimals = 1
        self.seedLocalityFactorSlider.singleStep = 0.1
        self.seedLocalityFactorSlider.pageStep = 1.0
        self.seedLocalityFactorSlider.setToolTip(
            'Increasing this value makes the effect of seeds more localized,'
            ' thereby reducing leaks, but requires seed regions to be more evenly distributed in the image.'
            ' The value is specified as an additional "intensity level difference" per "unit distance."'
        )
        self.scriptedEffect.addLabeledOptionsWidget(
            "Seed locality:", self.seedLocalityFactorSlider)
        self.seedLocalityFactorSlider.connect(
            'valueChanged(double)', self.updateAlgorithmParameterFromGUI)
    def setup(self):
        # this is the function that implements all GUI
        ScriptedLoadableModuleWidget.setup(self)

        # This sets the view being used to the red view only
        slicer.app.layoutManager().setLayout(
            slicer.vtkMRMLLayoutNode.SlicerLayoutOneUpRedSliceView)

        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#
        #Section 3.2.1: Ultrasound connection ang widgets
        #the following code provides a GUI to connect to an external ultrasound scanner throught the PlusServer
        #this section also provides examples of other widgets that can be used
        #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

        ##################################################################################################################
        #This section creates all the widgets
        #This is where you will create the type of widget and what it will say
        ##################################################################################################################

        #This code block creates a collapsible button

        #This defines which type of button you are using
        self.usButton = ctk.ctkCollapsibleButton()
        #This is what the button will say
        self.usButton.text = "Ultrasound Connection"
        #This actually creates that button

        #This descirbes the type of widget
        self.inputIPLineEdit = qt.QLineEdit()
        #This sets a placehoder example of what should be inputted to the line edit
        self.inputIPLineEdit.setPlaceholderText("127.0.0.1")
        #This is the help tooltip
        self.inputIPLineEdit.toolTip = "Put the IP address of your ultrasound device here"

        #This code block is the exact same as the one above only it asks for the server port
        self.inputPortLineEdit = qt.QLineEdit()
        self.inputPortLineEdit.setPlaceholderText("18944")
        self.inputPortLineEdit.setValidator(qt.QIntValidator())
        self.inputPortLineEdit.toolTip = "Put the port ID of the OpenIGTLink here (18944)"

        #This is a push button
        self.connectButton = qt.QPushButton()
        self.connectButton.setDefault(False)
        #This button says connect
        self.connectButton.text = "Connect"
        #help tooltip that explains the funciton
        self.connectButton.toolTip = "Connects to Ultrasound"
        #adds the widget to the layout

        self.freezeButton = qt.QPushButton()
        self.freezeButton.text = "Freeze"
        self.freezeButton.toolTip = "Freeze the ultrasound image for fiducial placement"

        # Combobox for image selection
        self.imageSelector = slicer.qMRMLNodeComboBox()
        self.imageSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
        self.imageSelector.selectNodeUponCreation = True
        self.imageSelector.addEnabled = False
        self.imageSelector.removeEnabled = False
        self.imageSelector.noneEnabled = True
        self.imageSelector.showHidden = False
        self.imageSelector.showChildNodeTypes = False
        self.imageSelector.setMRMLScene(slicer.mrmlScene)
        self.imageSelector.setToolTip("Pick the image to be used.")

        self.checkBox = qt.QCheckBox()
        self.checkBox.text = "This is a check box"
        self.checkBox.toolTip = "This an example check box"

        #### EXAMPLE: to access the functionality of a check box you can use an if statement
        #### if self.checkBox.isChecked() == True:

        self.radioButton = qt.QRadioButton()
        self.radioButton.text = "This is an example radio button"
        self.radioButton.toolTip = "This an example radio button"

        self.sliderWidget = slicer.qMRMLSliderWidget()
        self.sliderWidget.minimum = 0.00
        self.sliderWidget.maximum = 100.00

        self.resetButton = qt.QPushButton('Reset')
        self.resetButton.setDefault(False)
        self.resetButton.toolTip = "This Button Resets the Module"

        ##################################################################################################################
        #This section adds the containers to the parent widget
        ##################################################################################################################
        self.layout.addWidget(self.usButton)
        #This creates a variable that describes layout within this collapsible button
        self.usLayout = qt.QFormLayout(self.usButton)
        self.usLayout.addRow("Server IP:", self.inputIPLineEdit)
        self.usLayout.addRow("Server Port:", self.inputPortLineEdit)
        self.usLayout.addWidget(self.connectButton)
        self.usLayout.addRow("US Volume: ", self.imageSelector)
        self.usLayout.addRow(self.freezeButton)
        self.shortcut = qt.QShortcut(qt.QKeySequence('f'),
                                     slicer.util.mainWindow())
        self.usLayout.addRow(self.checkBox)
        self.usLayout.addRow(self.radioButton)
        self.usLayout.addRow(self.sliderWidget)

        # Add vertical spacer
        self.layout.addStretch(1)

        ##################################################################################################################
        #This section connects the widgets to functions
        ##################################################################################################################
        self.connectButton.connect('clicked(bool)',
                                   self.onConnectButtonClicked)
        self.freezeButton.connect('clicked(bool)', self.onConnectButtonClicked)
        self.inputIPLineEdit.connect('textChanged(QString)',
                                     self.onInputChanged)
        self.inputPortLineEdit.connect('textChanged(QString)',
                                       self.onInputChanged)
        self.imageSelector.connect('currentNodeChanged(vtkMRMLNode*)',
                                   self.onImageChanged)

        # Disable buttons until conditions are met
        self.connectButton.setEnabled(False)
        self.freezeButton.setEnabled(False)
Example #10
0
 def createSliderWidget(self, minimum, maximum):
     slider = slicer.qMRMLSliderWidget()
     slider.minimum = minimum
     slider.maximum = maximum
     return slider
Example #11
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        # Instantiate and connect widgets ...

        # Input file

        # Text + Button invoking QFileDialog
        self.inputFileLayout = qt.QHBoxLayout()
        self.inputFileLabelHeader = qt.QLabel()
        self.inputFileLabelHeader.text = "Input File: "
        self.inputFileLabelFile = qt.QLabel()
        self.inputFileLabelFile.text = "Input header.xml or .m3d"
        self.inputFileButton = qt.QPushButton()
        self.inputFileButton.text = "Browse"
        self.inputFileLayout.addWidget(self.inputFileLabelHeader)
        self.inputFileLayout.addWidget(self.inputFileLabelFile)
        self.inputFileLayout.addWidget(self.inputFileButton)
        self.layout.addLayout(self.inputFileLayout)

        #
        # Parameters Area
        #
        self.parametersCollapsibleButton = ctk.ctkCollapsibleButton()
        self.parametersCollapsibleButton.collapsed = True
        self.parametersCollapsibleButton.text = "Parameters for legacy m3d format"
        self.layout.addWidget(self.parametersCollapsibleButton)

        # Layout within the dummy collapsible button
        parametersFormLayout = qt.QFormLayout(self.parametersCollapsibleButton)

        # set distance of fold curve from interior points
        self.distSlider = slicer.qMRMLSliderWidget()
        self.distSlider.setProperty('maximum', 0.6)
        self.distSlider.setProperty('minimum', 0.0)
        self.distSlider.setProperty('singleStep', 0.01)

        self.distSlider.setToolTip(
            "Parameter used in transformation from legacy s-rep to new s-rep")
        parametersFormLayout.addRow("Set distance to expand fold curve",
                                    self.distSlider)

        self.outputFolderLayout = qt.QHBoxLayout()
        self.outputFolderLabelHeader = qt.QLabel()
        self.outputFolderLabelHeader.text = "Output folder: "
        self.outputFolderLabelFile = qt.QLabel()
        self.outputFolderLabelFile.text = "Folder to save the new xml format"
        self.outputFolderButton = qt.QPushButton()
        self.outputFolderButton.text = "Browse"
        self.outputFolderLayout.addWidget(self.outputFolderLabelHeader)
        self.outputFolderLayout.addWidget(self.outputFolderLabelFile)
        self.outputFolderLayout.addWidget(self.outputFolderButton)
        parametersFormLayout.addRow(self.outputFolderLayout)

        #
        # Apply Button
        #
        self.applyButton = qt.QPushButton("Visualize s-rep file")
        self.applyButton.toolTip = "Parse and visualize s-rep."
        self.layout.addWidget(self.applyButton)

        # Unused
        # self.boundarySurfaceRendering = qt.QCheckBox()
        # self.boundarySurfaceRendering.checked = 0
        # self.boundarySurfaceRendering.setToolTip("If checked, set the visibility of the boundary mesh")
        # self.layout.addWidget(self.boundarySurfaceRendering)

        # connections
        self.applyButton.connect('clicked(bool)', self.onApplyButton)
        self.inputFileButton.connect('clicked(bool)',
                                     self.onInputFileButtonClicked)
        self.outputFolderButton.connect('clicked(bool)',
                                        self.onOutputFolderButtonClicked)
        # Add vertical spacer
        self.layout.addStretch(1)
Example #12
0
 def createSliderWidget(self, minimum, maximum):
   slider = slicer.qMRMLSliderWidget()
   slider.minimum = minimum
   slider.maximum = maximum
   return slider
Example #13
0
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        # Instantiate and connect widgets ...

        #
        # Parameters Area
        #
        parametersCollapsibleButton = ctk.ctkCollapsibleButton()
        parametersCollapsibleButton.text = "Parameters"
        self.layout.addWidget(parametersCollapsibleButton)

        # Layout within the dummy collapsible button
        parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton)

        #
        # input volume selector
        #
        # self.inputSelector = slicer.qMRMLNodeComboBox()
        # self.inputSelector.nodeTypes = ["vtkMRMLScalarVolumeNode"]
        # self.inputSelector.selectNodeUponCreation = True
        # self.inputSelector.addEnabled = False
        # self.inputSelector.removeEnabled = False
        # self.inputSelector.noneEnabled = False
        # self.inputSelector.showHidden = False
        # self.inputSelector.showChildNodeTypes = False
        # self.inputSelector.setMRMLScene(slicer.mrmlScene)
        # self.inputSelector.setToolTip("Pick the input to the algorithm.")
        # parametersFormLayout.addRow("Input Volume: ", self.inputSelector)

        # set distance of fold curve from interior points
        self.distSlider = slicer.qMRMLSliderWidget()
        #        self.distSlider.setMaximum(0.6)
        #        self.distSlider.setMinimum(0.0)
        self.distSlider.setProperty('maximum', 0.6)
        self.distSlider.setProperty('minimum', 0.0)
        self.distSlider.setProperty('singleStep', 0.01)
        #        self.distSlider.setValue(0.02)

        self.distSlider.setToolTip(
            "Parameter used in transformation from legacy s-rep to new s-rep")
        parametersFormLayout.addRow("Set distance to expand fold curve",
                                    self.distSlider)

        #
        # Apply Button
        #
        self.applyButton = qt.QPushButton("Select s-rep file")
        self.applyButton.toolTip = "Run the algorithm."
        parametersFormLayout.addRow(self.applyButton)

        self.boundarySurfaceRendering = qt.QCheckBox()
        self.boundarySurfaceRendering.checked = 0
        self.boundarySurfaceRendering.setToolTip(
            "If checked, set the visibility of the boundary mesh")
        parametersFormLayout.addRow("Show Boundary Mesh",
                                    self.boundarySurfaceRendering)

        # connections
        self.applyButton.connect('clicked(bool)', self.onApplyButton)
        # Add vertical spacer
        self.layout.addStretch(1)
    def setup(self):
        ScriptedLoadableModuleWidget.setup(self)

        self.setupViewSettingsArea()

        # Setup a logger for the extension log messages
        self.logger = logging.getLogger('SlicerCaseIterator')

        self.logic = None

        # These variables hold connections to other parts of Slicer, such as registered keyboard shortcuts and
        # Event observers
        self.shortcuts = []
        self.observers = []

        # Instantiate and connect widgets ...

        #
        # ComboBox for mode selection
        #
        self.modeGroup = qt.QGroupBox("Mode Selection")
        self.modeGroup.setLayout(qt.QFormLayout())
        self.layout.addWidget(self.modeGroup)

        modes = IteratorFactory.getImplementationNames()
        self.modeComboBox = qt.QComboBox()
        self.modeComboBox.addItems([""] + modes)
        self.modeGroup.layout().addWidget(self.modeComboBox)

        #
        # Select and Load input data section
        #
        self.inputDataCollapsibleButton = ctk.ctkCollapsibleButton()
        self.inputDataCollapsibleButton.text = 'Select and Load case data'
        self.layout.addWidget(self.inputDataCollapsibleButton)

        #
        # Parameters Area
        #
        self.parametersCollapsibleButton = ctk.ctkCollapsibleButton()
        self.parametersCollapsibleButton.text = 'Case iteration parameters'
        self.layout.addWidget(self.parametersCollapsibleButton)

        # Layout within the dummy collapsible button
        parametersFormLayout = qt.QFormLayout(self.parametersCollapsibleButton)

        #
        # Reader Name
        #
        self.txtReaderName = qt.QLineEdit()
        self.txtReaderName.text = ''
        self.txtReaderName.toolTip = 'Name of the current reader; if not empty, this name will be added to the filename ' \
                                     'of saved masks'
        parametersFormLayout.addRow('Reader name', self.txtReaderName)

        #
        # Start position
        #
        self.npStart = qt.QSpinBox()
        self.npStart.minimum = 1
        self.npStart.maximum = 999999
        self.npStart.value = 1
        self.npStart.toolTip = 'Start position in the CSV file (1 = first patient)'
        parametersFormLayout.addRow('Start position', self.npStart)

        #
        # Visualization Properties
        #
        self.visualizationPropertiesCollapsibleButton = ctk.ctkCollapsibleButton(
        )
        self.visualizationPropertiesCollapsibleButton.text = 'Visualization properties'
        self.layout.addWidget(self.visualizationPropertiesCollapsibleButton)

        visualizationPropertiesFormLayout = qt.QVBoxLayout(
            self.visualizationPropertiesCollapsibleButton)

        #
        # Mask Groupbox
        #
        self.maskGroup = qt.QGroupBox("Mask")
        self.maskGroup.setLayout(qt.QFormLayout())
        visualizationPropertiesFormLayout.addWidget(self.maskGroup)

        self.sliceFill2DSlider = slicer.qMRMLSliderWidget()
        self.sliceFill2DSlider.minimum = 0.0
        self.sliceFill2DSlider.maximum = 1.0
        self.sliceFill2DSlider.singleStep = 0.1
        self.maskGroup.layout().addRow("Slice 2D fill:",
                                       self.sliceFill2DSlider)

        self.sliceOutline2DSlider = slicer.qMRMLSliderWidget()
        self.sliceOutline2DSlider.minimum = 0.0
        self.sliceOutline2DSlider.maximum = 1.0
        self.sliceOutline2DSlider.singleStep = 0.1
        self.sliceOutline2DSlider.value = 1.0
        self.maskGroup.layout().addRow("Slice 2D outline:",
                                       self.sliceOutline2DSlider)

        #
        # Progressbar
        #
        self.progressBar = qt.QProgressBar()
        self.progressBar.setFormat("%v/%m")
        self.progressBar.visible = False
        self.layout.addWidget(self.progressBar)

        #
        # Case Button Row
        #
        self.caseButtonWidget = qt.QWidget()
        self.caseButtonWidget.setLayout(qt.QHBoxLayout())
        self.layout.addWidget(self.caseButtonWidget)

        #
        # Reset
        #
        self.resetButton = qt.QPushButton('Start Batch')
        self.resetButton.enabled = False
        self.caseButtonWidget.layout().addWidget(self.resetButton)

        #
        # Previous Case
        #
        self.previousButton = qt.QPushButton('Previous Case')
        self.previousButton.enabled = False
        self.previousButton.toolTip = '(Ctrl+P) Press this button to go to the previous case, previous new masks are not reloaded'
        self.caseButtonWidget.layout().addWidget(self.previousButton)

        #
        # Load CSV / Next Case
        #
        self.nextButton = qt.QPushButton('Next Case')
        self.nextButton.enabled = False
        self.nextButton.toolTip = '(Ctrl+N) Press this button to go to the next case'
        self.caseButtonWidget.layout().addWidget(self.nextButton)

        #
        # Collapsible Button group for enabling only one at a time
        #
        self.collapsibleButtonGroup = qt.QButtonGroup()
        self.collapsibleButtonGroup.setExclusive(True)
        self.collapsibleButtonGroup.addButton(self.inputDataCollapsibleButton)
        self.collapsibleButtonGroup.addButton(self.parametersCollapsibleButton)
        self.collapsibleButtonGroup.addButton(
            self.visualizationPropertiesCollapsibleButton)

        self.layout.addStretch(1)

        #
        # Connect buttons to functions
        #
        self.modeComboBox.currentTextChanged.connect(self.onModeSelected)
        self.previousButton.connect('clicked(bool)', self.onPrevious)
        self.nextButton.connect('clicked(bool)', self.onNext)
        self.resetButton.connect('clicked(bool)', self.onReset)
        self.sliceFill2DSlider.valueChanged.connect(
            lambda value: self.updateSegmentationProperties())
        self.sliceOutline2DSlider.valueChanged.connect(
            lambda value: self.updateSegmentationProperties())

        if len(modes) == 1:
            self.modeComboBox.hide()
            self.onModeSelected(modes[1])

        self._setGUIstate(csv_loaded=False)