From 4d56a90790a6587e042d27f637ed68b2ca232883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20R=C3=A9aux?= Date: Mon, 19 Jan 2026 11:16:23 +0100 Subject: [PATCH] rename app ; add new,open,save actions --- LICENSE | 4 +- Makefile | 6 +- README.md | 23 ++-- data/example.json | 36 +++--- main.py | 6 +- .../controller/__ini__.py | 0 src/warchron/controller/controller.py | 119 ++++++++++++++++++ .../model/__ini__.py | 0 .../model/model.py | 34 +++-- .../model/player.py | 0 .../model/repository.py | 0 .../view/__ini__.py | 0 .../view/resources/arrow-curve-180-left.png | Bin .../view/resources/arrow-curve.png | Bin .../view/resources/cross.png | Bin .../view/resources/disk--pencil.png | Bin .../view/resources/disk.png | Bin .../view/resources/document.png | Bin .../view/resources/door--arrow.png | Bin .../view/resources/folder.png | Bin .../view/resources/notebook--arrow.png | Bin .../view/resources/pencil.png | Bin .../view/resources/plus.png | Bin .../view/resources/question.png | Bin src/warchron/view/resources/swords-small.png | Bin 0 -> 1129 bytes src/warchron/view/resources/swords.png | Bin 0 -> 26405 bytes .../view/resources/users.png | Bin .../view/resources/warchron_logo.png} | Bin .../view/ui/ui_main_window.py | 31 ++--- .../view/ui/ui_main_window.ui | 13 +- .../view/ui/ui_player_dialog.py | 4 +- .../view/ui/ui_player_dialog.ui | 2 +- src/warchron/view/view.py | 57 +++++++++ src/wargame_campaign/controller/controller.py | 34 ----- .../view/resources/swords-small.png | Bin 345 -> 0 bytes .../view/resources/swords.png | Bin 31151 -> 0 bytes src/wargame_campaign/view/view.py | 29 ----- 37 files changed, 271 insertions(+), 127 deletions(-) rename src/{wargame_campaign => warchron}/controller/__ini__.py (100%) create mode 100644 src/warchron/controller/controller.py rename src/{wargame_campaign => warchron}/model/__ini__.py (100%) rename src/{wargame_campaign => warchron}/model/model.py (63%) rename src/{wargame_campaign => warchron}/model/player.py (100%) rename src/{wargame_campaign => warchron}/model/repository.py (100%) rename src/{wargame_campaign => warchron}/view/__ini__.py (100%) rename src/{wargame_campaign => warchron}/view/resources/arrow-curve-180-left.png (100%) rename src/{wargame_campaign => warchron}/view/resources/arrow-curve.png (100%) rename src/{wargame_campaign => warchron}/view/resources/cross.png (100%) rename src/{wargame_campaign => warchron}/view/resources/disk--pencil.png (100%) rename src/{wargame_campaign => warchron}/view/resources/disk.png (100%) rename src/{wargame_campaign => warchron}/view/resources/document.png (100%) rename src/{wargame_campaign => warchron}/view/resources/door--arrow.png (100%) rename src/{wargame_campaign => warchron}/view/resources/folder.png (100%) rename src/{wargame_campaign => warchron}/view/resources/notebook--arrow.png (100%) rename src/{wargame_campaign => warchron}/view/resources/pencil.png (100%) rename src/{wargame_campaign => warchron}/view/resources/plus.png (100%) rename src/{wargame_campaign => warchron}/view/resources/question.png (100%) create mode 100644 src/warchron/view/resources/swords-small.png create mode 100644 src/warchron/view/resources/swords.png rename src/{wargame_campaign => warchron}/view/resources/users.png (100%) rename src/{wargame_campaign/view/resources/wargame_campaign_logo.png => warchron/view/resources/warchron_logo.png} (100%) rename src/{wargame_campaign => warchron}/view/ui/ui_main_window.py (78%) rename src/{wargame_campaign => warchron}/view/ui/ui_main_window.ui (95%) rename src/{wargame_campaign => warchron}/view/ui/ui_player_dialog.py (88%) rename src/{wargame_campaign => warchron}/view/ui/ui_player_dialog.ui (94%) create mode 100644 src/warchron/view/view.py delete mode 100644 src/wargame_campaign/controller/controller.py delete mode 100644 src/wargame_campaign/view/resources/swords-small.png delete mode 100644 src/wargame_campaign/view/resources/swords.png delete mode 100644 src/wargame_campaign/view/view.py diff --git a/LICENSE b/LICENSE index 5c6b8f0..9953916 100644 --- a/LICENSE +++ b/LICENSE @@ -208,7 +208,7 @@ If you develop a new program, and you want it to be of the greatest possible use To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. - Wargame_campain_app + warchron_app Copyright (C) 2025 maximator This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. @@ -221,7 +221,7 @@ Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - Wargame_campain_app Copyright (C) 2025 maximator + warchron_app Copyright (C) 2025 maximator This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. diff --git a/Makefile b/Makefile index d2f93c9..266e199 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ ress: - pyrcc5 .\src\wargame_campaign\view\resources\ui_ressources.qrc -o .\src\wargame_campaign\view\resources\ui_ressources_rc.py + pyrcc5 .\src\warchron\view\resources\ui_ressources.qrc -o .\src\warchron\view\resources\ui_ressources_rc.py installer : python -m PyInstaller .\main.spec @@ -14,11 +14,11 @@ ui: $(PY_FILES) # Pattern rule: .ui -> .py using pyuic5 $(UI_DIR)/%.py: $(UI_DIR)/%.ui - pyuic5 -x $< -o $@ --import-from wargame_campaign.view.resources + pyuic5 -x $< -o $@ --import-from warchron.view.resources # Function to generate UI file from given name _ui_generate: - pyuic6 -x .\src\wargame_campaign\view\ui\$(UI_NAME).ui -o .\src\wargame_campaign\view\ui\$(UI_NAME).py --import-from wargame_campaign.view.resources + pyuic6 -x .\src\warchron\view\ui\$(UI_NAME).ui -o .\src\warchron\view\ui\$(UI_NAME).py --import-from warchron.view.resources # Set default UI_NAME if not provided UI_NAME ?= ui_main_window diff --git a/README.md b/README.md index ec3c5cd..65b9e72 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,22 @@ -# Wargame_campaign_app +# WarChron -A simple local app to manage players and their scores throughout several organised games of a tabletop wargame. +A simple local app to track players' campaigns for tabletop wargames. ## Features ### Main logic -Manage a list of players to sign them up to be selectable for war(s) and campaign(s). -A year "war" contains several "campaign" events which contain several "battle" games organised in successive rounds. -Battle results determine campaign score which determines the war score. Wars are independent. +Manage a list of players to sign them up to be selectable for war(s) and campaign(s). +A "war" year contains several "campaign" events which contain several "battle" games organised in successive rounds. +Battle results determine campaign score which determines the war score. +Wars are independent. ### Design notes -Players are global identities -Influence tokens are scoped to a war -Campaign order enables historical tie-breakers -Effects are generic → future-proof +* Players are global identities +* Influence tokens are scoped to a war +* Campaign order enables historical tie-breakers +* Effects are generic → future-proof ## Installation @@ -27,8 +28,8 @@ Effects are generic → future-proof ### Setup ```bash -git clone /Wargame_campaign_app.git -cd Wargame_campaign_app +git clone /warchron_app.git +cd warchron_app python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -r requirements.txt diff --git a/data/example.json b/data/example.json index 10ae5b8..c12a44a 100644 --- a/data/example.json +++ b/data/example.json @@ -3,16 +3,24 @@ "players": [ { - "id" : "p1", - "name" :"Alice" + "id": "e7844fbb-8366-44e4-bb43-89b9eef6ef64", + "name": "Alice" }, { - "id" : "p2", - "name" :"Bob" + "id": "b7eebce7-cf04-40bc-b80c-400585adb3cd", + "name": "Bob" }, { - "id" : "p3", - "name" :"Charlie" + "id": "f87e6d53-30a2-4dd8-a359-d860404ef2ee", + "name": "Charlie" + }, + { + "id": "056011da-b0c7-4dc7-8b7c-14213a8df009", + "name": "Dave" + }, + { + "id": "50e83cb3-b828-4f1e-ad89-7644a84f3d8c", + "name": "Eve" } ], @@ -23,11 +31,11 @@ "year": 2025, "registered_players": { - "p1": { + "e7844fbb-8366-44e4-bb43-89b9eef6ef64": { "war_points": 0, "influence_tokens": 1 }, - "p2": { + "b7eebce7-cf04-40bc-b80c-400585adb3cd": { "war_points": 0, "influence_tokens": 0 } @@ -40,8 +48,8 @@ "order": 1, "month" : "June", "participants": { - "p1": { "campaign_points": 0 }, - "p2": { "campaign_points": 0 } + "e7844fbb-8366-44e4-bb43-89b9eef6ef64": { "campaign_points": 0 }, + "b7eebce7-cf04-40bc-b80c-400585adb3cd": { "campaign_points": 0 } }, "rounds": [ @@ -50,15 +58,15 @@ "sectors": ["North", "South"], "choices": { - "p1": { "primary": "North", "secondary": "South" }, - "p2": { "primary": "North", "secondary": "South" } + "e7844fbb-8366-44e4-bb43-89b9eef6ef64": { "primary": "North", "secondary": "South" }, + "b7eebce7-cf04-40bc-b80c-400585adb3cd": { "primary": "North", "secondary": "South" } }, "battles": [ { "sector": "North", - "players": ["p1", "p2"], - "winner": "p1", + "players": ["e7844fbb-8366-44e4-bb43-89b9eef6ef64", "b7eebce7-cf04-40bc-b80c-400585adb3cd"], + "winner": "e7844fbb-8366-44e4-bb43-89b9eef6ef64", "effects": { "campaign_points": 1, diff --git a/main.py b/main.py index ced14b9..938058b 100644 --- a/main.py +++ b/main.py @@ -4,9 +4,9 @@ sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), "src") from PyQt6.QtWidgets import QApplication -from wargame_campaign.view.view import View -from wargame_campaign.model.model import Model -from wargame_campaign.controller.controller import Controller +from warchron.view.view import View +from warchron.model.model import Model +from warchron.controller.controller import Controller if sys.version_info < (3, 12): raise RuntimeError("Python 3.12 or higher is required") diff --git a/src/wargame_campaign/controller/__ini__.py b/src/warchron/controller/__ini__.py similarity index 100% rename from src/wargame_campaign/controller/__ini__.py rename to src/warchron/controller/__ini__.py diff --git a/src/warchron/controller/controller.py b/src/warchron/controller/controller.py new file mode 100644 index 0000000..734f84d --- /dev/null +++ b/src/warchron/controller/controller.py @@ -0,0 +1,119 @@ +from pathlib import Path + +from PyQt6.QtWidgets import QMessageBox, QDialog + +from warchron.view.view import PlayerDialog + +class Controller: + def __init__(self, model, view): + self.model = model + self.view = view + self.current_file: Path | None = None + self.view.on_close_callback = self.on_app_close + self.is_dirty = False + self.__connect() + self.refresh_players_view() + + def __connect(self): + self.view.addPlayerBtn.clicked.connect(self.add_player) + self.view.actionExit.triggered.connect(self.view.close) + self.view.actionNew.triggered.connect(self.new) + self.view.actionOpen.triggered.connect(self.open_file) + self.view.actionSave.triggered.connect(self.save) + self.view.actionSave_as.triggered.connect(self.save_as) + + def refresh_players_view(self): + players = self.model.get_all_players() + self.view.display_players(players) + + def new(self): + if self.is_dirty: + reply = QMessageBox.question( + self.view, + "Unsaved changes", + "Discard current campaign?", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No + ) + if reply != QMessageBox.StandardButton.Yes: + return + self.model.new() + self.current_file = None + self.is_dirty = False + self.refresh_players_view() + self.update_window_title() + + def open_file(self): + if self.is_dirty: + reply = QMessageBox.question( + self.view, + "Unsaved changes", + "Discard current campaign?", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No + ) + if reply != QMessageBox.StandardButton.Yes: + return + path = self.view.ask_open_file() + if not path: + return + self.model.load(path) + self.current_file = path + self.is_dirty = False + self.refresh_players_view() + self.update_window_title() + + def on_app_close(self) -> bool: + if self.is_dirty: + reply = QMessageBox.question( + self.view, + "Unsaved changes", + "You have unsaved changes. Do you want to save before quitting?", + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No | QMessageBox.StandardButton.Cancel + ) + if reply == QMessageBox.StandardButton.Yes: + self.save() + elif reply == QMessageBox.StandardButton.Cancel: + return False + return True + + def save(self): + if not self.current_file: + self.save_as() + return + self.model.save(self.current_file) + self.is_dirty = False + self.update_window_title() + + def save_as(self): + path = self.view.ask_save_file() + if not path: + return + self.current_file = path + self.model.save(path) + self.is_dirty = False + self.update_window_title() + + def update_window_title(self): + base = "WarChron" + if self.current_file: + base += f" - {self.current_file.name}" + if self.is_dirty: + base = "*" + base + self.view.setWindowTitle(base) + + + 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.is_dirty = True + self.refresh_players_view() + self.update_window_title() diff --git a/src/wargame_campaign/model/__ini__.py b/src/warchron/model/__ini__.py similarity index 100% rename from src/wargame_campaign/model/__ini__.py rename to src/warchron/model/__ini__.py diff --git a/src/wargame_campaign/model/model.py b/src/warchron/model/model.py similarity index 63% rename from src/wargame_campaign/model/model.py rename to src/warchron/model/model.py index 494f432..ff88508 100644 --- a/src/wargame_campaign/model/model.py +++ b/src/warchron/model/model.py @@ -2,20 +2,30 @@ from pathlib import Path import json import shutil -from wargame_campaign.model.player import Player +from warchron.model.player import Player class Model: def __init__(self): 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: - pass # Create empty json + def new(self): + self.players.clear() + # self.wars.clear() + # self.campaigns.clear() + # self.rounds.clear() + + def load(self, path: Path): + self.players.clear() + self._load_data(path) + + def save(self, path: Path): + self._save_data(path) + + def _load_data(self, path: Path): + if not path.exists() or path.stat().st_size == 0: + return # Start empty try: - with open(data_file_path, "r", encoding="utf-8") as f: + with open(path, "r", encoding="utf-8") as f: data = json.load(f) for player in data["players"] : saved_player = Player.fromDict(player["id"], player['name']) @@ -26,16 +36,16 @@ class Model: except json.JSONDecodeError: raise RuntimeError("Data file is corrupted") - def save_data(self, data_file_path): - if data_file_path.exists(): - shutil.copy(data_file_path, data_file_path.with_suffix(".json.bak")) + def _save_data(self, path: Path): + if path.exists(): + shutil.copy(path, path.with_suffix(".json.bak")) data = {} data['version'] = "1.0" data['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: + with open(path, "w", encoding="utf-8") as f: json.dump(data, f, indent=2) def add_player(self, name): diff --git a/src/wargame_campaign/model/player.py b/src/warchron/model/player.py similarity index 100% rename from src/wargame_campaign/model/player.py rename to src/warchron/model/player.py diff --git a/src/wargame_campaign/model/repository.py b/src/warchron/model/repository.py similarity index 100% rename from src/wargame_campaign/model/repository.py rename to src/warchron/model/repository.py diff --git a/src/wargame_campaign/view/__ini__.py b/src/warchron/view/__ini__.py similarity index 100% rename from src/wargame_campaign/view/__ini__.py rename to src/warchron/view/__ini__.py diff --git a/src/wargame_campaign/view/resources/arrow-curve-180-left.png b/src/warchron/view/resources/arrow-curve-180-left.png similarity index 100% rename from src/wargame_campaign/view/resources/arrow-curve-180-left.png rename to src/warchron/view/resources/arrow-curve-180-left.png diff --git a/src/wargame_campaign/view/resources/arrow-curve.png b/src/warchron/view/resources/arrow-curve.png similarity index 100% rename from src/wargame_campaign/view/resources/arrow-curve.png rename to src/warchron/view/resources/arrow-curve.png diff --git a/src/wargame_campaign/view/resources/cross.png b/src/warchron/view/resources/cross.png similarity index 100% rename from src/wargame_campaign/view/resources/cross.png rename to src/warchron/view/resources/cross.png diff --git a/src/wargame_campaign/view/resources/disk--pencil.png b/src/warchron/view/resources/disk--pencil.png similarity index 100% rename from src/wargame_campaign/view/resources/disk--pencil.png rename to src/warchron/view/resources/disk--pencil.png diff --git a/src/wargame_campaign/view/resources/disk.png b/src/warchron/view/resources/disk.png similarity index 100% rename from src/wargame_campaign/view/resources/disk.png rename to src/warchron/view/resources/disk.png diff --git a/src/wargame_campaign/view/resources/document.png b/src/warchron/view/resources/document.png similarity index 100% rename from src/wargame_campaign/view/resources/document.png rename to src/warchron/view/resources/document.png diff --git a/src/wargame_campaign/view/resources/door--arrow.png b/src/warchron/view/resources/door--arrow.png similarity index 100% rename from src/wargame_campaign/view/resources/door--arrow.png rename to src/warchron/view/resources/door--arrow.png diff --git a/src/wargame_campaign/view/resources/folder.png b/src/warchron/view/resources/folder.png similarity index 100% rename from src/wargame_campaign/view/resources/folder.png rename to src/warchron/view/resources/folder.png diff --git a/src/wargame_campaign/view/resources/notebook--arrow.png b/src/warchron/view/resources/notebook--arrow.png similarity index 100% rename from src/wargame_campaign/view/resources/notebook--arrow.png rename to src/warchron/view/resources/notebook--arrow.png diff --git a/src/wargame_campaign/view/resources/pencil.png b/src/warchron/view/resources/pencil.png similarity index 100% rename from src/wargame_campaign/view/resources/pencil.png rename to src/warchron/view/resources/pencil.png diff --git a/src/wargame_campaign/view/resources/plus.png b/src/warchron/view/resources/plus.png similarity index 100% rename from src/wargame_campaign/view/resources/plus.png rename to src/warchron/view/resources/plus.png diff --git a/src/wargame_campaign/view/resources/question.png b/src/warchron/view/resources/question.png similarity index 100% rename from src/wargame_campaign/view/resources/question.png rename to src/warchron/view/resources/question.png diff --git a/src/warchron/view/resources/swords-small.png b/src/warchron/view/resources/swords-small.png new file mode 100644 index 0000000000000000000000000000000000000000..abd610f43a7749d208c6f9f63a73faf53d2c23b7 GIT binary patch literal 1129 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 literal 0 HcmV?d00001 diff --git a/src/wargame_campaign/view/resources/users.png b/src/warchron/view/resources/users.png similarity index 100% rename from src/wargame_campaign/view/resources/users.png rename to src/warchron/view/resources/users.png diff --git a/src/wargame_campaign/view/resources/wargame_campaign_logo.png b/src/warchron/view/resources/warchron_logo.png similarity index 100% rename from src/wargame_campaign/view/resources/wargame_campaign_logo.png rename to src/warchron/view/resources/warchron_logo.png diff --git a/src/wargame_campaign/view/ui/ui_main_window.py b/src/warchron/view/ui/ui_main_window.py similarity index 78% rename from src/wargame_campaign/view/ui/ui_main_window.py rename to src/warchron/view/ui/ui_main_window.py index 1b2a884..e5c8a37 100644 --- a/src/wargame_campaign/view/ui/ui_main_window.py +++ b/src/warchron/view/ui/ui_main_window.py @@ -1,4 +1,4 @@ -# Form implementation generated from reading ui file '.\src\wargame_campaign\view\ui\ui_main_window.ui' +# Form implementation generated from reading ui file '.\src\warchron\view\ui\ui_main_window.ui' # # Created by: PyQt6 UI code generator 6.7.1 # @@ -14,7 +14,7 @@ class Ui_MainWindow(object): 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) + icon.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/warchron_logo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) MainWindow.setWindowIcon(icon) self.centralwidget = QtWidgets.QWidget(parent=MainWindow) self.centralwidget.setObjectName("centralwidget") @@ -36,7 +36,7 @@ class Ui_MainWindow(object): 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) + icon1.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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") @@ -52,7 +52,7 @@ class Ui_MainWindow(object): 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) + icon2.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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) @@ -70,48 +70,48 @@ class Ui_MainWindow(object): 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) + icon3.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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) + icon4.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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) + icon5.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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) + icon6.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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) + icon7.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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) + icon8.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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) + icon9.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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) + icon10.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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) + icon11.addPixmap(QtGui.QPixmap(".\\src\\warchron\\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) @@ -135,7 +135,7 @@ class Ui_MainWindow(object): def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "Wargame campaign")) + MainWindow.setWindowTitle(_translate("MainWindow", "WarChron")) item = self.playersTable.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "Name")) item = self.playersTable.horizontalHeaderItem(1) @@ -151,8 +151,11 @@ class Ui_MainWindow(object): self.actionNew.setText(_translate("MainWindow", "New")) self.actionNew.setShortcut(_translate("MainWindow", "Ctrl+N")) self.actionOpen.setText(_translate("MainWindow", "Open")) + self.actionOpen.setShortcut(_translate("MainWindow", "Ctrl+O")) self.actionSave.setText(_translate("MainWindow", "Save")) + self.actionSave.setShortcut(_translate("MainWindow", "Ctrl+S")) self.actionExit.setText(_translate("MainWindow", "Exit")) + self.actionExit.setShortcut(_translate("MainWindow", "Ctrl+Shift+Q")) self.actionUndo.setText(_translate("MainWindow", "Undo")) self.actionRedo.setText(_translate("MainWindow", "Redo")) self.actionAbout.setText(_translate("MainWindow", "About")) diff --git a/src/wargame_campaign/view/ui/ui_main_window.ui b/src/warchron/view/ui/ui_main_window.ui similarity index 95% rename from src/wargame_campaign/view/ui/ui_main_window.ui rename to src/warchron/view/ui/ui_main_window.ui index d68e721..b88ad16 100644 --- a/src/wargame_campaign/view/ui/ui_main_window.ui +++ b/src/warchron/view/ui/ui_main_window.ui @@ -11,11 +11,11 @@ - Wargame campaign + WarChron - ../resources/wargame_campaign_logo.png../resources/wargame_campaign_logo.png + ../resources/warchron_logo.png../resources/warchron_logo.png @@ -187,6 +187,9 @@ Open + + Ctrl+O + @@ -196,6 +199,9 @@ Save + + Ctrl+S + @@ -205,6 +211,9 @@ Exit + + Ctrl+Shift+Q + diff --git a/src/wargame_campaign/view/ui/ui_player_dialog.py b/src/warchron/view/ui/ui_player_dialog.py similarity index 88% rename from src/wargame_campaign/view/ui/ui_player_dialog.py rename to src/warchron/view/ui/ui_player_dialog.py index 5353e22..2505608 100644 --- a/src/wargame_campaign/view/ui/ui_player_dialog.py +++ b/src/warchron/view/ui/ui_player_dialog.py @@ -1,4 +1,4 @@ -# Form implementation generated from reading ui file '.\src\wargame_campaign\view\ui\ui_player_dialog.ui' +# Form implementation generated from reading ui file '.\src\warchron\view\ui\ui_player_dialog.ui' # # Created by: PyQt6 UI code generator 6.7.1 # @@ -15,7 +15,7 @@ class Ui_playerDialog(object): 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) + icon.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/warchron_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)) diff --git a/src/wargame_campaign/view/ui/ui_player_dialog.ui b/src/warchron/view/ui/ui_player_dialog.ui similarity index 94% rename from src/wargame_campaign/view/ui/ui_player_dialog.ui rename to src/warchron/view/ui/ui_player_dialog.ui index 029c92b..6f2301f 100644 --- a/src/wargame_campaign/view/ui/ui_player_dialog.ui +++ b/src/warchron/view/ui/ui_player_dialog.ui @@ -18,7 +18,7 @@ - ../resources/wargame_campaign_logo.png../resources/wargame_campaign_logo.png + ../resources/warchron_logo.png../resources/warchron_logo.png diff --git a/src/warchron/view/view.py b/src/warchron/view/view.py new file mode 100644 index 0000000..7ca4f03 --- /dev/null +++ b/src/warchron/view/view.py @@ -0,0 +1,57 @@ +from pathlib import Path + +from PyQt6 import QtWidgets +from PyQt6.QtWidgets import QDialog, QFileDialog +from PyQt6.QtGui import QCloseEvent + +from warchron.view.ui.ui_main_window import Ui_MainWindow +from warchron.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) + self.on_close_callback = None + + 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() + + def closeEvent(self, event: QCloseEvent): + if self.on_close_callback: + proceed = self.on_close_callback() + if not proceed: + event.ignore() + return + event.accept() + + def ask_open_file(self) -> Path | None: + filename, _ = QFileDialog.getOpenFileName( + self, + "Open war history", + "", + "WarChron files (*.json)" + ) + return Path(filename) if filename else None + + def ask_save_file(self) -> Path | None: + filename, _ = QFileDialog.getSaveFileName( + self, + "Save war history", + "", + "WarChron files (*.json)" + ) + return Path(filename) if filename else None + +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() diff --git a/src/wargame_campaign/controller/controller.py b/src/wargame_campaign/controller/controller.py deleted file mode 100644 index a9869e5..0000000 --- a/src/wargame_campaign/controller/controller.py +++ /dev/null @@ -1,34 +0,0 @@ -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.addPlayerBtn.clicked.connect(self.add_player) - pass - - 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/view/resources/swords-small.png b/src/wargame_campaign/view/resources/swords-small.png deleted file mode 100644 index d76343b7475c537c086f96323065cf5601652533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 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 HanSz(OTNm7 diff --git a/src/wargame_campaign/view/view.py b/src/wargame_campaign/view/view.py deleted file mode 100644 index 2898125..0000000 --- a/src/wargame_campaign/view/view.py +++ /dev/null @@ -1,29 +0,0 @@ -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()