From 1c4d5a344cc018ecbeecc161a8b4aeb83438f48d Mon Sep 17 00:00:00 2001 From: Christian Herz Date: Fri, 21 Apr 2017 14:11:07 -0400 Subject: [PATCH 1/3] ENH: fixed messed up NewCaseSelectionNameWidget on Ubuntu (issue #273): * improved alignment and colors as well --- SliceTracker/SliceTrackerUtils/helpers.py | 38 +++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/SliceTracker/SliceTrackerUtils/helpers.py b/SliceTracker/SliceTrackerUtils/helpers.py index 3f818ad..a950649 100644 --- a/SliceTracker/SliceTrackerUtils/helpers.py +++ b/SliceTracker/SliceTrackerUtils/helpers.py @@ -1,6 +1,8 @@ import os import datetime import qt +import re +import slicer from SlicerProstateUtils.mixins import ModuleWidgetMixin @@ -25,7 +27,6 @@ def __init__(self, destination, parent=None): self.onCaseNumberChanged(self.minimum) def getNextCaseNumber(self): - import re caseNumber = 0 for dirName in [dirName for dirName in os.listdir(self.destinationRoot) if os.path.isdir(os.path.join(self.destinationRoot, dirName)) and re.match(self.PATTERN, dirName)]: @@ -35,19 +36,44 @@ def getNextCaseNumber(self): def setupUI(self): self.setWindowTitle("Case Number Selection") - self.setText("Please select a case number for the new case.") - self.setIcon(qt.QMessageBox.Question) self.spinbox = qt.QSpinBox() self.spinbox.setRange(self.minimum, int("9"*self.CASE_NUMBER_DIGITS)) + + self.hideInvisibleUnneededComponents() + + self.textLabel = qt.QLabel("Please select a case number for the new case.") + self.textLabel.setStyleSheet("font-weight: bold;") + self.previewLabel = qt.QLabel("New case directory:") self.preview = qt.QLabel() self.notice = qt.QLabel() - self.layout().addWidget(self.createVLayout([self.createHLayout([qt.QLabel("Proposed Case Number"), self.spinbox]), - self.preview, self.notice]), 2, 1) + self.notice.setStyleSheet("color:red;") + self.okButton = self.addButton(self.Ok) self.okButton.enabled = False self.cancelButton = self.addButton(self.Cancel) self.setDefaultButton(self.okButton) + self.groupBox = qt.QGroupBox() + self.groupBox.setLayout(qt.QGridLayout()) + self.groupBox.layout().addWidget(self.textLabel, 0, 0, 1, 2) + self.groupBox.layout().addWidget(qt.QLabel("Proposed Case Number"), 1, 0) + self.groupBox.layout().addWidget(self.spinbox, 1, 1) + self.groupBox.layout().addWidget(self.previewLabel, 2, 0, 1, 2) + self.groupBox.layout().addWidget(self.preview, 3, 0, 1, 2) + self.groupBox.layout().addWidget(self.notice, 4, 0, 1, 2) + + self.groupBox.layout().addWidget(self.okButton, 5, 0) + self.groupBox.layout().addWidget(self.cancelButton, 5, 1) + + self.layout().addWidget(self.groupBox, 1, 1) + + def hideInvisibleUnneededComponents(self): + for oName in ["qt_msgbox_label", "qt_msgboxex_icon_label"]: + try: + slicer.util.findChild(self, oName).hide() + except RuntimeError: + pass + def setupConnections(self): self.spinbox.valueChanged.connect(self.onCaseNumberChanged) @@ -56,7 +82,7 @@ def onCaseNumberChanged(self, caseNumber): caseNumber = formatString % caseNumber directory = self.PREFIX+caseNumber+self.SUFFIX self.newCaseDirectory = os.path.join(self.destinationRoot, directory) - self.preview.setText("New case directory: " + self.newCaseDirectory) + self.preview.setText( self.newCaseDirectory) self.okButton.enabled = not os.path.exists(self.newCaseDirectory) self.notice.text = "" if not os.path.exists(self.newCaseDirectory) else "Note: Directory already exists." From 5eb67a55639bebb81e55ddbcda0c613e8896392a Mon Sep 17 00:00:00 2001 From: Christian Herz Date: Fri, 21 Apr 2017 15:30:03 -0400 Subject: [PATCH 2/3] ENH: Implemented SliceTrackerSlicelet (issue #261) * TODO: take care of non existing moduleSelector which is used for selecting mpReview and checking if current module is SliceTracker --- SliceTracker/SliceTracker.py | 98 +++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/SliceTracker/SliceTracker.py b/SliceTracker/SliceTracker.py index 8b3a7ce..54947cf 100644 --- a/SliceTracker/SliceTracker.py +++ b/SliceTracker/SliceTracker.py @@ -1,4 +1,5 @@ import ast +import vtk import logging from SliceTrackerUtils.configuration import SliceTrackerConfiguration @@ -222,4 +223,99 @@ def onCurrentTabChanged(self, index): if step.active: self.session.previousStep = step step.active = False - self.session.steps[index].active = True \ No newline at end of file + self.session.steps[index].active = True + + +class SliceTrackerSlicelet(qt.QWidget, ModuleWidgetMixin): + + class MainWindow(qt.QWidget): + + def __init__(self, parent=None): + qt.QWidget.__init__(self) + self.objectName = "qSlicerAppMainWindow" + self.setLayout(qt.QVBoxLayout()) + self.mainFrame = qt.QFrame() + self.mainFrame.setLayout(qt.QHBoxLayout()) + + self._statusBar = qt.QStatusBar() + self._statusBar.setMaximumHeight(35) + + self.layout().addWidget(self.mainFrame) + self.layout().addWidget(self._statusBar) + + def statusBar(self): + self._statusBar = getattr(self, "_statusBar", None) + if not self._statusBar: + self._statusBar = qt.QStatusBar() + return self._statusBar + + def __init__(self): + qt.QWidget.__init__(self) + + print slicer.dicomDatabase + + self.mainWidget = SliceTrackerSlicelet.MainWindow() + + self.setupLayoutWidget() + + self.moduleFrame = qt.QWidget() + self.moduleFrame.setLayout(qt.QVBoxLayout()) + self.widget = SliceTrackerWidget(self.moduleFrame) + self.widget.setup() + + # TODO: resize self.widget.parent to minimum possible width + + self.scrollArea = qt.QScrollArea() + self.scrollArea.setWidget(self.widget.parent) + self.scrollArea.setWidgetResizable(True) + self.scrollArea.setMinimumWidth(self.widget.parent.minimumSizeHint.width()) + + self.splitter = qt.QSplitter() + self.splitter.setOrientation(qt.Qt.Horizontal) + self.splitter.addWidget(self.scrollArea) + self.splitter.addWidget(self.layoutWidget) + self.splitter.splitterMoved.connect(self.onSplitterMoved) + + self.splitter.setStretchFactor(0,0) + self.splitter.setStretchFactor(1,1) + self.splitter.handle(1).installEventFilter(self) + + self.mainWidget.mainFrame.layout().addWidget(self.splitter) + self.mainWidget.show() + + def setupLayoutWidget(self): + self.layoutWidget = qt.QWidget() + self.layoutWidget.setLayout(qt.QHBoxLayout()) + layoutWidget = slicer.qMRMLLayoutWidget() + layoutManager = slicer.qSlicerLayoutManager() + layoutManager.setMRMLScene(slicer.mrmlScene) + layoutManager.setScriptedDisplayableManagerDirectory(slicer.app.slicerHome + "/bin/Python/mrmlDisplayableManager") + layoutWidget.setLayoutManager(layoutManager) + slicer.app.setLayoutManager(layoutManager) + layoutWidget.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutFourUpView) + self.layoutWidget.layout().addWidget(layoutWidget) + + def eventFilter(self, obj, event): + if event.type() == qt.QEvent.MouseButtonDblClick: + self.onSplitterClick() + + def onSplitterMoved(self, pos, index): + vScroll = self.scrollArea.verticalScrollBar() + print self.moduleFrame.width, self.widget.parent.width, self.scrollArea.width, vScroll.width + vScrollbarWidth = 4 if not vScroll.isVisible() else vScroll.width + 4 # TODO: find out, what is 4px wide + if self.scrollArea.minimumWidth != self.widget.parent.minimumSizeHint.width() + vScrollbarWidth: + self.scrollArea.setMinimumWidth(self.widget.parent.minimumSizeHint.width() + vScrollbarWidth) + + def onSplitterClick(self): + if self.splitter.sizes()[0] > 0: + self.splitter.setSizes([0, self.splitter.sizes()[1]]) + else: + minimumWidth = self.widget.parent.minimumSizeHint.width() + self.splitter.setSizes([minimumWidth, self.splitter.sizes()[1]-minimumWidth]) + + +if __name__ == "SliceTrackerSlicelet": + import sys + print( sys.argv ) + + slicelet = SliceTrackerSlicelet() From 561566950148c89bb2928e5aa625fe941f152b79 Mon Sep 17 00:00:00 2001 From: Christian Herz Date: Fri, 21 Apr 2017 15:40:13 -0400 Subject: [PATCH 3/3] ENH: added bash script for starting slicelet from ubuntu (issue #261): * TODO: get Slicer path from env --- startSlicelet_Ubuntu.sh | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 startSlicelet_Ubuntu.sh diff --git a/startSlicelet_Ubuntu.sh b/startSlicelet_Ubuntu.sh new file mode 100644 index 0000000..fad63b6 --- /dev/null +++ b/startSlicelet_Ubuntu.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +SLICER="/home/parallels/sources/cpp/Slicer/Build/Slicer-build/Slicer" + +$SLICER --python-code "from SliceTracker import SliceTrackerSlicelet; slicelet=SliceTrackerSlicelet();" --no-splash --no-main-window \ No newline at end of file