From 72f043f45050704ef092723a2e223131f95f962f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C5=A0tercl?= <stercjak@fit.cvut.cz> Date: Wed, 15 Mar 2017 15:31:16 +0100 Subject: [PATCH] groups overview: groups table displays as intended, members table displays correct data --- .../controllers/group_edit_controller.py | 8 ++++ .../controllers/groups_overview_controller.py | 39 ++++++++++++++++--- .../controllers/mainwindow_controller.py | 16 +------- Implementace/database.py | 4 +- Implementace/model/group.py | 4 ++ .../model/qtmodels/GroupTableModel.py | 21 +++++++--- .../model/qtmodels/PersonListModel.py | 20 ---------- .../model/qtmodels/PersonTableModel.py | 33 ++++++++++++++++ 8 files changed, 97 insertions(+), 48 deletions(-) create mode 100644 Implementace/controllers/group_edit_controller.py delete mode 100644 Implementace/model/qtmodels/PersonListModel.py create mode 100644 Implementace/model/qtmodels/PersonTableModel.py diff --git a/Implementace/controllers/group_edit_controller.py b/Implementace/controllers/group_edit_controller.py new file mode 100644 index 0000000..26e3b32 --- /dev/null +++ b/Implementace/controllers/group_edit_controller.py @@ -0,0 +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 + 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 fa69800..241fa54 100644 --- a/Implementace/controllers/groups_overview_controller.py +++ b/Implementace/controllers/groups_overview_controller.py @@ -1,6 +1,8 @@ +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 windows import groupsoverview @@ -9,17 +11,44 @@ class GroupsOverview(QWidget, groupsoverview.Ui_Form): super(GroupsOverview, self).__init__(parent) self.setupUi(self) #self.btnCreateGroup.clicked.connect() - model = GroupTableModel(Global.db.get_groups()) + self._initializeGroupsTable() + + def _initializeGroupsTable(self): + + # initialize contents + model = GroupTableModel(Global.db.getGroups()) + model.dataChanged.connect(self.nameButtons) self.tableGroups.setModel(model) + self._buttons = [] for i in range(model.rowCount()): - edit_button = QPushButton("edit" + str(i)) - group = model.data(self.tableGroups.model().index(i, 0), model.modelRole) - edit_button.setObjectName(str(group.id)) + edit_button = QPushButton("edit") + self._buttons.append(edit_button) + self.nameButtons() edit_button.clicked.connect(self.editGroup) self.tableGroups.setIndexWidget(self.tableGroups.model().index(i, 1), edit_button) + + # initialize table settings (and signals) header_view = self.tableGroups.horizontalHeader() header_view.setSectionResizeMode(0, QHeaderView.Stretch) header_view.resizeSection(1, 50) + self.tableGroups.clicked.connect(self.showMembers) + self.tableGroups.activated.connect(self.showMembers) + self.tableGroups.sortByColumn(0, Qt.AscendingOrder) + + @pyqtSlot() + def nameButtons(self): + model = self.tableGroups.model() + for i, button in enumerate(self._buttons): + group = model.data(model.index(i, 0), model.MODEL_ROLE) + button.setObjectName(str(group.id)) def editGroup(self): - print(self.sender().objectName()) \ No newline at end of file + print(self.sender().objectName()) + + def showMembers(self): + index = self.tableGroups.currentIndex() + model = self.tableGroups.model() + group = model.data(index, model.MODEL_ROLE) + members = group.getMembers() + model = PersonTableModel(members) + self.tableMembers.setModel(model) \ No newline at end of file diff --git a/Implementace/controllers/mainwindow_controller.py b/Implementace/controllers/mainwindow_controller.py index 7145007..bb504fc 100644 --- a/Implementace/controllers/mainwindow_controller.py +++ b/Implementace/controllers/mainwindow_controller.py @@ -2,7 +2,7 @@ from PyQt5 import QtWidgets as Qt from controllers.groups_overview_controller import GroupsOverview from model.qtmodels.GroupTableModel import GroupTableModel -from model.qtmodels.PersonListModel import PersonListModel +from model.qtmodels.PersonTableModel import PersonTableModel from windows import mainwindow from globals import Global @@ -21,21 +21,7 @@ class Mainwindow(Qt.QMainWindow, mainwindow.Ui_MainWindow): for controller in self._screens: self.stackedWidget.addWidget(controller) self.go_to_group_overview() - # model = GroupListModel(self.db.get_groups()) - # self.listGroups.setModel(model) - # self.listGroups.activated.connect(self.show_members) - # self.listGroups.clicked.connect(self.show_members) - #for group in self.db.get_groups(): - # self.listGroups.addItem(group.name) - #self.listGroups.currentItemChanged.connect(self.show_people) - #self.btnBrowse.clicked.connect(self.browse_folder) - #self.list1.currentItemChanged.connect(self.show_content) def go_to_group_overview(self): self.stackedWidget.setCurrentWidget(self._screens[0]) - # def show_members(self, current): - # group = current.data(GroupListModel.modelRole) - # members = Global.db.get_group_members(group.id) - # model = PersonListModel(members) - # self.listPeople.setModel(model) diff --git a/Implementace/database.py b/Implementace/database.py index 14e0566..ddce0e2 100644 --- a/Implementace/database.py +++ b/Implementace/database.py @@ -8,7 +8,7 @@ class Database: self.connection = sqlite.connect('database.db') self.connection.isolation_level = None # so we don't have to use self.connection.commit() - def get_groups(self, person_id = None): + def getGroups(self, person_id = None): if person_id is not None: curs = self.connection.execute("SELECT * FROM GROUPS WHERE person_id = ?", str(person_id)) else: @@ -18,7 +18,7 @@ class Database: res.append(Group(row)) return res - def get_group_members(self, group_id): + def getGroupMembers(self, group_id): curs = self.connection.execute('''SELECT person.* FROM person JOIN person_to_group USING (person_id) diff --git a/Implementace/model/group.py b/Implementace/model/group.py index 582b041..d77d5f1 100644 --- a/Implementace/model/group.py +++ b/Implementace/model/group.py @@ -1,6 +1,10 @@ +from globals import Global class Group: def __init__(self, db_row): self.id = db_row[0] self.name = db_row[1] + + def getMembers(self): + return Global.db.getGroupMembers(self.id) \ No newline at end of file diff --git a/Implementace/model/qtmodels/GroupTableModel.py b/Implementace/model/qtmodels/GroupTableModel.py index 444f0eb..76a7d08 100644 --- a/Implementace/model/qtmodels/GroupTableModel.py +++ b/Implementace/model/qtmodels/GroupTableModel.py @@ -3,7 +3,7 @@ from PyQt5.QtWidgets import QPushButton class GroupTableModel(QtCore.QAbstractTableModel): - modelRole = -1 + MODEL_ROLE = -1 def __init__(self, groups=[], parent=None): super(GroupTableModel, self).__init__(parent) @@ -16,15 +16,24 @@ class GroupTableModel(QtCore.QAbstractTableModel): return 2 def headerData(self, p_int, Qt_Orientation, role=None): - if role == QtCore.Qt.DisplayRole: - return 'x' + if role == QtCore.Qt.DisplayRole and p_int == 0: + return 'JmĂ©no skupiny' def data(self, index, role=None): if role == QtCore.Qt.DisplayRole: if index.column() == 0: return self._groups[index.row()].name - if index.column() == 1: - return QPushButton("karel") - if role == GroupTableModel.modelRole: + if role == GroupTableModel.MODEL_ROLE: return self._groups[index.row()] + + def sort(self, p_int, order=None): + if p_int != 0: + return + if order == QtCore.Qt.AscendingOrder: + self._groups.sort(key=lambda group: group.name) + if order == QtCore.Qt.DescendingOrder: + self._groups.sort(key=lambda group: group.name, reverse=True) + self.dataChanged.emit(self.index(0, 0), + self.index(self.rowCount(), 0), + []) diff --git a/Implementace/model/qtmodels/PersonListModel.py b/Implementace/model/qtmodels/PersonListModel.py deleted file mode 100644 index 5a34169..0000000 --- a/Implementace/model/qtmodels/PersonListModel.py +++ /dev/null @@ -1,20 +0,0 @@ -from PyQt5 import QtGui, QtCore, uic - - -class PersonListModel(QtCore.QAbstractListModel): - modelRole = -1 - - def __init__(self, people=[], parent=None): - super(PersonListModel, self).__init__(parent) - self._people = people - - def rowCount(self, parent=None, *args, **kwargs): - return len(self._people) - - def data(self, index, role=None): - person = self._people[index.row()] - if role == QtCore.Qt.DisplayRole: - return person.name + " " + person.surname - - if role == PersonListModel.modelRole: - return self._people[index.row()] diff --git a/Implementace/model/qtmodels/PersonTableModel.py b/Implementace/model/qtmodels/PersonTableModel.py new file mode 100644 index 0000000..a0dfb01 --- /dev/null +++ b/Implementace/model/qtmodels/PersonTableModel.py @@ -0,0 +1,33 @@ +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()] -- GitLab