class StudentWidget(QWidget): def __init__(self, student=None, eventTitle=None): super().__init__() # Loading our ui file and giving it some data self.UI = QUiLoader().load( pathJoin('attendanceTracker', 'assets', 'studentWidget.ui')) # Collecting variables from constructor self.student = student self.eventTitle = eventTitle # Setting initial values of our widget self.setWidgetInformation() # Setting some flags to make the window work self.editMode = False self.toggleEditable(False) # Binding some buttons self.UI.editButton.pressed.connect(self.toggleEditable) self.UI.clearButton.pressed.connect(self._clearInfo) self.UI.studentCheckinButton.pressed.connect(self.studentCheckin) def setWidgetInformation(self, student=None, event=None): # Changing our student or event title information if given self.student = student if student is not None else self.student self.event = event if event is not None else self.event # Setting to display student details first self.UI.studentWidgetTabContainer.setCurrentIndex(0) # Setting our student details, questions, and event panel self._displayStudentDetails() self._displayStudentQuestions() self._displayEventDetails() # Setting our edit flag to false. This fixes formatting errors self.toggleEditable(False) def _displayStudentDetails(self): # Checking if we have a student currently if self.student == None: self.UI.studentDetailsStack.setCurrentIndex(0) self.UI.studentNickname.setText('') return self.UI.studentDetailsStack.setCurrentIndex(1) # Setting the student's general information self.UI.studentNickname.setText(self.student.nick) self.UI.studentName.setText(self.student.name) self.UI.studentID.setText(self.student.ID) self.UI.eventsAttended.setText(str(self.student.getNumEvents())) self.UI.meetingsAttended.setText(str(self.student.getNumMeetings())) def _displayStudentQuestions(self): # Checking if we have a student if self.student == None: self.UI.studentQuestionsStack.setCurrentIndex(0) return self.UI.studentQuestionsStack.setCurrentIndex(1) # Questions panel if self.student.questions not in [None, {}]: # Setting our widget and clearing its contents studentDetailsWidget = self.UI.studentQuestions [ studentDetailsWidget.removeRow(0) for _ in range(studentDetailsWidget.rowCount()) ] # Iterating through our student's questions and adding them to our widget for currentRow, (label, field) in enumerate( self.student.questions.items()): labelWidget = QLineEdit(label) labelWidget.setAlignment(Qt.AlignRight | Qt.AlignVCenter) fieldWidget = QLineEdit(field) fieldWidget.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) studentDetailsWidget.addRow(labelWidget, fieldWidget) def _displayEventDetails(self): # Checking if we have a student if self.student == None: self.UI.eventDetailsStack.setCurrentIndex(0) self.UI.studentEventNoneLabel.setText( 'No student details found...') return # Checking if we have an event name elif self.event == None: self.UI.eventDetailsStack.setCurrentIndex(0) self.UI.studentEventNoneLabel.setText('No event details found...') return try: eventIndex = [ event.title.lower() for event in self.student.events ].index(self.event.title.lower()) # If we don't have an event in our student structure, then we need to ask to check in except ValueError: self.UI.eventDetailsStack.setCurrentIndex(1) self.UI.studentCheckinButton.setText( f'Check student into "{self.event.title}"') self.UI.studentWidgetTabContainer.setCurrentIndex(2) return self.UI.eventDetailsStack.setCurrentIndex(2) # Setting event details event = self.student.events[eventIndex] self.UI.eventTitle.setText(event.title) self.UI.eventType.setText(event.eventType) self.UI.eventCost.setText(str(event.cost)) self.UI.eventCost.setText(str(event.payment)) def getWidgetInformation(self): # Collecting information from each panel studentDict = { 'nick': self.UI.studentNickname.text(), 'name': self.UI.studentName.text(), 'ID': self.UI.studentID.text(), 'questions': self._getStudentQuestions(), 'events': self.student.events, } return Student(**studentDict) def _getStudentQuestions(self): layout = self.UI.studentQuestions questions = {} for row in range(0, layout.rowCount()): questions[layout.itemAt(row, QFormLayout.LabelRole)] = layout.itemAt( row, QFormLayout.FieldRole) return questions def _clearInfo(self): print('Clearing information!') self.student = None self.event = None self.setWidgetInformation(None, None) def setup_show(self): self.UI.create() self.UI.show() def studentCheckin(self): self.student.addEvent(self.event) self.setWidgetInformation() def toggleEditable(self, editable=None): # Letting user specify is editable, or toggle self.editMode = (not self.editMode if editable is None else editable) # Setting all QLineEdits to accept changes for field in self.UI.findChildren(QLineEdit): if type(field) is QLineEdit: field.setFrame(False) field.setClearButtonEnabled(self.editMode) elif type(field) is QPlainTextEdit: field.setFrameStyle(0) field.setFont(self.UI.studentName.font()) field.setReadOnly(not self.editMode) field.setStyleSheet( 'none;' if self.editMode else 'background-color: transparent;') defaultFont = self.UI.studentName.font() defaultFont.setPointSize(24) self.UI.studentNickname.setFont(defaultFont)