Skip to content
Snippets Groups Projects
addExperiment.py 6.93 KiB
Newer Older
#!/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

    # 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)
        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