This commit is contained in:
Auric Vente 2024-07-19 00:54:22 -06:00
parent 95bc45af8b
commit 2b965b3435
4 changed files with 72 additions and 9 deletions

View File

@ -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)

View File

@ -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

View File

@ -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()

View File

@ -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)