diff --git a/src/python/dm/aps_beamline_tools/gui/addExperiment.py b/src/python/dm/aps_beamline_tools/gui/addExperiment.py
new file mode 100644
index 0000000000000000000000000000000000000000..afa3ebae171623cdac982ff00bab7546909c9d80
--- /dev/null
+++ b/src/python/dm/aps_beamline_tools/gui/addExperiment.py
@@ -0,0 +1,19 @@
+#!/usr/bin/env python
+
+from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \
+ QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView
+from PyQt4.QtCore import Qt
+from dmApiFactory import DmApiFactory
+
+# Define the experiments tab content:
+class AddExperimentTab(QWidget):
+ def __init__(self, stationName, parent, id=-1):
+ super(AddExperimentTab, self).__init__(parent)
+ self.stationName = stationName
+ self.parent = parent
+ self.experimentDsApi = DmApiFactory.getInstance().getExperimentDsApi()
+ self.addExperimentsTabLayout()
+
+ # Sets up the tab's layout, each block is a row
+ def addExperimentsTabLayout(self):
+ grid = QGridLayout()
\ No newline at end of file
diff --git a/src/python/dm/aps_beamline_tools/gui/daqsTab.py b/src/python/dm/aps_beamline_tools/gui/daqsTab.py
index 7d824749300ff7aa07b1acabe3366d80c8db48fd..d7e15e3f63929ee2c51786fea8eb7eb074370ee3 100644
--- a/src/python/dm/aps_beamline_tools/gui/daqsTab.py
+++ b/src/python/dm/aps_beamline_tools/gui/daqsTab.py
@@ -1,37 +1,86 @@
#!/usr/bin/env python
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \
+ QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView
+from PyQt4.QtCore import Qt
from dmApiFactory import DmApiFactory
# Define the DAQs tab content:
-class DaqsTab(QObject):
+class DaqsTab(QWidget):
def __init__(self, stationName, parent, id=-1):
super(DaqsTab, self).__init__(parent)
self.stationName = stationName
+ self.parent = parent
self.experimentDaqApi = DmApiFactory.getInstance().getExperimentDaqApi()
+ self.daqsTabLayout()
- self.InsertColumn(0, 'Id')
- self.InsertColumn(2, 'Data Directory')
- self.InsertColumn(3, '# Files')
+ def daqsTabLayout(self):
+ grid = QGridLayout()
- self.SetColumnWidth(0, 150)
- self.SetColumnWidth(1, 350)
- self.SetColumnWidth(2, 250)
+ labelFont = QFont('Arial', 18, QFont.Bold)
+ lbl = QLabel(self.stationName + ' DAQs List', self)
+ lbl.setAlignment(Qt.AlignCenter)
+ lbl.setFont(labelFont)
+ grid.addWidget(lbl, 1, 1, 1, 3)
+ # lambda allows the passing of variables
+ backBtn = QPushButton('Back', self)
+ backBtn.clicked.connect(lambda: self.setTab(0))
+ backBtn.setMaximumWidth(100)
+ grid.addWidget(backBtn, 2, 3)
+
+ grid.addItem(QSpacerItem(20, 30, QSizePolicy.Expanding), 3, 1)
+
+ grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 1)
+ self.tableWidget = QTableWidget()
+ self.tableWidget.setFixedWidth(600)
self.updateList()
+ grid.addWidget(self.tableWidget, 4, 2)
+ grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 3)
+
+ addBtn = QPushButton('Start New', self)
+ addBtn.clicked.connect(lambda: self.setTab(0))
+ addBtn.setFixedWidth(250)
+ grid.addWidget(addBtn, 5, 2, Qt.AlignLeft)
+ modBtn = QPushButton('Stop Selected', self)
+ modBtn.clicked.connect(lambda: self.setTab(0))
+ modBtn.setFixedWidth(250)
+ grid.addWidget(modBtn, 5, 2, Qt.AlignRight)
+
+ grid.addItem(QSpacerItem(20, 40, QSizePolicy.Expanding), 6, 1)
+
+ self.daqsTabWidget = QWidget()
+ self.daqsTabWidget.setLayout(grid)
def updateList(self):
self.daqList = self.experimentDaqApi.listDaqs()
+ self.tableWidget.setRowCount(len(self.daqList))
+ self.tableWidget.setColumnCount(3)
+ self.tableWidget.setColumnWidth(1, 348)
+ self.tableWidget.setColumnWidth(2, 150)
+ self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
+ self.tableWidget.setHorizontalHeaderLabels('ID;Data Directory;Number of Files;'.split(';'))
+ self.tableWidget.cellDoubleClicked.connect(self.expandRow)
i = 0
for daq in self.daqList:
- self.InsertStringItem(i, daq.get('id'))
- self.SetStringItem(i, 1, daq.get('dataDirectory', ''))
- self.SetStringItem(i, 2, str(daq.get('nFiles', '0')))
+ rowID = QTableWidgetItem(daq.get('id'))
+ rowDataDir = QTableWidgetItem(daq.get('dataDirectory', ''))
+ rowNumFiles = QTableWidgetItem(str(daq.get('nFiles', '')))
+ self.tableWidget.setItem(i, 0, rowID)
+ self.tableWidget.setItem(i, 1, rowDataDir)
+ self.tableWidget.setItem(i, 2, rowNumFiles)
if (i % 2) == 0:
- self.SetItemBackgroundColour(i, '#e6f1f5')
+ rowID.setBackground(QColor.fromRgb(230, 241, 245))
+ rowDataDir.setBackground(QColor.fromRgb(230, 241, 245))
+ rowNumFiles.setBackground(QColor.fromRgb(230, 241, 245))
i += 1
+ def setTab(self, tab):
+ self.parent.stackedLayout.setCurrentIndex(tab)
+
+ def expandRow(self, row, column):
+ self.tableWidget.resizeRowToContents(row)
+
diff --git a/src/python/dm/aps_beamline_tools/gui/dmStationUi.py b/src/python/dm/aps_beamline_tools/gui/dmStationUi.py
index dc53a71b549366374917a0a08097b27f4fd51d97..4b2f94e64011b4b7e24216ef92806979b8f1afde 100755
--- a/src/python/dm/aps_beamline_tools/gui/dmStationUi.py
+++ b/src/python/dm/aps_beamline_tools/gui/dmStationUi.py
@@ -14,6 +14,7 @@ from experimentsTab import ExperimentsTab
from daqsTab import DaqsTab
from uploadsTab import UploadsTab
from initialTab import InitialTab
+from addExperiment import AddExperimentTab
class DmStationUi(QMainWindow):
@@ -29,37 +30,66 @@ class DmStationUi(QMainWindow):
self.stackedLayout = QStackedLayout()
# Create the tab windows
- initialTab = InitialTab(self.stationName, self.stackedLayout)
- experimentsTab = ExperimentsTab(self.stationName, self.stackedLayout)
- #daqsTab = DaqsTab(self.stationName, self.stackedLayout)
- #uploadsTab = UploadsTab(self.stationName, self.stackedLayout)
+ self.initialTab = InitialTab(self.stationName, self)
+ self.experimentsTab = ExperimentsTab(self.stationName, self)
+ self.daqsTab = DaqsTab(self.stationName, self)
+ self.uploadsTab = UploadsTab(self.stationName, self)
+ #addExperimentTab = AddExperimentTab(self.stationName, self)
# Add the windows to the stack.
- self.stackedLayout.addWidget(initialTab)
- self.stackedLayout.addWidget(experimentsTab)
- #self.stackedLayout.addWidget(daqsTab)
- #self.stackedLayout.addWidget(uploadsTab)
+ self.stackedLayout.addWidget(self.initialTab.initialTabWidget)
+ self.stackedLayout.addWidget(self.experimentsTab.experimentsTabWidget)
+ self.stackedLayout.addWidget(self.daqsTab.daqsTabWidget)
+ self.stackedLayout.addWidget(self.uploadsTab.uploadsTabWidget)
+ #self.stackedLayout.addWidget(addExperimentTab.addExperimentTabWidget)
# Set a central widget to hold everything
self.centralWidget = QWidget()
self.centralWidget.setLayout(self.stackedLayout)
self.setCentralWidget(self.centralWidget)
+ self.stackedLayout.setCurrentIndex(0)
+ self.center()
+ self.show()
+
def __configure(self):
self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)
configManager = ConfigurationManager.getInstance()
self.stationName = configManager.getInstance().getStationName()
if not self.stationName:
raise ConfigurationError('DM_STATION_NAME environment variable is not defined.')
-
+
+ # Centers window on the screen where the mouse is detected
+ def center(self):
+ frameGeo = self.frameGeometry()
+ screen = QApplication.desktop().screenNumber(QApplication.desktop().cursor().pos())
+ screenCenter = QApplication.desktop().screenGeometry(screen).center()
+ frameGeo.moveCenter(screenCenter)
+ self.move(frameGeo.topLeft())
+
+ # Calls for the table to be resized when a resize event is called
+ def resizeEvent(self, event):
+ windowSize = event.size().width()
+ currentIndex = self.getTab()
+ if currentIndex == 0:
+ return
+ elif currentIndex == 1:
+ ExperimentsTab.resizeTable(self.experimentsTab, windowSize)
+
+ def getTab(self):
+ return self.stackedLayout.currentIndex()
+
+
if __name__ == "__main__":
- try:
+ #try:
app = QApplication(sys.argv)
- DmStationUi().Show()
- app.MainLoop()
- except DmException, ex:
- print >>sys.stderr, 'ERROR: %s' % ex
- raise SystemExit(ex.getErrorCode())
- except Exception, ex:
- print >>sys.stderr, '%s' % ex
- raise SystemExit(dmStatus.DM_ERROR)
+ window = DmStationUi()
+ window.show()
+ window.raise_()
+ sys.exit(app.exec_())
+ #except DmException, ex:
+ # print >>sys.stderr, 'ERROR: %s' % ex
+ # raise SystemExit(ex.getErrorCode())
+ #except Exception, ex:
+ # print >>sys.stderr, '%s' % ex
+ # raise SystemExit(dmStatus.DM_ERROR)
diff --git a/src/python/dm/aps_beamline_tools/gui/experimentsTab.py b/src/python/dm/aps_beamline_tools/gui/experimentsTab.py
index d925fbc4b25e3776ce038ae41c86e7282d3e5818..51e820fd0338b31c12fc87c0b3b80010b2dfde38 100644
--- a/src/python/dm/aps_beamline_tools/gui/experimentsTab.py
+++ b/src/python/dm/aps_beamline_tools/gui/experimentsTab.py
@@ -1,31 +1,100 @@
#!/usr/bin/env python
-from PyQt4.QtGui import *
-from PyQt4.QtCore import QObject
+from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \
+ QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView
+from PyQt4.QtCore import Qt
from dmApiFactory import DmApiFactory
# Define the experiments tab content:
-class ExperimentsTab(QObject):
+class ExperimentsTab(QWidget):
def __init__(self, stationName, parent, id=-1):
super(ExperimentsTab, self).__init__(parent)
self.stationName = stationName
+ self.parent = parent
+ self.test = 'cat'
self.experimentDsApi = DmApiFactory.getInstance().getExperimentDsApi()
+ self.experimentsTabLayout()
+ # Sets up the tab's layout, each block is a row
+ def experimentsTabLayout(self):
+ grid = QGridLayout()
+ labelFont = QFont('Arial', 18, QFont.Bold)
+ lbl = QLabel(self.stationName + ' DM Experiment List', self)
+ lbl.setAlignment(Qt.AlignCenter)
+ lbl.setFont(labelFont)
+ grid.addWidget(lbl, 0, 0, 1, 3)
+ backBtn = QPushButton('Back', self)
+ backBtn.clicked.connect(lambda: self.setTab(0))
+ backBtn.setMaximumWidth(100)
+ grid.addWidget(backBtn, 1, 2)
+
+ grid.addItem(QSpacerItem(20, 30, QSizePolicy.Expanding), 2, 0)
+
+ grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 3, 0)
+ self.tableWidget = QTableWidget()
self.updateList()
+ grid.addWidget(self.tableWidget, 3, 0, 1, 3)
+ grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 3, 2)
+
+
+ addBtn = QPushButton('Add Experiment', self)
+ addBtn.clicked.connect(lambda: self.setTab(0))
+ addBtn.setFixedWidth(250)
+ grid.addWidget(addBtn, 4, 1, Qt.AlignLeft)
+ modBtn = QPushButton('Modify Selected', self)
+ modBtn.clicked.connect(lambda: self.setTab(0))
+ modBtn.setFixedWidth(250)
+ grid.addWidget(modBtn, 4, 1, Qt.AlignRight)
+
+ grid.addItem(QSpacerItem(20, 40, QSizePolicy.Expanding), 5, 0)
+
+ self.experimentsTabWidget = QWidget()
+ self.experimentsTabWidget.setLayout(grid)
+
+ # Sets up the table structure and fills it with data
def updateList(self):
self.experimentList = self.experimentDsApi.getExperimentsByStation(self.stationName)
+ self.tableWidget.setRowCount(len(self.experimentList))
+ self.tableWidget.setColumnCount(3)
+ self.colWidths = (130, 400, 209)
+ for i, size in enumerate(self.colWidths):
+ self.tableWidget.horizontalHeader().resizeSection(i, size)
+ self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
+ self.tableWidget.setHorizontalHeaderLabels('Name;Description;Start Date;'.split(';'))
+ self.tableWidget.cellDoubleClicked.connect(self.expandRow)
i = 0
for experiment in self.experimentList:
- self.InsertStringItem(i, experiment.get('name'))
- self.SetStringItem(i, 1, experiment.get('description', ''))
- self.SetStringItem(i, 2, str(experiment.get('startDate', '')))
+ rowName = QTableWidgetItem(experiment.get('name'))
+ rowDescription = QTableWidgetItem(experiment.get('description', ''))
+ rowStartDate = QTableWidgetItem(str(experiment.get('startDate', '')))
+ self.tableWidget.setItem(i, 0, rowName)
+ self.tableWidget.setItem(i, 1, rowDescription)
+ self.tableWidget.setItem(i, 2, rowStartDate)
if (i % 2) == 0:
- self.SetItemBackgroundColour(i, '#e6f1f5')
+ rowName.setBackground(QColor.fromRgb(230, 241, 245))
+ rowDescription.setBackground(QColor.fromRgb(230, 241, 245))
+ rowStartDate.setBackground(QColor.fromRgb(230, 241, 245))
i += 1
+ # Used to change between tabs
+ def setTab(self, tab):
+ self.parent.stackedLayout.setCurrentIndex(tab)
+
+ # Expands the given row to fit the size of its contents
+ def expandRow(self, row, column):
+ self.tableWidget.resizeRowToContents(row)
+ # Resizes the horizontal headers to fit the screen
+ def resizeTable(self, width):
+ totalWidths = sum(self.colWidths)
+ if self.tableWidget.verticalScrollBar().isVisible():
+ newSize = [column * (width - 60) / totalWidths for column in self.colWidths]
+ else:
+ newSize = [column * (width - 60) / totalWidths for column in self.colWidths]
+ for i, column in enumerate(newSize):
+ self.tableWidget.horizontalHeader().resizeSection(i, column)
diff --git a/src/python/dm/aps_beamline_tools/gui/initialTab.py b/src/python/dm/aps_beamline_tools/gui/initialTab.py
index 7fca1d8f632aed5f6214bdfae7d9fd7ff1c3f2b3..170b2eb3df1dd50114795b5379cb2c6080dcf6fe 100644
--- a/src/python/dm/aps_beamline_tools/gui/initialTab.py
+++ b/src/python/dm/aps_beamline_tools/gui/initialTab.py
@@ -5,32 +5,40 @@ from PyQt4.QtCore import QObject, Qt
# Define the experiments tab content:
-class InitialTab(QObject):
+class InitialTab(QWidget):
def __init__(self, stationName, parent, id=-1):
super(InitialTab, self).__init__(parent)
self.stationName = stationName
self.parent = parent
+ self.initialTabLayout()
def initialTabLayout(self):
grid = QGridLayout()
- labelFont = QFont("Arial", 18, QFont.Bold)
- lbl = QLabel(self.stationName + " DM Tool", self)
+ labelFont = QFont('Arial', 18, QFont.Bold)
+ lbl = QLabel(self.stationName + ' DM Tool', self)
lbl.setAlignment(Qt.AlignCenter)
lbl.setFont(labelFont)
- grid.addWidget(lbl, 1, 1, 1, 3)
+ grid.addWidget(lbl, 1, 1, 1, 7)
grid.addItem(QSpacerItem(20, 130, QSizePolicy.Expanding), 2, 1)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 3, 1)
- manageBtn = QPushButton("Manage Experiments", self)
- manageBtn.clicked.connect(self.setTab(1))
+ manageBtn = QPushButton('Manage Experiments', self)
+ manageBtn.setFixedSize(160, 160)
+ manageBtn.clicked.connect(lambda: self.setTab(1))
grid.addWidget(manageBtn, 3, 2)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 3, 3)
- viewBtn = QPushButton("View Experiments", self)
- viewBtn.clicked.connect(self.setTab(2))
+ viewBtn = QPushButton('DAQs', self)
+ viewBtn.setFixedSize(160, 160)
+ viewBtn.clicked.connect(lambda: self.setTab(2))
grid.addWidget(viewBtn, 3, 4)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 3, 5)
+ viewBtn = QPushButton('Uploads', self)
+ viewBtn.setFixedSize(160, 160)
+ viewBtn.clicked.connect(lambda: self.setTab(3))
+ grid.addWidget(viewBtn, 3, 6)
+ grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 3, 7)
grid.addItem(QSpacerItem(20, 130, QSizePolicy.Expanding), 4, 1)
@@ -38,4 +46,4 @@ class InitialTab(QObject):
self.initialTabWidget.setLayout(grid)
def setTab(self, tab):
- self.parent.setCurrentIndex(tab)
+ self.parent.stackedLayout.setCurrentIndex(tab)
diff --git a/src/python/dm/aps_beamline_tools/gui/uploadsTab.py b/src/python/dm/aps_beamline_tools/gui/uploadsTab.py
index a5654bacd9dc9da9b4358379a67b8c323673d9e7..9f164e4112cf04d221105c0e6e630909db32c265 100644
--- a/src/python/dm/aps_beamline_tools/gui/uploadsTab.py
+++ b/src/python/dm/aps_beamline_tools/gui/uploadsTab.py
@@ -1,37 +1,84 @@
#!/usr/bin/env python
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
+from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \
+ QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView
+from PyQt4.QtCore import Qt
from dmApiFactory import DmApiFactory
# Define the experiments tab content:
-class UploadsTab(QObject):
+class UploadsTab(QWidget):
def __init__(self, stationName, parent, id=-1):
super(UploadsTab, self).__init__(parent)
self.stationName = stationName
+ self.parent = parent
self.experimentDaqApi = DmApiFactory.getInstance().getExperimentDaqApi()
+ self.uploadTabLayout()
- self.InsertColumn(0, 'Id')
- self.InsertColumn(2, 'Data Directory')
- self.InsertColumn(3, '# Files')
+ def uploadTabLayout(self):
+ grid = QGridLayout()
- self.SetColumnWidth(0, 150)
- self.SetColumnWidth(1, 350)
- self.SetColumnWidth(2, 250)
+ labelFont = QFont('Arial', 18, QFont.Bold)
+ lbl = QLabel(self.stationName + ' Uploads List', self)
+ lbl.setAlignment(Qt.AlignCenter)
+ lbl.setFont(labelFont)
+ grid.addWidget(lbl, 1, 1, 1, 3)
+ # lambda allows the passing of variables
+ backBtn = QPushButton('Back', self)
+ backBtn.clicked.connect(lambda: self.setTab(0))
+ backBtn.setMaximumWidth(100)
+ grid.addWidget(backBtn, 2, 3)
+
+ grid.addItem(QSpacerItem(20, 30, QSizePolicy.Expanding), 3, 1)
+
+ grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 1)
+ self.tableWidget = QTableWidget()
+ self.tableWidget.setFixedWidth(600)
self.updateList()
+ grid.addWidget(self.tableWidget, 4, 2)
+ grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 3)
+
+ addBtn = QPushButton('Start New', self)
+ addBtn.clicked.connect(lambda: self.setTab(0))
+ addBtn.setFixedWidth(250)
+ grid.addWidget(addBtn, 5, 2, Qt.AlignLeft)
+ modBtn = QPushButton('Stop Selected', self)
+ modBtn.clicked.connect(lambda: self.setTab(0))
+ modBtn.setFixedWidth(250)
+ grid.addWidget(modBtn, 5, 2, Qt.AlignRight)
+
+ grid.addItem(QSpacerItem(20, 40, QSizePolicy.Expanding), 6, 1)
+
+ self.uploadsTabWidget = QWidget()
+ self.uploadsTabWidget.setLayout(grid)
def updateList(self):
self.uploadList = self.experimentDaqApi.listUploads()
+ self.tableWidget.setRowCount(len(self.uploadList))
+ self.tableWidget.setColumnCount(3)
+ self.tableWidget.setColumnWidth(1, 348)
+ self.tableWidget.setColumnWidth(2, 150)
+ self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
+ self.tableWidget.setHorizontalHeaderLabels('ID;Data Directory;Number of Files;'.split(';'))
+ self.tableWidget.cellDoubleClicked.connect(self.expandRow)
i = 0
for upload in self.uploadList:
- self.InsertStringItem(i, upload.get('id'))
- self.SetStringItem(i, 1, upload.get('dataDirectory', ''))
- self.SetStringItem(i, 2, str(upload.get('nFiles', '0')))
+ rowID = QTableWidgetItem(upload.get('id'))
+ rowDataDir = QTableWidgetItem(upload.get('dataDirectory', ''))
+ rowNumFiles = QTableWidgetItem(str(upload.get('nFiles', '')))
+ self.tableWidget.setItem(i, 0, rowID)
+ self.tableWidget.setItem(i, 1, rowDataDir)
+ self.tableWidget.setItem(i, 2, rowNumFiles)
if (i % 2) == 0:
- self.SetItemBackgroundColour(i, '#e6f1f5')
+ rowID.setBackground(QColor.fromRgb(230, 241, 245))
+ rowDataDir.setBackground(QColor.fromRgb(230, 241, 245))
+ rowNumFiles.setBackground(QColor.fromRgb(230, 241, 245))
i += 1
+ def setTab(self, tab):
+ self.parent.stackedLayout.setCurrentIndex(tab)
+ def expandRow(self, row, column):
+ self.tableWidget.resizeRowToContents(row)