Files

204 lines
6.0 KiB
Python

"""
Finale UI - Main Entry Point
Modern traffic monitoring interface entry point.
"""
from PySide6.QtWidgets import QApplication
from PySide6.QtCore import Qt
from PySide6.QtGui import QFont, QPalette, QColor
import sys
import os
from pathlib import Path
# Import finale components
try:
# Try relative imports first (when running as a package)
from .main_window import FinaleMainWindow
from .splash import FinaleSplashScreen
from .styles import FinaleStyles, MaterialColors
from .icons import FinaleIcons
except ImportError:
# Fallback to direct imports (when running as script)
try:
from main_window import FinaleMainWindow
from splash import FinaleSplashScreen
from styles import FinaleStyles, MaterialColors
from icons import FinaleIcons
except ImportError:
print('Error importing main components')
# Add Qt message handler from original main.py
def qt_message_handler(mode, context, message):
print(f"Qt Message: {message} (Mode: {mode})")
# Install custom handler for Qt messages
from PySide6.QtCore import Qt
if hasattr(Qt, 'qInstallMessageHandler'):
Qt.qInstallMessageHandler(qt_message_handler)
class FinaleUI:
"""
Main Finale UI application class.
Handles application initialization, theme setup, and window management.
"""
def __init__(self):
self.app = None
self.main_window = None
self.splash = None
def initialize_application(self, sys_argv=None):
"""
Initialize the QApplication with proper settings.
Args:
sys_argv: System arguments (defaults to sys.argv)
"""
if sys_argv is None:
sys_argv = sys.argv
# Create or get existing application instance
self.app = QApplication.instance() or QApplication(sys_argv)
# Set application properties
self.app.setApplicationName("Finale Traffic Monitoring")
self.app.setApplicationVersion("1.0.0")
self.app.setOrganizationName("Finale Systems")
self.app.setOrganizationDomain("finale.traffic")
# Set application icon
self.app.setWindowIcon(FinaleIcons.get_icon("traffic_monitoring"))
# Enable high DPI scaling
self.app.setAttribute(Qt.AA_EnableHighDpiScaling, True)
self.app.setAttribute(Qt.AA_UseHighDpiPixmaps, True)
# Set font
self.setup_fonts()
# Set global theme
self.setup_theme()
return self.app
def setup_fonts(self):
"""Setup application fonts"""
# Set default font
font = QFont("Segoe UI", 9)
font.setHintingPreference(QFont.PreferDefaultHinting)
self.app.setFont(font)
def setup_theme(self):
"""Setup global application theme"""
# Apply dark theme by default
MaterialColors.apply_dark_theme()
# Set global stylesheet
self.app.setStyleSheet(FinaleStyles.get_global_style())
def show_splash_screen(self):
"""Show splash screen during initialization"""
try:
self.splash = FinaleSplashScreen()
self.splash.show()
# Process events to show splash
self.app.processEvents()
return self.splash
except Exception as e:
print(f"Could not show splash screen: {e}")
return None
def create_main_window(self):
"""Create and initialize the main window"""
try:
self.main_window = FinaleMainWindow()
return self.main_window
except Exception as e:
print(f"Error creating main window: {e}")
raise
def run(self, show_splash=True):
"""
Run the complete Finale UI application.
Args:
show_splash: Whether to show splash screen
Returns:
Application exit code
"""
try:
# Initialize application
if not self.app:
self.initialize_application()
# Show splash screen
if show_splash:
splash = self.show_splash_screen()
if splash:
splash.update_progress(20, "Initializing UI components...")
self.app.processEvents()
# Create main window
if splash:
splash.update_progress(50, "Loading detection models...")
self.app.processEvents()
self.main_window = self.create_main_window()
if splash:
splash.update_progress(80, "Connecting to backend...")
self.app.processEvents()
# Finish splash and show main window
if splash:
splash.update_progress(100, "Ready!")
self.app.processEvents()
splash.finish(self.main_window)
# Show main window
self.main_window.show()
# Start event loop
return self.app.exec()
except Exception as e:
print(f"❌ Error running Finale UI: {e}")
import traceback
traceback.print_exc()
return 1
def create_finale_app(sys_argv=None):
"""
Create and return a Finale UI application instance.
Args:
sys_argv: System arguments
Returns:
FinaleUI instance
"""
finale_ui = FinaleUI()
finale_ui.initialize_application(sys_argv)
return finale_ui
def run_finale_ui(sys_argv=None, show_splash=True):
"""
Convenience function to run the Finale UI.
Args:
sys_argv: System arguments
show_splash: Whether to show splash screen
Returns:
Application exit code
"""
finale_ui = create_finale_app(sys_argv)
return finale_ui.run(show_splash)
# Main execution
if __name__ == "__main__":
exit_code = run_finale_ui()
sys.exit(exit_code)