Source code for hyloa.main

# This file is part of HYLOA - HYsteresis LOop Analyzer.
# Copyright (C) 2024 Francesco Zeno Costanzo

# HYLOA is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# HYLOA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with HYLOA. If not, see <https://www.gnu.org/licenses/>.


"""
Entry point for HYLOA application.
"""

import sys
import time 
from importlib import resources
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QProgressBar
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt, QTimer


# Duration to show the splash screen at minimum
MIN_SPLASH_TIME = 3.0  # Seconds


[docs] class Splash(QWidget): ''' Splash screen with a logo and a progress bar. ''' def __init__(self, pixmap): ''' Initialize the splash screen with a logo and a progress bar. Parameters ---------- pixmap : QPixmap The logo to display on the splash screen. ''' super().__init__( flags=Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint ) self.setAttribute(Qt.WA_TranslucentBackground) layout = QVBoxLayout(self) layout.setContentsMargins(20, 20, 20, 20) # Logo self.logo = QLabel() self.logo.setPixmap(pixmap) self.logo.setAlignment(Qt.AlignCenter) # Progress Bar self.progress = QProgressBar() self.progress.setRange(0, 100) self.progress.setValue(0) self.progress.setTextVisible(True) self.progress.setFormat("%p%") layout.addWidget(self.logo) layout.addWidget(self.progress) self.adjustSize() self.move( self.screen().geometry().center() - self.rect().center() )
[docs] def set_progress(self, value): ''' Update the progress bar value. Parameters ---------- value : int The new value for the progress bar (0-100). ''' self.progress.setValue(value)
[docs] def compute_remaining_time(start_time, min_splash_time): ''' Compute the remaining time to show the splash screen Parameters ---------- start_time : float The time when the splash screen was shown (monotonic). min_splash_time : float The minimum duration to show the splash screen (seconds). Returns ------- int Remaining time in milliseconds to show the splash screen. ''' elapsed = time.monotonic() - start_time return max(0, int((min_splash_time - elapsed) * 1000))
[docs] def main(): ''' Main entry point for the HYLOA application. ''' start_time = time.monotonic() app = QApplication(sys.argv) # Load splash screen resources with resources.path("hyloa.resources", "icon-6.png") as p: pixmap = QPixmap(str(p)) splash = Splash(pixmap) splash.show() splash.set_progress(20) app.processEvents() # Import main window (heavy part of the loading) from hyloa.gui.main_window import MainApp splash.set_progress(60) app.processEvents() window = MainApp() remaining = compute_remaining_time(start_time, MIN_SPLASH_TIME) def finish(): splash.set_progress(100) app.processEvents() window.show() splash.close() QTimer.singleShot(remaining, finish) sys.exit(app.exec_())
if __name__ == "__main__": main()