#!/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 ExperimentsTab(QWidget): def __init__(self, stationName, parent, id=-1): super(ExperimentsTab, self).__init__(parent) self.stationName = stationName self.parent = parent 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, 5) backBtn = QPushButton('Back', self) backBtn.clicked.connect(lambda: self.setTab(0)) backBtn.setMinimumWidth(100) grid.addWidget(backBtn, 1, 4, Qt.AlignCenter) grid.addItem(QSpacerItem(20, 30, QSizePolicy.Expanding), 2, 0) self.tableWidget = QTableWidget() self.updateList() 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(4)) addBtn.setMinimumWidth(150) addBtn.setFixedHeight(40) 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(5)) modBtn.setMinimumWidth(150) modBtn.setFixedHeight(40) grid.addWidget(modBtn, 4, 3) grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 4) grid.addItem(QSpacerItem(20, 10, 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) self.tableWidget.horizontalHeader().setStretchLastSection(True) i = 0 for experiment in self.experimentList: 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: 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)