diff --git a/src/inventory_wars/gui/app.py b/src/inventory_wars/gui/app.py index d671d58..489b1bd 100644 --- a/src/inventory_wars/gui/app.py +++ b/src/inventory_wars/gui/app.py @@ -3,7 +3,7 @@ import sys from datetime import datetime from enum import Enum -from PySide6.QtCore import QObject, Signal, Slot, Property, QEnum, QAbstractItemModel +from PySide6.QtCore import QObject, Signal, Slot, Property, QEnum from PySide6.QtGui import QGuiApplication from PySide6.QtQml import QQmlApplicationEngine, QmlElement from sqlalchemy import create_engine @@ -11,8 +11,8 @@ from sqlalchemy.orm import Session from star_resonance_tracer.proto.enum_chit_chat_channel_type_pb2 import ChitChatChannelType from inventory_wars.game import Game -from inventory_wars.models import Base -from inventory_wars.scoring import Scoring, FirstGuess, FirstThenHighest +from inventory_wars.models import Base, ItemShare +from inventory_wars.scoring import FirstGuess, FirstThenHighest from inventory_wars.state import GameOngoing, GameIdle QML_IMPORT_NAME = "InventoryWars" @@ -24,25 +24,57 @@ Base.metadata.create_all(engine) session = Session(engine) +class FirstGuessGui(FirstGuess): + def __init__(self, game: GameService): + super().__init__() + self.game = game + + def calculate_score(self, item: ItemShare) -> int: + result = super().calculate_score(item) + elapsed = self.game.elapsedSeconds + if result: + self.game.guessed.emit(item.user.username, elapsed) + self.game.end() + return result + + +class FirstThenHighestGui(FirstThenHighest): + def __init__(self, game: GameService): + super().__init__() + self.game = game + + def calculate_score(self, item: ItemShare) -> int: + previous_max = self.highest.max + result = super().calculate_score(item) + elapsed = self.game.elapsedSeconds + if result: + self.game.guessed.emit(item.user.username, elapsed) + if previous_max is not self.highest.max: + self.game.highest.emit(item.user.username, elapsed) + return result + + class GameScoring(Enum): FirstGuess = 0 FirstGuessThenHighestAmount = 1 @property - def as_scoring(self) -> type[Scoring]: + def as_scoring(self) -> type[FirstGuessGui | FirstThenHighestGui]: match self: case self.FirstGuess: - return FirstGuess + return FirstGuessGui case self.FirstGuessThenHighestAmount: - return FirstThenHighest + return FirstThenHighestGui case _: raise NotImplementedError + class GameState(Enum): Hidden = 0 Revealed = 1 Ended = 3 + @QmlElement class GameService(QObject): QEnum(GameScoring) @@ -62,7 +94,7 @@ class GameService(QObject): @Slot(int, int) def start(self, item_id: int, mode: int): mode = GameScoring(mode) - self.m_game.start(item_id, mode.as_scoring()) + self.m_game.start(item_id, mode.as_scoring(self)) self.m_started_at = datetime.now() self.m_revealed_at = None self.stateChanged.emit()