Merge pull request #6 from yeah-its-gloria/main

This commit is contained in:
Campbell 2024-10-22 06:55:59 -04:00 committed by GitHub
commit 58d3f7bd3e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 344 additions and 63 deletions

129
NUSGet.py
View File

@ -11,14 +11,14 @@ from importlib.metadata import version
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import (QApplication, QMainWindow, QMessageBox, QTreeWidgetItem, QHeaderView, QStyle,
QStyleFactory)
QStyleFactory, QFileDialog)
from PySide6.QtCore import QRunnable, Slot, QThreadPool, Signal, QObject, QLibraryInfo, QTranslator, QLocale
from qt.py.ui_MainMenu import Ui_MainWindow
from modules.core import *
from modules.download_wii import run_nus_download_wii
from modules.download_dsi import run_nus_download_dsi
from modules.download_wii import run_nus_download_wii, run_nus_download_wii_batch
from modules.download_dsi import run_nus_download_dsi, run_nus_download_dsi_batch
nusget_version = "1.2.0"
@ -63,6 +63,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.ui.setupUi(self)
self.threadpool = QThreadPool()
self.ui.download_btn.clicked.connect(self.download_btn_pressed)
self.ui.script_btn.clicked.connect(self.script_btn_pressed)
self.ui.pack_archive_chkbox.clicked.connect(self.pack_wad_chkbox_toggled)
self.ui.tid_entry.textChanged.connect(self.tid_updated)
# noinspection PyUnresolvedReferences
@ -124,6 +125,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
tree[0].insertTopLevelItems(0, self.tree_categories)
# Connect the double click signal for handling when titles are selected.
tree[0].itemDoubleClicked.connect(self.onItemClicked)
# Prevent resizing, Qt makes us look stupid here
self.setFixedSize(self.size())
# Do a quick check to see if there's a newer release available, and inform the user if there is.
worker = Worker(check_nusget_updates, app, nusget_version)
worker.signals.result.connect(self.prompt_for_update)
@ -230,6 +235,24 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.log_text = f"{tid} - {selected_title.name}\nVersion: {selected_title.version}\n\n{danger_text}\n"
self.ui.log_text_browser.setText(self.log_text)
def lock_ui_for_download(self):
# Lock the UI prior to the download beginning to avoid spawning multiple threads or changing info part way in.
# Also resets the log.
self.ui.tid_entry.setEnabled(False)
self.ui.version_entry.setEnabled(False)
self.ui.download_btn.setEnabled(False)
self.ui.script_btn.setEnabled(False)
self.ui.pack_archive_chkbox.setEnabled(False)
self.ui.keep_enc_chkbox.setEnabled(False)
self.ui.create_dec_chkbox.setEnabled(False)
self.ui.use_local_chkbox.setEnabled(False)
self.ui.use_wiiu_nus_chkbox.setEnabled(False)
self.ui.pack_vwii_mode_chkbox.setEnabled(False)
self.ui.archive_file_entry.setEnabled(False)
self.ui.console_select_dropdown.setEnabled(False)
self.log_text = ""
self.ui.log_text_browser.setText(self.log_text)
def download_btn_pressed(self):
# Throw an error and make a message box appear if you haven't selected any options to output the title.
if (self.ui.pack_archive_chkbox.isChecked() is False and self.ui.keep_enc_chkbox.isChecked() is False and
@ -244,20 +267,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
"like the download to be saved."))
msg_box.exec()
return
# Lock the UI prior to the download beginning to avoid spawning multiple threads or changing info part way in.
self.ui.tid_entry.setEnabled(False)
self.ui.version_entry.setEnabled(False)
self.ui.download_btn.setEnabled(False)
self.ui.pack_archive_chkbox.setEnabled(False)
self.ui.keep_enc_chkbox.setEnabled(False)
self.ui.create_dec_chkbox.setEnabled(False)
self.ui.use_local_chkbox.setEnabled(False)
self.ui.use_wiiu_nus_chkbox.setEnabled(False)
self.ui.pack_vwii_mode_chkbox.setEnabled(False)
self.ui.archive_file_entry.setEnabled(False)
self.ui.console_select_dropdown.setEnabled(False)
self.log_text = ""
self.ui.log_text_browser.setText(self.log_text)
self.lock_ui_for_download()
# Create a new worker object to handle the download in a new thread.
if self.ui.console_select_dropdown.currentText() == "DSi":
worker = Worker(run_nus_download_dsi, out_folder, self.ui.tid_entry.text(),
@ -318,6 +330,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.ui.tid_entry.setEnabled(True)
self.ui.version_entry.setEnabled(True)
self.ui.download_btn.setEnabled(True)
self.ui.script_btn.setEnabled(True)
self.ui.pack_archive_chkbox.setEnabled(True)
self.ui.keep_enc_chkbox.setEnabled(True)
self.ui.create_dec_chkbox.setEnabled(True)
@ -347,6 +360,88 @@ class MainWindow(QMainWindow, Ui_MainWindow):
elif self.ui.console_select_dropdown.currentText() == "DSi":
self.ui.pack_vwii_mode_chkbox.setEnabled(False)
def script_btn_pressed(self):
file_name = QFileDialog.getOpenFileName(self, caption=app.translate("MainWindow", "Open NUS script"), filter=app.translate("MainWindow", "NUS Scripts (*.nus *.txt)"), options=QFileDialog.Option.ReadOnly)
if len(file_name[0]) == 0:
return
try:
file = open(file_name[0], "r")
except:
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "Failed to open the script."), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
return
content = file.readlines()
# Decoding NUS Scripts
# NUS Scripts are plaintext UTF-8 files that list a title per line, terminated with newlines.
# Every title is its u64 TID, a space and its u16 version, *both* written in hexadecimal.
# NUS itself expects versions as decimal notation, so they need to be decoded first, but TIDs are always written in hexadecimal notation.
titles = []
for index, title in enumerate(content):
decoded = title.replace("\n", "").split(" ", 1)
if len(decoded[0]) != 16:
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "The TID for title #%n is not valid.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
return
elif len(decoded[1]) != 4:
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "The version for title #%n is not valid.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
return
tid = decoded[0]
try:
version = int(decoded[1], 16)
except:
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "The version for title #%n is not valid.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
return
title = None
for category in self.trees[self.ui.platform_tabs.currentIndex()][1]:
for title_ in self.trees[self.ui.platform_tabs.currentIndex()][1][category]:
# The last two digits are either identifying the title type (e.g IOS slot, BC type, etc) or a region code; in case of the latter, skip the region here to match it
if not ((title_["TID"][-2:] == "XX" and title_["TID"][:-2] == tid[:-2]) or title_["TID"] == tid):
continue
found_ver = False
for region in title_["Versions"]:
for db_version in title_["Versions"][region]:
if db_version == version:
found_ver = True
break
if not found_ver:
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "The version for title #%n could not be discovered in the database.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
return
title = title_
break
if title == None:
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "Title #%n could not be discovered in the database.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
return
titles.append((title["TID"], str(version), title["Archive Name"]))
self.lock_ui_for_download()
self.update_log_text(f"Found {len(titles)} titles, starting batch download.")
if self.ui.console_select_dropdown.currentText() == "DSi":
worker = Worker(run_nus_download_dsi_batch, out_folder, titles, self.ui.pack_archive_chkbox.isChecked(),
self.ui.keep_enc_chkbox.isChecked(), self.ui.create_dec_chkbox.isChecked(),
self.ui.use_local_chkbox.isChecked(), self.ui.archive_file_entry.text())
else:
worker = Worker(run_nus_download_wii_batch, out_folder, titles, self.ui.pack_archive_chkbox.isChecked(),
self.ui.keep_enc_chkbox.isChecked(), self.ui.create_dec_chkbox.isChecked(),
self.ui.use_wiiu_nus_chkbox.isChecked(), self.ui.use_local_chkbox.isChecked(),
self.ui.pack_vwii_mode_chkbox.isChecked(), self.ui.patch_ios_chkbox.isChecked())
worker.signals.result.connect(self.check_download_result)
worker.signals.progress.connect(self.update_log_text)
self.threadpool.start(worker)
if __name__ == "__main__":
app = QApplication(sys.argv)

View File

@ -3,6 +3,7 @@
import os
import pathlib
from typing import List, Tuple
import libTWLPy
@ -116,7 +117,7 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_
title.tad.set_cert_data(libTWLPy.download_cert())
# Use a typed TAD name if there is one, and auto generate one based on the TID and version if there isn't.
progress_callback.emit("Packing TAD...")
if tad_file_name != "":
if tad_file_name != "" and tad_file_name is not None:
if tad_file_name[-4:] != ".tad":
tad_file_name = tad_file_name + ".tad"
else:
@ -132,3 +133,13 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_
if (not pack_tad_enabled and pack_tad_chkbox) or (not decrypt_contents_enabled and decrypt_contents_chkbox):
return 1
return 0
def run_nus_download_dsi_batch(out_folder: pathlib.Path, titles: List[Tuple[str, str, str]], pack_tad_chkbox: bool, keep_enc_chkbox: bool,
decrypt_contents_chkbox: bool, use_local_chkbox: bool, progress_callback=None):
for title in titles:
result = run_nus_download_dsi(out_folder, title[0], title[1], pack_tad_chkbox, keep_enc_chkbox, decrypt_contents_chkbox, use_local_chkbox, f"{title[2]}-{title[1]}.tad", progress_callback)
if result != 0:
return result
progress_callback.emit(f"Batch download finished.")
return 0

View File

@ -3,6 +3,7 @@
import os
import pathlib
from typing import List, Tuple
import libWiiPy
@ -138,7 +139,7 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
title.wad.set_cert_data(libWiiPy.title.download_cert(wiiu_endpoint=wiiu_nus_enabled))
# Use a typed WAD name if there is one, and auto generate one based on the TID and version if there isn't.
progress_callback.emit(" - Packing WAD...")
if wad_file_name != "":
if wad_file_name != "" and wad_file_name is not None:
if wad_file_name[-4:] != ".wad":
wad_file_name = wad_file_name + ".wad"
else:
@ -165,3 +166,14 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
if (not pack_wad_enabled and pack_wad_chkbox) or (not decrypt_contents_enabled and decrypt_contents_chkbox):
return 1
return 0
def run_nus_download_wii_batch(out_folder: pathlib.Path, titles: List[Tuple[str, str, str]], pack_wad_chkbox: bool, keep_enc_chkbox: bool,
decrypt_contents_chkbox: bool, wiiu_nus_chkbox: bool, use_local_chkbox: bool,
repack_vwii_chkbox: bool, patch_ios: bool, progress_callback=None):
for title in titles:
result = run_nus_download_wii(out_folder, title[0], title[1], pack_wad_chkbox, keep_enc_chkbox, decrypt_contents_chkbox, wiiu_nus_chkbox, use_local_chkbox, repack_vwii_chkbox, patch_ios, f"{title[2]}-{title[1]}.wad", progress_callback)
if result != 0:
return result
progress_callback.emit(f"Batch download finished.")
return 0

View File

@ -3,7 +3,7 @@
################################################################################
## Form generated from reading UI file 'MainMenu.ui'
##
## Created by: Qt User Interface Compiler version 6.7.2
## Created by: Qt User Interface Compiler version 6.8.0
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
@ -32,6 +32,7 @@ class Ui_MainWindow(object):
self.centralwidget.setObjectName(u"centralwidget")
self.horizontalLayout_3 = QHBoxLayout(self.centralwidget)
self.horizontalLayout_3.setObjectName(u"horizontalLayout_3")
self.horizontalLayout_3.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint)
self.vertical_layout_trees = QVBoxLayout()
self.vertical_layout_trees.setObjectName(u"vertical_layout_trees")
self.label_2 = QLabel(self.centralwidget)
@ -111,7 +112,7 @@ class Ui_MainWindow(object):
self.vertical_layout_controls = QVBoxLayout()
self.vertical_layout_controls.setObjectName(u"vertical_layout_controls")
self.vertical_layout_controls.setSizeConstraint(QLayout.SetDefaultConstraint)
self.vertical_layout_controls.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint)
self.horizontal_layout_title_entry = QHBoxLayout()
self.horizontal_layout_title_entry.setObjectName(u"horizontal_layout_title_entry")
self.tid_entry = QLineEdit(self.centralwidget)
@ -145,15 +146,38 @@ class Ui_MainWindow(object):
self.vertical_layout_controls.addLayout(self.horizontal_layout_title_entry)
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setObjectName(u"horizontalLayout")
self.download_btn = QPushButton(self.centralwidget)
self.download_btn.setObjectName(u"download_btn")
sizePolicy1 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0)
sizePolicy1.setHeightForWidth(self.download_btn.sizePolicy().hasHeightForWidth())
self.download_btn.setSizePolicy(sizePolicy1)
self.vertical_layout_controls.addWidget(self.download_btn)
self.horizontalLayout.addWidget(self.download_btn)
self.script_btn = QPushButton(self.centralwidget)
self.script_btn.setObjectName(u"script_btn")
sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
sizePolicy2.setHorizontalStretch(0)
sizePolicy2.setVerticalStretch(0)
sizePolicy2.setHeightForWidth(self.script_btn.sizePolicy().hasHeightForWidth())
self.script_btn.setSizePolicy(sizePolicy2)
self.horizontalLayout.addWidget(self.script_btn)
self.vertical_layout_controls.addLayout(self.horizontalLayout)
self.horizontalLayout_5 = QHBoxLayout()
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
self.horizontalLayout_5.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
self.verticalLayout_7 = QVBoxLayout()
self.verticalLayout_7.setSpacing(5)
self.verticalLayout_7.setObjectName(u"verticalLayout_7")
self.verticalLayout_7.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
self.label_3 = QLabel(self.centralwidget)
self.label_3.setObjectName(u"label_3")
self.label_3.setFont(font)
@ -161,20 +185,26 @@ class Ui_MainWindow(object):
self.verticalLayout_7.addWidget(self.label_3)
self.pack_archive_row = QHBoxLayout()
self.pack_archive_row.setSpacing(10)
self.pack_archive_row.setObjectName(u"pack_archive_row")
self.pack_archive_chkbox = QCheckBox(self.centralwidget)
self.pack_archive_chkbox.setObjectName(u"pack_archive_chkbox")
sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0)
sizePolicy1.setHeightForWidth(self.pack_archive_chkbox.sizePolicy().hasHeightForWidth())
self.pack_archive_chkbox.setSizePolicy(sizePolicy1)
sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed)
sizePolicy3.setHorizontalStretch(0)
sizePolicy3.setVerticalStretch(0)
sizePolicy3.setHeightForWidth(self.pack_archive_chkbox.sizePolicy().hasHeightForWidth())
self.pack_archive_chkbox.setSizePolicy(sizePolicy3)
self.pack_archive_chkbox.setText(u"")
self.pack_archive_row.addWidget(self.pack_archive_chkbox)
self.label_7 = QLabel(self.centralwidget)
self.label_7.setObjectName(u"label_7")
sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.MinimumExpanding)
sizePolicy4.setHorizontalStretch(0)
sizePolicy4.setVerticalStretch(0)
sizePolicy4.setHeightForWidth(self.label_7.sizePolicy().hasHeightForWidth())
self.label_7.setSizePolicy(sizePolicy4)
self.label_7.setWordWrap(True)
self.pack_archive_row.addWidget(self.label_7)
@ -189,11 +219,12 @@ class Ui_MainWindow(object):
self.verticalLayout_7.addWidget(self.archive_file_entry)
self.keep_enc_row = QHBoxLayout()
self.keep_enc_row.setSpacing(10)
self.keep_enc_row.setObjectName(u"keep_enc_row")
self.keep_enc_chkbox = QCheckBox(self.centralwidget)
self.keep_enc_chkbox.setObjectName(u"keep_enc_chkbox")
sizePolicy1.setHeightForWidth(self.keep_enc_chkbox.sizePolicy().hasHeightForWidth())
self.keep_enc_chkbox.setSizePolicy(sizePolicy1)
sizePolicy3.setHeightForWidth(self.keep_enc_chkbox.sizePolicy().hasHeightForWidth())
self.keep_enc_chkbox.setSizePolicy(sizePolicy3)
self.keep_enc_chkbox.setText(u"")
self.keep_enc_chkbox.setChecked(True)
@ -201,6 +232,8 @@ class Ui_MainWindow(object):
self.label_6 = QLabel(self.centralwidget)
self.label_6.setObjectName(u"label_6")
sizePolicy4.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth())
self.label_6.setSizePolicy(sizePolicy4)
self.label_6.setWordWrap(True)
self.keep_enc_row.addWidget(self.label_6)
@ -209,17 +242,20 @@ class Ui_MainWindow(object):
self.verticalLayout_7.addLayout(self.keep_enc_row)
self.create_dec_row = QHBoxLayout()
self.create_dec_row.setSpacing(10)
self.create_dec_row.setObjectName(u"create_dec_row")
self.create_dec_chkbox = QCheckBox(self.centralwidget)
self.create_dec_chkbox.setObjectName(u"create_dec_chkbox")
sizePolicy1.setHeightForWidth(self.create_dec_chkbox.sizePolicy().hasHeightForWidth())
self.create_dec_chkbox.setSizePolicy(sizePolicy1)
sizePolicy3.setHeightForWidth(self.create_dec_chkbox.sizePolicy().hasHeightForWidth())
self.create_dec_chkbox.setSizePolicy(sizePolicy3)
self.create_dec_chkbox.setText(u"")
self.create_dec_row.addWidget(self.create_dec_chkbox)
self.create_dec_chkbox_lbl = QLabel(self.centralwidget)
self.create_dec_chkbox_lbl.setObjectName(u"create_dec_chkbox_lbl")
sizePolicy4.setHeightForWidth(self.create_dec_chkbox_lbl.sizePolicy().hasHeightForWidth())
self.create_dec_chkbox_lbl.setSizePolicy(sizePolicy4)
self.create_dec_chkbox_lbl.setWordWrap(True)
self.create_dec_row.addWidget(self.create_dec_chkbox_lbl)
@ -228,18 +264,21 @@ class Ui_MainWindow(object):
self.verticalLayout_7.addLayout(self.create_dec_row)
self.use_local_row = QHBoxLayout()
self.use_local_row.setSpacing(10)
self.use_local_row.setObjectName(u"use_local_row")
self.use_local_chkbox = QCheckBox(self.centralwidget)
self.use_local_chkbox.setObjectName(u"use_local_chkbox")
self.use_local_chkbox.setEnabled(True)
sizePolicy1.setHeightForWidth(self.use_local_chkbox.sizePolicy().hasHeightForWidth())
self.use_local_chkbox.setSizePolicy(sizePolicy1)
sizePolicy3.setHeightForWidth(self.use_local_chkbox.sizePolicy().hasHeightForWidth())
self.use_local_chkbox.setSizePolicy(sizePolicy3)
self.use_local_chkbox.setText(u"")
self.use_local_row.addWidget(self.use_local_chkbox)
self.use_local_chkbox_lbl = QLabel(self.centralwidget)
self.use_local_chkbox_lbl.setObjectName(u"use_local_chkbox_lbl")
sizePolicy4.setHeightForWidth(self.use_local_chkbox_lbl.sizePolicy().hasHeightForWidth())
self.use_local_chkbox_lbl.setSizePolicy(sizePolicy4)
self.use_local_chkbox_lbl.setWordWrap(True)
self.use_local_row.addWidget(self.use_local_chkbox_lbl)
@ -248,12 +287,14 @@ class Ui_MainWindow(object):
self.verticalLayout_7.addLayout(self.use_local_row)
self.use_wiiu_nus_row = QHBoxLayout()
self.use_wiiu_nus_row.setSpacing(10)
self.use_wiiu_nus_row.setObjectName(u"use_wiiu_nus_row")
self.use_wiiu_nus_row.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint)
self.use_wiiu_nus_chkbox = QCheckBox(self.centralwidget)
self.use_wiiu_nus_chkbox.setObjectName(u"use_wiiu_nus_chkbox")
sizePolicy1.setHeightForWidth(self.use_wiiu_nus_chkbox.sizePolicy().hasHeightForWidth())
self.use_wiiu_nus_chkbox.setSizePolicy(sizePolicy1)
self.use_wiiu_nus_chkbox.setLayoutDirection(Qt.LeftToRight)
sizePolicy.setHeightForWidth(self.use_wiiu_nus_chkbox.sizePolicy().hasHeightForWidth())
self.use_wiiu_nus_chkbox.setSizePolicy(sizePolicy)
self.use_wiiu_nus_chkbox.setLayoutDirection(Qt.LayoutDirection.LeftToRight)
self.use_wiiu_nus_chkbox.setText(u"")
self.use_wiiu_nus_chkbox.setChecked(True)
@ -261,6 +302,8 @@ class Ui_MainWindow(object):
self.use_wiiu_nus_chkbox_lbl = QLabel(self.centralwidget)
self.use_wiiu_nus_chkbox_lbl.setObjectName(u"use_wiiu_nus_chkbox_lbl")
sizePolicy4.setHeightForWidth(self.use_wiiu_nus_chkbox_lbl.sizePolicy().hasHeightForWidth())
self.use_wiiu_nus_chkbox_lbl.setSizePolicy(sizePolicy4)
self.use_wiiu_nus_chkbox_lbl.setWordWrap(True)
self.use_wiiu_nus_row.addWidget(self.use_wiiu_nus_chkbox_lbl)
@ -269,12 +312,13 @@ class Ui_MainWindow(object):
self.verticalLayout_7.addLayout(self.use_wiiu_nus_row)
self.patch_ios_row = QHBoxLayout()
self.patch_ios_row.setSpacing(10)
self.patch_ios_row.setObjectName(u"patch_ios_row")
self.patch_ios_chkbox = QCheckBox(self.centralwidget)
self.patch_ios_chkbox.setObjectName(u"patch_ios_chkbox")
self.patch_ios_chkbox.setEnabled(False)
sizePolicy1.setHeightForWidth(self.patch_ios_chkbox.sizePolicy().hasHeightForWidth())
self.patch_ios_chkbox.setSizePolicy(sizePolicy1)
sizePolicy3.setHeightForWidth(self.patch_ios_chkbox.sizePolicy().hasHeightForWidth())
self.patch_ios_chkbox.setSizePolicy(sizePolicy3)
self.patch_ios_chkbox.setText(u"")
self.patch_ios_row.addWidget(self.patch_ios_chkbox)
@ -282,6 +326,8 @@ class Ui_MainWindow(object):
self.patch_ios_lbl = QLabel(self.centralwidget)
self.patch_ios_lbl.setObjectName(u"patch_ios_lbl")
self.patch_ios_lbl.setEnabled(True)
sizePolicy4.setHeightForWidth(self.patch_ios_lbl.sizePolicy().hasHeightForWidth())
self.patch_ios_lbl.setSizePolicy(sizePolicy4)
self.patch_ios_lbl.setWordWrap(True)
self.patch_ios_row.addWidget(self.patch_ios_lbl)
@ -289,11 +335,11 @@ class Ui_MainWindow(object):
self.verticalLayout_7.addLayout(self.patch_ios_row)
self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Ignored)
self.verticalLayout_7.addItem(self.verticalSpacer_2)
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum)
self.verticalLayout_7.addItem(self.horizontalSpacer)
@ -302,6 +348,7 @@ class Ui_MainWindow(object):
self.verticalLayout_8 = QVBoxLayout()
self.verticalLayout_8.setObjectName(u"verticalLayout_8")
self.verticalLayout_8.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
self.label_4 = QLabel(self.centralwidget)
self.label_4.setObjectName(u"label_4")
self.label_4.setFont(font)
@ -313,8 +360,8 @@ class Ui_MainWindow(object):
self.pack_vwii_mode_chkbox = QCheckBox(self.centralwidget)
self.pack_vwii_mode_chkbox.setObjectName(u"pack_vwii_mode_chkbox")
self.pack_vwii_mode_chkbox.setEnabled(False)
sizePolicy1.setHeightForWidth(self.pack_vwii_mode_chkbox.sizePolicy().hasHeightForWidth())
self.pack_vwii_mode_chkbox.setSizePolicy(sizePolicy1)
sizePolicy3.setHeightForWidth(self.pack_vwii_mode_chkbox.sizePolicy().hasHeightForWidth())
self.pack_vwii_mode_chkbox.setSizePolicy(sizePolicy3)
self.pack_vwii_mode_chkbox.setText(u"")
self.pack_vwii_mode_row.addWidget(self.pack_vwii_mode_chkbox)
@ -322,6 +369,11 @@ class Ui_MainWindow(object):
self.pack_vwii_mode_lbl = QLabel(self.centralwidget)
self.pack_vwii_mode_lbl.setObjectName(u"pack_vwii_mode_lbl")
self.pack_vwii_mode_lbl.setEnabled(True)
sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred)
sizePolicy5.setHorizontalStretch(0)
sizePolicy5.setVerticalStretch(0)
sizePolicy5.setHeightForWidth(self.pack_vwii_mode_lbl.sizePolicy().hasHeightForWidth())
self.pack_vwii_mode_lbl.setSizePolicy(sizePolicy5)
self.pack_vwii_mode_lbl.setWordWrap(True)
self.pack_vwii_mode_row.addWidget(self.pack_vwii_mode_lbl)
@ -329,11 +381,11 @@ class Ui_MainWindow(object):
self.verticalLayout_8.addLayout(self.pack_vwii_mode_row)
self.verticalSpacer = QSpacerItem(20, 50, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
self.verticalSpacer = QSpacerItem(20, 50, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.MinimumExpanding)
self.verticalLayout_8.addItem(self.verticalSpacer)
self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum)
self.verticalLayout_8.addItem(self.horizontalSpacer_2)
@ -380,6 +432,7 @@ class Ui_MainWindow(object):
self.label_5.setText(QCoreApplication.translate("MainWindow", u"Console:", None))
self.console_select_dropdown.setCurrentText("")
self.download_btn.setText(QCoreApplication.translate("MainWindow", u"Start Download", None))
self.script_btn.setText(QCoreApplication.translate("MainWindow", u"Run Script", None))
self.label_3.setText(QCoreApplication.translate("MainWindow", u"General Settings", None))
self.label_7.setText(QCoreApplication.translate("MainWindow", u"Pack installable archive (WAD/TAD)", None))
self.archive_file_entry.setPlaceholderText(QCoreApplication.translate("MainWindow", u"File Name", None))
@ -392,8 +445,11 @@ class Ui_MainWindow(object):
self.pack_vwii_mode_lbl.setText(QCoreApplication.translate("MainWindow", u"Re-encrypt title using the Wii Common Key", None))
self.log_text_browser.setMarkdown("")
self.log_text_browser.setHtml(QCoreApplication.translate("MainWindow", u"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"hr { height: 1px; border-width: 0; }\n"
"li.unchecked::marker { content: \"\\2610\"; }\n"
"li.checked::marker { content: \"\\2612\"; }\n"
"</style></head><body style=\" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;\"><br /></p></body></html>", None))
# retranslateUi

143
qt/ui/MainMenu.ui Normal file → Executable file
View File

@ -27,13 +27,15 @@
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
</property>
<item>
<layout class="QVBoxLayout" name="vertical_layout_trees">
<item>
<widget class="QLabel" name="label_2">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -159,7 +161,7 @@
<item>
<layout class="QVBoxLayout" name="vertical_layout_controls">
<property name="sizeConstraint">
<enum>QLayout::SetDefaultConstraint</enum>
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
</property>
<item>
<layout class="QHBoxLayout" name="horizontal_layout_title_entry">
@ -222,21 +224,52 @@
</layout>
</item>
<item>
<widget class="QPushButton" name="download_btn">
<property name="text">
<string>Start Download</string>
</property>
</widget>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="download_btn">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Start Download</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="script_btn">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Run Script</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetMinimumSize</enum>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="spacing">
<number>5</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetMinimumSize</enum>
</property>
<item>
<widget class="QLabel" name="label_3">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -247,6 +280,9 @@
</item>
<item>
<layout class="QHBoxLayout" name="pack_archive_row">
<property name="spacing">
<number>10</number>
</property>
<item>
<widget class="QCheckBox" name="pack_archive_chkbox">
<property name="sizePolicy">
@ -262,6 +298,12 @@
</item>
<item>
<widget class="QLabel" name="label_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Pack installable archive (WAD/TAD)</string>
</property>
@ -284,6 +326,9 @@
</item>
<item>
<layout class="QHBoxLayout" name="keep_enc_row">
<property name="spacing">
<number>10</number>
</property>
<item>
<widget class="QCheckBox" name="keep_enc_chkbox">
<property name="sizePolicy">
@ -302,6 +347,12 @@
</item>
<item>
<widget class="QLabel" name="label_6">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Keep encrypted contents</string>
</property>
@ -314,6 +365,9 @@
</item>
<item>
<layout class="QHBoxLayout" name="create_dec_row">
<property name="spacing">
<number>10</number>
</property>
<item>
<widget class="QCheckBox" name="create_dec_chkbox">
<property name="sizePolicy">
@ -329,6 +383,12 @@
</item>
<item>
<widget class="QLabel" name="create_dec_chkbox_lbl">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Create decrypted contents (*.app)</string>
</property>
@ -341,6 +401,9 @@
</item>
<item>
<layout class="QHBoxLayout" name="use_local_row">
<property name="spacing">
<number>10</number>
</property>
<item>
<widget class="QCheckBox" name="use_local_chkbox">
<property name="enabled">
@ -359,6 +422,12 @@
</item>
<item>
<widget class="QLabel" name="use_local_chkbox_lbl">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Use local files, if they exist</string>
</property>
@ -371,16 +440,22 @@
</item>
<item>
<layout class="QHBoxLayout" name="use_wiiu_nus_row">
<property name="spacing">
<number>10</number>
</property>
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
</property>
<item>
<widget class="QCheckBox" name="use_wiiu_nus_chkbox">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<sizepolicy hsizetype="Maximum" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
<enum>Qt::LayoutDirection::LeftToRight</enum>
</property>
<property name="text">
<string notr="true"/>
@ -392,6 +467,12 @@
</item>
<item>
<widget class="QLabel" name="use_wiiu_nus_chkbox_lbl">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Use the Wii U NUS (faster, only effects Wii/vWii)</string>
</property>
@ -404,6 +485,9 @@
</item>
<item>
<layout class="QHBoxLayout" name="patch_ios_row">
<property name="spacing">
<number>10</number>
</property>
<item>
<widget class="QCheckBox" name="patch_ios_chkbox">
<property name="enabled">
@ -425,6 +509,12 @@
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Apply patches to IOS (Applies to WADs only)</string>
</property>
@ -438,10 +528,10 @@
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
<enum>QSizePolicy::Policy::Ignored</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -454,7 +544,10 @@
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::MinimumExpanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -468,11 +561,13 @@
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_8">
<property name="sizeConstraint">
<enum>QLayout::SizeConstraint::SetMinimumSize</enum>
</property>
<item>
<widget class="QLabel" name="label_4">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
@ -504,6 +599,12 @@
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Re-encrypt title using the Wii Common Key</string>
</property>
@ -517,10 +618,10 @@
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Orientation::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
<enum>QSizePolicy::Policy::MinimumExpanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -533,7 +634,10 @@
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Policy::MinimumExpanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
@ -560,8 +664,11 @@
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>