import cv2, numpy as np import sys import os import json from pathlib import Path from Tbd.helper import default_profile, CameraObject from UI.SetupPageWidget import SetupPage from UI.HomePageWidget import HomeWindow from UI.GameWindow import GameWindow from UI.UILogger import UILogger from Tbd.TrackingController import TrackingController from PySide6.QtCore import Qt, QTimer from PySide6.QtGui import QImage, QPixmap from PySide6.QtWidgets import ( QApplication, QMainWindow, QStackedWidget, QMessageBox, QPlainTextEdit ) from PySide6.QtWidgets import QLineEdit from PySide6.QtGui import QIntValidator from PySide6.QtWidgets import QWidget, QLabel, QVBoxLayout, QPushButton, QHBoxLayout, QSizePolicy from typing import List CONFIG_PATH = Path("config/profile_default.json") class MainWindow(QMainWindow): """ Main control window: left sidebar + right content area. """ cameraList = [] def __init__(self): super().__init__() self.P_mats = {} self.setWindowTitle("Gaming Table Control") self.resize(1200, 1200) # Central root widget root = QWidget() self.setCentralWidget(root) self.main_layout = QVBoxLayout(root) self.main_interaction_layout = QHBoxLayout() # Create Logger self.console = QPlainTextEdit() self.logger = UILogger(self.console) # ---------- Sidebar ---------- self.sidebar = QVBoxLayout() self.btn_home = QPushButton("Home") self.btn_start = QPushButton("Start Game") self.btn_stop = QPushButton("Stop Game") self.btn_setup = QPushButton("Setup Cameras") self.btn_exit = QPushButton("Exit") for btn in [self.btn_home, self.btn_start, self.btn_stop, self.btn_setup, self.btn_exit]: btn.setMinimumHeight(40) self.sidebar.addWidget(btn) self.sidebar.addStretch(1) # push buttons to top # ---------- Content area (stack) ---------- self.stack = QStackedWidget() # Home page home_page = QWidget() self.homeWidget = HomeWindow( cameraList=self.cameraList, on_cameraList_changed=self.on_cameraList_changed, P_mats=self.P_mats, logger=self.logger ) home_layout = QVBoxLayout(home_page) home_label = QLabel("Welcome to the Gaming Table Control") home_label.setAlignment(Qt.AlignCenter) home_layout.addWidget(home_label) home_layout.addWidget(self.homeWidget) # Setup page self.setup_page = SetupPage( cameraList=self.cameraList, on_cameraList_changed=self.on_cameraList_changed, logger=self.logger ) # Options page (placeholder) stop_page = QWidget() stop_layout = QVBoxLayout(stop_page) stop_label = QLabel("The game was stopped") stop_label.setAlignment(Qt.AlignCenter) stop_layout.addWidget(stop_label) # Add pages to stack self.page_home_index = self.stack.addWidget(home_page) self.page_setup_index = self.stack.addWidget(self.setup_page) self.page_stop_index = self.stack.addWidget(stop_page) # ---------- Assemble layout ---------- self.main_interaction_layout.addLayout(self.sidebar) # left side self.main_interaction_layout.addWidget(self.stack, 1) # right side grows self.main_layout.addLayout(self.main_interaction_layout) self.main_layout.addWidget(self.console) # ---------- Connections ---------- self.btn_home.clicked.connect(self.show_home) self.btn_setup.clicked.connect(self.show_setup) self.btn_stop.clicked.connect(self.show_stop) self.btn_start.clicked.connect(self.start_game) self.btn_exit.clicked.connect(self.close) self.game_window = None # -------------------- def on_cameraList_changed(self): self.homeWidget.updateCameras() self.logger.log("Camera List changed") for camera in self.cameraList: self.logger.log(str(camera.index)) def show_home(self): self.stack.setCurrentIndex(self.page_home_index) def show_setup(self): self.stack.setCurrentIndex(self.page_setup_index) def show_stop(self): self.stack.setCurrentIndex(self.page_stop_index) if(self.tracking) is not None: self.tracking.stop() def start_game(self): self.tracking = TrackingController( cameraList=self.cameraList, P_mats=self.P_mats, logger=self.logger, tick_ms=30 ) self.tracking.start() def main(): app = QApplication(sys.argv) win = MainWindow() win.show() sys.exit(app.exec()) if __name__ == "__main__": main()