import os import tempfile import cv2 import numpy as np from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QComboBox, QRadioButton, QButtonGroup, QFileDialog, QTextEdit, QProgressBar, QFrame, QScrollArea, QGroupBox, QGridLayout, QSlider, QSpinBox, QCheckBox, QTabWidget, QSplitter) from PyQt5.QtCore import Qt, QThread, pyqtSignal, QTimer, QMutex, QMutexLocker from PyQt5.QtGui import QPixmap, QImage, QPalette, QFont, QMovie from motion_app_qt import MotionComparisonAppQt from video_display_widget import VideoDisplayWidget from similarity_display_widget import SimilarityDisplayWidget from control_panel_widget import ControlPanelWidget class MainWidget(QWidget): def __init__(self): super().__init__() self.motion_app = MotionComparisonAppQt() self.setup_ui() def setup_ui(self): # Main layout - horizontal splitter main_splitter = QSplitter(Qt.Horizontal) # Control panel (sidebar) - fixed width self.control_panel = ControlPanelWidget(self.motion_app) self.control_panel.setMinimumWidth(300) self.control_panel.setMaximumWidth(350) # Main content area content_widget = QWidget() content_layout = QVBoxLayout(content_widget) # Video display area - priority for real-time performance self.video_display = VideoDisplayWidget(self.motion_app) content_layout.addWidget(self.video_display, stretch=2) # Similarity analysis area - can have latency self.similarity_display = SimilarityDisplayWidget(self.motion_app) content_layout.addWidget(self.similarity_display, stretch=1) # Add widgets to splitter main_splitter.addWidget(self.control_panel) main_splitter.addWidget(content_widget) main_splitter.setStretchFactor(0, 0) # Control panel fixed main_splitter.setStretchFactor(1, 1) # Content area expandable # Main layout main_layout = QHBoxLayout(self) main_layout.addWidget(main_splitter) main_layout.setContentsMargins(0, 0, 0, 0) # Connect signals self.setup_connections() def setup_connections(self): # Connect control panel signals to main app self.control_panel.video_selected.connect(self.video_display.load_video) self.control_panel.start_comparison.connect(self.start_comparison) self.control_panel.stop_comparison.connect(self.stop_comparison) self.control_panel.initialize_system.connect(self.motion_app.initialize_all) def start_comparison(self, video_path): self.video_display.start_comparison(video_path) self.similarity_display.start_analysis() def stop_comparison(self): self.video_display.stop_comparison() self.similarity_display.stop_analysis() self.motion_app.cleanup()