Newer
Older
Collin A. Schmitz
committed
#!/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
from objects.userInfo import UserInfo
Collin A. Schmitz
committed
# 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
Collin A. Schmitz
committed
self.experimentPropApi = DmApiFactory.getInstance().getBeamlineProposalApi()
Collin A. Schmitz
committed
self.addExperimentsTabLayout()
# Sets up the tab's layout, each block is a row
def addExperimentsTabLayout(self):
Collin A. Schmitz
committed
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('Show Details', self)
Collin A. Schmitz
committed
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(5))
Collin A. Schmitz
committed
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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):
id = self.tableWidget.item(self.tableWidget.currentRow(), 0).data(Qt.UserRole)
proposal = self.experimentPropApi.getBeamlineProposal(id)
objectAllUsers = [UserInfo(x['badge'], x['firstName'], x['id'], x['lastName'], x['email']) for x in proposal['experimenters']]
self.parent.currentUsers = objectAllUsers
self.setTab(5)
Collin A. Schmitz
committed
# Resizes the horizontal headers to fit the screen
#def resizeTable(self, width):
# try:
# totalWidths = sum(self.colWidths)
# except AttributeError:
# return
# 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)
Collin A. Schmitz
committed
def toggleDetails(self):
if self.detailBtn.text() == 'Hide Details':
Collin A. Schmitz
committed
self.tableWidget.show()
self.detailsTable.hide()
self.detailBtn.setText('Show Details')
Collin A. Schmitz
committed
else:
self.tableWidget.hide()
self.proposalDetails()
self.detailsTable.show()
self.detailBtn.setText('Hide Details')
Collin A. Schmitz
committed
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))
self.detailsTable.horizontalHeader().setStretchLastSection(True)
Collin A. Schmitz
committed
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