diff --git a/src/python/dm/aps_beamline_tools/gui/addExperiment.py b/src/python/dm/aps_beamline_tools/gui/addExperiment.py index 569212f79f2a48a19856bd6deba3278c8649c7b1..fdefba741881bb9e9ac16aa0e2f333ecefe9d11c 100644 --- a/src/python/dm/aps_beamline_tools/gui/addExperiment.py +++ b/src/python/dm/aps_beamline_tools/gui/addExperiment.py @@ -26,7 +26,7 @@ class AddExperimentTab(QWidget): grid.addWidget(lbl, 0, 0, 1, 7) backBtn = QPushButton('Back', self) - backBtn.clicked.connect(lambda: self.setTab(1)) + backBtn.clicked.connect(lambda: self.parent.setTab(1)) backBtn.setMinimumWidth(100) grid.addWidget(backBtn, 1, 5, 1, 2, Qt.AlignCenter) @@ -57,7 +57,7 @@ class AddExperimentTab(QWidget): grid.addItem(QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding), 6, 5) modBtn = QPushButton('Continue Manually', self) - modBtn.clicked.connect(lambda: self.setTab(5)) + modBtn.clicked.connect(lambda: self.parent.setTab(6)) modBtn.setFixedSize(150, 100) grid.addWidget(modBtn, 7, 5) @@ -85,9 +85,6 @@ class AddExperimentTab(QWidget): 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): @@ -98,20 +95,9 @@ class AddExperimentTab(QWidget): 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) + self.parent.generalSettings = {'description': proposal['title']} + self.parent.setTab(6) + def toggleDetails(self): if self.detailBtn.text() == 'Hide Details': @@ -130,9 +116,6 @@ class AddExperimentTab(QWidget): 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)) diff --git a/src/python/dm/aps_beamline_tools/gui/dmApiFactory.py b/src/python/dm/aps_beamline_tools/gui/dmApiFactory.py index ec637e159746e40bd49bf3fe892b0f94d56e685e..a585dd6bd1c0a13e814cdd8467e0ae653ee5f864 100755 --- a/src/python/dm/aps_beamline_tools/gui/dmApiFactory.py +++ b/src/python/dm/aps_beamline_tools/gui/dmApiFactory.py @@ -40,6 +40,11 @@ class DmApiFactory(Singleton): api = ApsBssApi() return api + def getApsUserDbApi(self): + from dm.aps_user_db.api.apsUserDbApi import ApsUserDbApi + api = ApsUserDbApi() + 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 edd38d4377bfec176ccf9763592bb8cfeb5faacf..71f0930cb827a54ab052e67ef192b7d8fd8fb79d 100755 --- a/src/python/dm/aps_beamline_tools/gui/dmStationUi.py +++ b/src/python/dm/aps_beamline_tools/gui/dmStationUi.py @@ -16,6 +16,7 @@ from uploadsTab import UploadsTab from initialTab import InitialTab from addExperiment import AddExperimentTab from manageUsersTab import ManageUsersTab +from genParamsTab import GenParamsTab class DmStationUi(QMainWindow): @@ -29,6 +30,9 @@ class DmStationUi(QMainWindow): # Variable to hold the user instances self.currentUsers = [] + + # Variable to hold the general settings + self.generalSettings = {} # Create a stacked layout to connect the various pages self.stackedLayout = QStackedLayout() @@ -41,6 +45,7 @@ class DmStationUi(QMainWindow): self.uploadsTab = UploadsTab(self.stationName, self) self.addExperimentTab = AddExperimentTab(self.stationName, self) self.manageUsersTab = ManageUsersTab(self.stationName, self) + self.genParamsTab = GenParamsTab(self.stationName, self) # Add the windows to the stack. self.stackedLayout.addWidget(self.initialTab.initialTabWidget) @@ -49,6 +54,7 @@ class DmStationUi(QMainWindow): self.stackedLayout.addWidget(self.uploadsTab.uploadsTabWidget) self.stackedLayout.addWidget(self.addExperimentTab.addExperimentTabWidget) self.stackedLayout.addWidget(self.manageUsersTab.manageUsersTabWidget) + self.stackedLayout.addWidget(self.genParamsTab.genParamsTabWidget) # Set a central widget to hold everything self.centralWidget = QWidget() @@ -74,31 +80,21 @@ class DmStationUi(QMainWindow): frameGeo.moveCenter(screenCenter) self.move(frameGeo.topLeft()) - # Calls for the table to be resized when a resize event is called - #def resizeEvent(self, event): - # windowSize = event.size().width() - # currentIndex = self.getTab() - # if currentIndex == 0: - # 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) - # elif currentIndex == 5: - # ManageUsersTab.resizeTable(self.manageUsersTab, windowSize) def currentChanged(self, index): newIndex = index if newIndex == 5: ManageUsersTab.updateUsers(self.manageUsersTab) + if newIndex == 6: + GenParamsTab.fillParams(self.genParamsTab) def getTab(self): return self.stackedLayout.currentIndex() + # Used to change between tabs + def setTab(self, tab): + self.stackedLayout.setCurrentIndex(tab) + if __name__ == "__main__": #try: diff --git a/src/python/dm/aps_beamline_tools/gui/experimentsTab.py b/src/python/dm/aps_beamline_tools/gui/experimentsTab.py index 5a82339a9911133cb4e511a1153f87b7e2a86acc..c4ca049e7d7fcfa9a62f9e200cbbbfaae50afe2f 100644 --- a/src/python/dm/aps_beamline_tools/gui/experimentsTab.py +++ b/src/python/dm/aps_beamline_tools/gui/experimentsTab.py @@ -4,6 +4,7 @@ from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWid 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 ExperimentsTab(QWidget): @@ -12,6 +13,7 @@ class ExperimentsTab(QWidget): self.stationName = stationName self.parent = parent self.experimentDsApi = DmApiFactory.getInstance().getExperimentDsApi() + self.userApi = DmApiFactory.getInstance().getUserDsApi() self.experimentsTabLayout() # Sets up the tab's layout, each block is a row @@ -25,7 +27,7 @@ class ExperimentsTab(QWidget): grid.addWidget(lbl, 0, 0, 1, 5) backBtn = QPushButton('Back', self) - backBtn.clicked.connect(lambda: self.setTab(0)) + backBtn.clicked.connect(lambda: self.parent.setTab(0)) backBtn.setMinimumWidth(100) grid.addWidget(backBtn, 1, 4, Qt.AlignCenter) @@ -37,13 +39,13 @@ class ExperimentsTab(QWidget): grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 0) addBtn = QPushButton('Add Experiment', self) - addBtn.clicked.connect(lambda: self.setTab(4)) + addBtn.clicked.connect(lambda: self.parent.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 = QPushButton('Use Selected', self) + modBtn.clicked.connect(self.setExperiment) modBtn.setMinimumWidth(150) modBtn.setFixedHeight(40) grid.addWidget(modBtn, 4, 3) @@ -59,9 +61,7 @@ class ExperimentsTab(QWidget): 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.setSelectionBehavior(QAbstractItemView.SelectRows) self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) self.tableWidget.setHorizontalHeaderLabels('Name;Description;Start Date;'.split(';')) self.tableWidget.cellDoubleClicked.connect(self.expandRow) @@ -70,6 +70,7 @@ class ExperimentsTab(QWidget): i = 0 for experiment in self.experimentList: rowName = QTableWidgetItem(experiment.get('name')) + rowName.setData(Qt.UserRole, experiment.get('id')) rowDescription = QTableWidgetItem(experiment.get('description', '')) rowStartDate = QTableWidgetItem(str(experiment.get('startDate', ''))) self.tableWidget.setItem(i, 0, rowName) @@ -81,21 +82,20 @@ class ExperimentsTab(QWidget): 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) + def setExperiment(self): + id = self.tableWidget.item(self.tableWidget.currentRow(), 0).data(Qt.UserRole).toInt()[0] + experiment = self.experimentDsApi.getExperimentById(id) + self.parent.generalSettings = experiment.data + userList = [self.userApi.getUserByUsername(user) for user in experiment['experimentUsernameList']] + self.parent.currentUsers = [UserInfo(x['badge'], x['firstName'], x['id'], x['lastName'], x['email']) for x in userList] + self.parent.setTab(6) + + + # PROBLEM reading self.dbPasswordFile in apsUserDbManager....I need this because I need to be able to get a user from a badge number + # Is it true/okay that this will only work for argonne users due to the badge methodology? diff --git a/src/python/dm/aps_beamline_tools/gui/genParamsTab.py b/src/python/dm/aps_beamline_tools/gui/genParamsTab.py new file mode 100644 index 0000000000000000000000000000000000000000..6381041e53875451d7fae8ee1835687cb9b2f914 --- /dev/null +++ b/src/python/dm/aps_beamline_tools/gui/genParamsTab.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python + +from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \ + QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView, QLineEdit, QVBoxLayout, QHBoxLayout +from PyQt4.QtCore import Qt +from dmApiFactory import DmApiFactory + + +# Define the experiments tab content: +class GenParamsTab(QWidget): + def __init__(self, stationName, parent, id=-1): + super(GenParamsTab, self).__init__(parent) + self.stationName = stationName + self.parent = parent + self.experimentDsApi = DmApiFactory.getInstance().getExperimentDsApi() + self.genParamsTabLayout() + + # Sets up the tab's layout, each block is a row + def genParamsTabLayout(self): + grid = QGridLayout() + + labelFont = QFont('Arial', 18, QFont.Bold) + lbl = QLabel(self.stationName + ' General Settings', self) + lbl.setAlignment(Qt.AlignCenter) + lbl.setFont(labelFont) + grid.addWidget(lbl, 0, 0, 1, 4) + + backBtn = QPushButton('Back', self) + backBtn.clicked.connect(lambda: self.parent.setTab(1)) + backBtn.setMinimumWidth(100) + grid.addWidget(backBtn, 1, 1, Qt.AlignRight) + + + self.nameField = QLineEdit() + self.nameField.setPlaceholderText('Name') + + self.startDateField = QLineEdit() + self.startDateField.setPlaceholderText('Start Date') + + self.endDateField = QLineEdit() + self.endDateField.setPlaceholderText('End Date') + + self.typeField = QLineEdit() + self.typeField.setPlaceholderText('Type') + + self.descField = QLineEdit() + self.descField.setPlaceholderText('Description') + + self.currentUserTable = QTableWidget() + + toUserBtn = QPushButton('Modify Users', self) + toUserBtn.clicked.connect(lambda: self.parent.setTab(5)) + toUserBtn.setMinimumWidth(100) + toUserBtn.setMaximumWidth(150) + + saveSettingsBtn = QPushButton('Save', self) + saveSettingsBtn.clicked.connect(self.updateParams) + saveSettingsBtn.setMinimumWidth(100) + saveSettingsBtn.setMaximumWidth(150) + + startDaqBtn = QPushButton('Start DAQ', self) + startDaqBtn.clicked.connect(lambda: self.parent.setTab(0)) + startDaqBtn.setMinimumWidth(150) + startDaqBtn.setMaximumWidth(200) + startDaqBtn.setFixedHeight(40) + + startUploadBtn = QPushButton('Start Upload', self) + startUploadBtn.clicked.connect(lambda: self.parent.setTab(0)) + startUploadBtn.setMinimumWidth(150) + startUploadBtn.setMaximumWidth(200) + startUploadBtn.setFixedHeight(40) + + hRow1 = QHBoxLayout() + hRow1.addWidget(self.startDateField) + hRow1.addWidget(self.endDateField) + + vColumn1 = QVBoxLayout() + vColumn1.addWidget(self.nameField) + vColumn1.addLayout(hRow1) + vColumn1.addWidget(self.typeField) + vColumn1.addWidget(self.descField) + grid.addLayout(vColumn1, 2, 0) + + vColumn2 = QVBoxLayout() + vColumn2.addWidget(self.currentUserTable) + + grid.addLayout(vColumn2, 2, 1) + + vColumn3 = QVBoxLayout() + vColumn3.addWidget(saveSettingsBtn) + vColumn3.setAlignment(saveSettingsBtn, Qt.AlignCenter) + vColumn3.addWidget(startDaqBtn) + vColumn3.setAlignment(startDaqBtn, Qt.AlignCenter) + grid.addLayout(vColumn3, 3, 0) + + vColumn4 = QVBoxLayout() + vColumn4.addWidget(toUserBtn) + vColumn4.setAlignment(toUserBtn, Qt.AlignCenter) + vColumn4.addWidget(startUploadBtn) + vColumn4.setAlignment(startUploadBtn, Qt.AlignCenter) + grid.addLayout(vColumn4, 3, 1) + + self.genParamsTabWidget = QWidget() + self.genParamsTabWidget.setLayout(grid) + + # Fills ui with any known information + def fillParams(self): + for key in self.parent.generalSettings: + if key == 'name': + self.nameField.setText(self.parent.generalSettings[key]) + elif key == 'date': + self.datefield.setText(self.parent.generalSettings[key]) + elif key == 'type': + self.typeField.setText(self.parent.generalSettings[key]) + elif key == 'description': + self.descField.setText(self.parent.generalSettings[key]) + + + # Set up the current users table + self.currentUserTable.setRowCount(len(self.parent.currentUsers)) + self.currentUserTable.setColumnCount(4) + self.currentUserTable.setSelectionBehavior(QAbstractItemView.SelectRows) + #for i, size in enumerate(self.colWidths): + # self.currentUserTable.horizontalHeader().resizeSection(i, size) + self.currentUserTable.setEditTriggers(QAbstractItemView.NoEditTriggers) + self.currentUserTable.setHorizontalHeaderLabels('Badge;First;Last;Email;'.split(';')) + self.currentUserTable.cellDoubleClicked.connect(lambda row, column: self.expandRow(row, column, self.currentUserTable)) + + i = 0 + for experimenter in self.parent.currentUsers: + rowBadge = QTableWidgetItem(experimenter.getBadge()) + rowBadge.setData(Qt.UserRole, experimenter.getID()) + rowFirstName = QTableWidgetItem(experimenter.getFirstName()) + rowLastName = QTableWidgetItem(experimenter.getLastName()) + try: + rowEmail = QTableWidgetItem(experimenter.getEmail()) + except KeyError: + rowEmail = QTableWidgetItem('') + self.currentUserTable.setItem(i, 0, rowBadge) + self.currentUserTable.setItem(i, 1, rowFirstName) + self.currentUserTable.setItem(i, 2, rowLastName) + self.currentUserTable.setItem(i, 3, rowEmail) + 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)) + rowEmail.setBackground(QColor.fromRgb(230, 241, 245)) + i += 1 + + self.currentUserTable.horizontalHeader().setStretchLastSection(True) + + # Updates ui with information supplied by signal + def updateParams(self): + self.parent.generalSettings['name'] = self.nameField.text() + self.parent.generalSettings['date'] = self.dateField.text() + self.parent.generalSettings['type'] = self.typeField.text() + self.parent.generalSettings['description'] = self.descField.text() diff --git a/src/python/dm/aps_beamline_tools/gui/initialTab.py b/src/python/dm/aps_beamline_tools/gui/initialTab.py index 9fb8a7caf4a9d010adf577addfd4bf018b062de7..4a667e8cef89d2f7c6a12a4d7268c0ca4fca3f05 100644 --- a/src/python/dm/aps_beamline_tools/gui/initialTab.py +++ b/src/python/dm/aps_beamline_tools/gui/initialTab.py @@ -26,17 +26,17 @@ class InitialTab(QWidget): 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)) + manageBtn.clicked.connect(lambda: self.parent.setTab(1)) 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)) + viewBtn.clicked.connect(lambda: self.parent.setTab(2)) 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)) + viewBtn.clicked.connect(lambda: self.parent.setTab(3)) grid.addWidget(viewBtn, 2, 5) grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum), 2, 6) @@ -45,5 +45,3 @@ class InitialTab(QWidget): self.initialTabWidget = QWidget() self.initialTabWidget.setLayout(grid) - def setTab(self, tab): - self.parent.stackedLayout.setCurrentIndex(tab) diff --git a/src/python/dm/aps_beamline_tools/gui/manageUsersTab.py b/src/python/dm/aps_beamline_tools/gui/manageUsersTab.py index d3ad7b8d19bb7e74af2ef5de010484897a5015a9..1030f57bf99a385e243567bb64ab55929749a296 100644 --- a/src/python/dm/aps_beamline_tools/gui/manageUsersTab.py +++ b/src/python/dm/aps_beamline_tools/gui/manageUsersTab.py @@ -1,7 +1,8 @@ #!/usr/bin/env python from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \ - QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView, QComboBox, QVBoxLayout + QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView, QComboBox, QVBoxLayout, QHBoxLayout, \ + QFontMetrics, QTableView, QStandardItemModel, QStandardItem from PyQt4.QtCore import Qt from dmApiFactory import DmApiFactory from objects.userInfo import UserInfo @@ -25,53 +26,42 @@ class ManageUsersTab(QWidget): lbl = QLabel(self.stationName + ' User Management', self) lbl.setAlignment(Qt.AlignCenter) lbl.setFont(labelFont) - grid.addWidget(lbl, 0, 0, 1, 4) + grid.addWidget(lbl, 0, 0, 1, 3) backBtn = QPushButton('Back', self) - backBtn.clicked.connect(lambda: self.setTab(1)) + backBtn.clicked.connect(lambda: self.parent.setTab(6)) backBtn.setMinimumWidth(100) grid.addWidget(backBtn, 1, 2, Qt.AlignRight) - #grid.addItem(QSpacerItem(750, 40, QSizePolicy.Maximum, QSizePolicy.Minimum), 2, 0) - #grid.addItem(QSpacerItem(750, 40, QSizePolicy.Maximum, QSizePolicy.Minimum), 2, 2, 1, 5) + self.currentUserTable = QTableWidget() + self.availableUserTable = QTableView() + self.availableUserTableModel = QStandardItemModel() + self.availableUserTable.setModel(self.availableUserTableModel) + moveUserBtn = QPushButton('<->', self) + moveUserBtn.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) currentLabel = QLabel('Current Users', self) currentLabel.setAlignment(Qt.AlignCenter) - #grid.addWidget(currentLabel, 3, 0) + currentLabel.setFixedHeight(30) self.userDropdown = QComboBox(self) - self.userDropdown.setMaximumWidth(400) + self.userDropdown.currentIndexChanged.connect(self.updateUsers) + self.userDropdown.setMaximumWidth(250) self.updateDropdown() - self.currentUserTable = QTableWidget() - self.availableUserTable = QTableWidget() - moveUserBtn = QPushButton('<->', self) - moveUserBtn.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) - #moveUserBtn.clicked.connect(self.moveUsers) - #grid.addWidget(moveUserBtn, 4, 1) - #grid.addWidget(self.availableUserTable, 4, 2, 1, 2) - #grid.addItem(QSpacerItem(20, 1000, QSizePolicy.Minimum, QSizePolicy.Expanding), 4, 3, 1, 1) - - startDaqBtn = QPushButton('Start DAQ', self) - startDaqBtn.clicked.connect(lambda: self.setTab(0)) - startDaqBtn.setMinimumWidth(150) - startDaqBtn.setMaximumWidth(200) - startDaqBtn.setFixedHeight(40) - #grid.addWidget(startDaqBtn, 5, 0, Qt.AlignCenter) - - startUploadBtn = QPushButton('Start Upload', self) - startUploadBtn.clicked.connect(lambda: self.setTab(0)) - startUploadBtn.setMinimumWidth(150) - startUploadBtn.setMaximumWidth(200) - startUploadBtn.setFixedHeight(40) - #grid.addWidget(startUploadBtn, 5, 2, 1, 5, Qt.AlignCenter) + saveUsersBtn = QPushButton('Save and Return', self) + saveUsersBtn.clicked.connect(lambda: self.parent.setTab(0)) + saveUsersBtn.setFixedHeight(40) grid.addItem(QSpacerItem(20, 10, QSizePolicy.Expanding, QSizePolicy.Minimum), 6, 0) + hRow1 = QHBoxLayout() + hRow1.addWidget(self.currentUserTable) + hRow1.addWidget(moveUserBtn) + hRow1.addWidget(self.availableUserTable) + vColumn1 = QVBoxLayout() vColumn1.addWidget(currentLabel) vColumn1.addWidget(self.currentUserTable) - vColumn1.addWidget(startDaqBtn) - vColumn1.setAlignment(startDaqBtn, Qt.AlignCenter) grid.addLayout(vColumn1, 2, 0) vColumn2 = QVBoxLayout() @@ -81,10 +71,12 @@ class ManageUsersTab(QWidget): vColumn3 = QVBoxLayout() vColumn3.addWidget(self.userDropdown, Qt.AlignCenter) vColumn3.addWidget(self.availableUserTable) - vColumn3.addWidget(startUploadBtn) - vColumn3.setAlignment(startUploadBtn, Qt.AlignCenter) grid.addLayout(vColumn3, 2, 2) + + + grid.addWidget(saveUsersBtn, 4, 0, 1, 3, Qt.AlignCenter) + self.manageUsersTabWidget = QWidget() self.manageUsersTabWidget.setLayout(grid) @@ -93,28 +85,10 @@ class ManageUsersTab(QWidget): self.proposalList = self.experimentPropApi.listBeamlineProposals() self.userDropdown.addItem('All Users', -1) for proposal in self.proposalList: - self.userDropdown.addItem(proposal['title'], proposal['id']) - - # Resizes the horizontal headers to fit the screen - def resizeTable(self, width): - totalWidths = sum(self.colWidths) - #if self.availableUserTable.verticalScrollBar().isVisible(): - # newSize = [column * (width - 490) / totalWidths for column in self.colWidths] - #else: - # newSize = [column * (width - 470) / totalWidths for column in self.colWidths] - #for i, column in enumerate(newSize): - # self.availableUserTable.horizontalHeader().resizeSection(i, column) - #print 4 - #if self.currentUserTable.verticalScrollBar().isVisible(): - # newSize = [column * (width - 470) / totalWidths for column in self.colWidths] - #else: - # newSize = [column * (width - 489) / totalWidths for column in self.colWidths] - #for i, column in enumerate(newSize): - # self.currentUserTable.horizontalHeader().resizeSection(i, column) - - # Used to change between tabs - def setTab(self, tab): - self.parent.stackedLayout.setCurrentIndex(tab) + fm = QFontMetrics(QFont("times", 12)) + elidedText = fm.elidedText(proposal['title'], Qt.ElideRight, 250) + self.userDropdown.addItem(elidedText, proposal['id']) + # Expands the given row to fit the size of its content def expandRow(self, row, column, table): @@ -126,11 +100,11 @@ class ManageUsersTab(QWidget): id = self.userDropdown.itemData(self.userDropdown.currentIndex(), Qt.UserRole) if id != -1: proposal = self.experimentPropApi.getBeamlineProposal(id) - self.availableUserTable.setRowCount(min(len(proposal['experimenters'] + 1, 101))) + self.availableUserTable.model().setRowCount(len(proposal['experimenters'])) allUsers = proposal['experimenters'] else: allUsers = self.userApi.getUsers() - self.availableUserTable.setRowCount(len(allUsers)) + self.availableUserTable.model().setRowCount(len(allUsers)) objectAllUsers = [] for x in allUsers: try: @@ -140,34 +114,32 @@ class ManageUsersTab(QWidget): continue else: objectAllUsers.append(UserInfo(x['badge'], x['firstName'], x['id'], x['lastName'], '')) - self.availableUserTable.setColumnCount(4) - self.colWidths = (70, 70, 70, 125) - for i, size in enumerate(self.colWidths): - self.availableUserTable.horizontalHeader().resizeSection(i, size) + self.availableUserTable.model().setColumnCount(4) + self.availableUserTable.horizontalHeader().setStretchLastSection(True) + self.availableUserTable.setSelectionBehavior(QAbstractItemView.SelectRows) self.availableUserTable.setEditTriggers(QAbstractItemView.NoEditTriggers) - self.availableUserTable.setHorizontalHeaderLabels('Badge;First;Last;Email;'.split(';')) - self.availableUserTable.cellDoubleClicked.connect(lambda row, column: self.expandRow(row, column, self.availableUserTable)) + self.availableUserTable.model().setHorizontalHeaderLabels('Badge;First;Last;Email;'.split(';')) + self.availableUserTable.doubleClicked.connect(lambda row, column: self.expandRow(row, column, self.availableUserTable)) i = 0 currentIDs = [x.getID() for x in self.parent.currentUsers] for experimenter in objectAllUsers: if experimenter.getID() in currentIDs: - self.availableUserTable.removeRow(i) + self.availableUserTable.model().removeRow(i) continue - - rowBadge = QTableWidgetItem(experimenter.getBadge()) + rowBadge = QStandardItem(experimenter.getBadge()) if rowBadge is None: continue rowBadge.setData(Qt.UserRole, experimenter.getID()) - rowFirstName = QTableWidgetItem(experimenter.getFirstName()) - rowLastName = QTableWidgetItem(experimenter.getLastName()) - rowEmail = QTableWidgetItem(experimenter.getEmail()) + rowFirstName = QStandardItem(experimenter.getFirstName()) + rowLastName = QStandardItem(experimenter.getLastName()) + rowEmail = QStandardItem(experimenter.getEmail()) if rowEmail is None: - rowEmail = QTableWidgetItem('') - self.availableUserTable.setItem(i, 0, rowBadge) - self.availableUserTable.setItem(i, 1, rowFirstName) - self.availableUserTable.setItem(i, 2, rowLastName) - self.availableUserTable.setItem(i, 3, rowEmail) + rowEmail = QStandardItem('') + self.availableUserTable.model().setItem(i, 0, rowBadge) + self.availableUserTable.model().setItem(i, 1, rowFirstName) + self.availableUserTable.model().setItem(i, 2, rowLastName) + self.availableUserTable.model().setItem(i, 3, rowEmail) if (i % 2) == 0: rowBadge.setBackground(QColor.fromRgb(230, 241, 245)) rowFirstName.setBackground(QColor.fromRgb(230, 241, 245)) @@ -178,8 +150,7 @@ class ManageUsersTab(QWidget): # Set up the current users table self.currentUserTable.setRowCount(len(self.parent.currentUsers)) self.currentUserTable.setColumnCount(4) - for i, size in enumerate(self.colWidths): - self.currentUserTable.horizontalHeader().resizeSection(i, size) + self.currentUserTable.setSelectionBehavior(QAbstractItemView.SelectRows) self.currentUserTable.setEditTriggers(QAbstractItemView.NoEditTriggers) self.currentUserTable.setHorizontalHeaderLabels('Badge;First;Last;Email;'.split(';')) self.currentUserTable.cellDoubleClicked.connect(lambda row, column: self.expandRow(row, column, self.currentUserTable)) @@ -206,28 +177,24 @@ class ManageUsersTab(QWidget): i += 1 self.currentUserTable.horizontalHeader().setStretchLastSection(True) - self.availableUserTable.horizontalHeader().setStretchLastSection(True) - # Moves users from one table to the other - #def moveUsers(self): - #for selection in self.availableUserTable.selectedItems(): - # userID = self.availableUserTable.item(selection.row(), 0).data(Qt.UserRole) + def moveUsers(self): + for selection in self.availableUserTable.model().selectedItems(): + userID = self.availableUserTable.model().item(selection.row(), 0).data(Qt.UserRole) - #selectedAvailable = [self.availableUserTable.item(x.row(), 0).data(Qt.UserRole) for x in self.availableUserTable.selectedItems()] - #currentAvailable = [self.currentUserTable.item(x.row(), 0).data(Qt.UserRole) for x in self.currentUserTable.selectedItems()] + selectedAvailable = [self.availableUserTable.model().item(x.row(), 0).data(Qt.UserRole) for x in self.availableUserTable.model().selectedItems()] + currentAvailable = [self.currentUserTable.item(x.row(), 0).data(Qt.UserRole) for x in self.currentUserTable.selectedItems()] - #for id in selectedAvailable: - # SHOULD I GET THE USER FROM THE ALLUSERS LIST, IF SO HOW SHOULD I PARSE BY ID? - # self.parent.currentUsers.append(self.userApi.getUserById(id)) + for id in selectedAvailable: + self.parent.currentUsers.append(self.userApi.getUserById(id)) - # for id in currentAvailable: - # AGAIN A PARSING PROBLEM, SHOULD I INSTEAD HAVE THE LIST ONLY BE OF IDs? - # THIS WOULD HANDLE PARSING BUT WOULD CAUSE THE NEED FOR DYNAMIC API CALLS.(Probably the best way to do this) - # self.parent.currentUsers.remove( + for id in currentAvailable: + self.parent.currentUsers.remove() + #self.parent.currentUsers.remove( #selectedAvailable = [x.row(0).text() for x in self.availableUserTable.selectedItems()] #currentAvailable = self.currentUserTable.item(self.currentUserTable.currentRow(), 0) - - + def addFilter(self): + self.updateUsers diff --git a/src/python/dm/aps_beamline_tools/gui/uploadsTab.py b/src/python/dm/aps_beamline_tools/gui/uploadsTab.py index b288356a76ad2b3ded65143cf9f6ef14f318fe4a..149d4f526cde6f3213cd7731226f90ec41c10624 100644 --- a/src/python/dm/aps_beamline_tools/gui/uploadsTab.py +++ b/src/python/dm/aps_beamline_tools/gui/uploadsTab.py @@ -25,7 +25,7 @@ class UploadsTab(QWidget): # lambda allows the passing of variables backBtn = QPushButton('Back', self) - backBtn.clicked.connect(lambda: self.setTab(0)) + backBtn.clicked.connect(lambda: self.parent.setTab(0)) backBtn.setMaximumWidth(100) grid.addWidget(backBtn, 1, 4) @@ -37,12 +37,12 @@ class UploadsTab(QWidget): grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 0) addBtn = QPushButton('Start New', self) - addBtn.clicked.connect(lambda: self.setTab(0)) + addBtn.clicked.connect(lambda: self.parent.setTab(0)) 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.clicked.connect(lambda: self.parent.setTab(0)) modBtn.setMinimumWidth(150) grid.addWidget(modBtn, 4, 3) grid.addItem(QSpacerItem(40, 20, QSizePolicy.Expanding), 4, 4) @@ -56,9 +56,6 @@ class UploadsTab(QWidget): self.uploadList = self.experimentDaqApi.listUploads() self.tableWidget.setRowCount(len(self.uploadList)) self.tableWidget.setColumnCount(3) - 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) @@ -78,19 +75,8 @@ class UploadsTab(QWidget): rowNumFiles.setBackground(QColor.fromRgb(230, 241, 245)) i += 1 - def setTab(self, tab): - self.parent.stackedLayout.setCurrentIndex(tab) 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)