aboutsummaryrefslogtreecommitdiff
path: root/gui/tab_teams.py
diff options
context:
space:
mode:
Diffstat (limited to 'gui/tab_teams.py')
-rw-r--r--gui/tab_teams.py204
1 files changed, 200 insertions, 4 deletions
diff --git a/gui/tab_teams.py b/gui/tab_teams.py
index a96b3e2..0335bab 100644
--- a/gui/tab_teams.py
+++ b/gui/tab_teams.py
@@ -1,13 +1,209 @@
import os
+import mariadb
from PySide6.QtGui import *
from PySide6.QtWidgets import *
+from PySide6.QtCore import *
+from PySide6.QtCore import Qt
+
+from split_view_layout import *
+
+from dataclasses import dataclass
+
+@dataclass
+class DBTeam():
+ id: int = 0
+ name: str = ""
+
+class TeamsModel(QAbstractTableModel):
+ cursor: mariadb.Cursor
+ calendar_id: int = 1
+
+ _header = ["team name"]
+ _data: [DBTeam] = []
+
+ def update(self):
+ self.beginResetModel()
+ self.cursor.execute("select `ID`, `teamName` from `teams` where `calendarID` = ?", (self.calendar_id,))
+ self._data = list()
+ for result in self.cursor.fetchall():
+ self._data.append(DBTeam(*result))
+ self.endResetModel()
+
+ def __init__(self, cursor):
+ super().__init__()
+ self.cursor = cursor
+ self.update()
+
+ def rowCount(self, index=0):
+ return len(self._data)
+
+ def columnCount(self, index=0):
+ return len(self._header)
+
+ def headerData(self, section, orientation, role):
+ if role == Qt.DisplayRole:
+ if orientation == Qt.Horizontal:
+ return self._header[section]
+ else:
+ return self._data[section].id
+
+ def data(self, index, role):
+ if role == Qt.DisplayRole:
+ team = self._data[index.row()]
+ return (
+ team.name,
+ )[index.column()]
+
+class TeamBrowser(QTableView):
+ model_table: TeamsModel
+ model_proxy: QSortFilterProxyModel
+ parent_update_fn: callable
+ selected_team_id: int = 1
+ ignore_update: bool = False
+ temp_selection_index: int = 0
+
+ def update(self, cascade=True):
+ self.model_table.update()
+ self.ignore_update = True
+ self.selectRow(self.temp_selection_index)
+ self.ignore_update = False
+
+ def parent_update(self):
+ if self.parent_update_fn != None:
+ self.parent_update_fn()
+
+ def set_parent_update(self, fn):
+ self.parent_update_fn = fn
+
+ def on_selection(self):
+ if self.ignore_update: return
+ rows = self.selectionModel().selectedRows()
+ if len(rows) == 0: return
+ row = rows[0].row()
+ self.temp_selection_index = row
+ index = self.model_proxy.mapToSource(self.model_proxy.index(row, 0))
+ new_team_id = self.model_table.headerData(index.row(), Qt.Vertical, Qt.DisplayRole)
+ if self.selected_team_id == new_team_id: return
+ self.selected_team_id = new_team_id
+ self.parent_update()
+
+ def __init__(self, cursor: mariadb.Cursor, parent=None):
+ super(TeamBrowser, self).__init__(parent)
+
+ self.cursor = cursor
+
+ self.setSelectionBehavior(QAbstractItemView.SelectRows)
+ self.model_table = TeamsModel(self.cursor)
+ self.model_proxy = QSortFilterProxyModel()
+ self.model_proxy.setSourceModel(self.model_table)
+ self.setModel(self.model_proxy)
+ self.setSortingEnabled(True)
+ self.selectionModel().selectionChanged.connect(self.on_selection)
+ self.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
+
+class TeamDetailsWidget(QWidget):
+ cursor: mariadb.Cursor
+ parent_update_fn: callable
+ selected_team_id: int = 1
+
+ team_members: QFormLayout
+ buttons: [QPushButton]
+ layout: QVBoxLayout
+ new_member_picker: QComboBox
+
+ def member_remove(self):
+ id = self.sender().property("id")
+ self.cursor.execute("delete from `formula1`.`teamsmember` where `memberID` = ? and `teamsID` = ?", (id,self.selected_team_id,))
+ self.update(False)
+
+ def member_add(self, id):
+ self.cursor.execute("insert into `formula1`.`teamsmember` (`memberID`, `teamsID`) values (?, ?)", (id,self.selected_team_id,))
+ self.update(False)
+
+ def update(self, cascade=True):
+ self.buttons = list()
+ for x in range(self.team_members.rowCount()):
+ self.team_members.removeRow(0)
+ self.cursor.execute("select member.ID, firstName, middleName, lastName from member join teamsmember on teamsmember.memberID = member.ID where teamsmember.teamsID = ?", (self.selected_team_id,))
+ for member in self.cursor.fetchall():
+ id = member[0]
+ name = " ".join(member[1:4])
+ remove_button = QPushButton("remove")
+ remove_button.setProperty("id", id)
+ remove_button.clicked.connect(self.member_remove)
+ self.team_members.addRow(QLabel(name), remove_button)
+
+ self.cursor.execute("select member.ID, firstName, middleName, lastName from member")
+ self.new_member_picker.clear()
+ for member in self.cursor.fetchall():
+ self.new_member_picker.addItem(" ".join(member[1:4]), member[0])
+
+ if cascade == False: return
+ self.nationality_editor.update()
+
+ def parent_update(self):
+ if self.parent_update_fn != None:
+ self.parent_update_fn()
+
+ def set_team_id(self, id):
+ self.selected_team_id = id
+ self.update(False)
+
+ def set_parent_update(self, fn):
+ self.parent_update_fn = fn
+
+ def __init__(self, cursor: mariadb.Cursor, parent=None):
+ super(TeamDetailsWidget, self).__init__(parent)
+ self.cursor = cursor
+
+ self.layout = QVBoxLayout(self)
+ self.layout.setAlignment(Qt.AlignmentFlag.AlignTop)
+
+ self.layout.addWidget(QLabel("Team members"))
+
+ self.team_members = QFormLayout(self)
+ self.team_members.addRow("bernard", QPushButton("remove"))
+ self.layout.addLayout(self.team_members)
+
+ self.new_member_picker = QComboBox()
+ self.new_member_picker.setCurrentIndex(-1)
+ self.new_member_picker.setPlaceholderText("Add member...")
+ self.new_member_picker.currentIndexChanged.connect(lambda i: self.member_add(self.new_member_picker.itemData(i)))
+ self.layout.addWidget(self.new_member_picker)
+
+ self.setLayout(self.layout)
class TabTeams(QWidget):
- def __init__(self, parent=None):
+ layout: SplitViewLayout
+ cursor: mariadb.Cursor
+ selected_team_id: int = 1
+
+ team_browser: TeamBrowser
+ team_details: TeamDetailsWidget
+
+ def update(self, cascade=True):
+ print("update TabTeams")
+
+ if not cascade: return
+ self.team_browser.update(True)
+
+ def child_update(self):
+ self.selected_team_id = self.team_browser.selected_team_id
+ self.team_browser.update(False)
+ self.team_details.set_team_id(self.selected_team_id)
+
+ def __init__(self, cursor, parent=None):
super(TabTeams, self).__init__(parent)
+ self.layout = SplitViewLayout(self)
+ self.cursor = cursor
+
+ self.team_browser = TeamBrowser(self.cursor, self)
+ self.team_browser.set_parent_update(self.child_update)
+ self.layout.leftWidget(self.team_browser)
- layout = QFormLayout()
- layout.addWidget(QLabel("hoi"))
+ self.team_details = TeamDetailsWidget(self.cursor, self)
+ self.team_details.set_parent_update(self.child_update)
+ self.layout.rightWidget(self.team_details)
- self.setLayout(layout)
+ self.setLayout(self.layout)