diff --git a/src/wargame_campaign/controller/controller.py b/src/wargame_campaign/controller/controller.py index 5f77d49..a9869e5 100644 --- a/src/wargame_campaign/controller/controller.py +++ b/src/wargame_campaign/controller/controller.py @@ -1,15 +1,34 @@ +from PyQt6.QtWidgets import QMessageBox, QDialog + +from wargame_campaign.view.view import PlayerDialog + class Controller: def __init__(self, model, view): self.model = model self.view = view self.__connect() - + self.refresh_players_view() def __connect(self): - # self.view.players_view.btn_add.clicked.connect(self.add_player) + self.view.addPlayerBtn.clicked.connect(self.add_player) pass - def add_player(self): - print(f"test") + def refresh_players_view(self): + players = self.model.get_all_players() + self.view.display_players(players) + def add_player(self): + dialog = PlayerDialog(self.view) + result = dialog.exec() # modal blocking dialog + if result == QDialog.DialogCode.Accepted: + name = dialog.get_player_name() + if not name: + QMessageBox.warning( + self.view, + "Invalid name", + "Player name cannot be empty." + ) + return + self.model.add_player(name) + self.refresh_players_view() \ No newline at end of file diff --git a/src/wargame_campaign/model/model.py b/src/wargame_campaign/model/model.py index 2065b9e..494f432 100644 --- a/src/wargame_campaign/model/model.py +++ b/src/wargame_campaign/model/model.py @@ -9,6 +9,7 @@ class Model: self.players = {} data_file_path = Path("data/warmachron.json") self.load_data(data_file_path) + self.save_data(data_file_path) def load_data(self, data_file_path): if not data_file_path.exists() or data_file_path.stat().st_size == 0: @@ -17,10 +18,10 @@ class Model: with open(data_file_path, "r", encoding="utf-8") as f: data = json.load(f) for player in data["players"] : - print(f"player {player}") saved_player = Player.fromDict(player["id"], player['name']) self.players[saved_player.id] = saved_player for war in data["wars"]: + # placeholder pass except json.JSONDecodeError: raise RuntimeError("Data file is corrupted") @@ -28,13 +29,12 @@ class Model: def save_data(self, data_file_path): if data_file_path.exists(): shutil.copy(data_file_path, data_file_path.with_suffix(".json.bak")) - data = {} - data['verion'] = "1.0" + data['version'] = "1.0" data['players'] = [] - for player in self.players: + data['wars'] = [] + for player in self.players.values(): data['players'].append(player.toDict()) - with open(data_file_path, "w", encoding="utf-8") as f: json.dump(data, f, indent=2) @@ -53,3 +53,6 @@ class Model: def delete_player(self, id): del self.players[id] + def get_all_players(self) -> list[Player]: + return list(self.players.values()) + diff --git a/src/wargame_campaign/model/player_service.py b/src/wargame_campaign/model/player_service.py deleted file mode 100644 index c81f52e..0000000 --- a/src/wargame_campaign/model/player_service.py +++ /dev/null @@ -1,23 +0,0 @@ -from models.player import create_player -from model.repository import save_data - -def generate_player_id(players): - return f"P{len(players) + 1}" - -def add_player(data, name): - players = data["players"] - - if any(p["name"].lower() == name.lower() for p in players.values()): - raise ValueError("Player already exists") - - player_id = generate_player_id(players) - players[player_id] = create_player(player_id, name) - save_data(data) - -def update_player(data, player_id, new_name): - data["players"][player_id]["name"] = new_name - save_data(data) - -def delete_player(data, player_id): - del data["players"][player_id] - save_data(data) \ No newline at end of file diff --git a/src/wargame_campaign/view/resources/arrow-curve-180-left.png b/src/wargame_campaign/view/resources/arrow-curve-180-left.png new file mode 100644 index 0000000..2a361a0 Binary files /dev/null and b/src/wargame_campaign/view/resources/arrow-curve-180-left.png differ diff --git a/src/wargame_campaign/view/resources/arrow-curve.png b/src/wargame_campaign/view/resources/arrow-curve.png new file mode 100644 index 0000000..56776f5 Binary files /dev/null and b/src/wargame_campaign/view/resources/arrow-curve.png differ diff --git a/src/wargame_campaign/view/resources/cross.png b/src/wargame_campaign/view/resources/cross.png new file mode 100644 index 0000000..6b9fa6d Binary files /dev/null and b/src/wargame_campaign/view/resources/cross.png differ diff --git a/src/wargame_campaign/view/resources/disk--pencil.png b/src/wargame_campaign/view/resources/disk--pencil.png new file mode 100644 index 0000000..47bf953 Binary files /dev/null and b/src/wargame_campaign/view/resources/disk--pencil.png differ diff --git a/src/wargame_campaign/view/resources/disk.png b/src/wargame_campaign/view/resources/disk.png new file mode 100644 index 0000000..c619461 Binary files /dev/null and b/src/wargame_campaign/view/resources/disk.png differ diff --git a/src/wargame_campaign/view/resources/document.png b/src/wargame_campaign/view/resources/document.png new file mode 100644 index 0000000..75f92b0 Binary files /dev/null and b/src/wargame_campaign/view/resources/document.png differ diff --git a/src/wargame_campaign/view/resources/door--arrow.png b/src/wargame_campaign/view/resources/door--arrow.png new file mode 100644 index 0000000..de2db77 Binary files /dev/null and b/src/wargame_campaign/view/resources/door--arrow.png differ diff --git a/src/wargame_campaign/view/resources/folder.png b/src/wargame_campaign/view/resources/folder.png new file mode 100644 index 0000000..ada85c4 Binary files /dev/null and b/src/wargame_campaign/view/resources/folder.png differ diff --git a/src/wargame_campaign/view/resources/notebook--arrow.png b/src/wargame_campaign/view/resources/notebook--arrow.png new file mode 100644 index 0000000..07ca850 Binary files /dev/null and b/src/wargame_campaign/view/resources/notebook--arrow.png differ diff --git a/src/wargame_campaign/view/resources/pencil.png b/src/wargame_campaign/view/resources/pencil.png new file mode 100644 index 0000000..3ef2fa6 Binary files /dev/null and b/src/wargame_campaign/view/resources/pencil.png differ diff --git a/src/wargame_campaign/view/resources/plus.png b/src/wargame_campaign/view/resources/plus.png new file mode 100644 index 0000000..4ac1baf Binary files /dev/null and b/src/wargame_campaign/view/resources/plus.png differ diff --git a/src/wargame_campaign/view/resources/question.png b/src/wargame_campaign/view/resources/question.png new file mode 100644 index 0000000..30a4703 Binary files /dev/null and b/src/wargame_campaign/view/resources/question.png differ diff --git a/src/wargame_campaign/view/resources/swords-small.png b/src/wargame_campaign/view/resources/swords-small.png new file mode 100644 index 0000000..d76343b Binary files /dev/null and b/src/wargame_campaign/view/resources/swords-small.png differ diff --git a/src/wargame_campaign/view/resources/swords.png b/src/wargame_campaign/view/resources/swords.png new file mode 100644 index 0000000..b862d6e Binary files /dev/null and b/src/wargame_campaign/view/resources/swords.png differ diff --git a/src/wargame_campaign/view/resources/users.png b/src/wargame_campaign/view/resources/users.png new file mode 100644 index 0000000..a6aae04 Binary files /dev/null and b/src/wargame_campaign/view/resources/users.png differ diff --git a/src/wargame_campaign/view/resources/wargame_campaign_logo.png b/src/wargame_campaign/view/resources/wargame_campaign_logo.png new file mode 100644 index 0000000..b5ac134 Binary files /dev/null and b/src/wargame_campaign/view/resources/wargame_campaign_logo.png differ diff --git a/src/wargame_campaign/view/ui/ui_main_window.py b/src/wargame_campaign/view/ui/ui_main_window.py index f72092b..1b2a884 100644 --- a/src/wargame_campaign/view/ui/ui_main_window.py +++ b/src/wargame_campaign/view/ui/ui_main_window.py @@ -13,23 +13,151 @@ class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/wargame_campaign_logo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + MainWindow.setWindowIcon(icon) self.centralwidget = QtWidgets.QWidget(parent=MainWindow) self.centralwidget.setObjectName("centralwidget") + self.tabWidget = QtWidgets.QTabWidget(parent=self.centralwidget) + self.tabWidget.setGeometry(QtCore.QRect(16, 9, 771, 531)) + self.tabWidget.setObjectName("tabWidget") + self.playersTab = QtWidgets.QWidget() + self.playersTab.setObjectName("playersTab") + self.playersTable = QtWidgets.QTableWidget(parent=self.playersTab) + self.playersTable.setGeometry(QtCore.QRect(10, 60, 741, 431)) + self.playersTable.setObjectName("playersTable") + self.playersTable.setColumnCount(2) + self.playersTable.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.playersTable.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.playersTable.setHorizontalHeaderItem(1, item) + self.addPlayerBtn = QtWidgets.QPushButton(parent=self.playersTab) + self.addPlayerBtn.setGeometry(QtCore.QRect(20, 20, 75, 23)) + self.addPlayerBtn.setObjectName("addPlayerBtn") + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/users.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.playersTab, icon1, "") + self.warsTab = QtWidgets.QWidget() + self.warsTab.setObjectName("warsTab") + self.warsTree = QtWidgets.QTreeWidget(parent=self.warsTab) + self.warsTree.setGeometry(QtCore.QRect(10, 60, 211, 431)) + self.warsTree.setObjectName("warsTree") + self.warsTree.headerItem().setText(0, "1") + self.addWarBtn = QtWidgets.QPushButton(parent=self.warsTab) + self.addWarBtn.setGeometry(QtCore.QRect(20, 20, 75, 23)) + self.addWarBtn.setObjectName("addWarBtn") + self.addCampaignBtn = QtWidgets.QPushButton(parent=self.warsTab) + self.addCampaignBtn.setEnabled(False) + self.addCampaignBtn.setGeometry(QtCore.QRect(110, 20, 91, 23)) + self.addCampaignBtn.setObjectName("addCampaignBtn") + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/swords-small.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.warsTab, icon2, "") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(parent=MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22)) self.menubar.setObjectName("menubar") + self.menuFile = QtWidgets.QMenu(parent=self.menubar) + self.menuFile.setObjectName("menuFile") + self.menuEdit = QtWidgets.QMenu(parent=self.menubar) + self.menuEdit.setObjectName("menuEdit") + self.menuHelp = QtWidgets.QMenu(parent=self.menubar) + self.menuHelp.setObjectName("menuHelp") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) + self.actionNew = QtGui.QAction(parent=MainWindow) + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/document.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionNew.setIcon(icon3) + self.actionNew.setObjectName("actionNew") + self.actionOpen = QtGui.QAction(parent=MainWindow) + icon4 = QtGui.QIcon() + icon4.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/folder.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionOpen.setIcon(icon4) + self.actionOpen.setObjectName("actionOpen") + self.actionSave = QtGui.QAction(parent=MainWindow) + icon5 = QtGui.QIcon() + icon5.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/disk.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionSave.setIcon(icon5) + self.actionSave.setObjectName("actionSave") + self.actionExit = QtGui.QAction(parent=MainWindow) + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/door--arrow.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionExit.setIcon(icon6) + self.actionExit.setObjectName("actionExit") + self.actionUndo = QtGui.QAction(parent=MainWindow) + icon7 = QtGui.QIcon() + icon7.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/arrow-curve-180-left.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionUndo.setIcon(icon7) + self.actionUndo.setObjectName("actionUndo") + self.actionRedo = QtGui.QAction(parent=MainWindow) + icon8 = QtGui.QIcon() + icon8.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/arrow-curve.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionRedo.setIcon(icon8) + self.actionRedo.setObjectName("actionRedo") + self.actionAbout = QtGui.QAction(parent=MainWindow) + icon9 = QtGui.QIcon() + icon9.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/question.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionAbout.setIcon(icon9) + self.actionAbout.setObjectName("actionAbout") + self.actionExport = QtGui.QAction(parent=MainWindow) + self.actionExport.setEnabled(False) + icon10 = QtGui.QIcon() + icon10.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/notebook--arrow.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionExport.setIcon(icon10) + self.actionExport.setObjectName("actionExport") + self.actionSave_as = QtGui.QAction(parent=MainWindow) + icon11 = QtGui.QIcon() + icon11.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/disk--pencil.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionSave_as.setIcon(icon11) + self.actionSave_as.setObjectName("actionSave_as") + self.menuFile.addAction(self.actionNew) + self.menuFile.addAction(self.actionOpen) + self.menuFile.addAction(self.actionSave) + self.menuFile.addAction(self.actionSave_as) + self.menuFile.addSeparator() + self.menuFile.addAction(self.actionExport) + self.menuFile.addSeparator() + self.menuFile.addAction(self.actionExit) + self.menuEdit.addAction(self.actionUndo) + self.menuEdit.addAction(self.actionRedo) + self.menuHelp.addAction(self.actionAbout) + self.menubar.addAction(self.menuFile.menuAction()) + self.menubar.addAction(self.menuEdit.menuAction()) + self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) + MainWindow.setWindowTitle(_translate("MainWindow", "Wargame campaign")) + item = self.playersTable.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Name")) + item = self.playersTable.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "ID")) + self.addPlayerBtn.setText(_translate("MainWindow", "Add player")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.playersTab), _translate("MainWindow", "Players")) + self.addWarBtn.setText(_translate("MainWindow", "Add war")) + self.addCampaignBtn.setText(_translate("MainWindow", "Add Campaign")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.warsTab), _translate("MainWindow", "Wars")) + self.menuFile.setTitle(_translate("MainWindow", "File")) + self.menuEdit.setTitle(_translate("MainWindow", "Edit")) + self.menuHelp.setTitle(_translate("MainWindow", "Help")) + self.actionNew.setText(_translate("MainWindow", "New")) + self.actionNew.setShortcut(_translate("MainWindow", "Ctrl+N")) + self.actionOpen.setText(_translate("MainWindow", "Open")) + self.actionSave.setText(_translate("MainWindow", "Save")) + self.actionExit.setText(_translate("MainWindow", "Exit")) + self.actionUndo.setText(_translate("MainWindow", "Undo")) + self.actionRedo.setText(_translate("MainWindow", "Redo")) + self.actionAbout.setText(_translate("MainWindow", "About")) + self.actionExport.setText(_translate("MainWindow", "Export")) + self.actionSave_as.setText(_translate("MainWindow", "Save as...")) if __name__ == "__main__": diff --git a/src/wargame_campaign/view/ui/ui_main_window.ui b/src/wargame_campaign/view/ui/ui_main_window.ui index 7bff7e1..d68e721 100644 --- a/src/wargame_campaign/view/ui/ui_main_window.ui +++ b/src/wargame_campaign/view/ui/ui_main_window.ui @@ -11,20 +11,249 @@ - MainWindow + Wargame campaign - + + + ../resources/wargame_campaign_logo.png../resources/wargame_campaign_logo.png + + + + + + 16 + 9 + 771 + 531 + + + + 1 + + + + + ../resources/users.png../resources/users.png + + + Players + + + + + 10 + 60 + 741 + 431 + + + + + Name + + + + + ID + + + + + + + 20 + 20 + 75 + 23 + + + + Add player + + + + + + + ../resources/swords-small.png../resources/swords-small.png + + + Wars + + + + + 10 + 60 + 211 + 431 + + + + + 1 + + + + + + + 20 + 20 + 75 + 23 + + + + Add war + + + + + false + + + + 110 + 20 + 91 + 23 + + + + Add Campaign + + + + + 0 0 800 - 21 + 22 + + + File + + + + + + + + + + + + + Edit + + + + + + + Help + + + + + + + + + + ../resources/document.png../resources/document.png + + + New + + + Ctrl+N + + + + + + ../resources/folder.png../resources/folder.png + + + Open + + + + + + ../resources/disk.png../resources/disk.png + + + Save + + + + + + ../resources/door--arrow.png../resources/door--arrow.png + + + Exit + + + + + + ../resources/arrow-curve-180-left.png../resources/arrow-curve-180-left.png + + + Undo + + + + + + ../resources/arrow-curve.png../resources/arrow-curve.png + + + Redo + + + + + + ../resources/question.png../resources/question.png + + + About + + + + + false + + + + ../resources/notebook--arrow.png../resources/notebook--arrow.png + + + Export + + + + + + ../resources/disk--pencil.png../resources/disk--pencil.png + + + Save as... + + diff --git a/src/wargame_campaign/view/ui/ui_player_dialog.py b/src/wargame_campaign/view/ui/ui_player_dialog.py new file mode 100644 index 0000000..5353e22 --- /dev/null +++ b/src/wargame_campaign/view/ui/ui_player_dialog.py @@ -0,0 +1,50 @@ +# Form implementation generated from reading ui file '.\src\wargame_campaign\view\ui\ui_player_dialog.ui' +# +# Created by: PyQt6 UI code generator 6.7.1 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_playerDialog(object): + def setupUi(self, playerDialog): + playerDialog.setObjectName("playerDialog") + playerDialog.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal) + playerDialog.resize(378, 98) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(".\\src\\wargame_campaign\\view\\ui\\../resources/wargame_campaign_logo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + playerDialog.setWindowIcon(icon) + self.buttonBox = QtWidgets.QDialogButtonBox(parent=playerDialog) + self.buttonBox.setGeometry(QtCore.QRect(10, 60, 341, 32)) + self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setObjectName("buttonBox") + self.label = QtWidgets.QLabel(parent=playerDialog) + self.label.setGeometry(QtCore.QRect(10, 20, 47, 14)) + self.label.setObjectName("label") + self.playerName = QtWidgets.QLineEdit(parent=playerDialog) + self.playerName.setGeometry(QtCore.QRect(60, 20, 113, 20)) + self.playerName.setObjectName("playerName") + + self.retranslateUi(playerDialog) + self.buttonBox.accepted.connect(playerDialog.accept) # type: ignore + self.buttonBox.rejected.connect(playerDialog.reject) # type: ignore + QtCore.QMetaObject.connectSlotsByName(playerDialog) + + def retranslateUi(self, playerDialog): + _translate = QtCore.QCoreApplication.translate + playerDialog.setWindowTitle(_translate("playerDialog", "Player")) + self.label.setText(_translate("playerDialog", "Name:")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + playerDialog = QtWidgets.QDialog() + ui = Ui_playerDialog() + ui.setupUi(playerDialog) + playerDialog.show() + sys.exit(app.exec()) diff --git a/src/wargame_campaign/view/ui/ui_player_dialog.ui b/src/wargame_campaign/view/ui/ui_player_dialog.ui new file mode 100644 index 0000000..029c92b --- /dev/null +++ b/src/wargame_campaign/view/ui/ui_player_dialog.ui @@ -0,0 +1,98 @@ + + + playerDialog + + + Qt::ApplicationModal + + + + 0 + 0 + 378 + 98 + + + + Player + + + + ../resources/wargame_campaign_logo.png../resources/wargame_campaign_logo.png + + + + + 10 + 60 + 341 + 32 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + 10 + 20 + 47 + 14 + + + + Name: + + + + + + 60 + 20 + 113 + 20 + + + + + + + + buttonBox + accepted() + playerDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + playerDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/wargame_campaign/view/view.py b/src/wargame_campaign/view/view.py index cf3c3ac..2898125 100644 --- a/src/wargame_campaign/view/view.py +++ b/src/wargame_campaign/view/view.py @@ -1,9 +1,29 @@ -from PyQt6 import uic, QtWidgets +from PyQt6 import QtWidgets +from PyQt6.QtWidgets import QDialog + from wargame_campaign.view.ui.ui_main_window import Ui_MainWindow +from wargame_campaign.view.ui.ui_player_dialog import Ui_playerDialog class View(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super(View, self).__init__(parent) self.setupUi(self) + def display_players(self, players: list): + table = self.playersTable + table.setRowCount(len(players)) + for row, player in enumerate(players): + table.setItem(row, 0, QtWidgets.QTableWidgetItem(player.name)) + table.setItem(row, 1, QtWidgets.QTableWidgetItem(player.id)) + + table.resizeColumnsToContents() + +class PlayerDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.ui = Ui_playerDialog() + self.ui.setupUi(self) + + def get_player_name(self) -> str: + return self.ui.playerName.text().strip()