from copy import copy from timeit import default_timer as timer from PyQt5 import Qt, QtCore from PyQt5.QtCore import pyqtSlot from PyQt5.QtGui import QPainter from PyQt5.QtPrintSupport import QPrinter, QPrintDialog from PyQt5.QtWidgets import QLineEdit, QDialog, QWidget, QGridLayout, QTableView, QSizePolicy from model.distribution import Distribution from model.team import Team from utils.members_drag_drop_table import MembersDragDropTable from utils.members_table import MembersTable from utils.print_widget import PrintWidget from utils.qtmodels.members_table_model import MembersTableModel from windows import distribution_overview class DistributionOverview(Qt.QWidget, distribution_overview.Ui_Form): def __init__(self, main_window, teams, group, parent=None): super(DistributionOverview, self).__init__(parent) self.setupUi(self) self.main_window = main_window self.group = group self._editName = QLineEdit() self.teamTables = [] for i, team_name in enumerate(teams): table = MembersDragDropTable(i, teams[team_name], team_name, self) table.model.sourceModel().droppedMemberFrom.connect(self.removeMember) table.deleteClicked.connect(self.removeTeam) self.teamTables.append(table) self.gridTeams.addWidget(table, i // 2, i % 2) self.btnAddTeam.clicked.connect(self.addTeam) self.btnSave.clicked.connect(self.save) self.btnEditName.clicked.connect(self.editName) self._editName.textChanged.connect(self.onEditNameChanged) self.btnPrint.clicked.connect(self.printDistribution) @pyqtSlot() def editName(self): self.btnEditName.setText("OK") self.lblDistName.hide() if self.lblDistName.width() > 100: self._editName.setFixedWidth(self.lblDistName.width()) else: self._editName.setFixedWidth(100) self._editName.setFixedHeight(self.lblDistName.height()) self._editName.setText(self.lblDistName.text()) self.layoutName.replaceWidget(self.lblDistName, self._editName) self._editName.show() self.btnEditName.clicked.disconnect(self.editName) self.btnEditName.clicked.connect(self.changeName) @pyqtSlot() def changeName(self): self.btnEditName.setText("Edit") self._editName.hide() self.lblDistName.setText(self._editName.text()) self.layoutName.replaceWidget(self._editName, self.lblDistName) self.lblDistName.show() self.btnEditName.clicked.disconnect(self.changeName) self.btnEditName.clicked.connect(self.editName) @pyqtSlot() def onEditNameChanged(self): if 0 < len(self._editName.text()) < 25: self.btnEditName.setDisabled(False) else: self.btnEditName.setDisabled(True) @pyqtSlot() def addTeam(self): table_id = len(self.teamTables) table = MembersDragDropTable(table_id, [], "Tým " + str(table_id + 1), self) table.model.sourceModel().droppedMemberFrom.connect(self.removeMember) table.deleteClicked.connect(self.removeTeam) self.teamTables.append(table) self.gridTeams.addWidget(table, table_id // 2, table_id % 2) @pyqtSlot(int, int) def removeMember(self, member_id, table_id): self.teamTables[table_id].removeMember(member_id) @pyqtSlot(int) def removeTeam(self, table_id): if self.teamTables[table_id].isEmpty(): self.teamTables[table_id].hide() for i in range(len(self.teamTables) - 1, table_id, -1): self.gridTeams.replaceWidget(self.teamTables[i-1], self.teamTables[i]) self.teamTables[i].id_ -= 1 self.teamTables.pop(table_id) else: msg = Qt.QMessageBox(self) msg.setIcon(Qt.QMessageBox.Critical) msg.setWindowTitle("Chyba") msg.setText("Nelze smazat neprázdný tým!") msg.setStandardButtons(Qt.QMessageBox.Ok) msg.exec_() @pyqtSlot() def save(self): teams = [] for table in self.teamTables: team = Team(table.id_, table.name, table.getAllData()) teams.append(team) distribution = Distribution(self.lblDistName.text(), teams, self.group.id_) start = timer() distribution.saveToDb() print('total time:', timer() - start) self.main_window.reset() @pyqtSlot() def printDistribution(self): printer = QPrinter(QPrinter.HighResolution) dialog = QPrintDialog() if dialog.exec_() != QDialog.Accepted: return painter = QPainter() widget = PrintWidget(self.lblDistName.text(), self.teamTables) size = widget.sizeHint() painter.begin(printer) xscale = printer.pageRect().width() / size.width() yscale = printer.pageRect().height() / size.height() scale = min([xscale, yscale]) painter.translate(printer.paperRect().x() + printer.pageRect().width() / 2, printer.paperRect().y() + printer.pageRect().height() / 2) painter.scale(scale, scale) painter.translate(-size.width() / 2, -size.height() / 2) widget.render(painter) painter.end()