From b4e80f1e16b0561b2aab7cd69d13b054a6f3a69c Mon Sep 17 00:00:00 2001 From: Kukuksumusu <stercjak@fit.cvut.cz> Date: Fri, 17 Mar 2017 22:13:07 +0100 Subject: [PATCH] Added groupedit --- .../controllers/group_edit_controller.py | 8 +- .../controllers/groups_overview_controller.py | 82 ++++++++++++----- .../controllers/mainwindow_controller.py | 18 ++-- Implementace/main.py | 15 ++-- .../model/qtmodels/PersonTableModel.py | 33 ------- ...roupTableModel.py => group_table_model.py} | 7 +- .../model/qtmodels/person_table_model.py | 57 ++++++++++++ Implementace/windows/groupsoverview.py | 13 ++- Implementace/windows/qt/groupoverview.ui | 89 ++++++++++++------- Implementace/windows/qt/qt.pro | 3 +- Implementace/windows/qt/qt.pro.user | 2 +- 11 files changed, 211 insertions(+), 116 deletions(-) delete mode 100644 Implementace/model/qtmodels/PersonTableModel.py rename Implementace/model/qtmodels/{GroupTableModel.py => group_table_model.py} (88%) create mode 100644 Implementace/model/qtmodels/person_table_model.py diff --git a/Implementace/controllers/group_edit_controller.py b/Implementace/controllers/group_edit_controller.py index 26e3b32..9cb33e4 100644 --- a/Implementace/controllers/group_edit_controller.py +++ b/Implementace/controllers/group_edit_controller.py @@ -1,8 +1,8 @@ from windows import groupedit from PyQt5 import QtWidgets as Qt -class GroupEditWindow(Qt.QMdiSubWindow, groupedit.Ui_Dialog): - def __init__(self, db, parent=None): - super(GroupEditWindow, self).__init__(parent) - self.db = db +class GroupEdit(Qt.QWidget, groupedit.Ui_Form): + def __init__(self, parent=None): + super(GroupEdit, self).__init__(parent) + # self.db = db self.setupUi(self) \ No newline at end of file diff --git a/Implementace/controllers/groups_overview_controller.py b/Implementace/controllers/groups_overview_controller.py index 241fa54..d23990d 100644 --- a/Implementace/controllers/groups_overview_controller.py +++ b/Implementace/controllers/groups_overview_controller.py @@ -1,54 +1,96 @@ from PyQt5.QtCore import * from PyQt5.QtWidgets import * from globals import Global -from model.qtmodels.GroupTableModel import GroupTableModel -from model.qtmodels.PersonTableModel import PersonTableModel +from model.qtmodels.group_table_model import GroupTableModel +from model.qtmodels.person_table_model import PersonTableModel from windows import groupsoverview class GroupsOverview(QWidget, groupsoverview.Ui_Form): - def __init__(self, parent=None): + _BUTTON_WIDTH = 50 + + _editButtonsMembers = [] + _editButtonsGroup = [] + + def __init__(self, main_window, parent=None): super(GroupsOverview, self).__init__(parent) + self.main_window = main_window self.setupUi(self) #self.btnCreateGroup.clicked.connect() self._initializeGroupsTable() + self._initializeMembersTable() + # initializes groups table (sets column widths, signals, etc.) def _initializeGroupsTable(self): - # initialize contents - model = GroupTableModel(Global.db.getGroups()) - model.dataChanged.connect(self.nameButtons) + # initialize content + model = GroupTableModel(Global.db.getGroups(), 2) self.tableGroups.setModel(model) - self._buttons = [] for i in range(model.rowCount()): edit_button = QPushButton("edit") - self._buttons.append(edit_button) - self.nameButtons() + self._editButtonsGroup.append(edit_button) edit_button.clicked.connect(self.editGroup) - self.tableGroups.setIndexWidget(self.tableGroups.model().index(i, 1), edit_button) + self.tableGroups.setIndexWidget(model.index(i, 1), edit_button) + model.dataChanged.connect(self.nameButtonsGroup) # initialize table settings (and signals) header_view = self.tableGroups.horizontalHeader() header_view.setSectionResizeMode(0, QHeaderView.Stretch) - header_view.resizeSection(1, 50) + header_view.resizeSection(1, self._BUTTON_WIDTH) self.tableGroups.clicked.connect(self.showMembers) self.tableGroups.activated.connect(self.showMembers) + + # this also calls nameButtonsGroup() (so the buttons will be correctly named) + # if for some reason you want to remove this, call self.nameButtonsGroup() self.tableGroups.sortByColumn(0, Qt.AscendingOrder) - @pyqtSlot() - def nameButtons(self): + # sets object name of every button to id of group on given row + # also slot for signal 'dataChanged', because buttons do not move when sorting table (we just change their names) + def nameButtonsGroup(self): model = self.tableGroups.model() - for i, button in enumerate(self._buttons): + for i, button in enumerate(self._editButtonsGroup): group = model.data(model.index(i, 0), model.MODEL_ROLE) button.setObjectName(str(group.id)) - def editGroup(self): - print(self.sender().objectName()) + # initializes members table (sets column widths, signals, etc.) + def _initializeMembersTable(self): + model = PersonTableModel(num_columns=3) + self.tableMembers.setModel(model) + header_view = self.tableMembers.horizontalHeader() + header_view.setSectionResizeMode(0, QHeaderView.Stretch) + header_view.setSectionResizeMode(1, QHeaderView.Stretch) + header_view.resizeSection(2, self._BUTTON_WIDTH) + + # sets object name of every button to id of user on given row + # also slot for signal 'dataChanged', because buttons do not move when sorting table (we just change their names) + def nameButtonsMembers(self): + model = self.tableMembers.model() + for i, button in enumerate(self._editButtonsMembers): + member = model.data(model.index(i, 0), model.MODEL_ROLE) + button.setObjectName(str(member.id)) + # changes content of members table to correspond with groups table selection def showMembers(self): index = self.tableGroups.currentIndex() - model = self.tableGroups.model() - group = model.data(index, model.MODEL_ROLE) + groups = self.tableGroups.model() + group = groups.data(index, GroupTableModel.MODEL_ROLE) members = group.getMembers() - model = PersonTableModel(members) - self.tableMembers.setModel(model) \ No newline at end of file + model = PersonTableModel(members, 3) + self.tableMembers.setModel(model) + self._editButtonsMembers = [] + for i in range(model.rowCount()): + edit_button = QPushButton("edit") + self._editButtonsMembers.append(edit_button) + edit_button.clicked.connect(self.editMember) + self.tableMembers.setIndexWidget(model.index(i, 2), edit_button) + model.dataChanged.connect(self.nameButtonsMembers) + # this also calls nameButtonsMembers() (so the buttons will be correctly named) + # if for some reason you want to remove this, call self.nameButtonsMembers() + self.tableMembers.sortByColumn(0, Qt.AscendingOrder) + + def editGroup(self): + print(self.sender().objectName()) + self.main_window.goToGroupEdit(self.sender().objectName()) + + def editMember(self): + print(self.sender().objectName()) \ No newline at end of file diff --git a/Implementace/controllers/mainwindow_controller.py b/Implementace/controllers/mainwindow_controller.py index bb504fc..55115c3 100644 --- a/Implementace/controllers/mainwindow_controller.py +++ b/Implementace/controllers/mainwindow_controller.py @@ -1,27 +1,31 @@ from PyQt5 import QtWidgets as Qt +from controllers.group_edit_controller import GroupEdit from controllers.groups_overview_controller import GroupsOverview -from model.qtmodels.GroupTableModel import GroupTableModel -from model.qtmodels.PersonTableModel import PersonTableModel +from model.qtmodels.group_table_model import GroupTableModel +from model.qtmodels.person_table_model import PersonTableModel from windows import mainwindow from globals import Global -class Mainwindow(Qt.QMainWindow, mainwindow.Ui_MainWindow): +class MainWindow(Qt.QMainWindow, mainwindow.Ui_MainWindow): def _init_screens(self): self._screens = [ - GroupsOverview(), + GroupsOverview(self), + GroupEdit(), ] def __init__(self, parent=None): - super(Mainwindow, self).__init__(parent) + super(MainWindow, self).__init__(parent) self.setupUi(self) self._init_screens() for controller in self._screens: self.stackedWidget.addWidget(controller) - self.go_to_group_overview() + self.goToGroupOverview() - def go_to_group_overview(self): + def goToGroupOverview(self): self.stackedWidget.setCurrentWidget(self._screens[0]) + def goToGroupEdit(self, group_id): + self.stackedWidget.setCurrentWidget(self._screens[1]) \ No newline at end of file diff --git a/Implementace/main.py b/Implementace/main.py index ab32e4e..30fc1e9 100644 --- a/Implementace/main.py +++ b/Implementace/main.py @@ -2,20 +2,17 @@ import sys from PyQt5 import QtWidgets as Qt -from controllers.mainwindow_controller import Mainwindow +from controllers.mainwindow_controller import MainWindow from database import Database from globals import Global def main(): - try: - Global.db = Database() - app = Qt.QApplication(sys.argv) - form = Mainwindow() - form.show() - app.exec_() - except Exception as e: - print(e) + Global.db = Database() + app = Qt.QApplication(sys.argv) + form = MainWindow() + form.show() + app.exec_() if __name__ == '__main__': main() \ No newline at end of file diff --git a/Implementace/model/qtmodels/PersonTableModel.py b/Implementace/model/qtmodels/PersonTableModel.py deleted file mode 100644 index a0dfb01..0000000 --- a/Implementace/model/qtmodels/PersonTableModel.py +++ /dev/null @@ -1,33 +0,0 @@ -from PyQt5 import QtGui, QtCore, uic - - -class PersonTableModel(QtCore.QAbstractTableModel): - MODEL_ROLE = -1 - - def __init__(self, people=[], parent=None): - super(PersonTableModel, self).__init__(parent) - self._people = people - - def rowCount(self, parent=None, *args, **kwargs): - return len(self._people) - - def columnCount(self, parent=None, *args, **kwargs): - return 3 - - def headerData(self, p_int, Qt_Orientation, role=None): - if role == QtCore.Qt.DisplayRole: - if p_int == 0: - return 'JmĂ©no' - if p_int == 1: - return 'PĹ™ĂjmenĂ' - - def data(self, index, role=None): - person = self._people[index.row()] - if role == QtCore.Qt.DisplayRole: - if index.column() == 0: - return person.name - if index.column() == 1: - return person.surname - - if role == PersonTableModel.MODEL_ROLE: - return self._people[index.row()] diff --git a/Implementace/model/qtmodels/GroupTableModel.py b/Implementace/model/qtmodels/group_table_model.py similarity index 88% rename from Implementace/model/qtmodels/GroupTableModel.py rename to Implementace/model/qtmodels/group_table_model.py index 76a7d08..3fc280a 100644 --- a/Implementace/model/qtmodels/GroupTableModel.py +++ b/Implementace/model/qtmodels/group_table_model.py @@ -5,19 +5,20 @@ from PyQt5.QtWidgets import QPushButton class GroupTableModel(QtCore.QAbstractTableModel): MODEL_ROLE = -1 - def __init__(self, groups=[], parent=None): + def __init__(self, groups=[], num_columns=1, parent=None): super(GroupTableModel, self).__init__(parent) self._groups = groups + self._columns = num_columns def rowCount(self, parent=None, *args, **kwargs): return len(self._groups) def columnCount(self, parent=None, *args, **kwargs): - return 2 + return self._columns def headerData(self, p_int, Qt_Orientation, role=None): if role == QtCore.Qt.DisplayRole and p_int == 0: - return 'JmĂ©no skupiny' + return 'Název skupiny' def data(self, index, role=None): if role == QtCore.Qt.DisplayRole: diff --git a/Implementace/model/qtmodels/person_table_model.py b/Implementace/model/qtmodels/person_table_model.py new file mode 100644 index 0000000..1d7317e --- /dev/null +++ b/Implementace/model/qtmodels/person_table_model.py @@ -0,0 +1,57 @@ +from PyQt5 import QtGui, QtCore, uic + + +class PersonTableModel(QtCore.QAbstractTableModel): + MODEL_ROLE = -1 + + def __init__(self, people=[], num_columns=2, parent=None): + super(PersonTableModel, self).__init__(parent) + self._people = people + self._columns = num_columns + + def rowCount(self, parent=None, *args, **kwargs): + return len(self._people) + + def columnCount(self, parent=None, *args, **kwargs): + return self._columns + + def headerData(self, p_int, Qt_Orientation, role=None): + if role == QtCore.Qt.DisplayRole: + if p_int == 0: + return 'PĹ™ĂjmenĂ' + if p_int == 1: + return 'JmĂ©no' + + + def data(self, index, role=None): + person = self._people[index.row()] + if role == QtCore.Qt.DisplayRole: + if index.column() == 0: + return person.surname + if index.column() == 1: + return person.name + + if role == PersonTableModel.MODEL_ROLE: + return self._people[index.row()] + + def sort(self, p_int, order=None): + if p_int > 1: + return + + #sorting by surname + if p_int == 0: + if order == QtCore.Qt.AscendingOrder: + self._people.sort(key=lambda person: person.surname) + if order == QtCore.Qt.DescendingOrder: + self._people.sort(key=lambda person: person.surname, reverse=True) + + #sorting by name + if p_int == 0: + if order == QtCore.Qt.AscendingOrder: + self._people.sort(key=lambda person: person.name) + if order == QtCore.Qt.DescendingOrder: + self._people.sort(key=lambda person: person.name, reverse=True) + + self.dataChanged.emit(self.index(0, 0), + self.index(self.rowCount(), 0), + []) diff --git a/Implementace/windows/groupsoverview.py b/Implementace/windows/groupsoverview.py index 216f42d..b297fc4 100644 --- a/Implementace/windows/groupsoverview.py +++ b/Implementace/windows/groupsoverview.py @@ -22,8 +22,6 @@ class Ui_Form(object): spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.verticalLayout.addLayout(self.horizontalLayout) - self.verticalLayout_3 = QtWidgets.QVBoxLayout() - self.verticalLayout_3.setObjectName("verticalLayout_3") self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.tableGroups = QtWidgets.QTableView(Form) @@ -38,10 +36,17 @@ class Ui_Form(object): self.tableGroups.verticalHeader().setCascadingSectionResizes(True) self.horizontalLayout_2.addWidget(self.tableGroups) self.tableMembers = QtWidgets.QTableView(Form) + self.tableMembers.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) + self.tableMembers.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) + self.tableMembers.setShowGrid(False) + self.tableMembers.setSortingEnabled(True) + self.tableMembers.setCornerButtonEnabled(False) self.tableMembers.setObjectName("tableMembers") + self.tableMembers.horizontalHeader().setHighlightSections(False) + self.tableMembers.verticalHeader().setVisible(False) + self.tableMembers.verticalHeader().setCascadingSectionResizes(True) self.horizontalLayout_2.addWidget(self.tableMembers) - self.verticalLayout_3.addLayout(self.horizontalLayout_2) - self.verticalLayout.addLayout(self.verticalLayout_3) + self.verticalLayout.addLayout(self.horizontalLayout_2) self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) diff --git a/Implementace/windows/qt/groupoverview.ui b/Implementace/windows/qt/groupoverview.ui index 7fd84d2..e1e5b12 100644 --- a/Implementace/windows/qt/groupoverview.ui +++ b/Implementace/windows/qt/groupoverview.ui @@ -39,41 +39,62 @@ </layout> </item> <item> - <layout class="QVBoxLayout" name="verticalLayout_3"> + <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QTableView" name="tableGroups"> - <property name="selectionMode"> - <enum>QAbstractItemView::SingleSelection</enum> - </property> - <property name="selectionBehavior"> - <enum>QAbstractItemView::SelectRows</enum> - </property> - <property name="showGrid"> - <bool>false</bool> - </property> - <property name="sortingEnabled"> - <bool>true</bool> - </property> - <property name="cornerButtonEnabled"> - <bool>false</bool> - </property> - <attribute name="horizontalHeaderHighlightSections"> - <bool>false</bool> - </attribute> - <attribute name="verticalHeaderVisible"> - <bool>false</bool> - </attribute> - <attribute name="verticalHeaderCascadingSectionResizes"> - <bool>true</bool> - </attribute> - </widget> - </item> - <item> - <widget class="QTableView" name="tableMembers"/> - </item> - </layout> + <widget class="QTableView" name="tableGroups"> + <property name="selectionMode"> + <enum>QAbstractItemView::SingleSelection</enum> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectRows</enum> + </property> + <property name="showGrid"> + <bool>false</bool> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + <property name="cornerButtonEnabled"> + <bool>false</bool> + </property> + <attribute name="horizontalHeaderHighlightSections"> + <bool>false</bool> + </attribute> + <attribute name="verticalHeaderVisible"> + <bool>false</bool> + </attribute> + <attribute name="verticalHeaderCascadingSectionResizes"> + <bool>true</bool> + </attribute> + </widget> + </item> + <item> + <widget class="QTableView" name="tableMembers"> + <property name="selectionMode"> + <enum>QAbstractItemView::SingleSelection</enum> + </property> + <property name="selectionBehavior"> + <enum>QAbstractItemView::SelectRows</enum> + </property> + <property name="showGrid"> + <bool>false</bool> + </property> + <property name="sortingEnabled"> + <bool>true</bool> + </property> + <property name="cornerButtonEnabled"> + <bool>false</bool> + </property> + <attribute name="horizontalHeaderHighlightSections"> + <bool>false</bool> + </attribute> + <attribute name="verticalHeaderVisible"> + <bool>false</bool> + </attribute> + <attribute name="verticalHeaderCascadingSectionResizes"> + <bool>true</bool> + </attribute> + </widget> </item> </layout> </item> diff --git a/Implementace/windows/qt/qt.pro b/Implementace/windows/qt/qt.pro index 47eba0c..efe16be 100644 --- a/Implementace/windows/qt/qt.pro +++ b/Implementace/windows/qt/qt.pro @@ -29,4 +29,5 @@ SOURCES += main.cpp\ HEADERS += mainwindow.h FORMS += mainwindow.ui \ - groupoverview.ui + groupoverview.ui \ + groupedit.ui diff --git a/Implementace/windows/qt/qt.pro.user b/Implementace/windows/qt/qt.pro.user index 6199bd1..782ad29 100644 --- a/Implementace/windows/qt/qt.pro.user +++ b/Implementace/windows/qt/qt.pro.user @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE QtCreatorProject> -<!-- Written by QtCreator 4.2.1, 2017-03-14T23:24:44. --> +<!-- Written by QtCreator 4.2.1, 2017-03-17T22:12:48. --> <qtcreator> <data> <variable>EnvironmentId</variable> -- GitLab