Files
Traffic-Intersection-Monito…/qt_app_pyside1/enhanced_main_window.py

131 lines
5.9 KiB
Python

"""
Patch for the MainWindow class to use EnhancedVideoController by default.
This file is imported by main.py to modify MainWindow's behavior.
"""
# Import all necessary Qt components
from PySide6.QtCore import Qt, QTimer
from PySide6.QtWidgets import QMessageBox
# Import the enhanced controller - handle potential import errors
try:
from controllers.enhanced_video_controller import EnhancedVideoController
except ImportError:
try:
from qt_app_pyside.controllers.enhanced_video_controller import EnhancedVideoController
except ImportError:
print("⚠️ Warning: Could not import EnhancedVideoController. Using fallback controller.")
EnhancedVideoController = None
# Original imports preserved for compatibility - handle potential import errors
try:
from controllers.video_controller_new import VideoController
from controllers.analytics_controller import AnalyticsController
from controllers.performance_overlay import PerformanceOverlay
from controllers.model_manager import ModelManager
except ImportError:
try:
from qt_app_pyside.controllers.video_controller_new import VideoController
from qt_app_pyside.controllers.analytics_controller import AnalyticsController
from qt_app_pyside.controllers.performance_overlay import PerformanceOverlay
from qt_app_pyside.controllers.model_manager import ModelManager
except ImportError:
print("⚠️ Warning: Could not import controller modules.")
# Store original method reference
original_setup_controllers = None
def enhanced_setup_controllers(self):
"""Enhanced version of setupControllers that uses the EnhancedVideoController"""
global EnhancedVideoController, ModelManager, AnalyticsController
# If modules couldn't be imported, fall back to original method
if EnhancedVideoController is None:
print("⚠️ Enhanced controller not available, falling back to original setup")
if original_setup_controllers:
original_setup_controllers(self)
return
# Store existing source if video controller already exists
existing_source = None
if hasattr(self, 'video_controller') and self.video_controller:
# Grab the current source before replacing the controller
print("📽️ Preserving existing video source...")
try:
# Try to get source from the processing thread
if hasattr(self.video_controller, 'processing_thread') and self.video_controller.processing_thread:
existing_source = self.video_controller.processing_thread.source
print(f"✅ Preserved source from processing thread: {existing_source}")
# Backup: Get source directly from live tab
elif hasattr(self, 'live_tab') and hasattr(self.live_tab, 'current_source'):
existing_source = self.live_tab.current_source
print(f"✅ Preserved source from live tab: {existing_source}")
except Exception as e:
print(f"⚠️ Could not preserve source: {e}")
# Load config from file
try: # Initialize model manager
self.model_manager = ModelManager(self.config_file)
# Create enhanced video controller instead of regular one
print("🚀 Creating enhanced video controller with async inference...")
self.video_controller = EnhancedVideoController(self.model_manager)
# Restore the source if we had one or check the live tab
# First try the source we grabbed earlier
if existing_source is not None and existing_source != 0:
print(f"🔄 Restoring video source from previous controller: {existing_source}")
self.video_controller.set_source(existing_source)
# If we couldn't get it from the previous controller, try getting it from the live tab directly
elif hasattr(self, 'live_tab') and hasattr(self.live_tab, 'current_source') and self.live_tab.current_source is not None and self.live_tab.current_source != 0:
print(f"🔄 Using source directly from live_tab: {self.live_tab.current_source}")
self.video_controller.set_source(self.live_tab.current_source)
# Create analytics controller
self.analytics_controller = AnalyticsController()
# Setup update timer for performance overlay
self.perf_timer = QTimer()
self.perf_timer.timeout.connect(self.performance_overlay.update_stats)
self.perf_timer.start(1000) # Update every second
# Important: Do NOT set a default source - let the UI handle it properly
# This allows video files to be loaded and remembered
print("✅ Enhanced controller setup complete!")
except Exception as e:
# Show error message
from PySide6.QtWidgets import QMessageBox
QMessageBox.critical(
self,
"Initialization Error",
f"Error initializing enhanced controllers: {str(e)}"
)
print(f"❌ Error details: {e}")
# Fall back to original method if there's an error
if original_setup_controllers:
print("⚠️ Falling back to original controller setup")
original_setup_controllers(self)
# Function to patch the MainWindow class and return the patched version
def patch_mainwindow_class():
"""
Import and patch the MainWindow class to use EnhancedVideoController by default.
Returns the patched MainWindow class.
"""
global original_setup_controllers
# Import MainWindow here to avoid circular imports
from ui.main_window import MainWindow
# Store the original method
original_setup_controllers = MainWindow.setupControllers
# Replace with enhanced method
MainWindow.setupControllers = enhanced_setup_controllers
print("✅ MainWindow patched to use EnhancedVideoController")
return MainWindow