From ec10d9679a90944d651cf4e13c2a390f99ce6084 Mon Sep 17 00:00:00 2001
From: Kukuksumusu <stercjak@fit.cvut.cz>
Date: Mon, 3 Apr 2017 12:54:01 +0200
Subject: [PATCH] improved tables, improved groupedit, added distribution_setup
 + requirement_dialog... PS: A lot of changes (I should be committing more
 often :/)

---
 .../controllers/distribution_setup.py         |  62 +++
 .../controllers/group_edit_controller.py      |  80 +++-
 .../controllers/groups_overview_controller.py |  14 +-
 .../controllers/mainwindow_controller.py      |  45 ++-
 .../controllers/requirement_dialog.py         |  16 +
 Implementace/database.py                      |  58 ++-
 Implementace/database_create.py               |  13 +-
 Implementace/globals.py                       |   2 +-
 Implementace/model/group.py                   |  29 +-
 Implementace/model/member.py                  |   8 +
 Implementace/model/person.py                  |   7 -
 ...p_table_model.py => groups_table_model.py} |  18 +-
 ..._table_model.py => members_table_model.py} |  30 +-
 Implementace/model/requirements.py            |  20 +
 Implementace/utils/group_table.py             |  11 -
 Implementace/utils/groups_table.py            |  11 +
 Implementace/utils/members_table.py           |  11 +
 Implementace/utils/person_table.py            |  11 -
 Implementace/utils/table.py                   |  38 +-
 Implementace/windows/distributionsetup.py     | 144 +++++++
 Implementace/windows/groupedit.py             |  62 ++-
 Implementace/windows/qt/distributionsetup.ui  | 353 ++++++++++++++++++
 Implementace/windows/qt/groupedit.ui          | 301 +++++++++++++++
 Implementace/windows/qt/grouptable.ui         |  64 ++++
 Implementace/windows/qt/main.cpp              |  11 +
 Implementace/windows/qt/mainwindow.cpp        |  14 +
 Implementace/windows/qt/mainwindow.h          |  22 ++
 Implementace/windows/qt/qt.pro                |   4 +-
 Implementace/windows/qt/qt.pro.user           |   2 +-
 Implementace/windows/qt/requirementdialog.ui  | 144 +++++++
 Implementace/windows/qt/table.ui              |  76 ++++
 Implementace/windows/requirement_dialog.py    |  65 ++++
 Implementace/windows/table.py                 |  10 +
 33 files changed, 1588 insertions(+), 168 deletions(-)
 create mode 100644 Implementace/controllers/distribution_setup.py
 create mode 100644 Implementace/controllers/requirement_dialog.py
 create mode 100644 Implementace/model/member.py
 delete mode 100644 Implementace/model/person.py
 rename Implementace/model/qtmodels/{group_table_model.py => groups_table_model.py} (61%)
 rename Implementace/model/qtmodels/{person_table_model.py => members_table_model.py} (50%)
 create mode 100644 Implementace/model/requirements.py
 delete mode 100644 Implementace/utils/group_table.py
 create mode 100644 Implementace/utils/groups_table.py
 create mode 100644 Implementace/utils/members_table.py
 delete mode 100644 Implementace/utils/person_table.py
 create mode 100644 Implementace/windows/distributionsetup.py
 create mode 100644 Implementace/windows/qt/distributionsetup.ui
 create mode 100644 Implementace/windows/qt/groupedit.ui
 create mode 100644 Implementace/windows/qt/grouptable.ui
 create mode 100644 Implementace/windows/qt/main.cpp
 create mode 100644 Implementace/windows/qt/mainwindow.cpp
 create mode 100644 Implementace/windows/qt/mainwindow.h
 create mode 100644 Implementace/windows/qt/requirementdialog.ui
 create mode 100644 Implementace/windows/qt/table.ui
 create mode 100644 Implementace/windows/requirement_dialog.py

diff --git a/Implementace/controllers/distribution_setup.py b/Implementace/controllers/distribution_setup.py
new file mode 100644
index 0000000..c522ca7
--- /dev/null
+++ b/Implementace/controllers/distribution_setup.py
@@ -0,0 +1,62 @@
+from math import ceil
+from PyQt5 import QtWidgets as Qt
+from PyQt5.QtCore import pyqtSlot
+from controllers.requirement_dialog import RequirementDialog
+from utils.groups_table import GroupsTable
+from windows import distributionsetup
+
+
+# TODO throw exception for empty groups
+class DistributionSetup(Qt.QWidget, distributionsetup.Ui_Form):
+    def __init__(self, main_window, group, parent=None):
+        """
+        :param main_window: main window controller 
+        :param group: (Group) that is being distributed
+        :param parent: 
+        """
+        super(DistributionSetup, self).__init__(parent)
+        self.setupUi(self)
+        self.placeTable.insertWidget(1, GroupsTable())
+        self.group = group
+
+        # set up header
+        self.lblGroupName.setText(self.group.name)
+        self.lblMemberCount.setText('(' + str(self.group.getMemberCount()) + ' ÄŤlenĹŻ)')
+
+        #set up spinners
+        self.spinTeamCount.setMinimum(1)
+        self.spinTeamCount.setMaximum(self.group.getMemberCount())
+        self.spinTeamCount.setFocus()
+        self.spinTeamCount.selectAll()
+        self.spinTeamCount.valueChanged.connect(self.teamCountSet)
+
+        self.spinMinTeamSize.setDisabled(True)
+        self.spinMinTeamSize.valueChanged.connect(self.minSizeSet)
+
+        self.spinMaxTeamSize.setDisabled(True)
+        self.spinMaxTeamSize.valueChanged.connect(self.maxSizeSet)
+
+        self.comboPrefer.setDisabled(True)
+        self.btnAddRequirement.clicked.connect(self.showRequirementDialog)
+
+    @pyqtSlot()
+    def teamCountSet(self):
+        self.spinMinTeamSize.setMaximum(self.group.getMemberCount() // self.spinTeamCount.value())
+        self.spinMinTeamSize.setDisabled(False)
+
+    @pyqtSlot()
+    def minSizeSet(self):
+        self.spinMaxTeamSize.setMinimum(ceil(self.group.getMemberCount() / self.spinTeamCount.value()))
+        self.spinMaxTeamSize.setMaximum(self.group.getMemberCount())
+        self.spinMaxTeamSize.setDisabled(False)
+
+    @pyqtSlot()
+    def maxSizeSet(self):
+        self.comboPrefer.setDisabled(False)
+
+    @pyqtSlot()
+    def showRequirementDialog(self):
+        dialog = RequirementDialog(self.group, parent=self)
+        dialog.exec_()
+        if dialog.result() == dialog.Accepted:
+            ...
diff --git a/Implementace/controllers/group_edit_controller.py b/Implementace/controllers/group_edit_controller.py
index 4d5622f..61d4928 100644
--- a/Implementace/controllers/group_edit_controller.py
+++ b/Implementace/controllers/group_edit_controller.py
@@ -1,33 +1,48 @@
+from PyQt5.QtCore import pyqtSlot
 from PyQt5.QtWidgets import QLineEdit
-from model.qtmodels.person_table_model import PersonTableModel
-from utils.person_table import PersonTable
+from utils.members_table import MembersTable
 from windows import groupedit
 from PyQt5 import QtWidgets as Qt
-from model.group import Group
 
 
 class GroupEdit(Qt.QWidget, groupedit.Ui_Form):
-    NEW_GROUP = 0
     def __init__(self, main_window, group, parent=None):
+        """
+        Cotnroller of group edit window
+        :param main_window: main application window
+        :param group: (Group) group to be displayed  
+        :param parent: 
+        """
         super(GroupEdit, self).__init__(parent)
         self.setupUi(self)
         self.main_window = main_window
-        if group == self.NEW_GROUP:
-            self.setGroup(Group(Group.NEW_GROUP))
-        else:
-            self.setGroup(group)
+        self.setGroup(group)
         self._editName = QLineEdit()
 
+        # signals
         self.btnDelete.clicked.connect(self.deleteGroup)
         self.btnChangeName.clicked.connect(self.editName)
+        self.btnAddNew.clicked.connect(self.addNewMember)
+        self.editNewMemberName.returnPressed.connect(self.editNewMemberSurname.setFocus)
+        self.editNewMemberSurname.returnPressed.connect(self.addNewMember)
+        self.btnDistribute.clicked.connect(self.distribute)
 
     def setGroup(self, group):
+        """
+        Set group this controller (and window) displays
+        :param group: 
+        """
         self.group = group
-        self.personTable = PersonTable(num_of_buttons=2, button_titles=("View", "-",), data=group.getMembers())
-        self.layoutMembers.insertWidget(1, self.personTable)
+        self.membersTable = MembersTable(num_of_buttons=2, button_titles=("View", "-",), data=group.getMembers())
+        self.updateMemberCount()
+        self.layoutMembers.insertWidget(1, self.membersTable)
         self.lblName.setText(group.name)
 
+    @pyqtSlot()
     def editName(self):
+        """
+        display edit line instead of group name (to enable editing of it)
+        """
         self.btnChangeName.setText("OK")
         # hide label and remove it from layout
         self.lblName.hide()
@@ -45,10 +60,13 @@ class GroupEdit(Qt.QWidget, groupedit.Ui_Form):
         self._editName.show()
         # change signals of button
         self.btnChangeName.clicked.disconnect(self.editName)
-        self.btnChangeName.clicked.connect(self.changeName)
+        self.btnChangeName.clicked.connect(self._changeName)
 
-    # TODO database
-    def changeName(self):
+    @pyqtSlot()
+    def _changeName(self):
+        """
+        Change group name to current value in edit line box (self._editName)
+        """
         try:
             self.group.changeName(self._editName.text())
         except ValueError as e:
@@ -69,17 +87,49 @@ class GroupEdit(Qt.QWidget, groupedit.Ui_Form):
         self.lblName.setText(self._editName.text())
         self.lblName.show()
         # change signals of button
-        self.btnChangeName.clicked.disconnect(self.changeName)
+        self.btnChangeName.clicked.disconnect(self._changeName)
         self.btnChangeName.clicked.connect(self.editName)
         self.main_window.dataChanged()
 
+    @pyqtSlot()
     def deleteGroup(self):
+        """
+        Show confirmation prompt and delete group + go back after 
+        """
         msg = Qt.QMessageBox(self)
         msg.setIcon(Qt.QMessageBox.Question)
         msg.setWindowTitle("Opravdu?")
         msg.setText("Opravdu chcete smazat skupinu " + self.group.name + "?")
         msg.setStandardButtons(Qt.QMessageBox.Ok|Qt.QMessageBox.Cancel)
-        if (msg.exec() == Qt.QMessageBox.Ok):
+        if msg.exec() == Qt.QMessageBox.Ok:
             self.group.delete()
             self.main_window.dataChanged()
             self.main_window.goBack()
+
+    @pyqtSlot()
+    def addNewMember(self):
+        """
+        Add member specified in self.editNewMemberName and self.editNewMemberSurname
+        """
+        name = self.editNewMemberName.text()
+        surname = self.editNewMemberSurname.text()
+        self.group.addMember(name, surname)
+        self.membersTable.changeData(self.group.getMembers())
+        # prepare for inserting another one
+        self.editNewMemberName.clear()
+        self.editNewMemberSurname.clear()
+        self.editNewMemberName.setFocus()
+        self.updateMemberCount()
+
+    def updateMemberCount(self):
+        """
+        Updates member count label 
+        """
+        self.lblMemberCount.setText(str(self.group.getMemberCount()))
+
+    @pyqtSlot()
+    def distribute(self):
+        """
+        go to distribution for this group
+        """
+        self.main_window.goToDistributionSetup(self.group)
diff --git a/Implementace/controllers/groups_overview_controller.py b/Implementace/controllers/groups_overview_controller.py
index ee5d51b..668ef5f 100644
--- a/Implementace/controllers/groups_overview_controller.py
+++ b/Implementace/controllers/groups_overview_controller.py
@@ -1,11 +1,11 @@
 from PyQt5.QtCore import *
 from PyQt5.QtWidgets import *
 
-from model.person import Person
-from utils.person_table import PersonTable
+from model.member import Member
+from utils.members_table import MembersTable
 from windows import groupsoverview
 from globals import Global
-from utils.group_table import GroupTable
+from utils.groups_table import GroupsTable
 from model.group import Group
 
 
@@ -22,13 +22,13 @@ class GroupsOverview(QWidget, groupsoverview.Ui_Form):
         self.btnCreateGroup.clicked.connect(main_window.goToGroupEdit)
 
         # add groups table
-        self.groups_table = GroupTable(num_of_buttons=1, button_titles=("edit",), data=Global.db.getGroups())
+        self.groups_table = GroupsTable(num_of_buttons=1, button_titles=("edit",), data=Global.db.getGroups())
         self.layoutTables.addWidget(self.groups_table)
         self.groups_table.btnClicked.connect(self.editGroup)
         self.groups_table.elementSelected.connect(self.showMembers)
 
         # add members table
-        self.members_table = PersonTable(num_of_buttons=1, button_titles=("penis",))
+        self.members_table = MembersTable(num_of_buttons=1, button_titles=("penis",))
         self.layoutTables.addWidget(self.members_table)
         self.members_table.btnClicked.connect(self.editMember)
 
@@ -46,6 +46,6 @@ class GroupsOverview(QWidget, groupsoverview.Ui_Form):
     def editGroup(self, group):
         self.main_window.goToGroupEdit(group)
 
-    @pyqtSlot(Person)
+    @pyqtSlot(Member)
     def editMember(self, person):
-        print(person.id)
\ No newline at end of file
+        print(person.id)
diff --git a/Implementace/controllers/mainwindow_controller.py b/Implementace/controllers/mainwindow_controller.py
index dd976c3..e54bba7 100644
--- a/Implementace/controllers/mainwindow_controller.py
+++ b/Implementace/controllers/mainwindow_controller.py
@@ -1,14 +1,17 @@
 from PyQt5 import QtWidgets as Qt
+from PyQt5.QtCore import pyqtSlot
+
+from controllers.distribution_setup import DistributionSetup
 from controllers.group_edit_controller import GroupEdit
 from controllers.groups_overview_controller import GroupsOverview
-from model.qtmodels.group_table_model import GroupTableModel
-from model.qtmodels.person_table_model import PersonTableModel
+from model.qtmodels.groups_table_model import GroupsTableModel
+from model.qtmodels.members_table_model import MembersTableModel
+from utils.groups_table import GroupsTable
 from windows import mainwindow
 from globals import Global
 
 
 class MainWindow(Qt.QMainWindow, mainwindow.Ui_MainWindow):
-
     def __init__(self, parent=None):
         super(MainWindow, self).__init__(parent)
         self.setupUi(self)
@@ -16,23 +19,37 @@ class MainWindow(Qt.QMainWindow, mainwindow.Ui_MainWindow):
         self.goToGroupsOverview()
         self._last_changed = 0
 
-    # all controllers have to call this when they change data in db
-    # it prompts every controller before current widget in stack to reload data
+    def _goToWidget(self, widget):
+        self.stackedWidget.addWidget(widget)
+        self.stackedWidget.setCurrentWidget(widget)
+
     def dataChanged(self):
+        """
+        all controllers have to call this when they change data in db
+        it prompts every controller before current widget in stack to reload data when getting back to view
+        """
         self._last_changed = self.stackedWidget.currentIndex()
 
     def goToGroupsOverview(self):
-        groups_overview = GroupsOverview(self)
-        self.stackedWidget.addWidget(groups_overview)
-        self.stackedWidget.setCurrentWidget(groups_overview)
+        self._goToWidget(GroupsOverview(self))
 
-    # if group_id unfilled - create new group
-    def goToGroupEdit(self, group=GroupEdit.NEW_GROUP):
-        if group == GroupEdit.NEW_GROUP:
+    @pyqtSlot()
+    def goToGroupEdit(self, group=None):
+        """
+        change active window to GroupEdit()
+        :param group: if unfilled (or None), create new group
+        """
+        if group is None:
             self._last_changed = self.stackedWidget.currentIndex() + 1
-        group_edit = GroupEdit(self, group)
-        self.stackedWidget.addWidget(group_edit)
-        self.stackedWidget.setCurrentWidget(group_edit)
+            group = Global.db.createNewGroup()
+        self._goToWidget(GroupEdit(self, group))
+
+    def goToDistributionSetup(self, group):
+        """
+        change active window to DistributionSetup()
+        :param group: 
+        """
+        self._goToWidget(DistributionSetup(self, group))
 
     def goBack(self):
         current_index = self.stackedWidget.currentIndex()
diff --git a/Implementace/controllers/requirement_dialog.py b/Implementace/controllers/requirement_dialog.py
new file mode 100644
index 0000000..95743a4
--- /dev/null
+++ b/Implementace/controllers/requirement_dialog.py
@@ -0,0 +1,16 @@
+from PyQt5.QtWidgets import QDialog, QAbstractItemView
+from utils.members_table import MembersTable
+from windows import requirement_dialog
+
+
+class RequirementDialog(QDialog, requirement_dialog.Ui_Dialog):
+    def __init__(self, group, requirement=None, parent=None):
+        super(RequirementDialog, self).__init__(parent)
+        self.setupUi(self)
+        self.tableMembers = MembersTable(data=group.getMembers(), parent=self)
+        self.placeTable.insertWidget(0, self.tableMembers)
+        self.tableMembers.setSelectionMode(QAbstractItemView.MultiSelection)
+
+
+    def getRequirement(self):
+        ...
diff --git a/Implementace/database.py b/Implementace/database.py
index d1a758b..14b8809 100644
--- a/Implementace/database.py
+++ b/Implementace/database.py
@@ -1,53 +1,89 @@
 import sqlite3 as sqlite
 from model.group import Group
-from model.person import Person
+from model.member import Member
 
 
 class Database:
     def __init__(self):
         self.connection = sqlite.connect('database.db')
         self.connection.isolation_level = None  # so we don't have to use self.connection.commit()
+        self.connection.row_factory = sqlite.Row
 
     def getGroups(self):
+        """
+        :return: all groups in database
+        """
         curs = self.connection.execute("SELECT * FROM groups")
         res = []
         for row in curs:
-            res.append(Group(row))
+            res.append(Group(row['group_id'], row['name']))
         curs.close()
         return res
 
     def getGroupMembers(self, group_id):
+        """
+        :param group_id
+        :return: members of group
+        """
         curs = self.connection.execute('''SELECT *
-                                    FROM person
+                                    FROM member
                                     WHERE group_id = ?''', (group_id,))
         res = []
         for row in curs:
-            res.append(Person(row[0], row[1], row[2]))
+            res.append(Member(row['person_id'], row['name'], row['surname'], row['group_id']))
         curs.close()
         return res
 
-    # creates new group, returns (id, name)
     # TODO can still conflict (e.g. you deleted 'Nová skupina' and still have 'Nová skupina 2')
     def createNewGroup(self):
+        """
+        create new group (with some default name)
+        :return: Group
+        """
         curs = self.connection.execute('''SELECT name FROM groups WHERE name LIKE 'Nová skupina%' ''')
         name = "Nová skupina"
         new_groups_count = len(curs.fetchall())
         if new_groups_count > 0:
             name = name + " " + str(new_groups_count)
-        self.connection.execute('''INSERT INTO groups (name) VALUES (?) ''', (name,))
-        curs.execute('''SELECT group_id, name FROM groups WHERE name LIKE ? ''', (name,))
-        return curs.fetchone()
+        curs.execute('''INSERT INTO groups (name) VALUES (?) ''', (name,))
+        return Group(curs.lastrowid, name)
 
     def deleteGroup(self, group_id):
+        """
+        delete group and all its members
+        :param group_id:
+        """
         self.connection.execute('''DELETE FROM groups WHERE group_id = ?''', (group_id,))
-        self.connection.execute('''DELETE FROM person WHERE group_id = ?''', (group_id,))
+        self.connection.execute('''DELETE FROM member WHERE group_id = ?''', (group_id,))
 
     def getGroupByName(self, group_name):
+        """
+        :param group_name: 
+        :return: Group (instance)
+        """
         curs = self.connection.execute('''SELECT * FROM groups WHERE name LIKE ?''', (group_name,))
         row = curs.fetchone()
         if row is None:
             return None
-        return Group(row)
+        return Group(row['group_id'], row['name'])
 
     def changeGroupName(self, group_id, new_name):
-        curs = self.connection.execute('''UPDATE groups SET name = ? WHERE group_id = ?''', (new_name, group_id,))
+        """
+        Update name of group in db
+        :param group_id: 
+        :param new_name:
+        """
+        self.connection.execute('''UPDATE groups SET name = ? WHERE group_id = ?''', (new_name, group_id,))
+
+    def createMember(self, group_id, name, surname):
+        """
+        create member of group
+        :param group_id: 
+        :param name: 
+        :param surname:
+        """
+        curs = self.connection.execute(
+            '''INSERT INTO member (name, surname, group_id) VALUES (?, ?, ?)''',
+            (name, surname, group_id,)
+        )
+        return Member(curs.lastrowid, name, surname, group_id)
diff --git a/Implementace/database_create.py b/Implementace/database_create.py
index 4dea7c6..26ed326 100644
--- a/Implementace/database_create.py
+++ b/Implementace/database_create.py
@@ -7,14 +7,15 @@ conn.isolation_level = None  # so we don't have to use self.connection.commit()
 curs = conn.cursor()
 
 curs.execute(
-    '''CREATE TABLE Person (
-    person_id INTEGER PRIMARY KEY AUTOINCREMENT,
-    name      VARCHAR,
-    surname   VARCHAR
-    );''')
+    '''CREATE TABLE Groups (
+    group_id INTEGER PRIMARY KEY,
+    name     VARCHAR UNIQUE
+                     NOT NULL
+    );'''
+)
 
 curs.execute(
-    '''CREATE TABLE Person (
+    '''CREATE TABLE Member (
     person_id INTEGER PRIMARY KEY AUTOINCREMENT,
     name      VARCHAR,
     surname   VARCHAR,
diff --git a/Implementace/globals.py b/Implementace/globals.py
index 937c08e..59d3540 100644
--- a/Implementace/globals.py
+++ b/Implementace/globals.py
@@ -1,3 +1,3 @@
 
-class Global():
+class Global:
     db = None
diff --git a/Implementace/model/group.py b/Implementace/model/group.py
index 4cb1d19..a0b2b46 100644
--- a/Implementace/model/group.py
+++ b/Implementace/model/group.py
@@ -2,15 +2,16 @@ from globals import Global
 
 
 class Group:
-    NEW_GROUP = 0
+    NEW_GROUP = -1
     MIN_LENGTH = 3
     MAX_LENGTH = 25
-    def __init__(self, db_row):
-        if db_row == self.NEW_GROUP:
+
+    def __init__(self, id, name=''):
+        if id == self.NEW_GROUP:
             self.id, self.name = Global.db.createNewGroup()
         else:
-            self.id = db_row[0]
-            self.name = db_row[1]
+            self.id = id
+            self.name = name
         self._members = None
 
     def getMembers(self):
@@ -18,6 +19,13 @@ class Group:
             self._members = Global.db.getGroupMembers(self.id)
         return self._members
 
+    def getMemberCount(self):
+        """
+        :return: count of members 
+        """
+        self.getMembers()
+        return len(self._members)
+
     def delete(self):
         Global.db.deleteGroup(self.id)
 
@@ -33,3 +41,14 @@ class Group:
             self.name = new_name
         else:
             raise ValueError("Skupina se jménem '" + new_name + "' již existuje.")
+
+    def addMember(self, name, surname):
+        """
+        Create and add new member to group
+        :param name: 
+        :param surname: 
+        :return: 
+        """
+        # force initialization of members
+        self.getMembers()
+        self._members.append(Global.db.createMember(self.id, name, surname))
diff --git a/Implementace/model/member.py b/Implementace/model/member.py
new file mode 100644
index 0000000..bb6aca1
--- /dev/null
+++ b/Implementace/model/member.py
@@ -0,0 +1,8 @@
+
+
+class Member:
+    def __init__(self, id, name, surname, group_id):
+        self.id = id
+        self.name = name
+        self.surname = surname
+        self.group_id = group_id
diff --git a/Implementace/model/person.py b/Implementace/model/person.py
deleted file mode 100644
index bf770af..0000000
--- a/Implementace/model/person.py
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-class Person:
-    def __init__(self, id, name, surname):
-        self.id = id
-        self.name = name
-        self.surname = surname
diff --git a/Implementace/model/qtmodels/group_table_model.py b/Implementace/model/qtmodels/groups_table_model.py
similarity index 61%
rename from Implementace/model/qtmodels/group_table_model.py
rename to Implementace/model/qtmodels/groups_table_model.py
index ad2196f..8498b4b 100644
--- a/Implementace/model/qtmodels/group_table_model.py
+++ b/Implementace/model/qtmodels/groups_table_model.py
@@ -2,11 +2,9 @@ from PyQt5 import QtGui, QtCore, uic
 from PyQt5.QtWidgets import QPushButton
 
 
-class GroupTableModel(QtCore.QAbstractTableModel):
-    MODEL_ROLE = -1
-
+class GroupsTableModel(QtCore.QAbstractTableModel):
     def __init__(self, groups=[], num_columns=1, parent=None):
-        super(GroupTableModel, self).__init__(parent)
+        super(GroupsTableModel, self).__init__(parent)
         self._groups = groups
         self._columns = num_columns
 
@@ -25,19 +23,9 @@ class GroupTableModel(QtCore.QAbstractTableModel):
             if index.column() == 0:
                 return self._groups[index.row()].name
 
-        if role == GroupTableModel.MODEL_ROLE:
+        if role == QtCore.Qt.UserRole:
             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),
-                         [])
 
     # returns instance of Group with given group_id or None if not found in collection
     def getElementById(self, group_id):
diff --git a/Implementace/model/qtmodels/person_table_model.py b/Implementace/model/qtmodels/members_table_model.py
similarity index 50%
rename from Implementace/model/qtmodels/person_table_model.py
rename to Implementace/model/qtmodels/members_table_model.py
index 8f717fb..41b4306 100644
--- a/Implementace/model/qtmodels/person_table_model.py
+++ b/Implementace/model/qtmodels/members_table_model.py
@@ -1,11 +1,9 @@
 from PyQt5 import QtGui, QtCore, uic
 
 
-class PersonTableModel(QtCore.QAbstractTableModel):
-    MODEL_ROLE = -1
-
+class MembersTableModel(QtCore.QAbstractTableModel):
     def __init__(self, people=[], num_columns=2, parent=None):
-        super(PersonTableModel, self).__init__(parent)
+        super(MembersTableModel, self).__init__(parent)
         self._people = people
         self._columns = num_columns
 
@@ -30,30 +28,8 @@ class PersonTableModel(QtCore.QAbstractTableModel):
             if index.column() == 1:
                 return person.name
 
-        if role == PersonTableModel.MODEL_ROLE:
+        if role == QtCore.Qt.UserRole:
             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 == 1:
-            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),
-                         [])
-
     def getElementById(self, person_id):
         return next((person for person in self._people if person.id == int(person_id)), None)
diff --git a/Implementace/model/requirements.py b/Implementace/model/requirements.py
new file mode 100644
index 0000000..cd0cdc0
--- /dev/null
+++ b/Implementace/model/requirements.py
@@ -0,0 +1,20 @@
+
+
+class Requirement:
+    def __init__(self, person, target_people):
+        """
+        :param person: the one person that's in some "relationship" with each of the target_people 
+        :param target_people: see person
+        """
+        self.person = person
+        self.target_people = target_people
+
+
+class RequirementSameTeam(Requirement):
+    def __init__(self, person, target_people):
+        super(RequirementSameTeam, self).__init__(person, target_people)
+
+
+class RequirementDifferentTeam(Requirement):
+    def __init__(self, person, target_people):
+        super(RequirementDifferentTeam, self).__init__(person, target_people)
diff --git a/Implementace/utils/group_table.py b/Implementace/utils/group_table.py
deleted file mode 100644
index c89ecde..0000000
--- a/Implementace/utils/group_table.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from utils.table import ElemTable
-from model.qtmodels.group_table_model import GroupTableModel
-
-
-class GroupTable(ElemTable):
-    def __init__(self, num_of_buttons=0, button_titles=(), data=[], parent=None):
-        super(GroupTable, self).__init__(GroupTableModel(data, num_of_buttons+1), num_of_buttons, button_titles, parent)
-
-
-    def changeData(self, data):
-        self.setModel(GroupTableModel(data, self._btn_amount+1))
diff --git a/Implementace/utils/groups_table.py b/Implementace/utils/groups_table.py
new file mode 100644
index 0000000..3e2f4ea
--- /dev/null
+++ b/Implementace/utils/groups_table.py
@@ -0,0 +1,11 @@
+from utils.table import ElemTable
+from model.qtmodels.groups_table_model import GroupsTableModel
+
+
+class GroupsTable(ElemTable):
+    def __init__(self, num_of_buttons=0, button_titles=(), data=[], parent=None):
+        super(GroupsTable, self).__init__(GroupsTableModel(data, num_of_buttons + 1), num_of_buttons, button_titles, parent)
+
+
+    def changeData(self, data):
+        self.setModel(GroupsTableModel(data, self._btn_amount + 1))
diff --git a/Implementace/utils/members_table.py b/Implementace/utils/members_table.py
new file mode 100644
index 0000000..9d364c0
--- /dev/null
+++ b/Implementace/utils/members_table.py
@@ -0,0 +1,11 @@
+from utils.table import ElemTable
+from model.qtmodels.members_table_model import MembersTableModel
+
+
+class MembersTable(ElemTable):
+    def __init__(self, num_of_buttons=0, button_titles=(), data=[], parent=None):
+        super(MembersTable, self).__init__(MembersTableModel(data, num_of_buttons + 2), num_of_buttons, button_titles, parent)
+
+
+    def changeData(self, data):
+        self.setModel(MembersTableModel(data, self._btn_amount + 2))
\ No newline at end of file
diff --git a/Implementace/utils/person_table.py b/Implementace/utils/person_table.py
deleted file mode 100644
index c747a85..0000000
--- a/Implementace/utils/person_table.py
+++ /dev/null
@@ -1,11 +0,0 @@
-from utils.table import ElemTable
-from model.qtmodels.person_table_model import PersonTableModel
-
-
-class PersonTable(ElemTable):
-    def __init__(self, num_of_buttons=0, button_titles=(), data=[], parent=None):
-        super(PersonTable, self).__init__(PersonTableModel(data, num_of_buttons+2), num_of_buttons, button_titles, parent)
-
-
-    def changeData(self, data):
-        self.setModel(PersonTableModel(data, self._btn_amount+2))
\ No newline at end of file
diff --git a/Implementace/utils/table.py b/Implementace/utils/table.py
index a88635b..d29c674 100644
--- a/Implementace/utils/table.py
+++ b/Implementace/utils/table.py
@@ -1,8 +1,10 @@
+from PyQt5.QtCore import QModelIndex
+
 from windows import table
 from PyQt5.QtCore import *
 from PyQt5.QtWidgets import *
 
-# TODO make this base class for group_table and person_table
+
 class ElemTable(QWidget, table.Ui_Form):
     _BUTTON_WIDTH = 50
 
@@ -13,15 +15,14 @@ class ElemTable(QWidget, table.Ui_Form):
         super(ElemTable, self).__init__(parent)
         self.setupUi(self)
 
-        self._buttons = []
         self._btn_titles = button_titles
         self._btn_amount = num_of_buttons
         self._data_columns = model.columnCount() - num_of_buttons
 
-        self.model = model
+        self.model = QSortFilterProxyModel()
+        self.model.setSourceModel(model)
         self.table.setModel(self.model)
         self.insertButtons()
-        self.model.dataChanged.connect(self.nameButtons)
 
         # initialize table settings (and signals)
         header_view = self.table.horizontalHeader()
@@ -33,41 +34,32 @@ class ElemTable(QWidget, table.Ui_Form):
         self.table.clicked.connect(self.onElementSelected)
         self.table.activated.connect(self.onElementSelected)
 
-        # this also calls nameButtons() (so the buttons will be correctly named)
-        # if for some reason you want to remove this, call self.nameButtons()
         self.table.sortByColumn(0, Qt.AscendingOrder)
 
     def insertButtons(self):
-        self._buttons = []  # if we're reloading data
         for btn_nr in range(self._btn_amount):
-            buttons = []
             for i in range(self.model.rowCount()):
                 button = QPushButton(self._btn_titles[btn_nr])
-                buttons.append(button)
                 button.clicked.connect(self.onBtnClicked)
+                group = self.model.data(self.model.index(i, 0), Qt.UserRole)
+                button.setObjectName(str(group.id) + "_" + str(btn_nr))
                 self.table.setIndexWidget(self.model.index(i, btn_nr+self._data_columns), button)
-            self._buttons.append(buttons)
-
-    # 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 nameButtons(self):
-        for buttons in self._buttons:
-            for i, button in enumerate(buttons):
-                group = self.model.data(self.model.index(i, 0), self.model.MODEL_ROLE)
-                button.setObjectName(str(group.id) + "_" + str(i))
 
     def onBtnClicked(self):
         elem_id, btn_id = str.split(self.sender().objectName(), '_')
-        elem = self.model.getElementById(elem_id)
+        elem = self.model.sourceModel().getElementById(elem_id)
         self.btnClicked.emit(elem, int(btn_id))
 
     def onElementSelected(self):
-        elem = self.model.data(self.table.currentIndex(), self.model.MODEL_ROLE)
+        elem = self.model.data(self.table.currentIndex(), Qt.UserRole)
         self.elementSelected.emit(elem)
 
     def setModel(self, model):
-        self.model = model
-        self.table.setModel(self.model)
+        self.model.beginResetModel()
+        self.model.setSourceModel(model)
+        self.model.endResetModel()
         self.insertButtons()
-        self.model.dataChanged.connect(self.nameButtons)
         self.table.sortByColumn(0, Qt.AscendingOrder)
+
+    def setSelectionMode(self, selection_mode):
+        self.table.setSelectionMode(selection_mode)
diff --git a/Implementace/windows/distributionsetup.py b/Implementace/windows/distributionsetup.py
new file mode 100644
index 0000000..1365f75
--- /dev/null
+++ b/Implementace/windows/distributionsetup.py
@@ -0,0 +1,144 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'distributionsetup.ui'
+#
+# Created by: PyQt5 UI code generator 5.8.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_Form(object):
+    def setupUi(self, Form):
+        Form.setObjectName("Form")
+        Form.resize(714, 564)
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout(Form)
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_3.setSpacing(0)
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.lblHeader = QtWidgets.QLabel(Form)
+        font = QtGui.QFont()
+        font.setPointSize(15)
+        font.setBold(True)
+        font.setWeight(75)
+        self.lblHeader.setFont(font)
+        self.lblHeader.setAlignment(QtCore.Qt.AlignCenter)
+        self.lblHeader.setObjectName("lblHeader")
+        self.verticalLayout_3.addWidget(self.lblHeader)
+        self.lblGroupName = QtWidgets.QLabel(Form)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(False)
+        font.setWeight(50)
+        self.lblGroupName.setFont(font)
+        self.lblGroupName.setAlignment(QtCore.Qt.AlignCenter)
+        self.lblGroupName.setObjectName("lblGroupName")
+        self.verticalLayout_3.addWidget(self.lblGroupName)
+        self.lblMemberCount = QtWidgets.QLabel(Form)
+        self.lblMemberCount.setAlignment(QtCore.Qt.AlignCenter)
+        self.lblMemberCount.setObjectName("lblMemberCount")
+        self.verticalLayout_3.addWidget(self.lblMemberCount)
+        self.verticalLayout_2.addLayout(self.verticalLayout_3)
+        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_4.addItem(spacerItem)
+        self.formLayout = QtWidgets.QFormLayout()
+        self.formLayout.setFieldGrowthPolicy(QtWidgets.QFormLayout.ExpandingFieldsGrow)
+        self.formLayout.setLabelAlignment(QtCore.Qt.AlignCenter)
+        self.formLayout.setFormAlignment(QtCore.Qt.AlignCenter)
+        self.formLayout.setObjectName("formLayout")
+        self.label = QtWidgets.QLabel(Form)
+        self.label.setObjectName("label")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label)
+        self.spinTeamCount = QtWidgets.QSpinBox(Form)
+        self.spinTeamCount.setMinimumSize(QtCore.QSize(40, 0))
+        self.spinTeamCount.setObjectName("spinTeamCount")
+        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.spinTeamCount)
+        self.label_2 = QtWidgets.QLabel(Form)
+        self.label_2.setObjectName("label_2")
+        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_2)
+        self.spinMinTeamSize = QtWidgets.QSpinBox(Form)
+        self.spinMinTeamSize.setMinimumSize(QtCore.QSize(40, 0))
+        self.spinMinTeamSize.setObjectName("spinMinTeamSize")
+        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.spinMinTeamSize)
+        self.label_3 = QtWidgets.QLabel(Form)
+        self.label_3.setObjectName("label_3")
+        self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_3)
+        self.spinMaxTeamSize = QtWidgets.QSpinBox(Form)
+        self.spinMaxTeamSize.setMinimumSize(QtCore.QSize(40, 0))
+        self.spinMaxTeamSize.setObjectName("spinMaxTeamSize")
+        self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.spinMaxTeamSize)
+        self.label_5 = QtWidgets.QLabel(Form)
+        self.label_5.setObjectName("label_5")
+        self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_5)
+        self.comboPrefer = QtWidgets.QComboBox(Form)
+        self.comboPrefer.setObjectName("comboPrefer")
+        self.comboPrefer.addItem("")
+        self.comboPrefer.addItem("")
+        self.comboPrefer.addItem("")
+        self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.comboPrefer)
+        self.horizontalLayout_4.addLayout(self.formLayout)
+        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_4.addItem(spacerItem1)
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
+        self.label_4 = QtWidgets.QLabel(Form)
+        self.label_4.setObjectName("label_4")
+        self.horizontalLayout_2.addWidget(self.label_4)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_2.addItem(spacerItem2)
+        self.btnAddRequirement = QtWidgets.QPushButton(Form)
+        self.btnAddRequirement.setObjectName("btnAddRequirement")
+        self.horizontalLayout_2.addWidget(self.btnAddRequirement)
+        self.verticalLayout.addLayout(self.horizontalLayout_2)
+        self.widget = QtWidgets.QWidget(Form)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.widget.sizePolicy().hasHeightForWidth())
+        self.widget.setSizePolicy(sizePolicy)
+        self.widget.setObjectName("widget")
+        self.placeTable = QtWidgets.QHBoxLayout(self.widget)
+        self.placeTable.setContentsMargins(0, 0, 0, 0)
+        self.placeTable.setSpacing(0)
+        self.placeTable.setObjectName("placeTable")
+        self.verticalLayout.addWidget(self.widget)
+        self.horizontalLayout_4.addLayout(self.verticalLayout)
+        self.verticalLayout_2.addLayout(self.horizontalLayout_4)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem3)
+        self.btnDistribute = QtWidgets.QPushButton(Form)
+        self.btnDistribute.setObjectName("btnDistribute")
+        self.horizontalLayout.addWidget(self.btnDistribute)
+        self.verticalLayout_2.addLayout(self.horizontalLayout)
+        self.label.setBuddy(self.spinTeamCount)
+        self.label_2.setBuddy(self.spinMinTeamSize)
+        self.label_3.setBuddy(self.spinMaxTeamSize)
+        self.label_5.setBuddy(self.comboPrefer)
+
+        self.retranslateUi(Form)
+        QtCore.QMetaObject.connectSlotsByName(Form)
+
+    def retranslateUi(self, Form):
+        _translate = QtCore.QCoreApplication.translate
+        Form.setWindowTitle(_translate("Form", "Form"))
+        self.lblHeader.setText(_translate("Form", "Rozdělení skupiny"))
+        self.lblGroupName.setText(_translate("Form", "GroupName"))
+        self.lblMemberCount.setText(_translate("Form", "(x ÄŤlenĹŻ)"))
+        self.label.setText(_translate("Form", "Počet týmů:"))
+        self.label_2.setText(_translate("Form", "Minimální velikost týmu:"))
+        self.label_3.setText(_translate("Form", "Maximální velikost týmu:"))
+        self.label_5.setText(_translate("Form", "Preferovat:"))
+        self.comboPrefer.setItemText(0, _translate("Form", "Nic"))
+        self.comboPrefer.setItemText(1, _translate("Form", "Stejné týmy"))
+        self.comboPrefer.setItemText(2, _translate("Form", "Nové týmy"))
+        self.label_4.setText(_translate("Form", "OmezenĂ­:"))
+        self.btnAddRequirement.setText(_translate("Form", "+"))
+        self.btnDistribute.setText(_translate("Form", "Rozdělit"))
diff --git a/Implementace/windows/groupedit.py b/Implementace/windows/groupedit.py
index a68e35c..1e1aa71 100644
--- a/Implementace/windows/groupedit.py
+++ b/Implementace/windows/groupedit.py
@@ -19,6 +19,8 @@ class Ui_Form(object):
         self.layoutName.setObjectName("layoutName")
         spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
         self.layoutName.addItem(spacerItem)
+        spacerItem1 = QtWidgets.QSpacerItem(175, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
+        self.layoutName.addItem(spacerItem1)
         self.lblName = QtWidgets.QLabel(Form)
         font = QtGui.QFont()
         font.setPointSize(20)
@@ -40,9 +42,34 @@ class Ui_Form(object):
         self.btnDelete.setMaximumSize(QtCore.QSize(50, 16777215))
         self.btnDelete.setObjectName("btnDelete")
         self.layoutName.addWidget(self.btnDelete)
-        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
-        self.layoutName.addItem(spacerItem1)
+        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.layoutName.addItem(spacerItem2)
+        self.btnDistribute = QtWidgets.QPushButton(Form)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.btnDistribute.sizePolicy().hasHeightForWidth())
+        self.btnDistribute.setSizePolicy(sizePolicy)
+        self.btnDistribute.setObjectName("btnDistribute")
+        self.layoutName.addWidget(self.btnDistribute)
         self.verticalLayout.addLayout(self.layoutName)
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem3)
+        self.label = QtWidgets.QLabel(Form)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.label.setFont(font)
+        self.label.setObjectName("label")
+        self.horizontalLayout.addWidget(self.label)
+        self.lblMemberCount = QtWidgets.QLabel(Form)
+        self.lblMemberCount.setObjectName("lblMemberCount")
+        self.horizontalLayout.addWidget(self.lblMemberCount)
+        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem4)
+        self.verticalLayout.addLayout(self.horizontalLayout)
         self.verticalLayout_3 = QtWidgets.QVBoxLayout()
         self.verticalLayout_3.setSpacing(0)
         self.verticalLayout_3.setObjectName("verticalLayout_3")
@@ -59,21 +86,26 @@ class Ui_Form(object):
         self.label_2.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)
         self.label_2.setObjectName("label_2")
         self.layoutMembers.addWidget(self.label_2)
-        spacerItem2 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
-        self.layoutMembers.addItem(spacerItem2)
+        spacerItem5 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
+        self.layoutMembers.addItem(spacerItem5)
         self.verticalLayout_3.addLayout(self.layoutMembers)
         self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
         self.horizontalLayout_4.setObjectName("horizontalLayout_4")
-        spacerItem3 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
-        self.horizontalLayout_4.addItem(spacerItem3)
-        self.editNewPerson = QtWidgets.QLineEdit(Form)
-        self.editNewPerson.setObjectName("editNewPerson")
-        self.horizontalLayout_4.addWidget(self.editNewPerson)
+        spacerItem6 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_4.addItem(spacerItem6)
+        self.editNewMemberName = QtWidgets.QLineEdit(Form)
+        self.editNewMemberName.setObjectName("editNewMemberName")
+        self.horizontalLayout_4.addWidget(self.editNewMemberName)
+        self.editNewMemberSurname = QtWidgets.QLineEdit(Form)
+        self.editNewMemberSurname.setText("")
+        self.editNewMemberSurname.setObjectName("editNewMemberSurname")
+        self.horizontalLayout_4.addWidget(self.editNewMemberSurname)
         self.btnAddNew = QtWidgets.QPushButton(Form)
+        self.btnAddNew.setDefault(False)
         self.btnAddNew.setObjectName("btnAddNew")
         self.horizontalLayout_4.addWidget(self.btnAddNew)
-        spacerItem4 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
-        self.horizontalLayout_4.addItem(spacerItem4)
+        spacerItem7 = QtWidgets.QSpacerItem(80, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout_4.addItem(spacerItem7)
         self.verticalLayout_3.addLayout(self.horizontalLayout_4)
         self.verticalLayout.addLayout(self.verticalLayout_3)
 
@@ -86,7 +118,11 @@ class Ui_Form(object):
         self.lblName.setText(_translate("Form", "Group Name"))
         self.btnChangeName.setText(_translate("Form", "Edit"))
         self.btnDelete.setText(_translate("Form", "Delete"))
+        self.btnDistribute.setText(_translate("Form", "Rozdělit"))
+        self.label.setText(_translate("Form", "PoÄŤet ÄŤlenĹŻ:"))
+        self.lblMemberCount.setText(_translate("Form", "0"))
         self.label_2.setText(_translate("Form", "Členové:"))
-        self.editNewPerson.setPlaceholderText(_translate("Form", "Jméno příjmení"))
-        self.btnAddNew.setText(_translate("Form", "Vytvořit"))
+        self.editNewMemberName.setPlaceholderText(_translate("Form", "Jméno"))
+        self.editNewMemberSurname.setPlaceholderText(_translate("Form", "Příjmení"))
+        self.btnAddNew.setText(_translate("Form", "Přidat"))
 
diff --git a/Implementace/windows/qt/distributionsetup.ui b/Implementace/windows/qt/distributionsetup.ui
new file mode 100644
index 0000000..1dce6ec
--- /dev/null
+++ b/Implementace/windows/qt/distributionsetup.ui
@@ -0,0 +1,353 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>622</width>
+    <height>526</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_2">
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <property name="spacing">
+      <number>0</number>
+     </property>
+     <item>
+      <widget class="QLabel" name="lblHeader">
+       <property name="font">
+        <font>
+         <pointsize>15</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="text">
+        <string>Rozdělení skupiny</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+       <property name="margin">
+        <number>5</number>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="lblGroupName">
+       <property name="font">
+        <font>
+         <pointsize>10</pointsize>
+         <weight>50</weight>
+         <bold>false</bold>
+        </font>
+       </property>
+       <property name="text">
+        <string>GroupName</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="lblMemberCount">
+       <property name="text">
+        <string>(x ÄŤlenĹŻ)</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_4">
+     <item>
+      <spacer name="horizontalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeType">
+        <enum>QSizePolicy::Preferred</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_4">
+       <item>
+        <layout class="QGridLayout" name="gridLayout">
+         <property name="verticalSpacing">
+          <number>6</number>
+         </property>
+         <item row="0" column="1">
+          <spacer name="verticalSpacer">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>40</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item row="5" column="1">
+          <spacer name="verticalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>40</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item row="1" column="0">
+          <widget class="QLabel" name="label">
+           <property name="text">
+            <string>Počet týmů:</string>
+           </property>
+           <property name="buddy">
+            <cstring>spinTeamCount</cstring>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="0">
+          <widget class="QLabel" name="label_2">
+           <property name="text">
+            <string>Minimální velikost týmu:</string>
+           </property>
+           <property name="buddy">
+            <cstring>spinMinTeamSize</cstring>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1">
+          <widget class="QSpinBox" name="spinTeamCount">
+           <property name="minimumSize">
+            <size>
+             <width>40</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="1">
+          <widget class="QSpinBox" name="spinMinTeamSize">
+           <property name="minimumSize">
+            <size>
+             <width>40</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item row="3" column="0">
+          <widget class="QLabel" name="label_3">
+           <property name="text">
+            <string>Maximální velikost týmu:</string>
+           </property>
+           <property name="buddy">
+            <cstring>spinMaxTeamSize</cstring>
+           </property>
+          </widget>
+         </item>
+         <item row="4" column="0">
+          <widget class="QLabel" name="label_5">
+           <property name="text">
+            <string>Preferovat:</string>
+           </property>
+           <property name="buddy">
+            <cstring>comboPrefer</cstring>
+           </property>
+          </widget>
+         </item>
+         <item row="3" column="1">
+          <widget class="QSpinBox" name="spinMaxTeamSize">
+           <property name="minimumSize">
+            <size>
+             <width>40</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item row="4" column="1">
+          <widget class="QComboBox" name="comboPrefer">
+           <item>
+            <property name="text">
+             <string>Nic</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Stejné týmy</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Nové týmy</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+         <item row="1" column="2">
+          <widget class="QCheckBox" name="cbIgnoreTeamCount">
+           <property name="text">
+            <string>ignorovat</string>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="2">
+          <widget class="QCheckBox" name="cbIgnoreMinSize">
+           <property name="text">
+            <string>ignorovat</string>
+           </property>
+          </widget>
+         </item>
+         <item row="3" column="2">
+          <widget class="QCheckBox" name="cbIgnoreMaxSize">
+           <property name="text">
+            <string>ignorovat</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_3">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeType">
+        <enum>QSizePolicy::Preferred</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout">
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <widget class="QLabel" name="label_4">
+           <property name="text">
+            <string>OmezenĂ­:</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>40</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="btnAddRequirement">
+           <property name="text">
+            <string>+</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QWidget" name="widget" native="true">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <layout class="QHBoxLayout" name="placeTable">
+          <property name="spacing">
+           <number>0</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <spacer name="horizontalSpacer_4">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnDistribute">
+       <property name="text">
+        <string>Rozdělit</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Implementace/windows/qt/groupedit.ui b/Implementace/windows/qt/groupedit.ui
new file mode 100644
index 0000000..b250fb5
--- /dev/null
+++ b/Implementace/windows/qt/groupedit.ui
@@ -0,0 +1,301 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>748</width>
+    <height>590</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QHBoxLayout" name="layoutName">
+     <property name="sizeConstraint">
+      <enum>QLayout::SetMaximumSize</enum>
+     </property>
+     <item>
+      <spacer name="horizontalSpacer_2">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeType">
+        <enum>QSizePolicy::Expanding</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_8">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeType">
+        <enum>QSizePolicy::Fixed</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>175</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QLabel" name="lblName">
+       <property name="font">
+        <font>
+         <pointsize>20</pointsize>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="text">
+        <string>Group Name</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnChangeName">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>50</width>
+         <height>16777215</height>
+        </size>
+       </property>
+       <property name="text">
+        <string>Edit</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnDelete">
+       <property name="maximumSize">
+        <size>
+         <width>50</width>
+         <height>16777215</height>
+        </size>
+       </property>
+       <property name="text">
+        <string>Delete</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="btnDistribute">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>Rozdělit</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <spacer name="horizontalSpacer_3">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="font">
+        <font>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="text">
+        <string>PoÄŤet ÄŤlenĹŻ:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="lblMemberCount">
+       <property name="text">
+        <string>0</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_7">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <property name="spacing">
+      <number>0</number>
+     </property>
+     <item>
+      <layout class="QHBoxLayout" name="layoutMembers">
+       <item>
+        <widget class="QLabel" name="label_2">
+         <property name="minimumSize">
+          <size>
+           <width>80</width>
+           <height>0</height>
+          </size>
+         </property>
+         <property name="maximumSize">
+          <size>
+           <width>80</width>
+           <height>16777215</height>
+          </size>
+         </property>
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>Členové:</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignHCenter|Qt::AlignTop</set>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer_4">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeType">
+          <enum>QSizePolicy::Maximum</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>80</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_4">
+       <item>
+        <spacer name="horizontalSpacer_5">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeType">
+          <enum>QSizePolicy::Fixed</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>80</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="editNewMemberName">
+         <property name="placeholderText">
+          <string>Jméno</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLineEdit" name="editNewMemberSurname">
+         <property name="text">
+          <string/>
+         </property>
+         <property name="placeholderText">
+          <string>Příjmení</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="btnAddNew">
+         <property name="text">
+          <string>Přidat</string>
+         </property>
+         <property name="default">
+          <bool>false</bool>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer_6">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeType">
+          <enum>QSizePolicy::Maximum</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>80</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Implementace/windows/qt/grouptable.ui b/Implementace/windows/qt/grouptable.ui
new file mode 100644
index 0000000..31f517e
--- /dev/null
+++ b/Implementace/windows/qt/grouptable.ui
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <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>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Implementace/windows/qt/main.cpp b/Implementace/windows/qt/main.cpp
new file mode 100644
index 0000000..b48f94e
--- /dev/null
+++ b/Implementace/windows/qt/main.cpp
@@ -0,0 +1,11 @@
+#include "mainwindow.h"
+#include <QApplication>
+
+int main(int argc, char *argv[])
+{
+    QApplication a(argc, argv);
+    MainWindow w;
+    w.show();
+
+    return a.exec();
+}
diff --git a/Implementace/windows/qt/mainwindow.cpp b/Implementace/windows/qt/mainwindow.cpp
new file mode 100644
index 0000000..49d64fc
--- /dev/null
+++ b/Implementace/windows/qt/mainwindow.cpp
@@ -0,0 +1,14 @@
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+
+MainWindow::MainWindow(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::MainWindow)
+{
+    ui->setupUi(this);
+}
+
+MainWindow::~MainWindow()
+{
+    delete ui;
+}
diff --git a/Implementace/windows/qt/mainwindow.h b/Implementace/windows/qt/mainwindow.h
new file mode 100644
index 0000000..a3948a9
--- /dev/null
+++ b/Implementace/windows/qt/mainwindow.h
@@ -0,0 +1,22 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+
+namespace Ui {
+class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    explicit MainWindow(QWidget *parent = 0);
+    ~MainWindow();
+
+private:
+    Ui::MainWindow *ui;
+};
+
+#endif // MAINWINDOW_H
diff --git a/Implementace/windows/qt/qt.pro b/Implementace/windows/qt/qt.pro
index b762e13..87d47bb 100644
--- a/Implementace/windows/qt/qt.pro
+++ b/Implementace/windows/qt/qt.pro
@@ -32,4 +32,6 @@ FORMS    += mainwindow.ui \
     groupoverview.ui \
     groupedit.ui \
     grouptable.ui \
-    table.ui
+    table.ui \
+    distributionsetup.ui \
+    requirementdialog.ui
diff --git a/Implementace/windows/qt/qt.pro.user b/Implementace/windows/qt/qt.pro.user
index 33848c7..6d06a35 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-27T21:55:18. -->
+<!-- Written by QtCreator 4.2.1, 2017-04-03T00:28:41. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
diff --git a/Implementace/windows/qt/requirementdialog.ui b/Implementace/windows/qt/requirementdialog.ui
new file mode 100644
index 0000000..17a2ca3
--- /dev/null
+++ b/Implementace/windows/qt/requirementdialog.ui
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>585</width>
+    <height>471</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>NastavenĂ­ omezenĂ­</string>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <property name="spacing">
+      <number>10</number>
+     </property>
+     <item>
+      <widget class="QComboBox" name="comboWho"/>
+     </item>
+     <item>
+      <widget class="QComboBox" name="comboType">
+       <property name="font">
+        <font>
+         <weight>75</weight>
+         <bold>true</bold>
+        </font>
+       </property>
+       <property name="currentText">
+        <string>nesmĂ­</string>
+       </property>
+       <item>
+        <property name="text">
+         <string>nesmĂ­</string>
+        </property>
+       </item>
+       <item>
+        <property name="text">
+         <string>musĂ­</string>
+        </property>
+       </item>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>být v týmu s:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QWidget" name="widget" native="true">
+     <layout class="QVBoxLayout" name="placeTable">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>Dialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>Dialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/Implementace/windows/qt/table.ui b/Implementace/windows/qt/table.ui
new file mode 100644
index 0000000..434e2e6
--- /dev/null
+++ b/Implementace/windows/qt/table.ui
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QTableView" name="table">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <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>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/Implementace/windows/requirement_dialog.py b/Implementace/windows/requirement_dialog.py
new file mode 100644
index 0000000..28e3945
--- /dev/null
+++ b/Implementace/windows/requirement_dialog.py
@@ -0,0 +1,65 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'requirementdialog.ui'
+#
+# Created by: PyQt5 UI code generator 5.8.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+class Ui_Dialog(object):
+    def setupUi(self, Dialog):
+        Dialog.setObjectName("Dialog")
+        Dialog.setWindowModality(QtCore.Qt.ApplicationModal)
+        Dialog.resize(585, 471)
+        Dialog.setModal(True)
+        self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.horizontalLayout = QtWidgets.QHBoxLayout()
+        self.horizontalLayout.setSpacing(10)
+        self.horizontalLayout.setObjectName("horizontalLayout")
+        self.comboWho = QtWidgets.QComboBox(Dialog)
+        self.comboWho.setObjectName("comboWho")
+        self.horizontalLayout.addWidget(self.comboWho)
+        self.comboType = QtWidgets.QComboBox(Dialog)
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.comboType.setFont(font)
+        self.comboType.setObjectName("comboType")
+        self.comboType.addItem("")
+        self.comboType.addItem("")
+        self.horizontalLayout.addWidget(self.comboType)
+        self.label = QtWidgets.QLabel(Dialog)
+        self.label.setObjectName("label")
+        self.horizontalLayout.addWidget(self.label)
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem)
+        self.verticalLayout.addLayout(self.horizontalLayout)
+        self.widget = QtWidgets.QWidget(Dialog)
+        self.widget.setObjectName("widget")
+        self.placeTable = QtWidgets.QVBoxLayout(self.widget)
+        self.placeTable.setContentsMargins(0, 0, 0, 0)
+        self.placeTable.setSpacing(0)
+        self.placeTable.setObjectName("placeTable")
+        self.verticalLayout.addWidget(self.widget)
+        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
+        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
+        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
+        self.buttonBox.setObjectName("buttonBox")
+        self.verticalLayout.addWidget(self.buttonBox)
+
+        self.retranslateUi(Dialog)
+        self.buttonBox.accepted.connect(Dialog.accept)
+        self.buttonBox.rejected.connect(Dialog.reject)
+        QtCore.QMetaObject.connectSlotsByName(Dialog)
+
+    def retranslateUi(self, Dialog):
+        _translate = QtCore.QCoreApplication.translate
+        Dialog.setWindowTitle(_translate("Dialog", "NastavenĂ­ omezenĂ­"))
+        self.comboType.setCurrentText(_translate("Dialog", "nesmĂ­"))
+        self.comboType.setItemText(0, _translate("Dialog", "nesmĂ­"))
+        self.comboType.setItemText(1, _translate("Dialog", "musĂ­"))
+        self.label.setText(_translate("Dialog", "být v týmu s:"))
+
diff --git a/Implementace/windows/table.py b/Implementace/windows/table.py
index 057d272..ae3d88d 100644
--- a/Implementace/windows/table.py
+++ b/Implementace/windows/table.py
@@ -12,11 +12,21 @@ class Ui_Form(object):
     def setupUi(self, Form):
         Form.setObjectName("Form")
         Form.resize(400, 300)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
+        Form.setSizePolicy(sizePolicy)
         self.verticalLayout = QtWidgets.QVBoxLayout(Form)
         self.verticalLayout.setContentsMargins(0, 0, 0, 0)
         self.verticalLayout.setSpacing(0)
         self.verticalLayout.setObjectName("verticalLayout")
         self.table = QtWidgets.QTableView(Form)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.table.sizePolicy().hasHeightForWidth())
+        self.table.setSizePolicy(sizePolicy)
         self.table.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
         self.table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
         self.table.setShowGrid(False)
-- 
GitLab