diff --git a/example.json b/example.json
index e94efdd..6dba8a4 100644
--- a/example.json
+++ b/example.json
@@ -30,7 +30,7 @@
"name": "Llael War 2025",
"year": 2025,
- "entrants": {
+ "participants": {
"e7844fbb-8366-44e4-bb43-89b9eef6ef64": {
"war_points": 0,
"influence_tokens": 1
diff --git a/src/warchron/constants.py b/src/warchron/constants.py
new file mode 100644
index 0000000..1d431b6
--- /dev/null
+++ b/src/warchron/constants.py
@@ -0,0 +1,24 @@
+from enum import StrEnum
+from enum import Enum, auto
+
+from PyQt6.QtCore import Qt
+
+ROLE_TYPE = Qt.ItemDataRole.UserRole
+ROLE_ID = Qt.ItemDataRole.UserRole + 1
+
+class ItemType(StrEnum):
+ PLAYER = "player"
+ WAR = "war"
+ CAMPAIGN = "campaign"
+ ROUND = "round"
+ OBJECTIVE = "objective"
+ WAR_PARTICIPANT = "war_participant"
+
+class RefreshScope(Enum):
+ NONE = auto()
+ PLAYERS_LIST = auto()
+ WARS_TREE = auto()
+ WAR_DETAILS = auto()
+ CAMPAIGN_DETAILS = auto()
+ ROUND_DETAILS = auto()
+
diff --git a/src/warchron/controller/controller.py b/src/warchron/controller/controller.py
index 62c1397..af71bbd 100644
--- a/src/warchron/controller/controller.py
+++ b/src/warchron/controller/controller.py
@@ -5,7 +5,8 @@ from PyQt6.QtWidgets import QMessageBox, QDialog
from warchron.model.model import Model
from warchron.view.view import View
-from warchron.view.view import PlayerDialog, WarDialog, CampaignDialog
+from warchron.constants import ItemType, RefreshScope
+from warchron.view.view import PlayerDialog, WarDialog, CampaignDialog, ObjectiveDialog, ParticipantDialog
class Controller:
def __init__(self, model: Model, view: View):
@@ -34,6 +35,8 @@ class Controller:
self.view.actionSave_as.triggered.connect(self.save_as)
self.view.addPlayerBtn.clicked.connect(self.add_player)
self.view.addWarBtn.clicked.connect(self.add_war)
+ self.view.addObjectiveBtn.clicked.connect(self.add_objective)
+ self.view.addWarParticipantBtn.clicked.connect(self.add_war_participant)
self.view.on_edit_item = self.edit_item
self.view.on_delete_item = self.delete_item
@@ -50,6 +53,8 @@ class Controller:
elif reply == QMessageBox.StandardButton.Cancel:
return False
return True
+
+ # Menu bar methods
def new(self):
if self.is_dirty:
@@ -105,6 +110,8 @@ class Controller:
self.is_dirty = False
self.update_window_title()
+# Display methods
+
def update_window_title(self):
base = "WarChron"
if self.current_file:
@@ -121,32 +128,169 @@ class Controller:
def refresh_wars_view(self):
wars = self.model.get_all_wars()
- self.view.display_wars(wars)
+ self.view.display_wars_tree(wars)
- def refresh_views(self):
- current = self.view.get_current_tab()
- if current == "players":
- self.refresh_players_view()
- elif current == "wars":
- self.refresh_wars_view()
+ def _fill_war_details(self, war_id: str):
+ war = self.model.get_war(war_id)
+ self.view.show_war_details(name=war.name, year=war.year)
+ objectives = war.get_all_objectives()
+ self.view.display_war_objectives(objectives)
+ participants = war.get_all_war_participants()
+ participants_for_display = [
+ (self.model.get_player_name(p.id), p.faction, p.id)
+ for p in participants
+ ]
+ self.view.display_war_participants(participants_for_display)
+
+ def _fill_campaign_details(self, campaign_id: str):
+ camp = self.model.get_campaign(campaign_id)
+ self.view.show_campaign_details(name=camp.name, month=camp.month)
+
+ def _fill_round_details(self, round_id: str):
+ index = self.model.get_round_index(round_id)
+ self.view.show_round_details(index=index)
def on_tree_selection_changed(self, selection):
self.selected_war_id = None
self.selected_campaign_id = None
self.selected_round_id = None
if selection:
- if selection["type"] == "war":
- self.selected_war_id = selection["id"]
- elif selection["type"] == "campaign":
- self.selected_campaign_id = selection["id"]
- elif selection["type"] == "round":
- self.selected_round_id = selection["id"]
+ item_type = selection["type"]
+ item_id = selection["id"]
+ if item_type == ItemType.WAR:
+ self.selected_war_id = item_id
+ self.view.show_details(ItemType.WAR)
+ self._fill_war_details(item_id)
+ elif item_type == ItemType.CAMPAIGN:
+ self.selected_campaign_id = item_id
+ self.view.show_details(ItemType.CAMPAIGN)
+ self._fill_campaign_details(item_id)
+ elif item_type == ItemType.ROUND:
+ self.selected_round_id = item_id
+ self.view.show_details(ItemType.ROUND)
+ self._fill_round_details(item_id)
+ else:
+ self.view.show_details(None)
+ self.update_actions_state()
+ return
self.update_actions_state()
def update_actions_state(self):
self.view.set_add_campaign_enabled(self.selected_war_id is not None)
self.view.set_add_round_enabled(self.selected_campaign_id is not None)
+ def refresh(self, scope: RefreshScope):
+ match scope:
+ case RefreshScope.PLAYERS_LIST:
+ self.refresh_players_view()
+ case RefreshScope.WARS_TREE:
+ self.refresh_wars_view()
+ case RefreshScope.WAR_DETAILS:
+ if self.selected_war_id:
+ self.view.show_details(ItemType.WAR)
+ self._fill_war_details(self.selected_war_id)
+ case RefreshScope.CAMPAIGN_DETAILS:
+ if self.selected_campaign_id:
+ self.view.show_details(ItemType.CAMPAIGN)
+ self._fill_campaign_details(self.selected_campaign_id)
+ case RefreshScope.ROUND_DETAILS:
+ if self.selected_round_id:
+ self.view.show_details(ItemType.ROUND)
+ self._fill_round_details(self.selected_round_id)
+ self.update_window_title()
+
+# Common command methods
+
+ def refresh_and_select(self, scope: RefreshScope, *, item_type: ItemType, item_id: str):
+ self.refresh(scope)
+ self.view.select_tree_item(item_type=item_type, item_id=item_id)
+
+ def edit_item(self, item_type: str, item_id: str):
+ if item_type == ItemType.PLAYER:
+ play = self.model.get_player(item_id)
+ dialog = PlayerDialog(self.view, default_name=play.name)
+ if dialog.exec() == QDialog.DialogCode.Accepted:
+ name = dialog.get_player_name()
+ if not self._validate_player_inputs(name):
+ return
+ self.model.update_player(item_id, name=name)
+ self.refresh(RefreshScope.PLAYERS_LIST)
+ elif item_type == ItemType.WAR:
+ war = self.model.get_war(item_id)
+ dialog = WarDialog(self.view, default_name=war.name, default_year=war.year)
+ if dialog.exec() == QDialog.DialogCode.Accepted:
+ name = dialog.get_war_name()
+ year = dialog.get_war_year()
+ if not self._validate_war_inputs(name, year):
+ return
+ self.model.update_war(item_id, name=name, year=year)
+ self.refresh_and_select(RefreshScope.WARS_TREE, item_type=ItemType.WAR, item_id=war.id)
+ elif item_type == ItemType.CAMPAIGN:
+ camp = self.model.get_campaign(item_id)
+ dialog = CampaignDialog(self.view, default_name=camp.name, default_month=camp.month)
+ if dialog.exec() == QDialog.DialogCode.Accepted:
+ name = dialog.get_campaign_name()
+ month = dialog.get_campaign_month()
+ if not self._validate_campaign_inputs(name, month):
+ return
+ self.model.update_campaign(item_id, name=name, month=month)
+ self.refresh_and_select(RefreshScope.WARS_TREE, item_type=ItemType.CAMPAIGN, item_id=camp.id)
+ elif item_type == ItemType.OBJECTIVE:
+ obj = self.model.get_objective(item_id)
+ dialog = ObjectiveDialog(self.view, default_name=obj.name, default_description=obj.description)
+ if dialog.exec() == QDialog.DialogCode.Accepted:
+ name = dialog.get_objective_name()
+ description = dialog.get_objective_description()
+ if not self._validate_objective_inputs(name, description):
+ return
+ self.model.update_objective(item_id, name=name, description=description)
+ self.refresh(RefreshScope.WAR_DETAILS)
+ elif item_type == ItemType.WAR_PARTICIPANT:
+ part = self.model.get_war_participant(item_id)
+ player = self.model.get_player(part.id)
+ dialog = ParticipantDialog(self.view, players=[player], default_player_id=part.id, default_faction=part.faction)
+ if dialog.exec() == QDialog.DialogCode.Accepted:
+ id = dialog.get_player_id()
+ faction = dialog.get_participant_faction()
+ self.model.update_war_participant(item_id, faction=faction)
+ self.refresh(RefreshScope.WAR_DETAILS)
+ self.is_dirty = True
+
+ def delete_item(self, item_type: str, item_id: str):
+ reply = QMessageBox.question(
+ self.view,
+ "Confirm deletion",
+ "Are you sure you want to delete this item?",
+ QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
+ )
+ if reply != QMessageBox.StandardButton.Yes:
+ return
+ if item_type == ItemType.PLAYER:
+ self.model.remove_player(item_id)
+ self.refresh(RefreshScope.PLAYERS_LIST)
+ elif item_type == ItemType.WAR:
+ self.model.remove_war(item_id)
+ self.refresh(RefreshScope.WARS_TREE)
+ elif item_type == ItemType.CAMPAIGN:
+ war = self.model.get_war_by_campaign(item_id)
+ war_id = war.id
+ self.model.remove_campaign(item_id)
+ self.refresh_and_select(RefreshScope.WARS_TREE, item_type=ItemType.WAR, item_id=war_id)
+ elif item_type == ItemType.OBJECTIVE:
+ self.model.remove_objective(item_id)
+ self.refresh(RefreshScope.WAR_DETAILS)
+ elif item_type == ItemType.WAR_PARTICIPANT:
+ self.model.remove_war_participant(item_id)
+ self.refresh(RefreshScope.WAR_DETAILS)
+ elif item_type == ItemType.ROUND:
+ camp = self.model.get_campaign_by_round(item_id)
+ camp_id = camp.id
+ self.model.remove_round(item_id)
+ self.refresh_and_select(RefreshScope.WARS_TREE, item_type=ItemType.CAMPAIGN, item_id=camp_id)
+ self.is_dirty = True
+
+# Player methods
+
def _validate_player_inputs(self, name: str) -> bool:
if not name.strip():
QMessageBox.warning(
@@ -166,8 +310,9 @@ class Controller:
return
self.model.add_player(name)
self.is_dirty = True
- self.refresh_players_view()
- self.update_window_title()
+ self.refresh(RefreshScope.PLAYERS_LIST)
+
+# War methods
def _validate_war_inputs(self, name: str, year: int) -> bool:
if not name.strip():
@@ -194,10 +339,54 @@ class Controller:
year = dialog.get_war_year()
if not self._validate_war_inputs(name, year):
return
- self.model.add_war(name, year)
+ war = self.model.add_war(name, year)
self.is_dirty = True
- self.refresh_wars_view()
- self.update_window_title()
+ self.refresh_and_select(RefreshScope.WARS_TREE, item_type=ItemType.WAR, item_id=war.id)
+
+# Objective methods
+
+ def _validate_objective_inputs(self, name: str, description: int) -> bool:
+ if not name.strip():
+ QMessageBox.warning(
+ self.view,
+ "Invalid name",
+ "Campaign name cannot be empty."
+ )
+ return False
+ return True
+
+ def add_objective(self):
+ if not self.selected_war_id:
+ return
+ dialog = ObjectiveDialog(self.view)
+ if dialog.exec() != QDialog.DialogCode.Accepted:
+ return
+ name = dialog.get_objective_name()
+ description = dialog.get_objective_description()
+ if not name:
+ return
+ self.model.add_objective(self.selected_war_id, name, description)
+ self.is_dirty = True
+ self.refresh(RefreshScope.WAR_DETAILS)
+
+# War participant methods
+
+ def add_war_participant(self):
+ if not self.selected_war_id:
+ return
+ players = self.model.get_available_players(self.selected_war_id)
+ dialog = ParticipantDialog(self.view, players=players)
+ if dialog.exec() != QDialog.DialogCode.Accepted:
+ return
+ player_id = dialog.get_player_id()
+ faction = dialog.get_participant_faction()
+ if not player_id:
+ return
+ self.model.add_war_participant(self.selected_war_id, player_id, faction)
+ self.is_dirty = True
+ self.refresh(RefreshScope.WAR_DETAILS)
+
+# Campaign methods
def _validate_campaign_inputs(self, name: str, month: int) -> bool:
if not name.strip():
@@ -226,66 +415,15 @@ class Controller:
month = dialog.get_campaign_month()
if not self._validate_campaign_inputs(name, month):
return
- self.model.add_campaign(self.selected_war_id, name, month)
+ camp = self.model.add_campaign(self.selected_war_id, name, month)
self.is_dirty = True
- self.refresh_wars_view()
- self.update_window_title()
+ self.refresh_and_select(RefreshScope.WARS_TREE, item_type=ItemType.CAMPAIGN, item_id=camp.id)
+
+# Round methods
def add_round(self):
if not self.selected_campaign_id:
return
- self.model.add_round(self.selected_campaign_id)
+ rnd = self.model.add_round(self.selected_campaign_id)
self.is_dirty = True
- self.refresh_wars_view()
- self.update_window_title()
-
- def edit_item(self, item_type: str, item_id: str):
- if item_type == "player":
- play = self.model.get_player(item_id)
- dialog = PlayerDialog(self.view, default_name=play.name)
- if dialog.exec() == QDialog.DialogCode.Accepted:
- name = dialog.get_player_name()
- if not self._validate_player_inputs(name):
- return
- self.model.update_player(item_id, name=name)
- elif item_type == "war":
- war = self.model.get_war(item_id)
- dialog = WarDialog(self.view, default_name=war.name, default_year=war.year)
- if dialog.exec() == QDialog.DialogCode.Accepted:
- name = dialog.get_war_name()
- year = dialog.get_war_year()
- if not self._validate_war_inputs(name, year):
- return
- self.model.update_war(item_id, name=name, year=year)
- elif item_type == "campaign":
- camp = self.model.get_campaign(item_id)
- dialog = CampaignDialog(self.view, default_name=camp.name, default_month=camp.month)
- if dialog.exec() == QDialog.DialogCode.Accepted:
- name = dialog.get_campaign_name()
- month = dialog.get_campaign_month()
- if not self._validate_campaign_inputs(name, month):
- return
- self.model.update_campaign(item_id, name=name, month=month)
- self.is_dirty = True
- self.refresh_views()
-
- def delete_item(self, item_type: str, item_id: str):
- reply = QMessageBox.question(
- self.view,
- "Confirm deletion",
- "Are you sure you want to delete this item?",
- QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No
- )
- if reply != QMessageBox.StandardButton.Yes:
- return
- if item_type == "player":
- self.model.remove_player(item_id)
- elif item_type == "war":
- self.model.remove_war(item_id)
- elif item_type == "campaign":
- self.model.remove_campaign(item_id)
- elif item_type == "round":
- self.model.remove_round(item_id)
- self.is_dirty = True
- self.refresh_views()
-
+ self.refresh_and_select(RefreshScope.WARS_TREE, item_type=ItemType.ROUND, item_id=rnd.id)
\ No newline at end of file
diff --git a/src/warchron/model/campaign.py b/src/warchron/model/campaign.py
index 66dd16d..76c9d9b 100644
--- a/src/warchron/model/campaign.py
+++ b/src/warchron/model/campaign.py
@@ -1,27 +1,29 @@
+from __future__ import annotations
from uuid import uuid4
from datetime import datetime
from warchron.model.round import Round
class Campaign:
- def __init__(self, name, month):
- self.id = str(uuid4())
- self.name = name
- self.month = month
- self.entrants = {}
+ def __init__(self, name: str, month: int):
+ self.id: str = str(uuid4())
+ self.name: str = name
+ self.month: int = month
+ self.participants = {}
+ self.sectors = {}
self.rounds = []
self.is_over = False
- def set_id(self, new_id):
+ def set_id(self, new_id: str):
self.id = new_id
- def set_name(self, new_name):
+ def set_name(self, new_name: str):
self.name = new_name
- def set_month(self, new_month):
+ def set_month(self, new_month: int):
self.month = new_month
- def set_state(self, new_state):
+ def set_state(self, new_state: bool):
self.is_over = new_state
def toDict(self):
@@ -29,7 +31,7 @@ class Campaign:
"id" : self.id,
"name" : self.name,
"month" : self.month,
- # "entrants" : self.entrants,
+ # "participants" : self.participants,
"rounds": [rnd.toDict() for rnd in self.rounds],
"is_over": self.is_over
}
@@ -38,13 +40,16 @@ class Campaign:
def fromDict(data: dict):
camp = Campaign(name=data["name"], month=data["month"])
camp.set_id(data["id"])
- # camp.entrants = data.get("entrants", {})
+ # camp.participants = data.get("participants", {})
for rnd_data in data.get("rounds", []):
camp.rounds.append(Round.fromDict(rnd_data))
camp.set_state(data.get("is_over", False))
return camp
+
+ def has_round(self, round_id: str) -> bool:
+ return any(r.id == round_id for r in self.rounds)
- def get_round(self, round_id) -> Round:
+ def get_round(self, round_id: str) -> Round:
return self.rounds[round_id]
def get_all_rounds(self) -> list[Round]:
@@ -59,3 +64,25 @@ class Campaign:
rnd = next((r for r in self.rounds if r.id == round_id), None)
if rnd:
self.rounds.remove(rnd)
+
+ def get_round_index(self, round_id: str) -> int:
+ for index, rnd in enumerate(self.rounds, start=1):
+ if rnd.id == round_id:
+ return index
+ raise KeyError("Round not found in campaign")
+
+class CampaignParticipant:
+ def __init__(self,war_participant_id: str, leader: str):
+ self.id: str = war_participant_id # ref to War.participants
+ self.leader: str = leader
+ self.victory_points = 0
+ self.objective_points = {}
+
+class Sector:
+ def __init__(self, name: str, round_id: str, major_id: str, minor_id: str, influence_id: str):
+ self.id: str = str(uuid4())
+ self.name: str = name
+ self.major_objective_id: str = major_id
+ self.minor_objective_id: str = minor_id
+ self.influence_objective_id: str = influence_id
+ self.round_id: str = round_id
diff --git a/src/warchron/model/model.py b/src/warchron/model/model.py
index f488eed..6f8c222 100644
--- a/src/warchron/model/model.py
+++ b/src/warchron/model/model.py
@@ -4,14 +4,16 @@ import shutil
from datetime import datetime
from warchron.model.player import Player
-from warchron.model.war import War
+from warchron.model.war import War, Objective, WarParticipant
from warchron.model.campaign import Campaign
from warchron.model.round import Round
class Model:
def __init__(self):
- self.players = {}
- self.wars = {}
+ self.players: dict[str, Player] = {}
+ self.wars: dict[str, War] = {}
+
+# File management methods
def new(self):
self.players.clear()
@@ -53,6 +55,8 @@ class Model:
with open(path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2)
+# Player methods
+
def add_player(self, name):
player = Player(name)
self.players[player.id] = player
@@ -60,17 +64,22 @@ class Model:
def get_player(self, id):
return self.players[id]
-
+
+ def get_player_name(self, player_id: str) -> str:
+ return self.players[player_id].name
+
def update_player(self, player_id: str, *, name: str):
player = self.get_player(player_id)
player.set_name(name)
- def delete_player(self, id):
- del self.players[id]
-
def get_all_players(self) -> list[Player]:
return list(self.players.values())
+ def remove_player(self, player_id: str):
+ del self.players[player_id]
+
+# War methods
+
def get_default_war_values(self) -> dict:
return {
"year": datetime.now().year
@@ -91,6 +100,20 @@ class Model:
return war
raise KeyError(f"Campaign {campaign_id} not found in any War")
+ def get_war_by_objective(self, objective_id: str) -> War:
+ for war in self.wars.values():
+ for obj in war.objectives.values():
+ if obj.id == objective_id:
+ return war
+ raise KeyError(f"Objective {objective_id} not found in any War")
+
+ def get_war_by_war_participant(self, participant_id: str) -> War:
+ for war in self.wars.values():
+ for part in war.participants.values():
+ if part.id == participant_id:
+ return war
+ raise KeyError(f"Participant {participant_id} not found in any War")
+
def update_war(self, war_id: str, *, name: str, year: int):
war = self.get_war(war_id)
war.set_name(name)
@@ -99,6 +122,61 @@ class Model:
def get_all_wars(self) -> list[War]:
return list(self.wars.values())
+ def remove_war(self, war_id: str):
+ del self.wars[war_id]
+
+# Objective methods
+
+ def add_objective(self, war_id: str, name: str, description: str) -> Objective:
+ war = self.get_war(war_id)
+ return war.add_objective(name, description)
+
+ def get_objective(self, objective_id) -> Objective:
+ for war in self.wars.values():
+ for obj in war.objectives.values():
+ if obj.id == objective_id:
+ return obj
+ raise KeyError("Objective not found")
+
+ def update_objective(self, objective_id: str, *, name: str, description: str):
+ war = self.get_war_by_objective(objective_id)
+ war.update_objective(objective_id, name=name, description=description)
+
+ def remove_objective(self, objective_id: str):
+ war = self.get_war_by_objective(objective_id)
+ war.remove_objective(objective_id)
+
+# War participant methods
+
+ def get_available_players(self, war_id: str) -> list[Player]:
+ war = self.get_war(war_id)
+ return [
+ player
+ for player in self.players.values()
+ if not war.has_participant(player.id)
+ ]
+
+ def add_war_participant(self, war_id: str, player_id: str, faction: str) -> Objective:
+ war = self.get_war(war_id)
+ return war.add_war_participant(player_id, faction)
+
+ def get_war_participant(self, participant_id) -> WarParticipant:
+ for war in self.wars.values():
+ for part in war.participants.values():
+ if part.id == participant_id:
+ return part
+ raise KeyError("Participant not found")
+
+ def update_war_participant(self, participant_id: str, *, faction: str):
+ war = self.get_war_by_war_participant(participant_id)
+ war.update_war_participant(participant_id, faction=faction)
+
+ def remove_war_participant(self, participant_id: str):
+ war = self.get_war_by_war_participant(participant_id)
+ war.remove_war_participant(participant_id)
+
+# Campaign methods
+
def get_default_campaign_values(self, war_id: str) -> dict:
war = self.get_war(war_id)
return war.get_default_campaign_values()
@@ -125,6 +203,12 @@ class Model:
war = self.get_war_by_campaign(campaign_id)
war.update_campaign(campaign_id, name=name, month=month)
+ def remove_campaign(self, campaign_id: str):
+ war = self.get_war_by_campaign(campaign_id)
+ war.remove_campaign(campaign_id)
+
+# Round methods
+
def add_round(self, campaign_id: str) -> Round:
campaign = self.get_campaign(campaign_id)
return campaign.add_round()
@@ -136,17 +220,11 @@ class Model:
if rnd.id == round_id:
return rnd
raise KeyError("Round not found")
-
- def remove_player(self, player_id: str):
- del self.players[player_id]
- def remove_war(self, war_id: str):
- del self.wars[war_id]
-
- def remove_campaign(self, campaign_id: str):
- war = self.get_war_by_campaign(campaign_id)
- war.remove_campaign(campaign_id)
+ def get_round_index(self, round_id: str) -> int:
+ camp = self.get_campaign_by_round(round_id)
+ return camp.get_round_index(round_id)
def remove_round(self, round_id: str):
camp = self.get_campaign_by_round(round_id)
- camp.remove_round(round_id)
\ No newline at end of file
+ camp.remove_round(round_id)
diff --git a/src/warchron/model/round.py b/src/warchron/model/round.py
index c80012f..a32d0d6 100644
--- a/src/warchron/model/round.py
+++ b/src/warchron/model/round.py
@@ -2,16 +2,16 @@ from uuid import uuid4
class Round:
def __init__(self):
- self.id = str(uuid4())
+ self.id: str = str(uuid4())
self.sectors = {}
self.choices = {}
self.battles = {}
- self.is_over = False
+ self.is_over: bool = False
- def set_id(self, new_id):
+ def set_id(self, new_id: str):
self.id = new_id
- def set_state(self, new_state):
+ def set_state(self, new_state: bool):
self.is_over = new_state
def toDict(self):
diff --git a/src/warchron/model/war.py b/src/warchron/model/war.py
index 0633564..9e3b402 100644
--- a/src/warchron/model/war.py
+++ b/src/warchron/model/war.py
@@ -1,27 +1,30 @@
+from __future__ import annotations
from uuid import uuid4
from datetime import datetime
from warchron.model.campaign import Campaign
-class War:
- def __init__(self, name, year):
- self.id = str(uuid4())
- self.name = name
- self.year = year
- self.entrants = {}
- self.campaigns = []
- self.is_over = False
- def set_id(self, new_id):
+class War:
+ def __init__(self, name: str, year: int):
+ self.id: str = str(uuid4())
+ self.name: str = name
+ self.year: int = year
+ self.participants: dict[str, WarParticipant] = {}
+ self.objectives: dict[str, Objective] = {}
+ self.campaigns = []
+ self.is_over: bool = False
+
+ def set_id(self, new_id: str):
self.id = new_id
- def set_name(self, new_name):
+ def set_name(self, new_name: str):
self.name = new_name
- def set_year(self, new_year):
+ def set_year(self, new_year: int):
self.year = new_year
- def set_state(self, new_state):
+ def set_state(self, new_state: bool):
self.is_over = new_state
def toDict(self):
@@ -29,7 +32,7 @@ class War:
"id" : self.id,
"name" : self.name,
"year" : self.year,
- # "entrants" : self.entrants,
+ # "participants" : self.participants,
"campaigns": [camp.toDict() for camp in self.campaigns],
"is_over": self.is_over
}
@@ -38,12 +41,66 @@ class War:
def fromDict(data: dict):
war = War(name=data["name"], year=data["year"])
war.set_id(data["id"])
- # war.entrants = data.get("entrants", {})
+ # war.participants = data.get("participants", {})
for camp_data in data.get("campaigns", []):
war.campaigns.append(Campaign.fromDict(camp_data))
war.set_state(data.get("is_over", False))
return war
+# Objective methods
+
+ def add_objective(self, name: str, description: str) -> Objective:
+ objective = Objective(name, description)
+ self.objectives[objective.id] = objective
+ return objective
+
+ def get_objective(self, id: str) -> Objective:
+ return self.objectives[id]
+
+ def get_all_objectives(self) -> list[Objective]:
+ return list(self.objectives.values())
+
+ def update_objective(self, objective_id: str, *, name: str, description: str):
+ obj = self.get_objective(objective_id)
+ obj.set_name(name)
+ obj.set_description(description)
+
+ def remove_objective(self, objective_id: str):
+ del self.objectives[objective_id]
+
+# War participant methods
+
+ def get_all_war_participants_ids(self) -> set[str]:
+ return set(self.participants.keys())
+
+ def has_participant(self, player_id: str) -> bool:
+ return player_id in self.participants
+
+ def add_war_participant(self, player_id: str, faction: str) -> WarParticipant:
+ if player_id in self.participants:
+ raise ValueError("Player already registered in this war")
+ participant = WarParticipant(player_id, faction)
+ self.participants[participant.id] = participant
+ return participant
+
+ def get_war_participant(self, id: str) -> WarParticipant:
+ return self.participants[id]
+
+ def get_all_war_participants(self) -> list[WarParticipant]:
+ return list(self.participants.values())
+
+ def update_war_participant(self, player_id: str, *, faction: str):
+ part = self.get_war_participant(player_id)
+ part.set_faction(faction)
+
+ def remove_war_participant(self, player_id: str):
+ del self.participants[player_id]
+
+# Campaign methods
+
+ def has_campaign(self, campaign_id: str) -> bool:
+ return any(c.id == campaign_id for c in self.campaigns)
+
def get_default_campaign_values(self) -> dict:
return {
"month": datetime.now().month
@@ -56,7 +113,7 @@ class War:
self.campaigns.append(campaign)
return campaign
- def get_campaign(self, campaign_id) -> Campaign:
+ def get_campaign(self, campaign_id: str) -> Campaign:
for camp in self.campaigns:
if camp.id == campaign_id:
return camp
@@ -79,4 +136,31 @@ class War:
def remove_campaign(self, campaign_id: str):
camp = self.get_campaign(campaign_id)
- self.campaigns.remove(camp)
\ No newline at end of file
+ self.campaigns.remove(camp)
+
+class Objective:
+ def __init__(self, name: str, description: str):
+ self.id: str = str(uuid4())
+ self.name: str = name
+ self.description: str = description
+
+ def set_id(self, new_id: str):
+ self.id = new_id
+
+ def set_name(self, new_name: str):
+ self.name = new_name
+
+ def set_description(self, new_description: str):
+ self.description = new_description
+
+class WarParticipant:
+ def __init__(self, player_id: str, faction: str):
+ self.id: str = player_id # ref to Model.players
+ self.faction: str = faction
+
+ def set_id(self, new_id: str):
+ self.id = new_id
+
+ def set_faction(self, new_faction: str):
+ self.faction = new_faction
+
diff --git a/src/warchron/view/ui/ui_main_window.py b/src/warchron/view/ui/ui_main_window.py
index f9839e1..5bfbf54 100644
--- a/src/warchron/view/ui/ui_main_window.py
+++ b/src/warchron/view/ui/ui_main_window.py
@@ -26,7 +26,7 @@ class Ui_MainWindow(object):
self.playersTable = QtWidgets.QTableWidget(parent=self.playersTab)
self.playersTable.setGeometry(QtCore.QRect(10, 60, 741, 431))
self.playersTable.setObjectName("playersTable")
- self.playersTable.setColumnCount(3)
+ self.playersTable.setColumnCount(4)
self.playersTable.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.playersTable.setHorizontalHeaderItem(0, item)
@@ -34,6 +34,8 @@ class Ui_MainWindow(object):
self.playersTable.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.playersTable.setHorizontalHeaderItem(2, item)
+ item = QtWidgets.QTableWidgetItem()
+ self.playersTable.setHorizontalHeaderItem(3, item)
self.addPlayerBtn = QtWidgets.QPushButton(parent=self.playersTab)
self.addPlayerBtn.setGeometry(QtCore.QRect(20, 20, 75, 23))
self.addPlayerBtn.setObjectName("addPlayerBtn")
@@ -45,9 +47,6 @@ class Ui_MainWindow(object):
self.warsTree = QtWidgets.QTreeWidget(parent=self.warsTab)
self.warsTree.setGeometry(QtCore.QRect(10, 60, 211, 431))
self.warsTree.setObjectName("warsTree")
- item_0 = QtWidgets.QTreeWidgetItem(self.warsTree)
- item_1 = QtWidgets.QTreeWidgetItem(item_0)
- item_2 = QtWidgets.QTreeWidgetItem(item_1)
self.addWarBtn = QtWidgets.QPushButton(parent=self.warsTab)
self.addWarBtn.setGeometry(QtCore.QRect(20, 20, 75, 23))
self.addWarBtn.setObjectName("addWarBtn")
@@ -82,104 +81,50 @@ class Ui_MainWindow(object):
font.setPointSize(12)
self.warYear.setFont(font)
self.warYear.setObjectName("warYear")
- self.labelEntrants = QtWidgets.QLabel(parent=self.pageWar)
- self.labelEntrants.setGeometry(QtCore.QRect(10, 200, 47, 13))
- self.labelEntrants.setObjectName("labelEntrants")
- self.addEntrantBtn = QtWidgets.QPushButton(parent=self.pageWar)
- self.addEntrantBtn.setGeometry(QtCore.QRect(430, 310, 75, 23))
- self.addEntrantBtn.setObjectName("addEntrantBtn")
- self.playersTable_2 = QtWidgets.QTableWidget(parent=self.pageWar)
- self.playersTable_2.setGeometry(QtCore.QRect(10, 220, 401, 201))
- self.playersTable_2.setObjectName("playersTable_2")
- self.playersTable_2.setColumnCount(4)
- self.playersTable_2.setRowCount(6)
+ self.labelParticipants = QtWidgets.QLabel(parent=self.pageWar)
+ self.labelParticipants.setGeometry(QtCore.QRect(10, 150, 111, 16))
+ self.labelParticipants.setObjectName("labelParticipants")
+ self.addWarParticipantBtn = QtWidgets.QPushButton(parent=self.pageWar)
+ self.addWarParticipantBtn.setGeometry(QtCore.QRect(420, 270, 81, 23))
+ self.addWarParticipantBtn.setObjectName("addWarParticipantBtn")
+ self.warParticipantsTable = QtWidgets.QTableWidget(parent=self.pageWar)
+ self.warParticipantsTable.setGeometry(QtCore.QRect(10, 170, 401, 211))
+ self.warParticipantsTable.setObjectName("warParticipantsTable")
+ self.warParticipantsTable.setColumnCount(5)
+ self.warParticipantsTable.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setVerticalHeaderItem(0, item)
+ self.warParticipantsTable.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setVerticalHeaderItem(1, item)
+ self.warParticipantsTable.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setVerticalHeaderItem(2, item)
+ self.warParticipantsTable.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setVerticalHeaderItem(3, item)
+ self.warParticipantsTable.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setVerticalHeaderItem(4, item)
+ self.warParticipantsTable.setHorizontalHeaderItem(4, item)
+ self.endWarBtn = QtWidgets.QPushButton(parent=self.pageWar)
+ self.endWarBtn.setEnabled(True)
+ self.endWarBtn.setGeometry(QtCore.QRect(230, 400, 61, 23))
+ self.endWarBtn.setObjectName("endWarBtn")
+ self.objectivesTable = QtWidgets.QTableWidget(parent=self.pageWar)
+ self.objectivesTable.setGeometry(QtCore.QRect(10, 60, 401, 71))
+ self.objectivesTable.setObjectName("objectivesTable")
+ self.objectivesTable.setColumnCount(2)
+ self.objectivesTable.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setVerticalHeaderItem(5, item)
+ self.objectivesTable.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(0, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(0, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(0, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(0, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(1, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(1, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(1, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(1, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(2, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(2, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(2, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(2, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(3, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(3, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(3, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(3, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(4, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(4, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(4, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(4, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(5, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(5, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(5, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_2.setItem(5, 3, item)
- self.addCampaignBtn_2 = QtWidgets.QPushButton(parent=self.pageWar)
- self.addCampaignBtn_2.setEnabled(True)
- self.addCampaignBtn_2.setGeometry(QtCore.QRect(230, 120, 91, 23))
+ self.objectivesTable.setHorizontalHeaderItem(1, item)
+ self.labelObjectives = QtWidgets.QLabel(parent=self.pageWar)
+ self.labelObjectives.setGeometry(QtCore.QRect(10, 40, 111, 20))
+ self.labelObjectives.setObjectName("labelObjectives")
+ self.addObjectiveBtn = QtWidgets.QPushButton(parent=self.pageWar)
+ self.addObjectiveBtn.setEnabled(True)
+ self.addObjectiveBtn.setGeometry(QtCore.QRect(420, 80, 91, 23))
font = QtGui.QFont()
font.setPointSize(10)
- self.addCampaignBtn_2.setFont(font)
- self.addCampaignBtn_2.setObjectName("addCampaignBtn_2")
- self.listWidget = QtWidgets.QListWidget(parent=self.pageWar)
- self.listWidget.setGeometry(QtCore.QRect(10, 80, 211, 91))
- self.listWidget.setObjectName("listWidget")
- item = QtWidgets.QListWidgetItem()
- self.listWidget.addItem(item)
- self.labelCampaigns = QtWidgets.QLabel(parent=self.pageWar)
- self.labelCampaigns.setGeometry(QtCore.QRect(10, 60, 61, 16))
- self.labelCampaigns.setObjectName("labelCampaigns")
- self.addRoundBtn_8 = QtWidgets.QPushButton(parent=self.pageWar)
- self.addRoundBtn_8.setEnabled(True)
- self.addRoundBtn_8.setGeometry(QtCore.QRect(410, 400, 91, 23))
- self.addRoundBtn_8.setObjectName("addRoundBtn_8")
+ self.addObjectiveBtn.setFont(font)
+ self.addObjectiveBtn.setObjectName("addObjectiveBtn")
self.selectedDetailsStack.addWidget(self.pageWar)
self.pageCampaign = QtWidgets.QWidget()
self.pageCampaign.setObjectName("pageCampaign")
@@ -189,350 +134,106 @@ class Ui_MainWindow(object):
font.setPointSize(12)
self.campaignName.setFont(font)
self.campaignName.setObjectName("campaignName")
- self.labelRound = QtWidgets.QLabel(parent=self.pageCampaign)
- self.labelRound.setGeometry(QtCore.QRect(10, 50, 91, 16))
- self.labelRound.setObjectName("labelRound")
- self.addEntrantBtn_2 = QtWidgets.QPushButton(parent=self.pageCampaign)
- self.addEntrantBtn_2.setGeometry(QtCore.QRect(420, 310, 75, 23))
- self.addEntrantBtn_2.setObjectName("addEntrantBtn_2")
+ self.labelSectors = QtWidgets.QLabel(parent=self.pageCampaign)
+ self.labelSectors.setGeometry(QtCore.QRect(10, 40, 91, 16))
+ self.labelSectors.setObjectName("labelSectors")
+ self.addCampaignParticipantBtn = QtWidgets.QPushButton(parent=self.pageCampaign)
+ self.addCampaignParticipantBtn.setGeometry(QtCore.QRect(420, 270, 75, 23))
+ self.addCampaignParticipantBtn.setObjectName("addCampaignParticipantBtn")
self.campaignMonth = QtWidgets.QLabel(parent=self.pageCampaign)
self.campaignMonth.setGeometry(QtCore.QRect(280, 10, 121, 16))
font = QtGui.QFont()
font.setPointSize(12)
self.campaignMonth.setFont(font)
self.campaignMonth.setObjectName("campaignMonth")
- self.labelEntrants_2 = QtWidgets.QLabel(parent=self.pageCampaign)
- self.labelEntrants_2.setGeometry(QtCore.QRect(10, 200, 47, 13))
- self.labelEntrants_2.setObjectName("labelEntrants_2")
- self.playersTable_3 = QtWidgets.QTableWidget(parent=self.pageCampaign)
- self.playersTable_3.setGeometry(QtCore.QRect(10, 220, 401, 201))
- self.playersTable_3.setObjectName("playersTable_3")
- self.playersTable_3.setColumnCount(4)
- self.playersTable_3.setRowCount(6)
+ self.labelParticipants_2 = QtWidgets.QLabel(parent=self.pageCampaign)
+ self.labelParticipants_2.setGeometry(QtCore.QRect(10, 180, 47, 13))
+ self.labelParticipants_2.setObjectName("labelParticipants_2")
+ self.campaignParticipantsTable = QtWidgets.QTableWidget(parent=self.pageCampaign)
+ self.campaignParticipantsTable.setGeometry(QtCore.QRect(10, 200, 401, 181))
+ self.campaignParticipantsTable.setObjectName("campaignParticipantsTable")
+ self.campaignParticipantsTable.setColumnCount(4)
+ self.campaignParticipantsTable.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setVerticalHeaderItem(0, item)
+ self.campaignParticipantsTable.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setVerticalHeaderItem(1, item)
+ self.campaignParticipantsTable.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setVerticalHeaderItem(2, item)
+ self.campaignParticipantsTable.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setVerticalHeaderItem(3, item)
+ self.campaignParticipantsTable.setHorizontalHeaderItem(3, item)
+ self.sectorsTable = QtWidgets.QTableWidget(parent=self.pageCampaign)
+ self.sectorsTable.setGeometry(QtCore.QRect(10, 60, 401, 101))
+ self.sectorsTable.setObjectName("sectorsTable")
+ self.sectorsTable.setColumnCount(5)
+ self.sectorsTable.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setVerticalHeaderItem(4, item)
+ self.sectorsTable.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setVerticalHeaderItem(5, item)
+ self.sectorsTable.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setHorizontalHeaderItem(0, item)
+ self.sectorsTable.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setHorizontalHeaderItem(1, item)
+ self.sectorsTable.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(0, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(0, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(0, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(0, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(1, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(1, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(1, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(1, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(2, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(2, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(2, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(2, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(3, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(3, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(3, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(3, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(4, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(4, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(4, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(4, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(5, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(5, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(5, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_3.setItem(5, 3, item)
- self.addRoundBtn_2 = QtWidgets.QPushButton(parent=self.pageCampaign)
- self.addRoundBtn_2.setEnabled(True)
- self.addRoundBtn_2.setGeometry(QtCore.QRect(360, 90, 91, 23))
- self.addRoundBtn_2.setObjectName("addRoundBtn_2")
- self.playersTable_4 = QtWidgets.QTableWidget(parent=self.pageCampaign)
- self.playersTable_4.setGeometry(QtCore.QRect(10, 80, 331, 91))
- self.playersTable_4.setObjectName("playersTable_4")
- self.playersTable_4.setColumnCount(3)
- self.playersTable_4.setRowCount(3)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setVerticalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setVerticalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setItem(0, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setItem(0, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setItem(0, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setItem(1, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setItem(1, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setItem(1, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setItem(2, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setItem(2, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_4.setItem(2, 2, item)
+ self.sectorsTable.setHorizontalHeaderItem(4, item)
self.addSectorBtn = QtWidgets.QPushButton(parent=self.pageCampaign)
- self.addSectorBtn.setEnabled(False)
- self.addSectorBtn.setGeometry(QtCore.QRect(360, 130, 91, 23))
+ self.addSectorBtn.setEnabled(True)
+ self.addSectorBtn.setGeometry(QtCore.QRect(420, 110, 71, 23))
self.addSectorBtn.setObjectName("addSectorBtn")
self.endCampaignBtn = QtWidgets.QPushButton(parent=self.pageCampaign)
self.endCampaignBtn.setEnabled(True)
- self.endCampaignBtn.setGeometry(QtCore.QRect(410, 400, 91, 23))
+ self.endCampaignBtn.setGeometry(QtCore.QRect(210, 400, 91, 23))
self.endCampaignBtn.setObjectName("endCampaignBtn")
self.selectedDetailsStack.addWidget(self.pageCampaign)
self.pageRound = QtWidgets.QWidget()
self.pageRound.setObjectName("pageRound")
self.labelChoices = QtWidgets.QLabel(parent=self.pageRound)
- self.labelChoices.setGeometry(QtCore.QRect(10, 170, 91, 16))
+ self.labelChoices.setGeometry(QtCore.QRect(10, 40, 91, 16))
self.labelChoices.setObjectName("labelChoices")
self.choicesTable = QtWidgets.QTableWidget(parent=self.pageRound)
- self.choicesTable.setGeometry(QtCore.QRect(10, 190, 271, 91))
+ self.choicesTable.setGeometry(QtCore.QRect(10, 60, 301, 141))
self.choicesTable.setObjectName("choicesTable")
- self.choicesTable.setColumnCount(2)
- self.choicesTable.setRowCount(6)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setVerticalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setVerticalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setVerticalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setVerticalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setVerticalHeaderItem(5, item)
+ self.choicesTable.setColumnCount(3)
+ self.choicesTable.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
self.choicesTable.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.choicesTable.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(0, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(0, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(1, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(1, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(2, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(2, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(3, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(3, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(4, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(4, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(5, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable.setItem(5, 1, item)
+ self.choicesTable.setHorizontalHeaderItem(2, item)
self.roundNb = QtWidgets.QLabel(parent=self.pageRound)
self.roundNb.setGeometry(QtCore.QRect(10, 10, 241, 16))
font = QtGui.QFont()
font.setPointSize(12)
self.roundNb.setFont(font)
self.roundNb.setObjectName("roundNb")
- self.resolveBtn = QtWidgets.QPushButton(parent=self.pageRound)
- self.resolveBtn.setEnabled(True)
- self.resolveBtn.setGeometry(QtCore.QRect(290, 220, 91, 23))
- self.resolveBtn.setObjectName("resolveBtn")
- self.playersTable_6 = QtWidgets.QTableWidget(parent=self.pageRound)
- self.playersTable_6.setGeometry(QtCore.QRect(10, 320, 271, 91))
- self.playersTable_6.setObjectName("playersTable_6")
- self.playersTable_6.setColumnCount(2)
- self.playersTable_6.setRowCount(3)
+ self.resolvePairingBtn = QtWidgets.QPushButton(parent=self.pageRound)
+ self.resolvePairingBtn.setEnabled(True)
+ self.resolvePairingBtn.setGeometry(QtCore.QRect(320, 110, 91, 23))
+ self.resolvePairingBtn.setObjectName("resolvePairingBtn")
+ self.battlesTable = QtWidgets.QTableWidget(parent=self.pageRound)
+ self.battlesTable.setGeometry(QtCore.QRect(10, 240, 301, 111))
+ self.battlesTable.setObjectName("battlesTable")
+ self.battlesTable.setColumnCount(3)
+ self.battlesTable.setRowCount(0)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setVerticalHeaderItem(0, item)
+ self.battlesTable.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setVerticalHeaderItem(1, item)
+ self.battlesTable.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setVerticalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setItem(0, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setItem(0, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setItem(1, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setItem(1, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setItem(2, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.playersTable_6.setItem(2, 1, item)
- self.resultBtn = QtWidgets.QPushButton(parent=self.pageRound)
- self.resultBtn.setEnabled(True)
- self.resultBtn.setGeometry(QtCore.QRect(290, 360, 91, 23))
- self.resultBtn.setObjectName("resultBtn")
+ self.battlesTable.setHorizontalHeaderItem(2, item)
+ self.enterResultBtn = QtWidgets.QPushButton(parent=self.pageRound)
+ self.enterResultBtn.setEnabled(True)
+ self.enterResultBtn.setGeometry(QtCore.QRect(320, 290, 91, 23))
+ self.enterResultBtn.setObjectName("enterResultBtn")
self.endRoundBtn = QtWidgets.QPushButton(parent=self.pageRound)
self.endRoundBtn.setEnabled(True)
- self.endRoundBtn.setGeometry(QtCore.QRect(410, 400, 91, 23))
+ self.endRoundBtn.setGeometry(QtCore.QRect(220, 400, 71, 23))
self.endRoundBtn.setObjectName("endRoundBtn")
- self.labelChoices_2 = QtWidgets.QLabel(parent=self.pageRound)
- self.labelChoices_2.setGeometry(QtCore.QRect(10, 300, 91, 16))
- self.labelChoices_2.setObjectName("labelChoices_2")
- self.choicesTable_2 = QtWidgets.QTableWidget(parent=self.pageRound)
- self.choicesTable_2.setGeometry(QtCore.QRect(10, 70, 421, 91))
- self.choicesTable_2.setObjectName("choicesTable_2")
- self.choicesTable_2.setColumnCount(4)
- self.choicesTable_2.setRowCount(9)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setVerticalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setVerticalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setVerticalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setVerticalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setVerticalHeaderItem(4, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setVerticalHeaderItem(5, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setVerticalHeaderItem(6, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setVerticalHeaderItem(7, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setVerticalHeaderItem(8, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setHorizontalHeaderItem(0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setHorizontalHeaderItem(1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setHorizontalHeaderItem(2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setHorizontalHeaderItem(3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(0, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(0, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(0, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(0, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(1, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(1, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(1, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(1, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(2, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(2, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(2, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(2, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(3, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(3, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(3, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(3, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(4, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(4, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(4, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(4, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(5, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(5, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(5, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(5, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(6, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(6, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(6, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(6, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(7, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(7, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(7, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(7, 3, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(8, 0, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(8, 1, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(8, 2, item)
- item = QtWidgets.QTableWidgetItem()
- self.choicesTable_2.setItem(8, 3, item)
- self.labelChoices_3 = QtWidgets.QLabel(parent=self.pageRound)
- self.labelChoices_3.setGeometry(QtCore.QRect(10, 40, 91, 16))
- self.labelChoices_3.setObjectName("labelChoices_3")
- self.addSectorBtn_2 = QtWidgets.QPushButton(parent=self.pageRound)
- self.addSectorBtn_2.setEnabled(True)
- self.addSectorBtn_2.setGeometry(QtCore.QRect(430, 100, 91, 23))
- self.addSectorBtn_2.setObjectName("addSectorBtn_2")
+ self.labelBattles = QtWidgets.QLabel(parent=self.pageRound)
+ self.labelBattles.setGeometry(QtCore.QRect(10, 220, 91, 16))
+ self.labelBattles.setObjectName("labelBattles")
self.selectedDetailsStack.addWidget(self.pageRound)
icon2 = QtGui.QIcon()
icon2.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/swords-small.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
@@ -626,342 +327,78 @@ class Ui_MainWindow(object):
item.setText(_translate("MainWindow", "Wars"))
item = self.playersTable.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Wins"))
+ item = self.playersTable.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "Rewards"))
self.addPlayerBtn.setText(_translate("MainWindow", "Add player"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.playersTab), _translate("MainWindow", "Players"))
- __sortingEnabled = self.warsTree.isSortingEnabled()
- self.warsTree.setSortingEnabled(False)
- self.warsTree.topLevelItem(0).setText(0, _translate("MainWindow", "warItem"))
- self.warsTree.topLevelItem(0).child(0).setText(0, _translate("MainWindow", "campaignItem"))
- self.warsTree.topLevelItem(0).child(0).child(0).setText(0, _translate("MainWindow", "roundItem"))
- self.warsTree.setSortingEnabled(__sortingEnabled)
self.addWarBtn.setText(_translate("MainWindow", "Add war"))
self.addCampaignBtn.setText(_translate("MainWindow", "Add Campaign"))
self.addRoundBtn.setText(_translate("MainWindow", "Add Round"))
self.labelSelect.setText(_translate("MainWindow", "Select an element within the tree to show/edit details."))
self.warName.setText(_translate("MainWindow", "warName"))
self.warYear.setText(_translate("MainWindow", "warYear"))
- self.labelEntrants.setText(_translate("MainWindow", "Entrants"))
- self.addEntrantBtn.setText(_translate("MainWindow", "Add entrant"))
- item = self.playersTable_2.horizontalHeaderItem(0)
+ self.labelParticipants.setText(_translate("MainWindow", "Participants"))
+ self.addWarParticipantBtn.setText(_translate("MainWindow", "Add participant"))
+ item = self.warParticipantsTable.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "Name"))
- item = self.playersTable_2.horizontalHeaderItem(1)
+ item = self.warParticipantsTable.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Faction"))
- item = self.playersTable_2.horizontalHeaderItem(2)
+ item = self.warParticipantsTable.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Campaigns"))
- item = self.playersTable_2.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Wins"))
- __sortingEnabled = self.playersTable_2.isSortingEnabled()
- self.playersTable_2.setSortingEnabled(False)
- item = self.playersTable_2.item(0, 0)
- item.setText(_translate("MainWindow", "Alice"))
- item = self.playersTable_2.item(0, 1)
- item.setText(_translate("MainWindow", "army A"))
- item = self.playersTable_2.item(0, 2)
- item.setText(_translate("MainWindow", "2"))
- item = self.playersTable_2.item(0, 3)
- item.setText(_translate("MainWindow", "1"))
- item = self.playersTable_2.item(1, 0)
- item.setText(_translate("MainWindow", "Bob"))
- item = self.playersTable_2.item(1, 1)
- item.setText(_translate("MainWindow", "army B"))
- item = self.playersTable_2.item(1, 2)
- item.setText(_translate("MainWindow", "2"))
- item = self.playersTable_2.item(1, 3)
- item.setText(_translate("MainWindow", "1"))
- item = self.playersTable_2.item(2, 0)
- item.setText(_translate("MainWindow", "Charlie"))
- item = self.playersTable_2.item(2, 1)
- item.setText(_translate("MainWindow", "army C"))
- item = self.playersTable_2.item(2, 2)
- item.setText(_translate("MainWindow", "2"))
- item = self.playersTable_2.item(2, 3)
- item.setText(_translate("MainWindow", "0"))
- item = self.playersTable_2.item(3, 0)
- item.setText(_translate("MainWindow", "Dave"))
- item = self.playersTable_2.item(3, 1)
- item.setText(_translate("MainWindow", "army D"))
- item = self.playersTable_2.item(3, 2)
- item.setText(_translate("MainWindow", "1"))
- item = self.playersTable_2.item(3, 3)
- item.setText(_translate("MainWindow", "0"))
- item = self.playersTable_2.item(4, 0)
- item.setText(_translate("MainWindow", "Eve"))
- item = self.playersTable_2.item(4, 1)
- item.setText(_translate("MainWindow", "army E"))
- item = self.playersTable_2.item(4, 2)
- item.setText(_translate("MainWindow", "1"))
- item = self.playersTable_2.item(4, 3)
- item.setText(_translate("MainWindow", "0"))
- item = self.playersTable_2.item(5, 0)
- item.setText(_translate("MainWindow", "Fred"))
- item = self.playersTable_2.item(5, 1)
- item.setText(_translate("MainWindow", "army F"))
- item = self.playersTable_2.item(5, 2)
- item.setText(_translate("MainWindow", "2"))
- item = self.playersTable_2.item(5, 3)
- item.setText(_translate("MainWindow", "0"))
- self.playersTable_2.setSortingEnabled(__sortingEnabled)
- self.addCampaignBtn_2.setText(_translate("MainWindow", "Add Campaign"))
- __sortingEnabled = self.listWidget.isSortingEnabled()
- self.listWidget.setSortingEnabled(False)
- item = self.listWidget.item(0)
- item.setText(_translate("MainWindow", "campaignName"))
- self.listWidget.setSortingEnabled(__sortingEnabled)
- self.labelCampaigns.setText(_translate("MainWindow", "Campaigns"))
- self.addRoundBtn_8.setText(_translate("MainWindow", "End war"))
- self.campaignName.setText(_translate("MainWindow", "campaignName"))
- self.labelRound.setText(_translate("MainWindow", "Sectors by round"))
- self.addEntrantBtn_2.setText(_translate("MainWindow", "Add entrant"))
- self.campaignMonth.setText(_translate("MainWindow", "campaignMonth"))
- self.labelEntrants_2.setText(_translate("MainWindow", "Entrants"))
- item = self.playersTable_3.horizontalHeaderItem(0)
+ item = self.warParticipantsTable.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "Victory pts."))
+ item = self.warParticipantsTable.horizontalHeaderItem(4)
+ item.setText(_translate("MainWindow", "Theme pts"))
+ self.endWarBtn.setText(_translate("MainWindow", "End war"))
+ item = self.objectivesTable.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "Name"))
- item = self.playersTable_3.horizontalHeaderItem(1)
+ item = self.objectivesTable.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "Description"))
+ self.labelObjectives.setText(_translate("MainWindow", "Objectives"))
+ self.addObjectiveBtn.setText(_translate("MainWindow", "Add objective"))
+ self.campaignName.setText(_translate("MainWindow", "campaignName"))
+ self.labelSectors.setText(_translate("MainWindow", "Sectors"))
+ self.addCampaignParticipantBtn.setText(_translate("MainWindow", "Add participant"))
+ self.campaignMonth.setText(_translate("MainWindow", "campaignMonth"))
+ self.labelParticipants_2.setText(_translate("MainWindow", "Participants"))
+ item = self.campaignParticipantsTable.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "Name"))
+ item = self.campaignParticipantsTable.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Leader"))
- item = self.playersTable_3.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Battles"))
- item = self.playersTable_3.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Wins"))
- __sortingEnabled = self.playersTable_3.isSortingEnabled()
- self.playersTable_3.setSortingEnabled(False)
- item = self.playersTable_3.item(0, 0)
- item.setText(_translate("MainWindow", "Alice"))
- item = self.playersTable_3.item(0, 1)
- item.setText(_translate("MainWindow", "boss A"))
- item = self.playersTable_3.item(0, 2)
- item.setText(_translate("MainWindow", "6"))
- item = self.playersTable_3.item(0, 3)
- item.setText(_translate("MainWindow", "5"))
- item = self.playersTable_3.item(1, 0)
- item.setText(_translate("MainWindow", "Bob"))
- item = self.playersTable_3.item(1, 1)
- item.setText(_translate("MainWindow", "boss B"))
- item = self.playersTable_3.item(1, 2)
- item.setText(_translate("MainWindow", "6"))
- item = self.playersTable_3.item(1, 3)
- item.setText(_translate("MainWindow", "5"))
- item = self.playersTable_3.item(2, 0)
- item.setText(_translate("MainWindow", "Charlie"))
- item = self.playersTable_3.item(2, 1)
- item.setText(_translate("MainWindow", "boss C"))
- item = self.playersTable_3.item(2, 2)
- item.setText(_translate("MainWindow", "6"))
- item = self.playersTable_3.item(2, 3)
- item.setText(_translate("MainWindow", "3"))
- item = self.playersTable_3.item(3, 0)
- item.setText(_translate("MainWindow", "Dave"))
- item = self.playersTable_3.item(3, 1)
- item.setText(_translate("MainWindow", "boss D"))
- item = self.playersTable_3.item(3, 2)
- item.setText(_translate("MainWindow", "3"))
- item = self.playersTable_3.item(3, 3)
- item.setText(_translate("MainWindow", "2"))
- item = self.playersTable_3.item(4, 0)
- item.setText(_translate("MainWindow", "Eve"))
- item = self.playersTable_3.item(4, 1)
- item.setText(_translate("MainWindow", "boss E"))
- item = self.playersTable_3.item(4, 2)
- item.setText(_translate("MainWindow", "3"))
- item = self.playersTable_3.item(4, 3)
- item.setText(_translate("MainWindow", "1"))
- item = self.playersTable_3.item(5, 0)
- item.setText(_translate("MainWindow", "Fred"))
- item = self.playersTable_3.item(5, 1)
- item.setText(_translate("MainWindow", "boss F"))
- item = self.playersTable_3.item(5, 2)
- item.setText(_translate("MainWindow", "6"))
- item = self.playersTable_3.item(5, 3)
- item.setText(_translate("MainWindow", "2"))
- self.playersTable_3.setSortingEnabled(__sortingEnabled)
- self.addRoundBtn_2.setText(_translate("MainWindow", "Add Round"))
- item = self.playersTable_4.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Round 1"))
- item = self.playersTable_4.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Round 2"))
- item = self.playersTable_4.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Round 3"))
- __sortingEnabled = self.playersTable_4.isSortingEnabled()
- self.playersTable_4.setSortingEnabled(False)
- item = self.playersTable_4.item(0, 0)
- item.setText(_translate("MainWindow", "Zone A"))
- item = self.playersTable_4.item(0, 1)
- item.setText(_translate("MainWindow", "Zone D"))
- item = self.playersTable_4.item(0, 2)
- item.setText(_translate("MainWindow", "Zone G"))
- item = self.playersTable_4.item(1, 0)
- item.setText(_translate("MainWindow", "Zone B"))
- item = self.playersTable_4.item(1, 1)
- item.setText(_translate("MainWindow", "Zone E"))
- item = self.playersTable_4.item(1, 2)
- item.setText(_translate("MainWindow", "Zone H"))
- item = self.playersTable_4.item(2, 0)
- item.setText(_translate("MainWindow", "Zone C"))
- item = self.playersTable_4.item(2, 1)
- item.setText(_translate("MainWindow", "Zone F"))
- item = self.playersTable_4.item(2, 2)
- item.setText(_translate("MainWindow", "Zone I"))
- self.playersTable_4.setSortingEnabled(__sortingEnabled)
+ item = self.campaignParticipantsTable.horizontalHeaderItem(2)
+ item.setText(_translate("MainWindow", "Victory pts."))
+ item = self.campaignParticipantsTable.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "Theme pts."))
+ item = self.sectorsTable.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "Name"))
+ item = self.sectorsTable.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "Round"))
+ item = self.sectorsTable.horizontalHeaderItem(2)
+ item.setText(_translate("MainWindow", "Major obj."))
+ item = self.sectorsTable.horizontalHeaderItem(3)
+ item.setText(_translate("MainWindow", "Minor opp."))
+ item = self.sectorsTable.horizontalHeaderItem(4)
+ item.setText(_translate("MainWindow", "Influence imp."))
self.addSectorBtn.setText(_translate("MainWindow", "Add Sector"))
self.endCampaignBtn.setText(_translate("MainWindow", "End campaign"))
self.labelChoices.setText(_translate("MainWindow", "Choices"))
- item = self.choicesTable.verticalHeaderItem(0)
- item.setText(_translate("MainWindow", "Alice"))
- item = self.choicesTable.verticalHeaderItem(1)
- item.setText(_translate("MainWindow", "Bob"))
- item = self.choicesTable.verticalHeaderItem(2)
- item.setText(_translate("MainWindow", "Charlie"))
- item = self.choicesTable.verticalHeaderItem(3)
- item.setText(_translate("MainWindow", "Dave"))
- item = self.choicesTable.verticalHeaderItem(4)
- item.setText(_translate("MainWindow", "Eve"))
- item = self.choicesTable.verticalHeaderItem(5)
- item.setText(_translate("MainWindow", "Fred"))
item = self.choicesTable.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Prioritary"))
+ item.setText(_translate("MainWindow", "Player"))
item = self.choicesTable.horizontalHeaderItem(1)
+ item.setText(_translate("MainWindow", "Prioritary"))
+ item = self.choicesTable.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Secondary"))
- __sortingEnabled = self.choicesTable.isSortingEnabled()
- self.choicesTable.setSortingEnabled(False)
- item = self.choicesTable.item(0, 0)
- item.setText(_translate("MainWindow", "Zone A"))
- item = self.choicesTable.item(0, 1)
- item.setText(_translate("MainWindow", "Zone C"))
- item = self.choicesTable.item(1, 0)
- item.setText(_translate("MainWindow", "Zone B"))
- item = self.choicesTable.item(1, 1)
- item.setText(_translate("MainWindow", "Zone C"))
- item = self.choicesTable.item(2, 0)
- item.setText(_translate("MainWindow", "Zone A"))
- item = self.choicesTable.item(2, 1)
- item.setText(_translate("MainWindow", "Zone B"))
- item = self.choicesTable.item(3, 0)
- item.setText(_translate("MainWindow", "Zone C"))
- item = self.choicesTable.item(3, 1)
- item.setText(_translate("MainWindow", "Zone A"))
- item = self.choicesTable.item(4, 0)
- item.setText(_translate("MainWindow", "Zone C"))
- item = self.choicesTable.item(4, 1)
- item.setText(_translate("MainWindow", "Zone B"))
- item = self.choicesTable.item(5, 0)
- item.setText(_translate("MainWindow", "Zone B"))
- item = self.choicesTable.item(5, 1)
- item.setText(_translate("MainWindow", "Zone C"))
- self.choicesTable.setSortingEnabled(__sortingEnabled)
self.roundNb.setText(_translate("MainWindow", "Round Nb"))
- self.resolveBtn.setText(_translate("MainWindow", "Resolve pairing"))
- item = self.playersTable_6.verticalHeaderItem(0)
- item.setText(_translate("MainWindow", "Zone A"))
- item = self.playersTable_6.verticalHeaderItem(1)
- item.setText(_translate("MainWindow", "Zone B"))
- item = self.playersTable_6.verticalHeaderItem(2)
- item.setText(_translate("MainWindow", "Zone C"))
- item = self.playersTable_6.horizontalHeaderItem(0)
+ self.resolvePairingBtn.setText(_translate("MainWindow", "Resolve pairing"))
+ item = self.battlesTable.horizontalHeaderItem(0)
+ item.setText(_translate("MainWindow", "Sector"))
+ item = self.battlesTable.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Player 1"))
- item = self.playersTable_6.horizontalHeaderItem(1)
+ item = self.battlesTable.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Player 2"))
- __sortingEnabled = self.playersTable_6.isSortingEnabled()
- self.playersTable_6.setSortingEnabled(False)
- item = self.playersTable_6.item(0, 0)
- item.setText(_translate("MainWindow", "Alice"))
- item = self.playersTable_6.item(0, 1)
- item.setText(_translate("MainWindow", "Charlie"))
- item = self.playersTable_6.item(1, 0)
- item.setText(_translate("MainWindow", "Bob"))
- item = self.playersTable_6.item(1, 1)
- item.setText(_translate("MainWindow", "Fred"))
- item = self.playersTable_6.item(2, 0)
- item.setText(_translate("MainWindow", "Dave"))
- item = self.playersTable_6.item(2, 1)
- item.setText(_translate("MainWindow", "Eve"))
- self.playersTable_6.setSortingEnabled(__sortingEnabled)
- self.resultBtn.setText(_translate("MainWindow", "Enter results"))
+ self.enterResultBtn.setText(_translate("MainWindow", "Enter results"))
self.endRoundBtn.setText(_translate("MainWindow", "End round"))
- self.labelChoices_2.setText(_translate("MainWindow", "Battles"))
- item = self.choicesTable_2.horizontalHeaderItem(0)
- item.setText(_translate("MainWindow", "Name"))
- item = self.choicesTable_2.horizontalHeaderItem(1)
- item.setText(_translate("MainWindow", "Major"))
- item = self.choicesTable_2.horizontalHeaderItem(2)
- item.setText(_translate("MainWindow", "Minor"))
- item = self.choicesTable_2.horizontalHeaderItem(3)
- item.setText(_translate("MainWindow", "Influence"))
- __sortingEnabled = self.choicesTable_2.isSortingEnabled()
- self.choicesTable_2.setSortingEnabled(False)
- item = self.choicesTable_2.item(0, 0)
- item.setText(_translate("MainWindow", "Zone A"))
- item = self.choicesTable_2.item(0, 1)
- item.setText(_translate("MainWindow", "type1"))
- item = self.choicesTable_2.item(0, 2)
- item.setText(_translate("MainWindow", "type3"))
- item = self.choicesTable_2.item(0, 3)
- item.setText(_translate("MainWindow", "False"))
- item = self.choicesTable_2.item(1, 0)
- item.setText(_translate("MainWindow", "Zone B"))
- item = self.choicesTable_2.item(1, 1)
- item.setText(_translate("MainWindow", "type2"))
- item = self.choicesTable_2.item(1, 2)
- item.setText(_translate("MainWindow", "type1"))
- item = self.choicesTable_2.item(1, 3)
- item.setText(_translate("MainWindow", "True"))
- item = self.choicesTable_2.item(2, 0)
- item.setText(_translate("MainWindow", "Zone C"))
- item = self.choicesTable_2.item(2, 1)
- item.setText(_translate("MainWindow", "type3"))
- item = self.choicesTable_2.item(2, 2)
- item.setText(_translate("MainWindow", "type2"))
- item = self.choicesTable_2.item(2, 3)
- item.setText(_translate("MainWindow", "False"))
- item = self.choicesTable_2.item(3, 0)
- item.setText(_translate("MainWindow", "Zone D"))
- item = self.choicesTable_2.item(3, 1)
- item.setText(_translate("MainWindow", "type1"))
- item = self.choicesTable_2.item(3, 2)
- item.setText(_translate("MainWindow", "type3"))
- item = self.choicesTable_2.item(3, 3)
- item.setText(_translate("MainWindow", "True"))
- item = self.choicesTable_2.item(4, 0)
- item.setText(_translate("MainWindow", "Zone E"))
- item = self.choicesTable_2.item(4, 1)
- item.setText(_translate("MainWindow", "type3"))
- item = self.choicesTable_2.item(4, 2)
- item.setText(_translate("MainWindow", "type2"))
- item = self.choicesTable_2.item(4, 3)
- item.setText(_translate("MainWindow", "False"))
- item = self.choicesTable_2.item(5, 0)
- item.setText(_translate("MainWindow", "Zone F"))
- item = self.choicesTable_2.item(5, 1)
- item.setText(_translate("MainWindow", "type2"))
- item = self.choicesTable_2.item(5, 2)
- item.setText(_translate("MainWindow", "type1"))
- item = self.choicesTable_2.item(5, 3)
- item.setText(_translate("MainWindow", "False"))
- item = self.choicesTable_2.item(6, 0)
- item.setText(_translate("MainWindow", "Zone G"))
- item = self.choicesTable_2.item(6, 1)
- item.setText(_translate("MainWindow", "type3"))
- item = self.choicesTable_2.item(6, 2)
- item.setText(_translate("MainWindow", "type1"))
- item = self.choicesTable_2.item(6, 3)
- item.setText(_translate("MainWindow", "True"))
- item = self.choicesTable_2.item(7, 0)
- item.setText(_translate("MainWindow", "Zone H"))
- item = self.choicesTable_2.item(7, 1)
- item.setText(_translate("MainWindow", "type2"))
- item = self.choicesTable_2.item(7, 2)
- item.setText(_translate("MainWindow", "type3"))
- item = self.choicesTable_2.item(7, 3)
- item.setText(_translate("MainWindow", "False"))
- item = self.choicesTable_2.item(8, 0)
- item.setText(_translate("MainWindow", "Zone I"))
- item = self.choicesTable_2.item(8, 1)
- item.setText(_translate("MainWindow", "type1"))
- item = self.choicesTable_2.item(8, 2)
- item.setText(_translate("MainWindow", "type2"))
- item = self.choicesTable_2.item(8, 3)
- item.setText(_translate("MainWindow", "False"))
- self.choicesTable_2.setSortingEnabled(__sortingEnabled)
- self.labelChoices_3.setText(_translate("MainWindow", "Choices"))
- self.addSectorBtn_2.setText(_translate("MainWindow", "Add sector"))
+ self.labelBattles.setText(_translate("MainWindow", "Battles"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.warsTab), _translate("MainWindow", "Wars"))
self.menuFile.setTitle(_translate("MainWindow", "File"))
self.menuEdit.setTitle(_translate("MainWindow", "Edit"))
diff --git a/src/warchron/view/ui/ui_main_window.ui b/src/warchron/view/ui/ui_main_window.ui
index 8a1bc4d..2cb8313 100644
--- a/src/warchron/view/ui/ui_main_window.ui
+++ b/src/warchron/view/ui/ui_main_window.ui
@@ -62,6 +62,11 @@
Wins
+
+
+ Rewards
+
+
@@ -99,21 +104,6 @@
- -
-
- warItem
-
-
-
-
- campaignItem
-
-
-
-
- roundItem
-
-
-
-
@@ -224,71 +214,41 @@
warYear
-
+
10
- 200
- 47
- 13
+ 150
+ 111
+ 16
- Entrants
+ Participants
-
+
- 430
- 310
- 75
+ 420
+ 270
+ 81
23
- Add entrant
+ Add participant
-
+
10
- 220
+ 170
401
- 201
+ 211
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Name
@@ -306,138 +266,72 @@
- Wins
+ Victory pts.
- -
+
- Alice
+ Theme pts
-
- -
-
- army A
-
-
- -
-
- 2
-
-
- -
-
- 1
-
-
- -
-
- Bob
-
-
- -
-
- army B
-
-
- -
-
- 2
-
-
- -
-
- 1
-
-
- -
-
- Charlie
-
-
- -
-
- army C
-
-
- -
-
- 2
-
-
- -
-
- 0
-
-
- -
-
- Dave
-
-
- -
-
- army D
-
-
- -
-
- 1
-
-
- -
-
- 0
-
-
- -
-
- Eve
-
-
- -
-
- army E
-
-
- -
-
- 1
-
-
- -
-
- 0
-
-
- -
-
- Fred
-
-
- -
-
- army F
-
-
- -
-
- 2
-
-
- -
-
- 0
-
-
+
-
+
true
230
- 120
+ 400
+ 61
+ 23
+
+
+
+ End war
+
+
+
+
+
+ 10
+ 60
+ 401
+ 71
+
+
+
+
+ Name
+
+
+
+
+ Description
+
+
+
+
+
+
+ 10
+ 40
+ 111
+ 20
+
+
+
+ Objectives
+
+
+
+
+ true
+
+
+
+ 420
+ 80
91
23
@@ -448,51 +342,7 @@
- Add Campaign
-
-
-
-
-
- 10
- 80
- 211
- 91
-
-
- -
-
- campaignName
-
-
-
-
-
-
- 10
- 60
- 61
- 16
-
-
-
- Campaigns
-
-
-
-
- true
-
-
-
- 410
- 400
- 91
- 23
-
-
-
- End war
+ Add objective
@@ -515,30 +365,30 @@
campaignName
-
+
10
- 50
+ 40
91
16
- Sectors by round
+ Sectors
-
+
420
- 310
+ 270
75
23
- Add entrant
+ Add participant
@@ -559,58 +409,28 @@
campaignMonth
-
+
10
- 200
+ 180
47
13
- Entrants
+ Participants
-
+
10
- 220
+ 200
401
- 201
+ 181
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Name
@@ -623,245 +443,59 @@
- Battles
+ Victory pts.
- Wins
+ Theme pts.
- -
-
- Alice
-
-
- -
-
- boss A
-
-
- -
-
- 6
-
-
- -
-
- 5
-
-
- -
-
- Bob
-
-
- -
-
- boss B
-
-
- -
-
- 6
-
-
- -
-
- 5
-
-
- -
-
- Charlie
-
-
- -
-
- boss C
-
-
- -
-
- 6
-
-
- -
-
- 3
-
-
- -
-
- Dave
-
-
- -
-
- boss D
-
-
- -
-
- 3
-
-
- -
-
- 2
-
-
- -
-
- Eve
-
-
- -
-
- boss E
-
-
- -
-
- 3
-
-
- -
-
- 1
-
-
- -
-
- Fred
-
-
- -
-
- boss F
-
-
- -
-
- 6
-
-
- -
-
- 2
-
-
-
+
+
+
+ 10
+ 60
+ 401
+ 101
+
+
+
+
+ Name
+
+
+
+
+ Round
+
+
+
+
+ Major obj.
+
+
+
+
+ Minor opp.
+
+
+
+
+ Influence imp.
+
+
+
+
true
- 360
- 90
- 91
- 23
-
-
-
- Add Round
-
-
-
-
-
- 10
- 80
- 331
- 91
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Round 1
-
-
-
-
- Round 2
-
-
-
-
- Round 3
-
-
- -
-
- Zone A
-
-
- -
-
- Zone D
-
-
- -
-
- Zone G
-
-
- -
-
- Zone B
-
-
- -
-
- Zone E
-
-
- -
-
- Zone H
-
-
- -
-
- Zone C
-
-
- -
-
- Zone F
-
-
- -
-
- Zone I
-
-
-
-
-
- false
-
-
-
- 360
- 130
- 91
+ 420
+ 110
+ 71
23
@@ -875,7 +509,7 @@
- 410
+ 210
400
91
23
@@ -891,7 +525,7 @@
10
- 170
+ 40
91
16
@@ -904,41 +538,16 @@
10
- 190
- 271
- 91
+ 60
+ 301
+ 141
-
+
- Alice
+ Player
-
-
-
- Bob
-
-
-
-
- Charlie
-
-
-
-
- Dave
-
-
-
-
- Eve
-
-
-
-
- Fred
-
-
+
Prioritary
@@ -949,66 +558,6 @@
Secondary
- -
-
- Zone A
-
-
- -
-
- Zone C
-
-
- -
-
- Zone B
-
-
- -
-
- Zone C
-
-
- -
-
- Zone A
-
-
- -
-
- Zone B
-
-
- -
-
- Zone C
-
-
- -
-
- Zone A
-
-
- -
-
- Zone C
-
-
- -
-
- Zone B
-
-
- -
-
- Zone B
-
-
- -
-
- Zone C
-
-
@@ -1028,14 +577,14 @@
Round Nb
-
+
true
- 290
- 220
+ 320
+ 110
91
23
@@ -1044,30 +593,20 @@
Resolve pairing
-
+
10
- 320
- 271
- 91
+ 240
+ 301
+ 111
-
+
- Zone A
+ Sector
-
-
-
- Zone B
-
-
-
-
- Zone C
-
-
+
Player 1
@@ -1078,45 +617,15 @@
Player 2
- -
-
- Alice
-
-
- -
-
- Charlie
-
-
- -
-
- Bob
-
-
- -
-
- Fred
-
-
- -
-
- Dave
-
-
- -
-
- Eve
-
-
-
+
true
- 290
- 360
+ 320
+ 290
91
23
@@ -1131,9 +640,9 @@
- 410
+ 220
400
- 91
+ 71
23
@@ -1141,11 +650,11 @@
End round
-
+
10
- 300
+ 220
91
16
@@ -1154,290 +663,6 @@
Battles
-
-
-
- 10
- 70
- 421
- 91
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Name
-
-
-
-
- Major
-
-
-
-
- Minor
-
-
-
-
- Influence
-
-
- -
-
- Zone A
-
-
- -
-
- type1
-
-
- -
-
- type3
-
-
- -
-
- False
-
-
- -
-
- Zone B
-
-
- -
-
- type2
-
-
- -
-
- type1
-
-
- -
-
- True
-
-
- -
-
- Zone C
-
-
- -
-
- type3
-
-
- -
-
- type2
-
-
- -
-
- False
-
-
- -
-
- Zone D
-
-
- -
-
- type1
-
-
- -
-
- type3
-
-
- -
-
- True
-
-
- -
-
- Zone E
-
-
- -
-
- type3
-
-
- -
-
- type2
-
-
- -
-
- False
-
-
- -
-
- Zone F
-
-
- -
-
- type2
-
-
- -
-
- type1
-
-
- -
-
- False
-
-
- -
-
- Zone G
-
-
- -
-
- type3
-
-
- -
-
- type1
-
-
- -
-
- True
-
-
- -
-
- Zone H
-
-
- -
-
- type2
-
-
- -
-
- type3
-
-
- -
-
- False
-
-
- -
-
- Zone I
-
-
- -
-
- type1
-
-
- -
-
- type2
-
-
- -
-
- False
-
-
-
-
-
-
- 10
- 40
- 91
- 16
-
-
-
- Choices
-
-
-
-
- true
-
-
-
- 430
- 100
- 91
- 23
-
-
-
- Add sector
-
-
diff --git a/src/warchron/view/ui/ui_objective_dialog.py b/src/warchron/view/ui/ui_objective_dialog.py
new file mode 100644
index 0000000..6892af6
--- /dev/null
+++ b/src/warchron/view/ui/ui_objective_dialog.py
@@ -0,0 +1,59 @@
+# Form implementation generated from reading ui file '.\src\warchron\view\ui\ui_objective_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_objectiveDialog(object):
+ def setupUi(self, objectiveDialog):
+ objectiveDialog.setObjectName("objectiveDialog")
+ objectiveDialog.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal)
+ objectiveDialog.resize(394, 148)
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/warchron_logo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
+ objectiveDialog.setWindowIcon(icon)
+ self.gridLayout = QtWidgets.QGridLayout(objectiveDialog)
+ self.gridLayout.setObjectName("gridLayout")
+ self.label = QtWidgets.QLabel(parent=objectiveDialog)
+ self.label.setObjectName("label")
+ self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
+ self.objectiveName = QtWidgets.QLineEdit(parent=objectiveDialog)
+ self.objectiveName.setObjectName("objectiveName")
+ self.gridLayout.addWidget(self.objectiveName, 0, 1, 1, 1)
+ self.label_2 = QtWidgets.QLabel(parent=objectiveDialog)
+ self.label_2.setObjectName("label_2")
+ self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
+ self.objectiveDescription = QtWidgets.QTextEdit(parent=objectiveDialog)
+ self.objectiveDescription.setObjectName("objectiveDescription")
+ self.gridLayout.addWidget(self.objectiveDescription, 1, 1, 1, 1)
+ self.buttonBox = QtWidgets.QDialogButtonBox(parent=objectiveDialog)
+ self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
+ self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
+ self.buttonBox.setObjectName("buttonBox")
+ self.gridLayout.addWidget(self.buttonBox, 2, 0, 1, 2)
+
+ self.retranslateUi(objectiveDialog)
+ self.buttonBox.accepted.connect(objectiveDialog.accept) # type: ignore
+ self.buttonBox.rejected.connect(objectiveDialog.reject) # type: ignore
+ QtCore.QMetaObject.connectSlotsByName(objectiveDialog)
+
+ def retranslateUi(self, objectiveDialog):
+ _translate = QtCore.QCoreApplication.translate
+ objectiveDialog.setWindowTitle(_translate("objectiveDialog", "Objective"))
+ self.label.setText(_translate("objectiveDialog", "Name"))
+ self.label_2.setText(_translate("objectiveDialog", "Description"))
+
+
+if __name__ == "__main__":
+ import sys
+ app = QtWidgets.QApplication(sys.argv)
+ objectiveDialog = QtWidgets.QDialog()
+ ui = Ui_objectiveDialog()
+ ui.setupUi(objectiveDialog)
+ objectiveDialog.show()
+ sys.exit(app.exec())
diff --git a/src/warchron/view/ui/ui_objective_dialog.ui b/src/warchron/view/ui/ui_objective_dialog.ui
new file mode 100644
index 0000000..28b0d52
--- /dev/null
+++ b/src/warchron/view/ui/ui_objective_dialog.ui
@@ -0,0 +1,91 @@
+
+
+ objectiveDialog
+
+
+ Qt::ApplicationModal
+
+
+
+ 0
+ 0
+ 394
+ 148
+
+
+
+ Objective
+
+
+
+ ../resources/warchron_logo.png../resources/warchron_logo.png
+
+
+ -
+
+
+ Name
+
+
+
+ -
+
+
+ -
+
+
+ Description
+
+
+
+ -
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+
+
+ buttonBox
+ accepted()
+ objectiveDialog
+ accept()
+
+
+ 248
+ 254
+
+
+ 157
+ 274
+
+
+
+
+ buttonBox
+ rejected()
+ objectiveDialog
+ reject()
+
+
+ 316
+ 260
+
+
+ 286
+ 274
+
+
+
+
+
diff --git a/src/warchron/view/ui/ui_participant_dialog.py b/src/warchron/view/ui/ui_participant_dialog.py
new file mode 100644
index 0000000..7e82342
--- /dev/null
+++ b/src/warchron/view/ui/ui_participant_dialog.py
@@ -0,0 +1,64 @@
+# Form implementation generated from reading ui file '.\src\warchron\view\ui\ui_participant_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_participantDialog(object):
+ def setupUi(self, participantDialog):
+ participantDialog.setObjectName("participantDialog")
+ participantDialog.setWindowModality(QtCore.Qt.WindowModality.ApplicationModal)
+ participantDialog.resize(394, 148)
+ icon = QtGui.QIcon()
+ icon.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/warchron_logo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
+ participantDialog.setWindowIcon(icon)
+ self.gridLayout = QtWidgets.QGridLayout(participantDialog)
+ self.gridLayout.setObjectName("gridLayout")
+ self.label = QtWidgets.QLabel(parent=participantDialog)
+ self.label.setObjectName("label")
+ self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
+ self.playerComboBox = QtWidgets.QComboBox(parent=participantDialog)
+ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ sizePolicy.setHeightForWidth(self.playerComboBox.sizePolicy().hasHeightForWidth())
+ self.playerComboBox.setSizePolicy(sizePolicy)
+ self.playerComboBox.setObjectName("playerComboBox")
+ self.gridLayout.addWidget(self.playerComboBox, 0, 1, 1, 1)
+ self.label_2 = QtWidgets.QLabel(parent=participantDialog)
+ self.label_2.setObjectName("label_2")
+ self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
+ self.faction = QtWidgets.QLineEdit(parent=participantDialog)
+ self.faction.setObjectName("faction")
+ self.gridLayout.addWidget(self.faction, 1, 1, 1, 1)
+ self.buttonBox = QtWidgets.QDialogButtonBox(parent=participantDialog)
+ self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
+ self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok)
+ self.buttonBox.setObjectName("buttonBox")
+ self.gridLayout.addWidget(self.buttonBox, 2, 0, 1, 2)
+
+ self.retranslateUi(participantDialog)
+ self.buttonBox.accepted.connect(participantDialog.accept) # type: ignore
+ self.buttonBox.rejected.connect(participantDialog.reject) # type: ignore
+ QtCore.QMetaObject.connectSlotsByName(participantDialog)
+
+ def retranslateUi(self, participantDialog):
+ _translate = QtCore.QCoreApplication.translate
+ participantDialog.setWindowTitle(_translate("participantDialog", "Participant"))
+ self.label.setText(_translate("participantDialog", "Player"))
+ self.label_2.setText(_translate("participantDialog", "Faction"))
+
+
+if __name__ == "__main__":
+ import sys
+ app = QtWidgets.QApplication(sys.argv)
+ participantDialog = QtWidgets.QDialog()
+ ui = Ui_participantDialog()
+ ui.setupUi(participantDialog)
+ participantDialog.show()
+ sys.exit(app.exec())
diff --git a/src/warchron/view/ui/ui_participant_dialog.ui b/src/warchron/view/ui/ui_participant_dialog.ui
new file mode 100644
index 0000000..238ea5e
--- /dev/null
+++ b/src/warchron/view/ui/ui_participant_dialog.ui
@@ -0,0 +1,98 @@
+
+
+ participantDialog
+
+
+ Qt::ApplicationModal
+
+
+
+ 0
+ 0
+ 394
+ 148
+
+
+
+ Participant
+
+
+
+ ../resources/warchron_logo.png../resources/warchron_logo.png
+
+
+ -
+
+
+ Player
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ -
+
+
+ Faction
+
+
+
+ -
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+
+
+ buttonBox
+ accepted()
+ participantDialog
+ accept()
+
+
+ 248
+ 254
+
+
+ 157
+ 274
+
+
+
+
+ buttonBox
+ rejected()
+ participantDialog
+ reject()
+
+
+ 316
+ 260
+
+
+ 286
+ 274
+
+
+
+
+
diff --git a/src/warchron/view/view.py b/src/warchron/view/view.py
index 3792855..b5932e8 100644
--- a/src/warchron/view/view.py
+++ b/src/warchron/view/view.py
@@ -6,13 +6,13 @@ from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QDialog, QFileDialog, QTreeWidgetItem, QMenu
from PyQt6.QtGui import QCloseEvent
+from warchron.constants import ROLE_TYPE, ROLE_ID, ItemType
from warchron.view.ui.ui_main_window import Ui_MainWindow
from warchron.view.ui.ui_player_dialog import Ui_playerDialog
from warchron.view.ui.ui_war_dialog import Ui_warDialog
from warchron.view.ui.ui_campaign_dialog import Ui_campaignDialog
-
-ROLE_TYPE = Qt.ItemDataRole.UserRole
-ROLE_ID = Qt.ItemDataRole.UserRole + 1
+from warchron.view.ui.ui_objective_dialog import Ui_objectiveDialog
+from warchron.view.ui.ui_participant_dialog import Ui_participantDialog
class View(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
@@ -24,9 +24,13 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
self.on_add_round = None
self.on_edit_item = None
self.on_delete_item = None
+ self.show_details(None)
self.playersTable.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.playersTable.customContextMenuRequested.connect(self._on_players_table_context_menu)
- self.warsTree.currentItemChanged.connect(self._emit_selection_changed)
+ self.warParticipantsTable.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+ self.warParticipantsTable.customContextMenuRequested.connect(self._on_war_participants_table_context_menu)
+ self.objectivesTable.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
+ self.objectivesTable.customContextMenuRequested.connect(self._on_objectives_table_context_menu)
self.warsTree.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
self.warsTree.customContextMenuRequested.connect(self._on_wars_tree_context_menu)
self.addCampaignBtn.clicked.connect(self._on_add_campaign_clicked)
@@ -43,46 +47,15 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
"id": current.data(0, ROLE_ID),
})
- def _on_players_table_context_menu(self, pos):
- item = self.playersTable.itemAt(pos)
- if not item:
- return
- player_id = item.data(Qt.ItemDataRole.UserRole)
- menu = QMenu(self)
- edit_action = menu.addAction("Edit")
- delete_action = menu.addAction("Delete")
- action = menu.exec(self.playersTable.viewport().mapToGlobal(pos))
- if action == edit_action and self.on_edit_item:
- self.on_edit_item("player", player_id)
- elif action == delete_action and self.on_delete_item:
- self.on_delete_item("player", player_id)
+ def get_current_tab(self) -> str:
+ index = self.tabWidget.currentIndex()
+ if index == 0:
+ return "players"
+ elif index == 1:
+ return "wars"
+ return ""
- def _on_wars_tree_context_menu(self, pos):
- item = self.warsTree.itemAt(pos)
- if not item:
- return
- item_type = item.data(0, ROLE_TYPE)
- item_id = item.data(0, ROLE_ID)
- menu = QMenu(self)
- edit_action = None
- if item_type != "round":
- edit_action = menu.addAction("Edit")
- delete_action = menu.addAction("Delete")
- action = menu.exec(self.warsTree.viewport().mapToGlobal(pos))
- if action == edit_action:
- if self.on_edit_item:
- self.on_edit_item(item_type, item_id)
- elif action == delete_action:
- if self.on_delete_item:
- self.on_delete_item(item_type, item_id)
-
- def _on_add_campaign_clicked(self):
- if self.on_add_campaign:
- self.on_add_campaign()
-
- def _on_add_round_clicked(self):
- if self.on_add_round:
- self.on_add_round()
+# General popups
def closeEvent(self, event: QCloseEvent):
if self.on_close_callback:
@@ -110,6 +83,26 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
)
return Path(filename) if filename else None
+# Players view
+
+ def _on_players_table_context_menu(self, pos):
+ item = self.playersTable.itemAt(pos)
+ if not item:
+ return
+ row = item.row()
+ name_item = self.playersTable.item(row, 0)
+ if not name_item:
+ return
+ player_id = name_item.data(Qt.ItemDataRole.UserRole)
+ menu = QMenu(self)
+ edit_action = menu.addAction("Edit")
+ delete_action = menu.addAction("Delete")
+ action = menu.exec(self.playersTable.viewport().mapToGlobal(pos))
+ if action == edit_action and self.on_edit_item:
+ self.on_edit_item(ItemType.PLAYER, player_id)
+ elif action == delete_action and self.on_delete_item:
+ self.on_delete_item(ItemType.PLAYER, player_id)
+
def display_players(self, players: list):
table = self.playersTable
table.setRowCount(len(players))
@@ -119,28 +112,89 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
table.setItem(row, 0, play_item)
table.resizeColumnsToContents()
- def display_wars(self, wars: list):
+# Wars view
+
+ def _on_add_campaign_clicked(self):
+ if self.on_add_campaign:
+ self.on_add_campaign()
+
+ def _on_add_round_clicked(self):
+ if self.on_add_round:
+ self.on_add_round()
+
+ def set_add_campaign_enabled(self, enabled: bool):
+ self.addCampaignBtn.setEnabled(enabled)
+
+ def set_add_round_enabled(self, enabled: bool):
+ self.addRoundBtn.setEnabled(enabled)
+
+ def _on_wars_tree_context_menu(self, pos):
+ item = self.warsTree.itemAt(pos)
+ if not item:
+ return
+ item_type = item.data(0, ROLE_TYPE)
+ item_id = item.data(0, ROLE_ID)
+ menu = QMenu(self)
+ edit_action = None
+ if item_type != ItemType.ROUND:
+ edit_action = menu.addAction("Edit")
+ delete_action = menu.addAction("Delete")
+ action = menu.exec(self.warsTree.viewport().mapToGlobal(pos))
+ if action == edit_action:
+ if self.on_edit_item:
+ self.on_edit_item(item_type, item_id)
+ elif action == delete_action:
+ if self.on_delete_item:
+ self.on_delete_item(item_type, item_id)
+
+ def _format_war_label(self, war) -> str:
+ return f"{war.name} ({war.year})"
+
+ def _format_campaign_label(self, camp) -> str:
+ return f"{camp.name} ({calendar.month_name[camp.month]})"
+
+ def _format_round_label(self, round, index: int) -> str:
+ return f"Round {index}"
+
+ def display_wars_tree(self, wars: list):
tree = self.warsTree
tree.clear()
tree.setColumnCount(1)
tree.setHeaderLabels(["Wars"])
for war in wars:
- war_item = QTreeWidgetItem([f"{war.name} ({war.year})"])
- war_item.setData(0, ROLE_TYPE, "war")
+ war_item = QTreeWidgetItem([self._format_war_label(war)])
+ war_item.setData(0, ROLE_TYPE, ItemType.WAR)
war_item.setData(0, ROLE_ID, war.id)
tree.addTopLevelItem(war_item)
for camp in war.get_all_campaigns():
- camp_item = QTreeWidgetItem([f"{camp.name} ({calendar.month_name[camp.month]})"])
- camp_item.setData(0, ROLE_TYPE, "campaign")
+ camp_item = QTreeWidgetItem([self._format_campaign_label(camp)])
+ camp_item.setData(0, ROLE_TYPE, ItemType.CAMPAIGN)
camp_item.setData(0, ROLE_ID, camp.id)
war_item.addChild(camp_item)
for index, rnd in enumerate(camp.get_all_rounds(), start=1):
- rnd_item = QTreeWidgetItem([f"Round {index}"])
- rnd_item.setData(0, ROLE_TYPE, "round")
+ rnd_item = QTreeWidgetItem([self._format_round_label(rnd, index)])
+ rnd_item.setData(0, ROLE_TYPE, ItemType.ROUND)
rnd_item.setData(0, ROLE_ID, rnd.id)
camp_item.addChild(rnd_item)
+ tree.currentItemChanged.connect(self._emit_selection_changed)
tree.expandAll()
+ def select_tree_item(self, *, item_type: ItemType, item_id: str):
+ def walk(item: QTreeWidgetItem):
+ if (
+ item.data(0, ROLE_TYPE) == item_type
+ and item.data(0, ROLE_ID) == item_id
+ ):
+ self.warsTree.setCurrentItem(item)
+ return True
+ for i in range(item.childCount()):
+ if walk(item.child(i)):
+ return True
+ return False
+ for i in range(self.warsTree.topLevelItemCount()):
+ if walk(self.warsTree.topLevelItem(i)):
+ return
+
def get_selected_tree_item(self):
item = self.warsTree.currentItem()
if not item:
@@ -150,20 +204,94 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
"id": item.data(0, ROLE_ID)
}
- def set_add_campaign_enabled(self, enabled: bool):
- self.addCampaignBtn.setEnabled(enabled)
+ def show_details(self, item_type: str | None):
+ if item_type == ItemType.WAR:
+ self.selectedDetailsStack.setCurrentWidget(self.pageWar)
+ elif item_type == ItemType.CAMPAIGN:
+ self.selectedDetailsStack.setCurrentWidget(self.pageCampaign)
+ elif item_type == ItemType.ROUND:
+ self.selectedDetailsStack.setCurrentWidget(self.pageRound)
+ else:
+ self.selectedDetailsStack.setCurrentWidget(self.pageEmpty)
- def set_add_round_enabled(self, enabled: bool):
- self.addRoundBtn.setEnabled(enabled)
+# War page
- def get_current_tab(self) -> str:
- index = self.tabWidget.currentIndex()
- if index == 0:
- return "players"
- elif index == 1:
- return "wars"
- return ""
-
+ def _on_objectives_table_context_menu(self, pos):
+ item = self.objectivesTable.itemAt(pos)
+ if not item:
+ return
+ row = item.row()
+ name_item = self.objectivesTable.item(row, 0)
+ if not name_item:
+ return
+ objective_id = name_item.data(Qt.ItemDataRole.UserRole)
+ menu = QMenu(self)
+ edit_action = menu.addAction("Edit")
+ delete_action = menu.addAction("Delete")
+ action = menu.exec(self.objectivesTable.viewport().mapToGlobal(pos))
+ if action == edit_action and self.on_edit_item:
+ self.on_edit_item(ItemType.OBJECTIVE, objective_id)
+ elif action == delete_action and self.on_delete_item:
+ self.on_delete_item(ItemType.OBJECTIVE, objective_id)
+
+ def _on_war_participants_table_context_menu(self, pos):
+ item = self.warParticipantsTable.itemAt(pos)
+ if not item:
+ return
+ row = item.row()
+ name_item = self.warParticipantsTable.item(row, 0)
+ if not name_item:
+ return
+ participant_id = name_item.data(Qt.ItemDataRole.UserRole)
+ menu = QMenu(self)
+ edit_action = menu.addAction("Edit")
+ delete_action = menu.addAction("Delete")
+ action = menu.exec(self.warParticipantsTable.viewport().mapToGlobal(pos))
+ if action == edit_action and self.on_edit_item:
+ self.on_edit_item(ItemType.WAR_PARTICIPANT, participant_id)
+ elif action == delete_action and self.on_delete_item:
+ self.on_delete_item(ItemType.WAR_PARTICIPANT, participant_id)
+
+ def show_war_details(self, *, name: str, year: int):
+ self.warName.setText(name)
+ self.warYear.setText(str(year))
+
+ def display_war_objectives(self, objectives: list):
+ table = self.objectivesTable
+ table.clearContents()
+ table.setRowCount(len(objectives))
+ for row, obj in enumerate(objectives):
+ name_item = QtWidgets.QTableWidgetItem(obj.name)
+ desc_item = QtWidgets.QTableWidgetItem(obj.description)
+ name_item.setData(Qt.ItemDataRole.UserRole, obj.id)
+ table.setItem(row, 0, name_item)
+ table.setItem(row, 1, desc_item)
+ table.resizeColumnsToContents()
+
+ def display_war_participants(self, participants: list[tuple[str, str, str]]):
+ table = self.warParticipantsTable
+ table.clearContents()
+ table.setRowCount(len(participants))
+ for row, (name, faction, pid) in enumerate(participants):
+ name_item = QtWidgets.QTableWidgetItem(name)
+ fact_item = QtWidgets.QTableWidgetItem(faction)
+ name_item.setData(Qt.ItemDataRole.UserRole, pid)
+ table.setItem(row, 0, name_item)
+ table.setItem(row, 1, fact_item)
+ table.resizeColumnsToContents()
+
+# Campaign page
+
+ def show_campaign_details(self, *, name: str, month: int):
+ self.campaignName.setText(name)
+ self.campaignMonth.setText(calendar.month_name[month])
+
+# Round page
+
+ def show_round_details(self, *, index: int):
+ self.roundNb.setText(f"Round {index}")
+
+
class PlayerDialog(QDialog):
def __init__(self, parent=None, *, default_name: str = ""):
super().__init__(parent)
@@ -202,4 +330,38 @@ class CampaignDialog(QDialog):
return self.ui.campaignName.text().strip()
def get_campaign_month(self) -> int:
- return int(self.ui.campaignMonth.value())
\ No newline at end of file
+ return int(self.ui.campaignMonth.value())
+
+class ObjectiveDialog(QDialog):
+ def __init__(self, parent=None, *, default_name="", default_description=""):
+ super().__init__(parent)
+ self.ui = Ui_objectiveDialog()
+ self.ui.setupUi(self)
+ self.ui.objectiveName.setText(default_name)
+ self.ui.objectiveDescription.setPlainText(default_description)
+
+ def get_objective_name(self) -> str:
+ return self.ui.objectiveName.text().strip()
+
+ def get_objective_description(self) -> str:
+ return self.ui.objectiveDescription.toPlainText().strip()
+
+class ParticipantDialog(QDialog):
+ def __init__(self, parent=None, *, players: list, default_player_id=None, default_faction="", editable_player=True):
+ super().__init__(parent)
+ self.ui = Ui_participantDialog()
+ self.ui.setupUi(self)
+ for player in players:
+ self.ui.playerComboBox.addItem(player.name, player.id)
+ if default_player_id:
+ index = self.ui.playerComboBox.findData(default_player_id)
+ if index != -1:
+ self.ui.playerComboBox.setCurrentIndex(index)
+ self.ui.playerComboBox.setEnabled(editable_player)
+ self.ui.faction.setText(default_faction)
+
+ def get_player_id(self) -> str:
+ return self.ui.playerComboBox.currentData()
+
+ def get_participant_faction(self) -> str:
+ return self.ui.faction.text().strip()
\ No newline at end of file