Newer
Older
from PyQt5.QtCore import pyqtSlot, Qt
from PyQt5.QtWidgets import QMessageBox, QMenu
from database import IntegrityError
from model.distribution import Distribution
from model.member import Member
from utils.editable_title_widget import EditableTitle
Jakub Štercl
committed
from utils.members_table import MembersTable
from utils.qtmodels.distributions_tree_model import DistributionTreeModel
Jakub Štercl
committed
from windows import groupedit
from PyQt5 import QtWidgets as Qtw
Jakub Štercl
committed
class GroupEdit(Qtw.QWidget, groupedit.Ui_Form):
def __init__(self, main_window, group, parent=None):
Jakub Štercl
committed
"""
Cotnroller of group edit window
:param main_window: main application window
:param group: (Group) group to be displayed
:param parent:
"""
self.setupUi(self)
self.main_window = main_window
self.membersTable = MembersTable(
num_of_buttons=2,
button_definitions=({'text':"", 'tooltip':self.tr("Přehled"), 'icon':":/icons/eye.svg"},
{'text':"", 'tooltip':self.tr("Smazat člena"), 'icon':":/icons/minus.svg"},),
data=group.members)
self.treeDistributions.setModel(DistributionTreeModel(group.distributions))
title = EditableTitle(group.name, self)
self.layoutName.replaceWidget(self.widgetTitle, title)
self.widgetTitle = title
self.btnExpandAll.clicked.connect(self.onExpandAllClicked)
self.expanded = False
Jakub Štercl
committed
# signals
self.btnDelete.clicked.connect(self.deleteGroup)
Jakub Štercl
committed
self.btnAddNew.clicked.connect(self.addNewMember)
self.editNewMemberName.returnPressed.connect(self.addNewMember)
Jakub Štercl
committed
self.btnDistribute.clicked.connect(self.distribute)
self.membersTable.btnClicked.connect(self.onTableMembersBtnClicked)
self.membersTable.itemDoubleClicked.connect(self.goToMemberOverview)
self.widgetTitle.textConfirmed.connect(self.changeGroupName)
self.treeDistributions.expanded.connect(self.expandChildren)
self.treeDistributions.customContextMenuRequested.connect(self.onContextMenuRequested)
def reloadData(self):
self.group = Global.db.getGroupById(self.group.id_)
self.membersTable.changeData(self.group.members)
Jakub Štercl
committed
self.updateMemberCount()
self.treeDistributions.setModel(DistributionTreeModel(self.group.distributions))
Jakub Štercl
committed
try:
self.group.rename(name)
except IntegrityError as e:
msg = QMessageBox(self)
msg.setIcon(QMessageBox.Critical)
msg.setText("Skupina s tímto jménem již existuje")
msg.setWindowTitle(self.tr("Nelze přejmenovat skupinu"))
msg.setStandardButtons(QMessageBox.Ok)
Jakub Štercl
committed
msg.exec()
self.widgetTitle.editMode()
Jakub Štercl
committed
@pyqtSlot()
def deleteGroup(self):
Jakub Štercl
committed
"""
Show confirmation prompt and delete group + go back after
"""
msg = Qtw.QMessageBox(self)
msg.setIcon(Qtw.QMessageBox.Question)
msg.setWindowTitle(self.tr("Opravdu?"))
msg.setText(self.tr("Opravdu chcete smazat skupinu " + self.group.name + "?"))
msg.setStandardButtons(Qtw.QMessageBox.Ok | Qtw.QMessageBox.Cancel)
if msg.exec() == Qtw.QMessageBox.Ok:
Jakub Štercl
committed
self.group.delete()
self.main_window.dataChanged()
self.main_window.goBack()
Jakub Štercl
committed
@pyqtSlot()
def addNewMember(self):
"""
Add member specified in self.editNewMemberName and self.editNewMemberSurname
"""
name = self.editNewMemberName.text()
try:
self.group.addMember(name)
except IntegrityError as e:
msg = QMessageBox(self)
msg.setIcon(QMessageBox.Critical)
msg.setText(self.tr("Tento člen již v této skupině existuje."))
msg.setWindowTitle(self.tr("Nelze přidat člena"))
msg.setStandardButtons(QMessageBox.Ok)
msg.exec()
finally:
# prepare for inserting another one
self.editNewMemberName.clear()
self.editNewMemberName.setFocus()
self.membersTable.changeData(self.group.members)
Jakub Štercl
committed
self.updateMemberCount()
def updateMemberCount(self):
"""
Updates member count label
"""
Jakub Štercl
committed
self.lblMemberCount.setText(str(self.group.member_count))
Jakub Štercl
committed
@pyqtSlot()
def distribute(self):
"""
Jakub Štercl
committed
"""
self.main_window.goToDistributionSetup(self.group)
@pyqtSlot(Member, int)
def onTableMembersBtnClicked(self, member, btn_nr):
"""
Slot for buttons from tableMembers
:param member:
:param btn_nr:
"""
if btn_nr == 0:
self.goToMemberOverview(member)
elif btn_nr == 1:
self.deleteMember(member)
def goToMemberOverview(self, member):
"""
go to member overview
:param member:
"""
self.main_window.goToMemberOverview(member)
def deleteMember(self, member):
"""
delete member
:param member:
"""
msg = Qtw.QMessageBox(self)
msg.setIcon(Qtw.QMessageBox.Question)
msg.setWindowTitle(self.tr("Opravdu?"))
msg.setText(self.tr("Opravdu chcete smazat člena " + member.name + "?"))
msg.setInformativeText(self.tr("Člen bude zároveň smazán i ze všech rozdělení, ve kterých byl."))
msg.setStandardButtons(Qtw.QMessageBox.Ok | Qtw.QMessageBox.Cancel)
if msg.exec() == Qtw.QMessageBox.Ok:
member.delete()
self.main_window.dataChanged()
self.reloadData()
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
def onExpandAllClicked(self):
if self.expanded:
self.treeDistributions.collapseAll()
self.btnExpandAll.setText(self.tr("Rozbalit vše"))
else:
self.treeDistributions.expandAll()
self.btnExpandAll.setText(self.tr("Sbalit vše"))
self.expanded = not self.expanded
def expandChildren(self, index):
"""
expand all children of given index in self.treeDistribution
:param index:
"""
for i in range(index.model().rowCount(index)):
child = index.model().index(i, 0, index)
self.treeDistributions.expand(child)
def onContextMenuRequested(self, point):
"""
construct context menu (only if clicked on distribution)
:param point:
"""
element = self.treeDistributions.model().data(self.treeDistributions.indexAt(point), Qt.UserRole)
if not isinstance(element, Distribution):
return
menu = QMenu(self.treeDistributions)
menu.addAction(self.tr("Upravit"), lambda: self.goToDistributionEdit(element))
menu.exec_(self.treeDistributions.mapToGlobal(point))
def goToDistributionEdit(self, distribution):
"""
go to distribution edit window
:param distribution:
"""
self.main_window.goToDistributionEdit(distribution, self.group)