#!/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 # 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.experimentPropApi = DmApiFactory.getInstance().getBeamlineProposalApi() self.addExperimentsTabLayout() # Sets up the tab's layout, each block is a row def addExperimentsTabLayout(self): 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) 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)) 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) # 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) def toggleDetails(self): if self.detailBtn.text() == 'Hide Details': self.tableWidget.show() self.detailsTable.hide() self.detailBtn.setText('Show Details') else: self.tableWidget.hide() self.proposalDetails() self.detailsTable.show() self.detailBtn.setText('Hide Details') 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) 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