diff --git a/labscript_utils/splash.py b/labscript_utils/splash.py index 75cedf5..88f73cd 100644 --- a/labscript_utils/splash.py +++ b/labscript_utils/splash.py @@ -39,6 +39,31 @@ QtWidgets.QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True) +def configure_qapplication(qapplication): + """Apply labscript-wide QApplication configuration.""" + qapplication.setAttribute(Qt.AA_DontShowIconsInMenus, False) + if sys.platform == 'darwin': + icon_path = qapplication.property('_labscript_icon_path') + if icon_path: + icon = QtGui.QIcon(icon_path) + if not icon.isNull(): + qapplication.setWindowIcon(icon) + if qapplication.property('_labscript_qapplication_configured'): + return qapplication + # Native macOS widget styling makes many Qt controls look inconsistent + # with the rest of the suite. Use Qt's own style, but preserve the + # current palette so dark/light appearance still follows the active + # theme. + palette = QtGui.QPalette(qapplication.palette()) + style = QtWidgets.QStyleFactory.create('Fusion') + if style is not None: + qapplication.setStyle(style) + qapplication.setPalette(palette) + elif qapplication.property('_labscript_qapplication_configured'): + return qapplication + qapplication.setProperty('_labscript_qapplication_configured', True) + return qapplication + class Splash(QtWidgets.QFrame): w = 250 h = 230 @@ -49,15 +74,21 @@ class Splash(QtWidgets.QFrame): BG = '#ffffff' FG = '#000000' - def __init__(self, imagepath): + def __init__(self, icon_path, application_name=None): self.qapplication = QtWidgets.QApplication.instance() if self.qapplication is None: - self.qapplication = QtWidgets.QApplication(sys.argv) + argv = sys.argv + if application_name is not None: + # Create a new argv so QApplication can alter it without mutating sys.argv. + argv = [application_name] + argv[1:] + self.qapplication = QtWidgets.QApplication(argv) + self.qapplication.setProperty('_labscript_icon_path', icon_path) + configure_qapplication(self.qapplication) super().__init__() self.icon = QtGui.QPixmap() - self.icon.load(imagepath) + self.icon.load(icon_path) if self.icon.isNull(): - raise ValueError("Invalid image file: {}.\n".format(imagepath)) + raise ValueError("Invalid image file: {}.\n".format(icon_path)) self.icon = self.icon.scaled( self.imwidth, self.imheight, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation )