Skip to content
Snippets Groups Projects
Commit 52fbb0dc authored by Collin A. Schmitz's avatar Collin A. Schmitz
Browse files

Updated layout. AddExperimentTab now almost operational. Proposal Api added.

parent 344f2876
No related branches found
No related tags found
No related merge requests found
......@@ -11,9 +11,141 @@ class AddExperimentTab(QWidget):
super(AddExperimentTab, self).__init__(parent)
self.stationName = stationName
self.parent = parent
self.experimentDsApi = DmApiFactory.getInstance().getExperimentDsApi()
self.experimentPropApi = DmApiFactory.getInstance().getBeamlineProposalApi()
self.addExperimentsTabLayout()
# Sets up the tab's layout, each block is a row
def addExperimentsTabLayout(self):
grid = QGridLayout()
\ No newline at end of file
grid = QGridLayout()
labelFont = QFont('Arial', 18, QFont.Bold)
lbl = QLabel(self.stationName + ' Proposal List', self)
lbl.setAlignment(Qt.AlignCenter)
lbl.setFont(labelFont)
grid.addWidget(lbl, 0, 0, 1, 7)
backBtn = QPushButton('Back', self)
backBtn.clicked.connect(lambda: self.setTab(1))
backBtn.setMinimumWidth(100)
grid.addWidget(backBtn, 1, 5, 1, 2, Qt.AlignCenter)
grid.addItem(QSpacerItem(1500, 40, QSizePolicy.Expanding, QSizePolicy.Minimum), 2, 0)
self.tableWidget = QTableWidget()
self.updateList()
self.detailsTable = QTableWidget()
self.detailsTable.hide()
grid.addWidget(self.detailsTable, 3, 0, 5, 4)
grid.addWidget(self.tableWidget, 3, 0, 5, 4)
grid.addItem(QSpacerItem(20, 1000, QSizePolicy.Minimum, QSizePolicy.Expanding), 3, 1, 5, 1)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 3, 4)
self.detailBtn = QPushButton('Proposal Details', self)
self.detailBtn.clicked.connect(self.toggleDetails)
self.detailBtn.setFixedSize(150, 100)
grid.addWidget(self.detailBtn, 3, 5)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 3, 6)
grid.addItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding), 4, 5)
startBtn = QPushButton('Use Proposal', self)
startBtn.clicked.connect(self.startProposal)
startBtn.setFixedSize(150, 100)
grid.addWidget(startBtn, 5, 5)
grid.addItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding), 6, 5)
modBtn = QPushButton('Continue Manually', self)
modBtn.clicked.connect(lambda: self.setTab(0))
modBtn.setFixedSize(150, 100)
grid.addWidget(modBtn, 7, 5)
grid.addItem(QSpacerItem(20, 40, QSizePolicy.Expanding, QSizePolicy.Minimum), 8, 0)
self.addExperimentTabWidget = QWidget()
self.addExperimentTabWidget.setLayout(grid)
def updateList(self):
self.proposalList = self.experimentPropApi.listBeamlineProposals()
self.tableWidget.setRowCount(len(self.proposalList))
self.tableWidget.setColumnCount(1)
self.tableWidget.horizontalHeader().setStretchLastSection(True)
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.tableWidget.setHorizontalHeaderLabels('Proposal'.split(';'))
self.tableWidget.cellDoubleClicked.connect(lambda row, column: self.expandRow(row, column, self.tableWidget))
i = 0
for proposal in self.proposalList:
rowPropName = QTableWidgetItem(proposal['title'])
rowPropName.setData(Qt.UserRole, proposal['id'])
self.tableWidget.setItem(i, 0, rowPropName)
if (i % 2) == 0:
rowPropName.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, table):
table.resizeRowToContents(row)
def startProposal(self):
row = self.tableWidget.currentRow()
name = self.tableWidget.item(row, 0).text()
print "Starting " + name
self.setTab(0)
# Resizes the horizontal headers to fit the screen
def resizeTable(self, width):
totalWidths = sum(self.colWidths)
if self.detailsTable.verticalScrollBar().isVisible():
newSize = [column * (width - 204) / totalWidths for column in self.colWidths]
else:
newSize = [column * (width - 204) / totalWidths for column in self.colWidths]
for i, column in enumerate(newSize):
self.detailsTable.horizontalHeader().resizeSection(i, column)
def toggleDetails(self):
if self.detailBtn.isChecked():
self.tableWidget.show()
self.detailsTable.hide()
self.detailBtn.setChecked(False)
else:
self.tableWidget.hide()
self.proposalDetails()
self.detailsTable.show()
self.detailBtn.setChecked(True)
def proposalDetails(self):
id = self.tableWidget.item(self.tableWidget.currentRow(), 0).data(Qt.UserRole)
proposal = self.experimentPropApi.getBeamlineProposal(id)
self.detailsTable.setRowCount(len(proposal['experimenters']))
self.detailsTable.setColumnCount(4)
self.colWidths = (130, 150, 150, 164)
for i, size in enumerate(self.colWidths):
self.detailsTable.horizontalHeader().resizeSection(i, size)
self.detailsTable.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.detailsTable.setHorizontalHeaderLabels('Badge Number;First Name;Last Name;Institution'.split(';'))
self.detailsTable.cellDoubleClicked.connect(lambda row, column: self.expandRow(row, column, self.detailsTable))
i = 0
for experimenter in proposal['experimenters']:
rowBadge = QTableWidgetItem(experimenter['badge'])
rowFirstName = QTableWidgetItem(experimenter['firstName'])
rowLastName = QTableWidgetItem(experimenter['lastName'])
rowInstitution = QTableWidgetItem(experimenter['institution'])
self.detailsTable.setItem(i, 0, rowBadge)
self.detailsTable.setItem(i, 1, rowFirstName)
self.detailsTable.setItem(i, 2, rowLastName)
self.detailsTable.setItem(i, 3, rowInstitution)
if (i % 2) == 0:
rowBadge.setBackground(QColor.fromRgb(230, 241, 245))
rowFirstName.setBackground(QColor.fromRgb(230, 241, 245))
rowLastName.setBackground(QColor.fromRgb(230, 241, 245))
rowInstitution.setBackground(QColor.fromRgb(230, 241, 245))
i += 1
......@@ -2,7 +2,7 @@
from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \
QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView
from PyQt4.QtCore import Qt
from PyQt4.QtCore import Qt, pyqtSignal
from dmApiFactory import DmApiFactory
# Define the DAQs tab content:
......@@ -13,7 +13,6 @@ class DaqsTab(QWidget):
self.parent = parent
self.experimentDaqApi = DmApiFactory.getInstance().getExperimentDaqApi()
self.daqsTabLayout()
def daqsTabLayout(self):
grid = QGridLayout()
......@@ -21,33 +20,33 @@ class DaqsTab(QWidget):
lbl = QLabel(self.stationName + ' DAQs List', self)
lbl.setAlignment(Qt.AlignCenter)
lbl.setFont(labelFont)
grid.addWidget(lbl, 1, 1, 1, 3)
grid.addWidget(lbl, 0, 0, 1, 5)
# 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.addWidget(backBtn, 1, 4)
grid.addItem(QSpacerItem(20, 30, QSizePolicy.Expanding), 3, 1)
grid.addItem(QSpacerItem(20, 30, QSizePolicy.Expanding), 2, 0)
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)
grid.addWidget(self.tableWidget, 3, 0, 1, 5)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 0)
addBtn = QPushButton('Start New', self)
addBtn.clicked.connect(lambda: self.setTab(0))
addBtn.setFixedWidth(250)
grid.addWidget(addBtn, 5, 2, Qt.AlignLeft)
addBtn.setMinimumWidth(150)
grid.addWidget(addBtn, 4, 1)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 2)
modBtn = QPushButton('Stop Selected', self)
modBtn.clicked.connect(lambda: self.setTab(0))
modBtn.setFixedWidth(250)
grid.addWidget(modBtn, 5, 2, Qt.AlignRight)
modBtn.setMinimumWidth(150)
grid.addWidget(modBtn, 4, 3)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 4)
grid.addItem(QSpacerItem(20, 40, QSizePolicy.Expanding), 6, 1)
grid.addItem(QSpacerItem(20, 40, QSizePolicy.Expanding), 5, 0)
self.daqsTabWidget = QWidget()
self.daqsTabWidget.setLayout(grid)
......@@ -56,8 +55,9 @@ class DaqsTab(QWidget):
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.colWidths = (130, 450, 200)
for i, size in enumerate(self.colWidths):
self.tableWidget.horizontalHeader().resizeSection(i, size)
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.tableWidget.setHorizontalHeaderLabels('ID;Data Directory;Number of Files;'.split(';'))
self.tableWidget.cellDoubleClicked.connect(self.expandRow)
......@@ -82,5 +82,13 @@ class DaqsTab(QWidget):
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 - 19) / totalWidths for column in self.colWidths]
for i, column in enumerate(newSize):
self.tableWidget.horizontalHeader().resizeSection(i, column)
......@@ -35,6 +35,11 @@ class DmApiFactory(Singleton):
api = ExperimentDaqApi(self.username, self.password, self.daqHost, self.daqPort, self.protocol)
return api
def getBeamlineProposalApi(self):
from dm.aps_bss.api.apsBssApi import ApsBssApi
api = ApsBssApi()
return api
####################################################################
# Testing
......
......@@ -28,20 +28,21 @@ class DmStationUi(QMainWindow):
# Create a stacked layout to connect the various pages
self.stackedLayout = QStackedLayout()
self.stackedLayout.currentChanged.connect(self.currentChanged)
# Create the tab windows
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)
self.addExperimentTab = AddExperimentTab(self.stationName, self)
# Add the windows to the stack.
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)
self.stackedLayout.addWidget(self.addExperimentTab.addExperimentTabWidget)
# Set a central widget to hold everything
self.centralWidget = QWidget()
......@@ -75,6 +76,21 @@ class DmStationUi(QMainWindow):
return
elif currentIndex == 1:
ExperimentsTab.resizeTable(self.experimentsTab, windowSize)
elif currentIndex == 2:
DaqsTab.resizeTable(self.daqsTab, windowSize)
elif currentIndex == 3:
UploadsTab.resizeTable(self.uploadsTab, windowSize)
elif currentIndex == 4:
AddExperimentTab.resizeTable(self.addExperimentTab, windowSize)
def currentChanged(self, index):
newIndex = index
if newIndex == 1:
ExperimentsTab.resizeTable(self.experimentsTab, self.geometry().width())
elif newIndex == 2:
DaqsTab.resizeTable(self.daqsTab, self.geometry().width())
elif newIndex == 3:
UploadsTab.resizeTable(self.uploadsTab, self.geometry().width())
def getTab(self):
return self.stackedLayout.currentIndex()
......
......@@ -11,7 +11,6 @@ class ExperimentsTab(QWidget):
super(ExperimentsTab, self).__init__(parent)
self.stationName = stationName
self.parent = parent
self.test = 'cat'
self.experimentDsApi = DmApiFactory.getInstance().getExperimentDsApi()
self.experimentsTabLayout()
......@@ -23,31 +22,30 @@ class ExperimentsTab(QWidget):
lbl = QLabel(self.stationName + ' DM Experiment List', self)
lbl.setAlignment(Qt.AlignCenter)
lbl.setFont(labelFont)
grid.addWidget(lbl, 0, 0, 1, 3)
grid.addWidget(lbl, 0, 0, 1, 5)
backBtn = QPushButton('Back', self)
backBtn.clicked.connect(lambda: self.setTab(0))
backBtn.setMaximumWidth(100)
grid.addWidget(backBtn, 1, 2)
backBtn.setMinimumWidth(100)
grid.addWidget(backBtn, 1, 4, Qt.AlignCenter)
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)
grid.addWidget(self.tableWidget, 3, 0, 1, 5)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 0)
addBtn = QPushButton('Add Experiment', self)
addBtn.clicked.connect(lambda: self.setTab(0))
addBtn.setFixedWidth(250)
grid.addWidget(addBtn, 4, 1, Qt.AlignLeft)
addBtn.clicked.connect(lambda: self.setTab(4))
addBtn.setMinimumWidth(150)
grid.addWidget(addBtn, 4, 1)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 2)
modBtn = QPushButton('Modify Selected', self)
modBtn.clicked.connect(lambda: self.setTab(0))
modBtn.setFixedWidth(250)
grid.addWidget(modBtn, 4, 1, Qt.AlignRight)
modBtn.clicked.connect(lambda: self.setTab(5))
modBtn.setMinimumWidth(150)
grid.addWidget(modBtn, 4, 3)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 4)
grid.addItem(QSpacerItem(20, 40, QSizePolicy.Expanding), 5, 0)
......
......@@ -19,28 +19,28 @@ class InitialTab(QWidget):
lbl = QLabel(self.stationName + ' DM Tool', self)
lbl.setAlignment(Qt.AlignCenter)
lbl.setFont(labelFont)
grid.addWidget(lbl, 1, 1, 1, 7)
grid.addWidget(lbl, 0, 0, 1, 7)
grid.addItem(QSpacerItem(20, 130, QSizePolicy.Expanding), 2, 1)
grid.addItem(QSpacerItem(20, 130, QSizePolicy.Minimum, QSizePolicy.Expanding), 1, 0)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 3, 1)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 2, 0)
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)
grid.addWidget(manageBtn, 2, 1)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 2, 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)
grid.addWidget(viewBtn, 2, 3)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 2, 4)
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.addWidget(viewBtn, 2, 5)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 2, 6)
grid.addItem(QSpacerItem(20, 130, QSizePolicy.Expanding), 4, 1)
grid.addItem(QSpacerItem(20, 130, QSizePolicy.Minimum, QSizePolicy.Expanding), 3, 0)
self.initialTabWidget = QWidget()
self.initialTabWidget.setLayout(grid)
......
#!/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 ManageUsersTab(QWidget):
def __init__(self, stationName, parent, id=-1):
super(ManageUsersTab, self).__init__(parent)
self.stationName = stationName
self.parent = parent
self.experimentDsApi = DmApiFactory.getInstance().getExperimentDsApi()
self.experimentsTabLayout()
\ No newline at end of file
......@@ -21,33 +21,33 @@ class UploadsTab(QWidget):
lbl = QLabel(self.stationName + ' Uploads List', self)
lbl.setAlignment(Qt.AlignCenter)
lbl.setFont(labelFont)
grid.addWidget(lbl, 1, 1, 1, 3)
grid.addWidget(lbl, 0, 0, 1, 5)
# 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.addWidget(backBtn, 1, 4)
grid.addItem(QSpacerItem(20, 30, QSizePolicy.Expanding), 3, 1)
grid.addItem(QSpacerItem(20, 30, QSizePolicy.Expanding), 2, 0)
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)
grid.addWidget(self.tableWidget, 3, 0, 1, 5)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 0)
addBtn = QPushButton('Start New', self)
addBtn.clicked.connect(lambda: self.setTab(0))
addBtn.setFixedWidth(250)
grid.addWidget(addBtn, 5, 2, Qt.AlignLeft)
addBtn.setMinimumWidth(150)
grid.addWidget(addBtn, 4, 1)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 2)
modBtn = QPushButton('Stop Selected', self)
modBtn.clicked.connect(lambda: self.setTab(0))
modBtn.setFixedWidth(250)
grid.addWidget(modBtn, 5, 2, Qt.AlignRight)
modBtn.setMinimumWidth(150)
grid.addWidget(modBtn, 4, 3)
grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 4)
grid.addItem(QSpacerItem(20, 40, QSizePolicy.Expanding), 6, 1)
grid.addItem(QSpacerItem(20, 40, QSizePolicy.Expanding), 5, 0)
self.uploadsTabWidget = QWidget()
self.uploadsTabWidget.setLayout(grid)
......@@ -56,8 +56,9 @@ class UploadsTab(QWidget):
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.colWidths = (130, 450, 200)
for i, size in enumerate(self.colWidths):
self.tableWidget.horizontalHeader().resizeSection(i, size)
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.tableWidget.setHorizontalHeaderLabels('ID;Data Directory;Number of Files;'.split(';'))
self.tableWidget.cellDoubleClicked.connect(self.expandRow)
......@@ -82,3 +83,13 @@ class UploadsTab(QWidget):
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 - 19) / totalWidths for column in self.colWidths]
for i, column in enumerate(newSize):
self.tableWidget.horizontalHeader().resizeSection(i, column)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment