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

133 lines
4.4 KiB
Python

import webbrowser
from ngSkinTools2.api import versioncheck
from ngSkinTools2.api.log import getLogger
from ngSkinTools2.api.pyside import Qt, QtWidgets
from ngSkinTools2.ui.options import bind_checkbox, config
from .. import cleanup, signal, version
from . import qt
from .layout import scale_multiplier
log = getLogger("plugin")
def show(parent, silent_mode):
"""
:type parent: QWidget
"""
error_signal = signal.Signal("error")
success_signal = signal.Signal("success")
# noinspection PyShadowingNames
def body():
result = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
result.setLayout(layout)
layout.setContentsMargins(20, 30, 20, 20)
header = QtWidgets.QLabel("<strong>Checking for update...</strong>")
result1 = QtWidgets.QLabel("Current version: <strong>2.0.0</strong>")
result2 = QtWidgets.QLabel("Update available: 2.0.1")
download = QtWidgets.QPushButton("Download ngSkinTools v2.0.1")
# layout.addWidget(QtWidgets.QLabel("Checking for updates..."))
layout.addWidget(header)
layout.addWidget(result1)
layout.addWidget(result2)
layout.addWidget(download)
result1.setVisible(False)
result2.setVisible(False)
download.setVisible(False)
@signal.on(error_signal)
def error_handler(error):
header.setText("<strong>Error: {0}</strong>".format(error))
@signal.on(success_signal)
def success_handler(info):
"""
:type info: ngSkinTools2.api.versioncheck.
"""
header.setText("<strong>{0}</strong>".format('Update available!' if info.update_available else 'ngSkinTools is up to date.'))
result1.setVisible(True)
result1.setText("Current version: <strong>{0}</strong>".format(version.pluginVersion()))
if info.update_available:
result2.setVisible(True)
result2.setText(
"Update available: <strong>{0}</strong>, released on {1}".format(info.latest_version, info.update_date.strftime("%d %B, %Y"))
)
download.setVisible(True)
download.setText("Download ngSkinTools v" + info.latest_version)
@qt.on(download.clicked)
def open_link():
webbrowser.open_new(info.download_url)
return result
# noinspection PyShadowingNames
def buttonsRow(window):
btn_close = QtWidgets.QPushButton("Close")
btn_close.setMinimumWidth(100 * scale_multiplier)
check_do_on_startup = bind_checkbox(QtWidgets.QCheckBox("Check for updates at startup"), config.checkForUpdatesAtStartup)
layout = QtWidgets.QHBoxLayout()
layout.addWidget(check_do_on_startup)
layout.addStretch()
layout.addWidget(btn_close)
layout.setContentsMargins(20 * scale_multiplier, 15 * scale_multiplier, 20 * scale_multiplier, 15 * scale_multiplier)
btn_close.clicked.connect(lambda: window.close())
return layout
window = QtWidgets.QWidget(parent, Qt.Window | Qt.WindowTitleHint | Qt.CustomizeWindowHint)
window.resize(400 * scale_multiplier, 200 * scale_multiplier)
window.setAttribute(Qt.WA_DeleteOnClose)
window.setWindowTitle("ngSkinTools2 version update")
layout = QtWidgets.QVBoxLayout()
window.setLayout(layout)
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(body())
layout.addStretch(2)
layout.addLayout(buttonsRow(window))
if not silent_mode:
window.show()
@signal.on(success_signal)
def on_success(info):
if silent_mode:
if info.update_available:
window.show()
else:
log.info("not showing the window")
window.close()
cleanup.registerCleanupHandler(window.close)
@qt.on(window.destroyed)
def closed():
log.info("deleting update window")
versioncheck.download_update_info(success_callback=success_signal.emit, failure_callback=error_signal.emit)
def silent_check_and_show_if_available(parent):
show(parent, silent_mode=True)
def show_and_start_update(parent):
show(parent, silent_mode=False)
def build_action_check_for_updates(parent):
from ngSkinTools2.ui import actions
return actions.define_action(parent, "Check for Updates...", callback=lambda: show_and_start_update(parent))