diff --git a/src/python/dm/aps_beamline_tools/gui/addExperiment.py b/src/python/dm/aps_beamline_tools/gui/addExperiment.py index afa3ebae171623cdac982ff00bab7546909c9d80..16a6c05472c5874e32c019116faebf7a0984cda9 100644 --- a/src/python/dm/aps_beamline_tools/gui/addExperiment.py +++ b/src/python/dm/aps_beamline_tools/gui/addExperiment.py @@ -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 + diff --git a/src/python/dm/aps_beamline_tools/gui/daqsTab.py b/src/python/dm/aps_beamline_tools/gui/daqsTab.py index d7e15e3f63929ee2c51786fea8eb7eb074370ee3..fb69ba280ac6acc46bb715f05cfba43cc97a1735 100644 --- a/src/python/dm/aps_beamline_tools/gui/daqsTab.py +++ b/src/python/dm/aps_beamline_tools/gui/daqsTab.py @@ -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) diff --git a/src/python/dm/aps_beamline_tools/gui/dmApiFactory.py b/src/python/dm/aps_beamline_tools/gui/dmApiFactory.py index de3b65712baac335825755f37f1ad88b0b1233a5..ec637e159746e40bd49bf3fe892b0f94d56e685e 100755 --- a/src/python/dm/aps_beamline_tools/gui/dmApiFactory.py +++ b/src/python/dm/aps_beamline_tools/gui/dmApiFactory.py @@ -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 diff --git a/src/python/dm/aps_beamline_tools/gui/dmStationUi.py b/src/python/dm/aps_beamline_tools/gui/dmStationUi.py index 4b2f94e64011b4b7e24216ef92806979b8f1afde..c9def90902c92c8d22fcdd941bf2e993c0df7343 100755 --- a/src/python/dm/aps_beamline_tools/gui/dmStationUi.py +++ b/src/python/dm/aps_beamline_tools/gui/dmStationUi.py @@ -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() diff --git a/src/python/dm/aps_beamline_tools/gui/experimentsTab.py b/src/python/dm/aps_beamline_tools/gui/experimentsTab.py index 51e820fd0338b31c12fc87c0b3b80010b2dfde38..505910827c070b7db537905567af5b1edf9e2730 100644 --- a/src/python/dm/aps_beamline_tools/gui/experimentsTab.py +++ b/src/python/dm/aps_beamline_tools/gui/experimentsTab.py @@ -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) diff --git a/src/python/dm/aps_beamline_tools/gui/initialTab.py b/src/python/dm/aps_beamline_tools/gui/initialTab.py index 170b2eb3df1dd50114795b5379cb2c6080dcf6fe..9fb8a7caf4a9d010adf577addfd4bf018b062de7 100644 --- a/src/python/dm/aps_beamline_tools/gui/initialTab.py +++ b/src/python/dm/aps_beamline_tools/gui/initialTab.py @@ -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) diff --git a/src/python/dm/aps_beamline_tools/gui/manageUsersTab.py b/src/python/dm/aps_beamline_tools/gui/manageUsersTab.py new file mode 100644 index 0000000000000000000000000000000000000000..fd470b818d7a68468c48e29c889c76d14ed3ebd4 --- /dev/null +++ b/src/python/dm/aps_beamline_tools/gui/manageUsersTab.py @@ -0,0 +1,15 @@ +#!/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 diff --git a/src/python/dm/aps_beamline_tools/gui/uploadsTab.py b/src/python/dm/aps_beamline_tools/gui/uploadsTab.py index 9f164e4112cf04d221105c0e6e630909db32c265..c1147a2be8e251cc8e09acbe1905022e8756dfb7 100644 --- a/src/python/dm/aps_beamline_tools/gui/uploadsTab.py +++ b/src/python/dm/aps_beamline_tools/gui/uploadsTab.py @@ -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) +