204 lines
6.0 KiB
Python
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)
|