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