ScanSlicer/scanslicer/main.py

95 lines
2.6 KiB
Python
Raw Normal View History

import os
import sys
from PySide6.QtCore import Qt
from PySide6.QtGui import QColor, QFont, QFontInfo, QIcon, QPalette
from PySide6.QtWidgets import (
QApplication,
QGridLayout,
QHBoxLayout,
QLabel,
QMainWindow,
QPushButton,
QWidget,
)
from .autoslicer import Autoslicer, AutoslicerParams
from .controller import ScanSlicerControllerMixin
from .ui_builders import ScanSlicerUiBuilderMixin
# _unwrap_qvariant: function definition for ScanSlicer behavior.
def _unwrap_qvariant(value):
unwrapped = value
for _ in range(4):
if hasattr(unwrapped, "variant"):
try:
candidate = unwrapped.variant()
except Exception:
candidate = unwrapped
if candidate is not unwrapped:
unwrapped = candidate
continue
if hasattr(unwrapped, "value"):
try:
candidate = unwrapped.value()
except TypeError:
candidate = unwrapped.value
except Exception:
candidate = unwrapped
if candidate is not unwrapped:
unwrapped = candidate
continue
break
return unwrapped
# _read_portal_dark_preference: function definition for ScanSlicer behavior.
def _read_portal_dark_preference():
try:
from PySide6.QtDBus import QDBusConnection, QDBusInterface, QDBusMessage
except Exception:
return None
bus = QDBusConnection.sessionBus()
if not bus.isConnected():
return None
iface = QDBusInterface(
"org.freedesktop.portal.Desktop",
"/org/freedesktop/portal/desktop",
"org.freedesktop.portal.Settings",
bus,
)
if not iface.isValid():
return None
for method in ("ReadOne", "Read"):
reply = iface.call(method, "org.freedesktop.appearance", "color-scheme")
if reply.type() == QDBusMessage.MessageType.ErrorMessage:
continue
args = reply.arguments()
if not args:
continue
raw_value = _unwrap_qvariant(args[0])
if isinstance(raw_value, dict) and "color-scheme" in raw_value:
raw_value = _unwrap_qvariant(raw_value["color-scheme"])
if isinstance(raw_value, (list, tuple)) and raw_value:
raw_value = _unwrap_qvariant(raw_value[0])
try:
color_scheme = int(raw_value)
except Exception:
continue
# XDG portal color-scheme values:
# 0 = no preference, 1 = prefer dark, 2 = prefer light
if color_scheme == 1:
return True
if color_scheme == 2:
return False
return None