Add loading splash screen for app startup
**Splash Screen Features:** - Shows "Local Transcription" branding during startup - Displays progress messages as app initializes - Prevents users from clicking multiple times while loading - Clean dark theme matching app design **Implementation:** - Created splash screen with custom pixmap drawing - Updates messages during initialization phases: - "Loading configuration..." - "Creating user interface..." - "Starting web server..." - "Loading Whisper model..." - Automatically closes when main window is ready - Always stays on top to remain visible **Benefits:** - Better user experience during model loading (2-5 seconds) - Prevents multiple app instances from confusion - Professional appearance - Clear feedback that app is starting 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -71,10 +71,13 @@ class ModelLoaderThread(QThread):
|
|||||||
class MainWindow(QMainWindow):
|
class MainWindow(QMainWindow):
|
||||||
"""Main application window using PySide6."""
|
"""Main application window using PySide6."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, splash_screen=None):
|
||||||
"""Initialize the main window."""
|
"""Initialize the main window."""
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
# Store splash screen reference
|
||||||
|
self.splash_screen = splash_screen
|
||||||
|
|
||||||
# Application state
|
# Application state
|
||||||
self.is_transcribing = False
|
self.is_transcribing = False
|
||||||
self.config = Config()
|
self.config = Config()
|
||||||
@@ -101,14 +104,32 @@ class MainWindow(QMainWindow):
|
|||||||
self.setWindowTitle("Local Transcription")
|
self.setWindowTitle("Local Transcription")
|
||||||
self.resize(900, 700)
|
self.resize(900, 700)
|
||||||
|
|
||||||
|
# Update splash
|
||||||
|
self._update_splash("Creating user interface...")
|
||||||
|
|
||||||
# Create UI
|
# Create UI
|
||||||
self._create_widgets()
|
self._create_widgets()
|
||||||
|
|
||||||
|
# Update splash
|
||||||
|
self._update_splash("Starting web server...")
|
||||||
|
|
||||||
|
# Start web server if enabled
|
||||||
|
self._start_web_server_if_enabled()
|
||||||
|
|
||||||
|
# Update splash
|
||||||
|
self._update_splash("Loading Whisper model...")
|
||||||
|
|
||||||
# Initialize components (in background)
|
# Initialize components (in background)
|
||||||
self._initialize_components()
|
self._initialize_components()
|
||||||
|
|
||||||
# Start web server if enabled
|
def _update_splash(self, message: str):
|
||||||
self._start_web_server_if_enabled()
|
"""Update splash screen message if it exists."""
|
||||||
|
if self.splash_screen:
|
||||||
|
from PySide6.QtCore import Qt
|
||||||
|
from PySide6.QtGui import QColor
|
||||||
|
from PySide6.QtWidgets import QApplication
|
||||||
|
self.splash_screen.showMessage(message, Qt.AlignBottom | Qt.AlignCenter, QColor("#888888"))
|
||||||
|
QApplication.processEvents()
|
||||||
|
|
||||||
def _create_widgets(self):
|
def _create_widgets(self):
|
||||||
"""Create all UI widgets."""
|
"""Create all UI widgets."""
|
||||||
|
|||||||
62
main.py
62
main.py
@@ -14,10 +14,53 @@ from pathlib import Path
|
|||||||
project_root = Path(__file__).parent
|
project_root = Path(__file__).parent
|
||||||
sys.path.insert(0, str(project_root))
|
sys.path.insert(0, str(project_root))
|
||||||
|
|
||||||
from PySide6.QtWidgets import QApplication
|
from PySide6.QtWidgets import QApplication, QSplashScreen
|
||||||
|
from PySide6.QtGui import QPixmap, QPainter, QColor, QFont
|
||||||
|
from PySide6.QtCore import Qt, QTimer
|
||||||
from gui.main_window_qt import MainWindow
|
from gui.main_window_qt import MainWindow
|
||||||
|
|
||||||
|
|
||||||
|
def create_splash_pixmap(message="Loading..."):
|
||||||
|
"""Create a pixmap for the splash screen with a custom message."""
|
||||||
|
pixmap = QPixmap(500, 300)
|
||||||
|
pixmap.fill(QColor("#2b2b2b"))
|
||||||
|
|
||||||
|
# Draw on the pixmap
|
||||||
|
painter = QPainter(pixmap)
|
||||||
|
painter.setRenderHint(QPainter.Antialiasing)
|
||||||
|
|
||||||
|
# Draw title
|
||||||
|
title_font = QFont("Arial", 28, QFont.Bold)
|
||||||
|
painter.setFont(title_font)
|
||||||
|
painter.setPen(QColor("#ffffff"))
|
||||||
|
painter.drawText(pixmap.rect(), Qt.AlignCenter, "Local Transcription")
|
||||||
|
|
||||||
|
# Draw subtitle
|
||||||
|
subtitle_font = QFont("Arial", 12)
|
||||||
|
painter.setFont(subtitle_font)
|
||||||
|
painter.setPen(QColor("#888888"))
|
||||||
|
subtitle_rect = pixmap.rect().adjusted(0, 60, 0, 0)
|
||||||
|
painter.drawText(subtitle_rect, Qt.AlignCenter, message)
|
||||||
|
|
||||||
|
# Draw version/status at bottom
|
||||||
|
status_font = QFont("Arial", 10)
|
||||||
|
painter.setFont(status_font)
|
||||||
|
painter.setPen(QColor("#666666"))
|
||||||
|
status_rect = pixmap.rect().adjusted(0, 0, 0, -20)
|
||||||
|
painter.drawText(status_rect, Qt.AlignHCenter | Qt.AlignBottom, "Please wait...")
|
||||||
|
|
||||||
|
painter.end()
|
||||||
|
return pixmap
|
||||||
|
|
||||||
|
|
||||||
|
def create_splash_screen():
|
||||||
|
"""Create a splash screen for startup."""
|
||||||
|
pixmap = create_splash_pixmap("Initializing...")
|
||||||
|
splash = QSplashScreen(pixmap)
|
||||||
|
splash.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.SplashScreen)
|
||||||
|
return splash
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""Main application entry point."""
|
"""Main application entry point."""
|
||||||
try:
|
try:
|
||||||
@@ -31,8 +74,21 @@ def main():
|
|||||||
app.setApplicationName("Local Transcription")
|
app.setApplicationName("Local Transcription")
|
||||||
app.setOrganizationName("LocalTranscription")
|
app.setOrganizationName("LocalTranscription")
|
||||||
|
|
||||||
# Create and show main window
|
# Create and show splash screen
|
||||||
window = MainWindow()
|
splash = create_splash_screen()
|
||||||
|
splash.show()
|
||||||
|
app.processEvents() # Make sure splash is visible
|
||||||
|
|
||||||
|
# Update splash with progress
|
||||||
|
splash.showMessage("Loading configuration...", Qt.AlignBottom | Qt.AlignCenter, QColor("#888888"))
|
||||||
|
app.processEvents()
|
||||||
|
|
||||||
|
# Create main window (this takes time due to model loading)
|
||||||
|
# Pass splash to window so it can update the message
|
||||||
|
window = MainWindow(splash_screen=splash)
|
||||||
|
|
||||||
|
# Close splash and show main window
|
||||||
|
splash.finish(window)
|
||||||
window.show()
|
window.show()
|
||||||
|
|
||||||
# Run application
|
# Run application
|
||||||
|
|||||||
Reference in New Issue
Block a user