Skip to content
Snippets Groups Projects
Commit 287825dd authored by Collin A. Schmitz's avatar Collin A. Schmitz
Browse files

Layout and Table changes to simplify tables and grid layout.

parent ae60da81
No related branches found
No related tags found
No related merge requests found
......@@ -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 AddExperimentTab(QWidget):
......@@ -95,21 +96,22 @@ class AddExperimentTab(QWidget):
def startProposal(self):
id = self.tableWidget.item(self.tableWidget.currentRow(), 0).data(Qt.UserRole)
proposal = self.experimentPropApi.getBeamlineProposal(id)
self.parent.currentUsers = proposal
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 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':
......@@ -134,6 +136,7 @@ class AddExperimentTab(QWidget):
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']:
......
......@@ -61,6 +61,7 @@ class DaqsTab(QWidget):
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.tableWidget.setHorizontalHeaderLabels('ID;Data Directory;Number of Files;'.split(';'))
self.tableWidget.cellDoubleClicked.connect(self.expandRow)
self.tableWidget.horizontalHeader().setStretchLastSection(True)
i = 0
for daq in self.daqList:
......@@ -83,12 +84,12 @@ class DaqsTab(QWidget):
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)
#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)
......@@ -28,7 +28,7 @@ class DmStationUi(QMainWindow):
self.setGeometry(0, 0, 800, 400)
# Variable to hold the user instances
self.currentUsers = {} ####HOW DO I MAKE THIS AN INSTANCE OF A PROPOSAL WITH NO DATA
self.currentUsers = []
# Create a stacked layout to connect the various pages
self.stackedLayout = QStackedLayout()
......@@ -75,35 +75,26 @@ class DmStationUi(QMainWindow):
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 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 == 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())
elif newIndex == 4:
AddExperimentTab.resizeTable(self.addExperimentTab, self.geometry().width())
elif newIndex == 5:
if newIndex == 5:
ManageUsersTab.updateUsers(self.manageUsersTab)
ManageUsersTab.resizeTable(self.manageUsersTab, self.geometry().width())
def getTab(self):
return self.stackedLayout.currentIndex()
......
......@@ -65,6 +65,7 @@ class ExperimentsTab(QWidget):
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:
......@@ -89,12 +90,12 @@ class ExperimentsTab(QWidget):
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 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)
#!/usr/bin/env python
from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \
QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView, QComboBox
QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView, QComboBox, QVBoxLayout
from PyQt4.QtCore import Qt
from dmApiFactory import DmApiFactory
from objects.userInfo import UserInfo
# Define the experiments tab content:
class ManageUsersTab(QWidget):
......@@ -23,53 +25,70 @@ class ManageUsersTab(QWidget):
lbl = QLabel(self.stationName + ' User Management', self)
lbl.setAlignment(Qt.AlignCenter)
lbl.setFont(labelFont)
grid.addWidget(lbl, 0, 0, 1, 7)
grid.addWidget(lbl, 0, 0, 1, 4)
backBtn = QPushButton('Back', self)
backBtn.clicked.connect(lambda: self.setTab(1))
backBtn.setMinimumWidth(100)
grid.addWidget(backBtn, 1, 5, 1, 2, Qt.AlignCenter)
grid.addWidget(backBtn, 1, 2, Qt.AlignRight)
grid.addItem(QSpacerItem(750, 40, QSizePolicy.Expanding, QSizePolicy.Minimum), 2, 0)
grid.addItem(QSpacerItem(950, 40, QSizePolicy.Expanding, QSizePolicy.Minimum), 2, 2, 1, 5)
#grid.addItem(QSpacerItem(750, 40, QSizePolicy.Maximum, QSizePolicy.Minimum), 2, 0)
#grid.addItem(QSpacerItem(750, 40, QSizePolicy.Maximum, QSizePolicy.Minimum), 2, 2, 1, 5)
currentLabel = QLabel('Current Users', self)
currentLabel.setAlignment(Qt.AlignCenter)
grid.addWidget(currentLabel, 3, 0)
#grid.addWidget(currentLabel, 3, 0)
self.userDropdown = QComboBox(self)
self.userDropdown.setMaximumWidth(400)
self.updateDropdown()
grid.addWidget(self.userDropdown, 3, 2, 1, 5, Qt.AlignCenter)
self.currentUserTable = QTableWidget()
self.availableUserTable = QTableWidget()
grid.addWidget(self.currentUserTable, 4, 0, 1, 1)
moveUserBtn = QPushButton('<->', self)
moveUserBtn.setFixedSize(40, 40)
moveUserBtn.clicked.connect(self.moveUsers)
grid.addWidget(moveUserBtn, 4, 1)
grid.addWidget(self.availableUserTable, 4, 2, 1, 5)
grid.addItem(QSpacerItem(20, 1000, QSizePolicy.Minimum, QSizePolicy.Expanding), 4, 3, 1, 1)
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)
#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)
#grid.addWidget(startUploadBtn, 5, 2, 1, 5, Qt.AlignCenter)
grid.addItem(QSpacerItem(20, 10, QSizePolicy.Expanding, QSizePolicy.Minimum), 6, 0)
vColumn1 = QVBoxLayout()
vColumn1.addWidget(currentLabel)
vColumn1.addWidget(self.currentUserTable)
vColumn1.addWidget(startDaqBtn)
vColumn1.setAlignment(startDaqBtn, Qt.AlignCenter)
grid.addLayout(vColumn1, 2, 0)
vColumn2 = QVBoxLayout()
vColumn2.addWidget(moveUserBtn)
grid.addLayout(vColumn2, 2, 1)
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)
self.manageUsersTabWidget = QWidget()
self.manageUsersTabWidget.setLayout(grid)
# Populates the dropdown with available proposals
def updateDropdown(self):
self.proposalList = self.experimentPropApi.listBeamlineProposals()
self.userDropdown.addItem('All Users', -1)
......@@ -79,19 +98,19 @@ class ManageUsersTab(QWidget):
# 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 - 480) / totalWidths for column in self.colWidths]
for i, column in enumerate(newSize):
self.availableUserTable.horizontalHeader().resizeSection(i, column)
if self.currentUserTable.verticalScrollBar().isVisible():
newSize = [column * (width - 490) / totalWidths for column in self.colWidths]
else:
newSize = [column * (width - 480) / totalWidths for column in self.colWidths]
for i, column in enumerate(newSize):
self.currentUserTable.horizontalHeader().resizeSection(i, column)
#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):
......@@ -101,39 +120,49 @@ class ManageUsersTab(QWidget):
def expandRow(self, row, column, table):
table.resizeRowToContents(row)
# Populates both user tables with their corresponding users
def updateUsers(self):
# Setup the available users table
id = self.userDropdown.itemData(self.userDropdown.currentIndex(), Qt.UserRole)
if id != -1:
proposal = self.experimentPropApi.getBeamlineProposal(id)
self.availableUserTable.setRowCount(len(proposal['experimenters']))
self.availableUserTable.setRowCount(min(len(proposal['experimenters'] + 1, 101)))
allUsers = proposal['experimenters']
else:
allUsers = self.userApi.getUsers()
self.availableUserTable.setRowCount(len(allUsers))
objectAllUsers = []
for x in allUsers:
try:
objectAllUsers.append(UserInfo(x['badge'], x['firstName'], x['id'], x['lastName'], x['email']))
except KeyError, key:
if key.message == 'badge':
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.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.availableUserTable.setHorizontalHeaderLabels('Badge;First Name;Last Name;Email;'.split(';'))
self.availableUserTable.setHorizontalHeaderLabels('Badge;First;Last;Email;'.split(';'))
self.availableUserTable.cellDoubleClicked.connect(lambda row, column: self.expandRow(row, column, self.availableUserTable))
i = 0
currentIDs = [x['id'] for x in self.parent.currentUsers['experimenters']]
for experimenter in allUsers:
if experimenter['id'] in currentIDs:
currentIDs = [x.getID() for x in self.parent.currentUsers]
for experimenter in objectAllUsers:
if experimenter.getID() in currentIDs:
self.availableUserTable.removeRow(i)
continue
try:
rowBadge = QTableWidgetItem(experimenter['badge'])
except KeyError:
rowBadge = QTableWidgetItem(experimenter.getBadge())
if rowBadge is None:
continue
rowFirstName = QTableWidgetItem(experimenter['firstName'])
rowLastName = QTableWidgetItem(experimenter['lastName'])
try:
rowEmail = QTableWidgetItem(experimenter['email'])
except KeyError:
rowBadge.setData(Qt.UserRole, experimenter.getID())
rowFirstName = QTableWidgetItem(experimenter.getFirstName())
rowLastName = QTableWidgetItem(experimenter.getLastName())
rowEmail = QTableWidgetItem(experimenter.getEmail())
if rowEmail is None:
rowEmail = QTableWidgetItem('')
self.availableUserTable.setItem(i, 0, rowBadge)
self.availableUserTable.setItem(i, 1, rowFirstName)
......@@ -147,21 +176,22 @@ class ManageUsersTab(QWidget):
i += 1
# Set up the current users table
self.currentUserTable.setRowCount(len(self.parent.currentUsers['experimenters']))
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.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.currentUserTable.setHorizontalHeaderLabels('Badge;First Name;Last Name;Email;'.split(';'))
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['experimenters']:
rowBadge = QTableWidgetItem(experimenter['badge'])
rowFirstName = QTableWidgetItem(experimenter['firstName'])
rowLastName = QTableWidgetItem(experimenter['lastName'])
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['email'])
rowEmail = QTableWidgetItem(experimenter.getEmail())
except KeyError:
rowEmail = QTableWidgetItem('')
self.currentUserTable.setItem(i, 0, rowBadge)
......@@ -175,8 +205,29 @@ class ManageUsersTab(QWidget):
rowEmail.setBackground(QColor.fromRgb(230, 241, 245))
i += 1
def moveUsers(self):
temp = self.availableUserTable.selectedItems()[0].row()
temp2 = self.availableUserTable.item(temp, 0)
selectedAvailable = [x.row(0).text() for x in self.availableUserTable.selectedItems()]
currentAvailable = self.currentUserTable.item(self.currentUserTable.currentRow(), 0)
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)
#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()]
#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 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(
#selectedAvailable = [x.row(0).text() for x in self.availableUserTable.selectedItems()]
#currentAvailable = self.currentUserTable.item(self.currentUserTable.currentRow(), 0)
#!/usr/bin/env python
# User Object Class
class UserInfo:
def __init__(self, badge, firstName, id, lastName, email=None, lastUpdate=None, username=None, isLocalUser=None):
self.badge = badge
if email == None:
self.email = ''
else:
self.email = email
self.firstName = firstName
self.id = id
self.isLocalUser = isLocalUser
self.lastName = lastName
self.lastUpdate = lastUpdate
self.username = username
def getBadge(self):
return self.badge
def getEmail(self):
return self.email
def getFirstName(self):
return self.firstName
def getID(self):
return self.id
def getIsLocalUser(self):
return self.isLocalUser
def getLastName(self):
return self.lastName
def getLastUpdate(self):
return self.lastUpdate
def getUsername(self):
return self.username
......@@ -62,6 +62,7 @@ class UploadsTab(QWidget):
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.tableWidget.setHorizontalHeaderLabels('ID;Data Directory;Number of Files;'.split(';'))
self.tableWidget.cellDoubleClicked.connect(self.expandRow)
self.tableWidget.horizontalHeader().setStretchLastSection(True)
i = 0
for upload in self.uploadList:
......@@ -84,12 +85,12 @@ class UploadsTab(QWidget):
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)
#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)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment