Files
oxapp25/main.py
2025-04-13 19:06:01 +02:00

102 lines
3.6 KiB
Python

from PySide6.QtCore import QStandardPaths, QDataStream, QByteArray, QIODevice, Signal, Qt
from PySide6.QtNetwork import QLocalServer, QLocalSocket
from PySide6.QtWidgets import QApplication
import qasync
import sys
import asyncio
import os
import platform
import argparse
from pathlib import Path
from src.logs import configure_logging
from windows.main_window import MainWindow
class SingleApplication(QApplication):
# Signal émis lorsque des fichiers sont reçus d'une instance secondaire
files_received = Signal(list)
def __init__(self, app_id, args):
super().__init__(args)
self.app_id = app_id
self.server = None
self.is_primary_instance = self.try_connect_to_primary()
if self.is_primary_instance:
# C'est la première instance, on crée un serveur local
self.server = QLocalServer()
self.server.newConnection.connect(self.handle_new_connection)
if not self.server.listen(self.app_id):
# En cas d'erreur (serveur déjà existant mais zombie), on le supprime et on réessaie
QLocalServer.removeServer(self.app_id)
self.server.listen(self.app_id)
def try_connect_to_primary(self):
"""Essaie de se connecter à l'instance primaire de l'application"""
socket = QLocalSocket()
socket.connectToServer(self.app_id, QIODevice.OpenModeFlag.WriteOnly)
if socket.waitForConnected(500):
# Récupérer les arguments pour les envoyer à l'instance primaire
args = sys.argv[1:] if len(sys.argv) > 1 else []
# Envoyer les arguments à l'instance primaire
stream = QDataStream(socket)
stream.writeQString(";".join(args))
socket.flush()
socket.disconnectFromServer()
return False # Ce n'est pas l'instance primaire
return True # C'est l'instance primaire
def handle_new_connection(self):
"""Gère une nouvelle connexion d'une instance secondaire"""
socket = self.server.nextPendingConnection()
if socket.waitForReadyRead(1000):
stream = QDataStream(socket)
args_str = stream.readQString()
args = args_str.split(";") if args_str else []
# Émettre un signal pour informer l'application des fichiers à ouvrir
if args:
self.files_received.emit(args)
socket.disconnectFromServer()
if __name__ == "__main__":
# Analyser les arguments de la ligne de commande
parser = argparse.ArgumentParser(description='Application PySide6', allow_abbrev=False)
parser.add_argument('--dev', action='store_true', help='Active le mode développement avec logs')
parser.add_argument('files', nargs='*', help='Fichiers à ouvrir')
args, unknown = parser.parse_known_args()
# Configurer le logging en fonction du mode
configure_logging(args.dev)
os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--enable-gpu-rasterization --ignore-gpu-blocklist"
if args.dev:
os.environ["QTWEBENGINE_REMOTE_DEBUGGING"] = "4000"
app_id = "OxAPP25"
app = SingleApplication(app_id, sys.argv)
event_loop = qasync.QEventLoop(app)
asyncio.set_event_loop(event_loop)
app_close_event = asyncio.Event()
app.aboutToQuit.connect(app_close_event.set)
window = MainWindow()
# Connecter le signal de fichiers reçus à une méthode de traitement
app.files_received.connect(window.handle_files)
if args.files:
window.handle_files(args.files)
window.show()
with event_loop:
event_loop.run_until_complete(app_close_event.wait())