show is_over in warsTree & fator resources paths

This commit is contained in:
Maxime Réaux 2026-02-12 15:12:28 +01:00
parent a9cd4c9e27
commit d869017646
28 changed files with 783 additions and 628 deletions

View file

@ -1,3 +1,4 @@
from __future__ import annotations
from typing import Callable, List
from pathlib import Path
import calendar
@ -5,9 +6,9 @@ import calendar
from PyQt6 import QtWidgets
from PyQt6.QtCore import Qt, QPoint
from PyQt6.QtWidgets import QWidget, QFileDialog, QTreeWidgetItem, QMenu
from PyQt6.QtGui import QCloseEvent, QIcon
from PyQt6.QtGui import QCloseEvent
from warchron.constants import ROLE_TYPE, ROLE_ID, ItemType
from warchron.constants import ROLE_TYPE, ROLE_ID, ItemType, Icons, IconName
from warchron.controller.dtos import (
ParticipantOption,
TreeSelection,
@ -56,6 +57,7 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
)
self.addCampaignBtn.clicked.connect(self._on_add_campaign_clicked)
self.addRoundBtn.clicked.connect(self._on_add_round_clicked)
# Pages
self.warParticipantsTable.setContextMenuPolicy(
Qt.ContextMenuPolicy.CustomContextMenu
@ -89,6 +91,37 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
)
self.majorValue.valueChanged.connect(self._on_major_changed)
self.minorValue.valueChanged.connect(self._on_minor_changed)
self._apply_icons()
def _apply_icons(self) -> None:
# Window
self.setWindowIcon(Icons.get(IconName.WARCHRON))
# Menu bar
self.actionNew.setIcon(Icons.get(IconName.NEW))
self.actionOpen.setIcon(Icons.get(IconName.OPEN))
self.actionSave.setIcon(Icons.get(IconName.SAVE))
self.actionSave_as.setIcon(Icons.get(IconName.SAVE_AS))
self.actionExit.setIcon(Icons.get(IconName.EXIT))
self.actionUndo.setIcon(Icons.get(IconName.UNDO))
self.actionRedo.setIcon(Icons.get(IconName.REDO))
self.actionExport.setIcon(Icons.get(IconName.EXPORT))
self.actionAbout.setIcon(Icons.get(IconName.ABOUT))
# Tabs
self.tabWidget.setTabIcon(0, Icons.get(IconName.PLAYERS))
self.tabWidget.setTabIcon(1, Icons.get(IconName.WARS))
# Buttons
self.addPlayerBtn.setIcon(Icons.get(IconName.ADD))
self.addWarBtn.setIcon(Icons.get(IconName.ADD))
self.addCampaignBtn.setIcon(Icons.get(IconName.ADD))
self.addRoundBtn.setIcon(Icons.get(IconName.ADD))
self.addObjectiveBtn.setIcon(Icons.get(IconName.ADD))
self.addWarParticipantBtn.setIcon(Icons.get(IconName.ADD))
self.endWarBtn.setIcon(Icons.get(IconName.END))
self.addSectorBtn.setIcon(Icons.get(IconName.ADD))
self.addCampaignParticipantBtn.setIcon(Icons.get(IconName.ADD))
self.endCampaignBtn.setIcon(Icons.get(IconName.END))
self.resolvePairingBtn.setIcon(Icons.get(IconName.PAIRING))
self.endRoundBtn.setIcon(Icons.get(IconName.END))
def _emit_selection_changed(self, current: QTreeWidgetItem | None) -> None:
if not self.on_tree_selection_changed:
@ -147,12 +180,8 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
return
player_id = name_item.data(Qt.ItemDataRole.UserRole)
menu = QMenu(self)
edit_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/pencil.png"), "Edit"
)
delete_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/cross.png"), "Delete"
)
edit_action = menu.addAction(Icons.get(IconName.EDIT), "Edit")
delete_action = menu.addAction(Icons.get(IconName.DELETE), "Delete")
viewport = self.playersTable.viewport()
assert viewport is not None
action = menu.exec(viewport.mapToGlobal(pos))
@ -195,12 +224,8 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
menu = QMenu(self)
edit_action = None
if item_type != ItemType.ROUND:
edit_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/pencil.png"), "Edit"
)
delete_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/cross.png"), "Delete"
)
edit_action = menu.addAction(Icons.get(IconName.EDIT), "Edit")
delete_action = menu.addAction(Icons.get(IconName.DELETE), "Delete")
viewport = self.warsTree.viewport()
assert viewport is not None
action = menu.exec(viewport.mapToGlobal(pos))
@ -216,18 +241,23 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
tree.clear()
tree.setColumnCount(1)
tree.setHeaderLabels(["Wars"])
hourglass = Icons.get(IconName.ONGOING)
check = Icons.get(IconName.DONE)
for war in wars:
war_item = QTreeWidgetItem([format_war_label(war)])
war_item.setIcon(0, check if war.is_over else hourglass)
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([format_campaign_label(camp)])
camp_item.setIcon(0, check if camp.is_over else hourglass)
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([format_round_label(index)])
rnd_item.setIcon(0, check if rnd.is_over else hourglass)
rnd_item.setData(0, ROLE_TYPE, ItemType.ROUND)
rnd_item.setData(0, ROLE_ID, rnd.id)
camp_item.addChild(rnd_item)
@ -283,12 +313,8 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
return
objective_id = name_item.data(Qt.ItemDataRole.UserRole)
menu = QMenu(self)
edit_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/pencil.png"), "Edit"
)
delete_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/cross.png"), "Delete"
)
edit_action = menu.addAction(Icons.get(IconName.EDIT), "Edit")
delete_action = menu.addAction(Icons.get(IconName.DELETE), "Delete")
viewport = self.objectivesTable.viewport()
assert viewport is not None
action = menu.exec(viewport.mapToGlobal(pos))
@ -307,12 +333,8 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
return
participant_id = name_item.data(Qt.ItemDataRole.UserRole)
menu = QMenu(self)
edit_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/pencil.png"), "Edit"
)
delete_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/cross.png"), "Delete"
)
edit_action = menu.addAction(Icons.get(IconName.EDIT), "Edit")
delete_action = menu.addAction(Icons.get(IconName.DELETE), "Delete")
viewport = self.warParticipantsTable.viewport()
assert viewport is not None
action = menu.exec(viewport.mapToGlobal(pos))
@ -380,12 +402,8 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
return
sector_id = name_item.data(Qt.ItemDataRole.UserRole)
menu = QMenu(self)
edit_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/pencil.png"), "Edit"
)
delete_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/cross.png"), "Delete"
)
edit_action = menu.addAction(Icons.get(IconName.EDIT), "Edit")
delete_action = menu.addAction(Icons.get(IconName.DELETE), "Delete")
viewport = self.sectorsTable.viewport()
assert viewport is not None
action = menu.exec(viewport.mapToGlobal(pos))
@ -404,12 +422,8 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
return
participant_id = name_item.data(Qt.ItemDataRole.UserRole)
menu = QMenu(self)
edit_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/pencil.png"), "Edit"
)
delete_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/cross.png"), "Delete"
)
edit_action = menu.addAction(Icons.get(IconName.EDIT), "Edit")
delete_action = menu.addAction(Icons.get(IconName.DELETE), "Delete")
viewport = self.campaignParticipantsTable.viewport()
assert viewport is not None
action = menu.exec(viewport.mapToGlobal(pos))
@ -476,9 +490,7 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
if choice_id is None:
return
menu = QMenu(self)
edit_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/pencil.png"), "Edit"
)
edit_action = menu.addAction(Icons.get(IconName.EDIT), "Edit")
viewport = self.choicesTable.viewport()
assert viewport is not None
action = menu.exec(viewport.mapToGlobal(pos))
@ -497,9 +509,7 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
if battle_id is None:
return
menu = QMenu(self)
edit_action = menu.addAction(
QIcon(".\\src\\warchron\\view\\ui\\../resources/pencil.png"), "Edit"
)
edit_action = menu.addAction(Icons.get(IconName.EDIT), "Edit")
viewport = self.battlesTable.viewport()
assert viewport is not None
action = menu.exec(viewport.mapToGlobal(pos))
@ -530,13 +540,13 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
for row, battle in enumerate(sectors):
sector_item = QtWidgets.QTableWidgetItem(battle.sector_name)
if battle.state_icon:
sector_item.setIcon(QIcon(battle.state_icon))
sector_item.setIcon(battle.state_icon)
player_1_item = QtWidgets.QTableWidgetItem(battle.player_1)
if battle.player1_icon:
player_1_item.setIcon(QIcon(battle.player1_icon))
player_1_item.setIcon(battle.player1_icon)
player_2_item = QtWidgets.QTableWidgetItem(battle.player_2)
if battle.player2_icon:
player_2_item.setIcon(QIcon(battle.player2_icon))
player_2_item.setIcon(battle.player2_icon)
score_item = QtWidgets.QTableWidgetItem(battle.score)
vp_item = QtWidgets.QTableWidgetItem(battle.victory_condition)
comment_item = QtWidgets.QTableWidgetItem(battle.comment)
@ -544,7 +554,7 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow):
table.setItem(row, 0, sector_item)
table.setItem(row, 1, player_1_item)
table.setItem(row, 2, player_2_item)
table.setItem(row, 3, score_item)
table.setItem(row, 4, vp_item)
table.setItem(row, 3, vp_item)
table.setItem(row, 4, score_item)
table.setItem(row, 5, comment_item)
table.resizeColumnsToContents()