Files
Nexus/2023/scripts/rigging_tools/ngskintools2/ui/qt.py
2025-11-24 08:27:50 +08:00

129 lines
2.8 KiB
Python

import os
from ngSkinTools2.api.pyside import QtCore, QtGui, QtWidgets, get_main_window
from ngSkinTools2.api.python_compatibility import Object
def wrap_layout_into_widget(layout):
w = QtWidgets.QWidget()
w.setLayout(layout)
return w
def signals_blocked(widget):
return SignalBlockContext(widget)
class SignalBlockContext(Object):
def __init__(self, widget):
self.widget = widget
def __enter__(self):
self.prevState = self.widget.blockSignals(True)
def __exit__(self, *args):
self.widget.blockSignals(self.prevState)
def on(*signals):
"""
decorator for function: list signals that should fire for this function.
instead of:
def something():
...
btn.clicked.connect(something)
do:
@qt.on(btn.clicked)
def something():
...
"""
def decorator(fn):
for i in signals:
i.connect(fn)
return fn
return decorator
class SingleWindowPolicy(Object):
def __init__(self):
self.lastWindow = None
def setCurrent(self, window):
if self.lastWindow:
self.lastWindow.close()
self.lastWindow = window
on(window.finished)(self.cleanup)
def cleanup(self):
self.lastWindow = None
def alternative_palette_light():
palette = QtGui.QPalette()
palette.setColor(QtGui.QPalette.Window, QtGui.QColor(243, 244, 246))
palette.setColor(QtGui.QPalette.WindowText, QtGui.QColor(33, 37, 41))
return palette
def bind_action_to_button(action, button):
"""
:type button: PySide2.QtWidgets.QPushButton
:type action: PySide2.QtWidgets.QAction
"""
@on(action.changed)
def update_state():
button.setText(action.text())
button.setEnabled(action.isEnabled())
button.setToolTip(action.toolTip())
button.setStatusTip(action.statusTip())
button.setVisible(action.isVisible())
if action.isCheckable():
button.setChecked(action.isChecked())
button.setCheckable(action.isCheckable())
on(button.clicked)(action.trigger)
update_state()
return button
images_path = os.path.join(os.path.dirname(__file__), "images")
def icon_path(path):
if path.startswith(':'):
return path
return os.path.join(images_path, path)
def scaled_icon(path, w, h):
from ngSkinTools2.ui.layout import scale_multiplier
return QtGui.QIcon(
QtGui.QPixmap(icon_path(path)).scaled(w * scale_multiplier, h * scale_multiplier, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
)
def image_icon(file_name):
return QtGui.QIcon(icon_path(file_name))
def select_data(combo, data):
"""
set combo box index to data index
"""
combo.setCurrentIndex(combo.findData(data))
mainWindow = get_main_window()