from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QLineEdit from utils.members_table import MembersTable from utils.qtmodels.distributions_tree_model import DistributionTreeModel from windows import groupedit from PyQt5 import QtWidgets as Qt class GroupEdit(Qt.QWidget, groupedit.Ui_Form): def __init__(self, main_window, group, parent=None): """ Cotnroller of group edit window :param main_window: main application window :param group: (Group) group to be displayed :param parent: """ super(GroupEdit, self).__init__(parent) self.setupUi(self) self.main_window = main_window self.setGroup(group) self._editName = QLineEdit() # signals self.btnDelete.clicked.connect(self.deleteGroup) self.btnChangeName.clicked.connect(self.editName) self.btnAddNew.clicked.connect(self.addNewMember) self.editNewMemberName.returnPressed.connect(self.editNewMemberSurname.setFocus) self.editNewMemberSurname.returnPressed.connect(self.addNewMember) self.btnDistribute.clicked.connect(self.distribute) def setGroup(self, group): """ Set group this controller (and window) displays :param group: """ self.group = group self.membersTable = MembersTable(num_of_buttons=2, button_titles=("View", "-",), data=group.members) self.updateMemberCount() self.layoutMembers.addWidget(self.membersTable) self.lblName.setText(group.name) self.treeDistributions.setModel(DistributionTreeModel(group.distributions)) @pyqtSlot() def editName(self): """ display edit line instead of group name (to enable editing of it) """ self.btnChangeName.setText("OK") # hide label self.lblName.hide() # make line edit the same size if self.lblName.width() > 100: self._editName.setFixedWidth(self.lblName.width()) else: self._editName.setFixedWidth(100) self._editName.setFixedHeight(self.lblName.height()) # fill it with current name self._editName.setText(self.lblName.text()) # swap widgets in layout self.layoutName.replaceWidget(self.lblName, self._editName) self._editName.show() # change signals of button self.btnChangeName.clicked.disconnect(self.editName) self.btnChangeName.clicked.connect(self._changeName) @pyqtSlot() def _changeName(self): """ Change group name to current value in edit line box (self._editName) """ try: self.group.changeName(self._editName.text()) except ValueError as e: msg = Qt.QMessageBox(self) msg.setIcon(Qt.QMessageBox.Critical) msg.setText(e.args[0]) msg.setWindowTitle("Nelze pĆejmenovat skupinu") msg.setStandardButtons(Qt.QMessageBox.Ok) msg.exec() self._editName.setFocus() return self.btnChangeName.setText("Edit") # hide line edit self._editName.hide() #show updated label self.layoutName.replaceWidget(self._editName, self.lblName) self.lblName.setText(self._editName.text()) self.lblName.show() # change signals of button self.btnChangeName.clicked.disconnect(self._changeName) self.btnChangeName.clicked.connect(self.editName) self.main_window.dataChanged() @pyqtSlot() def deleteGroup(self): """ Show confirmation prompt and delete group + go back after """ msg = Qt.QMessageBox(self) msg.setIcon(Qt.QMessageBox.Question) msg.setWindowTitle("Opravdu?") msg.setText("Opravdu chcete smazat skupinu " + self.group.name + "?") msg.setStandardButtons(Qt.QMessageBox.Ok | Qt.QMessageBox.Cancel) if msg.exec() == Qt.QMessageBox.Ok: self.group.delete() self.main_window.dataChanged() self.main_window.goBack() @pyqtSlot() def addNewMember(self): """ Add member specified in self.editNewMemberName and self.editNewMemberSurname """ name = self.editNewMemberName.text() surname = self.editNewMemberSurname.text() self.group.addMember(name, surname) self.membersTable.changeData(self.group.members) # prepare for inserting another one self.editNewMemberName.clear() self.editNewMemberSurname.clear() self.editNewMemberName.setFocus() self.updateMemberCount() def updateMemberCount(self): """ Updates member count label """ self.lblMemberCount.setText(str(self.group.member_count)) @pyqtSlot() def distribute(self): """ go to distribution for this group """ self.main_window.goToDistributionSetup(self.group)