''' app/ui/widgets/statusbar.py ''' import os.path import socket import threading import time from PyQt6.QtCore import Qt, QTimer from PyQt6.QtGui import QPixmap from PyQt6.QtWidgets import QStatusBar, QLabel from src.api.server_proxy import RenderServerProxy from src.engines.engine_manager import EngineManager from src.utilities.misc_helper import resources_dir class StatusBar(QStatusBar): """ Initialize the status bar. Args: parent: The parent widget. """ def __init__(self, parent) -> None: super().__init__(parent) def background_update(): proxy = RenderServerProxy(socket.gethostname()) proxy.start_background_update() image_names = {'Ready': 'GreenCircle.png', 'Offline': "RedSquare.png"} # Check for status change every 1s on background thread while True: new_status = proxy.status() new_image_name = image_names.get(new_status, 'Synchronize.png') image_path = os.path.join(resources_dir(), new_image_name) self.label.setPixmap((QPixmap(image_path).scaled(16, 16, Qt.AspectRatioMode.KeepAspectRatio))) # add download status if EngineManager.download_tasks: if len(EngineManager.download_tasks) == 1: task = EngineManager.download_tasks[0] new_status = f"{new_status} | Downloading {task.engine.capitalize()} {task.version}..." else: new_status = f"{new_status} | Downloading {len(EngineManager.download_tasks)} engines" self.messageLabel.setText(new_status) time.sleep(1) background_thread = threading.Thread(target=background_update,) background_thread.daemon = True background_thread.start() # Create a label that holds an image self.label = QLabel() image_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'resources', 'RedSquare.png') pixmap = (QPixmap(image_path).scaled(16, 16, Qt.AspectRatioMode.KeepAspectRatio)) self.label.setPixmap(pixmap) self.addWidget(self.label) # Create a label for the message self.messageLabel = QLabel() self.addWidget(self.messageLabel) # Call this method to display a message self.messageLabel.setText("Loading...")