diff --git a/src/warchron/controller/app_controller.py b/src/warchron/controller/app_controller.py index e4e65f2..fdb16d5 100644 --- a/src/warchron/controller/app_controller.py +++ b/src/warchron/controller/app_controller.py @@ -45,6 +45,9 @@ class AppController: self.view.actionSave_as.triggered.connect(self.save_as) self.view.addPlayerBtn.clicked.connect(self.players.add_player) self.view.addWarBtn.clicked.connect(self.wars.add_war) + self.view.majorValue.valueChanged.connect(self.wars.set_major_value) + self.view.minorValue.valueChanged.connect(self.wars.set_minor_value) + self.view.influenceToken.toggled.connect(self.wars.set_influence_token) self.view.addObjectiveBtn.clicked.connect(self.wars.add_objective) self.view.addWarParticipantBtn.clicked.connect(self.wars.add_war_participant) self.view.addSectorBtn.clicked.connect(self.campaigns.add_sector) diff --git a/src/warchron/controller/war_controller.py b/src/warchron/controller/war_controller.py index cef7e1a..acf786d 100644 --- a/src/warchron/controller/war_controller.py +++ b/src/warchron/controller/war_controller.py @@ -23,6 +23,11 @@ class WarController: def _fill_war_details(self, war_id: str) -> None: war = self.app.model.get_war(war_id) self.app.view.show_war_details(name=war.name, year=war.year) + self.app.view.set_war_objective_values( + major=war.major_value, + minor=war.minor_value, + influence=war.influence_token, + ) objectives = war.get_all_objectives() objectives_for_display: List[ObjectiveDTO] = [ ObjectiveDTO(id=obj.id, name=obj.name, description=obj.description) @@ -81,6 +86,27 @@ class WarController: return self.app.model.update_war(war_id, name=name, year=year) + def set_major_value(self, value: int) -> None: + war_id = self.app.navigation.selected_war_id + if not war_id: + return + self.app.model.set_major_value(war_id, value) + self.app.is_dirty = True + + def set_minor_value(self, value: int) -> None: + war_id = self.app.navigation.selected_war_id + if not war_id: + return + self.app.model.set_minor_value(war_id, value) + self.app.is_dirty = True + + def set_influence_token(self, checked: bool) -> None: + war_id = self.app.navigation.selected_war_id + if not war_id: + return + self.app.model.set_influence_token(war_id, checked) + self.app.is_dirty = True + # Objective methods def _validate_objective_inputs(self, name: str, description: str) -> bool: diff --git a/src/warchron/model/model.py b/src/warchron/model/model.py index 77abd42..874d3fa 100644 --- a/src/warchron/model/model.py +++ b/src/warchron/model/model.py @@ -162,6 +162,18 @@ class Model: war.set_name(name) war.set_year(year) + def set_major_value(self, war_id: str, value: int) -> None: + war = self.get_war(war_id) + war.set_major(value) + + def set_minor_value(self, war_id: str, value: int) -> None: + war = self.get_war(war_id) + war.set_minor(value) + + def set_influence_token(self, war_id: str, value: bool) -> None: + war = self.get_war(war_id) + war.set_influence(value) + def get_all_wars(self) -> List[War]: return list(self.wars.values()) diff --git a/src/warchron/model/war.py b/src/warchron/model/war.py index 2f1bc3e..efc16ad 100644 --- a/src/warchron/model/war.py +++ b/src/warchron/model/war.py @@ -19,6 +19,9 @@ class War: self.id: str = str(uuid4()) self.name: str = name self.year: int = year + self.major_value: int = 2 + self.minor_value: int = 1 + self.influence_token: bool = True self.participants: Dict[str, WarParticipant] = {} self.objectives: Dict[str, Objective] = {} self.campaigns: List[Campaign] = [] @@ -33,6 +36,19 @@ class War: def set_year(self, new_year: int) -> None: self.year = new_year + def set_major(self, new_value: int) -> None: + if new_value < self.minor_value: + raise ValueError("major_value cannot be < minor_value") + self.major_value = new_value + + def set_minor(self, new_value: int) -> None: + if new_value > self.major_value: + raise ValueError("minor_value cannot be > major_value") + self.minor_value = new_value + + def set_influence(self, new_state: bool) -> None: + self.influence_token = new_state + def set_state(self, new_state: bool) -> None: self.is_over = new_state @@ -41,6 +57,9 @@ class War: "id": self.id, "name": self.name, "year": self.year, + "major_value": self.major_value, + "minor_value": self.minor_value, + "influence_token": self.influence_token, "participants": [part.toDict() for part in self.participants.values()], "objectives": [obj.toDict() for obj in self.objectives.values()], "campaigns": [camp.toDict() for camp in self.campaigns], @@ -51,6 +70,9 @@ class War: def fromDict(data: Dict[str, Any]) -> War: war = War(name=data["name"], year=data["year"]) war.set_id(data["id"]) + war.set_major(data["major_value"]) + war.set_minor(data["minor_value"]) + war.set_influence(data["influence_token"]) for part_data in data.get("participants", []): part = WarParticipant.fromDict(part_data) war.participants[part.id] = part diff --git a/src/warchron/view/ui/ui_main_window.py b/src/warchron/view/ui/ui_main_window.py index c074afa..8633950 100644 --- a/src/warchron/view/ui/ui_main_window.py +++ b/src/warchron/view/ui/ui_main_window.py @@ -29,6 +29,9 @@ class Ui_MainWindow(object): self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.addPlayerBtn = QtWidgets.QPushButton(parent=self.playersTab) + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/plus.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.addPlayerBtn.setIcon(icon1) self.addPlayerBtn.setObjectName("addPlayerBtn") self.horizontalLayout.addWidget(self.addPlayerBtn) spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) @@ -51,9 +54,9 @@ class Ui_MainWindow(object): self.playersTable.setHorizontalHeaderItem(3, item) self.playersTable.horizontalHeader().setStretchLastSection(True) self.gridLayout.addWidget(self.playersTable, 1, 0, 1, 1) - icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/users.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.tabWidget.addTab(self.playersTab, icon1, "") + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/users.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.playersTab, icon2, "") self.warsTab = QtWidgets.QWidget() self.warsTab.setObjectName("warsTab") self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.warsTab) @@ -61,14 +64,17 @@ class Ui_MainWindow(object): self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.addWarBtn = QtWidgets.QPushButton(parent=self.warsTab) + self.addWarBtn.setIcon(icon1) self.addWarBtn.setObjectName("addWarBtn") self.horizontalLayout_2.addWidget(self.addWarBtn) self.addCampaignBtn = QtWidgets.QPushButton(parent=self.warsTab) self.addCampaignBtn.setEnabled(False) + self.addCampaignBtn.setIcon(icon1) self.addCampaignBtn.setObjectName("addCampaignBtn") self.horizontalLayout_2.addWidget(self.addCampaignBtn) self.addRoundBtn = QtWidgets.QPushButton(parent=self.warsTab) self.addRoundBtn.setEnabled(False) + self.addRoundBtn.setIcon(icon1) self.addRoundBtn.setObjectName("addRoundBtn") self.horizontalLayout_2.addWidget(self.addRoundBtn) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) @@ -129,6 +135,7 @@ class Ui_MainWindow(object): font = QtGui.QFont() font.setPointSize(10) self.addObjectiveBtn.setFont(font) + self.addObjectiveBtn.setIcon(icon1) self.addObjectiveBtn.setObjectName("addObjectiveBtn") self.horizontalLayout_3.addWidget(self.addObjectiveBtn) spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) @@ -190,6 +197,7 @@ class Ui_MainWindow(object): self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName("horizontalLayout_5") self.addWarParticipantBtn = QtWidgets.QPushButton(parent=self.groupBox_2) + self.addWarParticipantBtn.setIcon(icon1) self.addWarParticipantBtn.setObjectName("addWarParticipantBtn") self.horizontalLayout_5.addWidget(self.addWarParticipantBtn) spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) @@ -254,6 +262,7 @@ class Ui_MainWindow(object): self.horizontalLayout_17.setObjectName("horizontalLayout_17") self.addSectorBtn = QtWidgets.QPushButton(parent=self.groupBox_3) self.addSectorBtn.setEnabled(True) + self.addSectorBtn.setIcon(icon1) self.addSectorBtn.setObjectName("addSectorBtn") self.horizontalLayout_17.addWidget(self.addSectorBtn) spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) @@ -287,6 +296,7 @@ class Ui_MainWindow(object): self.horizontalLayout_18 = QtWidgets.QHBoxLayout() self.horizontalLayout_18.setObjectName("horizontalLayout_18") self.addCampaignParticipantBtn = QtWidgets.QPushButton(parent=self.groupBox_4) + self.addCampaignParticipantBtn.setIcon(icon1) self.addCampaignParticipantBtn.setObjectName("addCampaignParticipantBtn") self.horizontalLayout_18.addWidget(self.addCampaignParticipantBtn) spacerItem13 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) @@ -393,9 +403,9 @@ class Ui_MainWindow(object): self.verticalLayout_8.addLayout(self.horizontalLayout_9) self.selectedDetailsStack.addWidget(self.pageRound) self.verticalLayout_3.addWidget(self.splitter) - icon2 = QtGui.QIcon() - icon2.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/swords-small.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.tabWidget.addTab(self.warsTab, icon2, "") + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/swords-small.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.warsTab, icon3, "") self.verticalLayout_9.addWidget(self.tabWidget) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(parent=MainWindow) @@ -412,50 +422,50 @@ class Ui_MainWindow(object): self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.actionNew = QtGui.QAction(parent=MainWindow) - icon3 = QtGui.QIcon() - icon3.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/document.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionNew.setIcon(icon3) + icon4 = QtGui.QIcon() + icon4.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/document.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionNew.setIcon(icon4) self.actionNew.setObjectName("actionNew") self.actionOpen = QtGui.QAction(parent=MainWindow) - icon4 = QtGui.QIcon() - icon4.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/folder.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionOpen.setIcon(icon4) + icon5 = QtGui.QIcon() + icon5.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/folder.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionOpen.setIcon(icon5) self.actionOpen.setObjectName("actionOpen") self.actionSave = QtGui.QAction(parent=MainWindow) - icon5 = QtGui.QIcon() - icon5.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/disk.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionSave.setIcon(icon5) + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/disk.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionSave.setIcon(icon6) self.actionSave.setObjectName("actionSave") self.actionExit = QtGui.QAction(parent=MainWindow) - icon6 = QtGui.QIcon() - icon6.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/door--arrow.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionExit.setIcon(icon6) + icon7 = QtGui.QIcon() + icon7.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/door--arrow.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionExit.setIcon(icon7) self.actionExit.setObjectName("actionExit") self.actionUndo = QtGui.QAction(parent=MainWindow) - icon7 = QtGui.QIcon() - icon7.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/arrow-curve-180-left.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionUndo.setIcon(icon7) + icon8 = QtGui.QIcon() + icon8.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/arrow-curve-180-left.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionUndo.setIcon(icon8) self.actionUndo.setObjectName("actionUndo") self.actionRedo = QtGui.QAction(parent=MainWindow) - icon8 = QtGui.QIcon() - icon8.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/arrow-curve.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionRedo.setIcon(icon8) + icon9 = QtGui.QIcon() + icon9.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/arrow-curve.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionRedo.setIcon(icon9) self.actionRedo.setObjectName("actionRedo") self.actionAbout = QtGui.QAction(parent=MainWindow) - icon9 = QtGui.QIcon() - icon9.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/question.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionAbout.setIcon(icon9) + icon10 = QtGui.QIcon() + icon10.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/question.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionAbout.setIcon(icon10) self.actionAbout.setObjectName("actionAbout") self.actionExport = QtGui.QAction(parent=MainWindow) self.actionExport.setEnabled(False) - icon10 = QtGui.QIcon() - icon10.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/notebook--arrow.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionExport.setIcon(icon10) + icon11 = QtGui.QIcon() + icon11.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/notebook--arrow.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionExport.setIcon(icon11) self.actionExport.setObjectName("actionExport") self.actionSave_as = QtGui.QAction(parent=MainWindow) - icon11 = QtGui.QIcon() - icon11.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/disk--pencil.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.actionSave_as.setIcon(icon11) + icon12 = QtGui.QIcon() + icon12.addPixmap(QtGui.QPixmap(".\\src\\warchron\\view\\ui\\../resources/disk--pencil.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.actionSave_as.setIcon(icon12) self.actionSave_as.setObjectName("actionSave_as") self.menuFile.addAction(self.actionNew) self.menuFile.addAction(self.actionOpen) @@ -474,7 +484,7 @@ class Ui_MainWindow(object): self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(1) - self.selectedDetailsStack.setCurrentIndex(3) + self.selectedDetailsStack.setCurrentIndex(1) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): diff --git a/src/warchron/view/view.py b/src/warchron/view/view.py index ca2afc4..527c543 100644 --- a/src/warchron/view/view.py +++ b/src/warchron/view/view.py @@ -35,6 +35,11 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow): self.on_tree_selection_changed: ( Callable[[TreeSelection | None], None] | None ) = None + self.on_major_value_changed: Callable[[int], None] | None = None + self.on_minot_value_changed: Callable[[int], None] | None = None + self.majorValue.setMinimum(0) + self.minorValue.setMinimum(0) + self.on_influence_token_changed: Callable[[int], None] | None = None self.on_add_campaign: Callable[[], None] | None = None self.on_add_round: Callable[[], None] | None = None self.on_edit_item: Callable[[str, str], None] | None = None @@ -82,6 +87,8 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow): self.battlesTable.customContextMenuRequested.connect( self._on_battles_table_context_menu ) + self.majorValue.valueChanged.connect(self._on_major_changed) + self.minorValue.valueChanged.connect(self._on_minor_changed) def _emit_selection_changed(self, current: QTreeWidgetItem | None) -> None: if not self.on_tree_selection_changed: @@ -326,6 +333,25 @@ class View(QtWidgets.QMainWindow, Ui_MainWindow): table.setItem(row, 1, fact_item) table.resizeColumnsToContents() + def _on_major_changed(self, value: int) -> None: + self.minorValue.setMaximum(value) + + def _on_minor_changed(self, value: int) -> None: + self.majorValue.setMinimum(value) + + def set_war_objective_values(self, major: int, minor: int, influence: bool) -> None: + self.majorValue.blockSignals(True) + self.minorValue.blockSignals(True) + self.influenceToken.blockSignals(True) + self.majorValue.setValue(major) + self.minorValue.setValue(minor) + self.influenceToken.setChecked(influence) + self.minorValue.setMaximum(major) + self.majorValue.setMinimum(minor) + self.majorValue.blockSignals(False) + self.minorValue.blockSignals(False) + self.influenceToken.blockSignals(False) + # Campaign page def _on_sectors_table_context_menu(self, pos: QPoint) -> None: