From 2b965b3435b7b05561dba19a43ad0ea860997e89 Mon Sep 17 00:00:00 2001 From: Auric Vente Date: Fri, 19 Jul 2024 00:54:22 -0600 Subject: [PATCH] Mods --- cromulant/ants.py | 19 +++++++++++++++++++ cromulant/config.py | 2 +- cromulant/game.py | 29 ++++++++++++++++++++++++++++- cromulant/window.py | 31 ++++++++++++++++++++++++------- 4 files changed, 72 insertions(+), 9 deletions(-) diff --git a/cromulant/ants.py b/cromulant/ants.py index 66708b6..a1c4ec7 100644 --- a/cromulant/ants.py +++ b/cromulant/ants.py @@ -86,6 +86,7 @@ class Ants: break Ants.save() + Game.update_info() @staticmethod def hatch_burst() -> None: @@ -104,13 +105,17 @@ class Ants: image_path = Config.terminated_image_path Game.add_message("Terminated", f"{ant.name} is gone", image_path) + Game.update_info() @staticmethod def terminate_all() -> None: + from .game import Game + def action() -> None: Ants.ants = [] Ants.save() Window.clear_view() + Game.update_info() Window.confirm("Terminate all ants?", action) @@ -157,3 +162,17 @@ class Ants: ant = Ant() ant.from_dict(obj) Ants.ants.append(ant) + + @staticmethod + def most_hits() -> Ant | None: + if not len(Ants.ants): + return None + + return max(Ants.ants, key=lambda a: a.hits) + + @staticmethod + def most_triumph() -> Ant | None: + if not len(Ants.ants): + return None + + return max(Ants.ants, key=lambda a: a.triumph) diff --git a/cromulant/config.py b/cromulant/config.py index fe0ba13..2649ccf 100644 --- a/cromulant/config.py +++ b/cromulant/config.py @@ -20,7 +20,7 @@ class Config: background_color: str = "#2c2c2c" text_color: str = "#ffffff" image_size: int = 80 - space_1: int = 25 + space_1: int = 20 max_messages: int = 120 loop_delay_fast: int = 3_000 loop_delay_normal: int = 20_000 diff --git a/cromulant/game.py b/cromulant/game.py index ee6242f..5094cfc 100644 --- a/cromulant/game.py +++ b/cromulant/game.py @@ -26,6 +26,7 @@ class Game: @staticmethod def prepare() -> None: Game.initial_fill() + Game.update_info() @staticmethod def add_status(ant: Ant) -> None: @@ -145,7 +146,8 @@ class Game: ants = sorted(Ants.ants, key=lambda ant: ant.updated) for ant in ants: - Game.add_status(ant) + if ant.status: + Game.add_status(ant) @staticmethod def start_loop() -> None: @@ -166,3 +168,28 @@ class Game: def update_speed() -> None: Game.timer.stop() Game.start_loop() + + @staticmethod + def update_info() -> None: + text = [] + + # Non-breaking space + nb = "\u00a0" + + if not len(Ants.ants): + text.append("Hatch some ants") + else: + text.append(f"Ants:{nb}{len(Ants.ants)}") + + hits = Ants.most_hits() + + if hits: + text.append(f"Most{nb}Hits:{nb}{hits.name}") + + triumph = Ants.most_triumph() + + if triumph: + text.append(f"Most{nb}Triumph:{nb}{triumph.name}") + + Window.info.setText(" | ".join(text)) + Window.info.adjustSize() diff --git a/cromulant/window.py b/cromulant/window.py index e7b2e28..5f1b3bb 100644 --- a/cromulant/window.py +++ b/cromulant/window.py @@ -15,6 +15,7 @@ from PySide6.QtWidgets import QComboBox from PySide6.QtWidgets import QLayout from PySide6.QtWidgets import QSizePolicy from PySide6.QtWidgets import QMessageBox +from PySide6.QtWidgets import QLabel from PySide6.QtGui import QMouseEvent # type: ignore from PySide6.QtGui import QIcon from PySide6.QtCore import Qt # type: ignore @@ -40,12 +41,15 @@ class Window: view: QVBoxLayout view_scene: QGraphicsScene speed: QComboBox + scroll_area: QScrollArea + info: QLabel @staticmethod def prepare() -> None: Window.make() Window.add_buttons() Window.add_view() + Window.add_footer() @staticmethod def make() -> None: @@ -83,21 +87,21 @@ class Window: Window.speed.setCurrentIndex(1) Window.speed.currentIndexChanged.connect(Game.update_speed) - btn_close = QPushButton("Close") - btn_close.clicked.connect(Window.close) + btn_top = QPushButton("Top") + btn_top.clicked.connect(Window.to_top) layout = QHBoxLayout() layout.addWidget(btn_hatch) layout.addWidget(btn_terminate) layout.addWidget(Window.speed) - layout.addWidget(btn_close) + layout.addWidget(btn_top) Window.root.addLayout(layout) @staticmethod def add_view() -> None: - scroll_area = QScrollArea() - scroll_area.setWidgetResizable(True) + Window.scroll_area = QScrollArea() + Window.scroll_area.setWidgetResizable(True) container = QWidget() parent = QVBoxLayout(container) @@ -105,8 +109,8 @@ class Window: parent.addLayout(Window.view) Window.view.setAlignment(Qt.AlignmentFlag.AlignTop) - scroll_area.setWidget(container) - Window.root.addWidget(scroll_area) + Window.scroll_area.setWidget(container) + Window.root.addWidget(Window.scroll_area) @staticmethod def start() -> None: @@ -155,3 +159,16 @@ class Window: item.widget().deleteLater() elif item.layout(): Window.delete_layout(item.layout()) + + @staticmethod + def to_top() -> None: + Window.scroll_area.verticalScrollBar().setValue(0) + + @staticmethod + def add_footer() -> None: + layout = QHBoxLayout() + Window.info = QLabel("---") + Window.info.setWordWrap(True) + Window.expand(Window.info) + layout.addWidget(Window.info) + Window.root.addLayout(layout)