From 0dbe28914de7a70e2f0947350e081ae1d6fa2e6e Mon Sep 17 00:00:00 2001 From: yeah-its-gloria <32610623+yeah-its-gloria@users.noreply.github.com> Date: Sat, 19 Oct 2024 18:07:42 +0200 Subject: [PATCH 1/5] Add batch downloading with NUSD scripts --- NUSGet.py | 67 +++++++++++++++++++++++++++++++++++++++-- modules/download_dsi.py | 13 +++++++- modules/download_wii.py | 14 ++++++++- qt/py/ui_MainMenu.py | 15 +++++++-- qt/ui/MainMenu.ui | 21 ++++++++++--- 5 files changed, 118 insertions(+), 12 deletions(-) diff --git a/NUSGet.py b/NUSGet.py index b0c014e..1848d34 100644 --- a/NUSGet.py +++ b/NUSGet.py @@ -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 @@ -248,6 +249,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): 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) @@ -318,6 +320,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 +350,64 @@ 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() + + titles = [] + for title in content: + decoded = title.replace("\n", "").split(" ", 1) + if len(decoded[0]) != 16 or len(decoded[1]) != 4: + QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "This script is invalid."), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok) + return + + try: + version = int(decoded[1], 16) + except: + QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "This script is invalid."), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok) + + titles.append((decoded[0], str(version))) + + 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) + + 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) diff --git a/modules/download_dsi.py b/modules/download_dsi.py index 9084883..bfecbd3 100644 --- a/modules/download_dsi.py +++ b/modules/download_dsi.py @@ -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]], 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, None, progress_callback) + if result != 0: + return result + + progress_callback.emit(f"Batch download finished.") + return 0 diff --git a/modules/download_wii.py b/modules/download_wii.py index f8126a7..0592e1e 100644 --- a/modules/download_wii.py +++ b/modules/download_wii.py @@ -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]], 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, None, progress_callback) + if result != 0: + return result + + progress_callback.emit(f"Batch download finished.") + return 0 diff --git a/qt/py/ui_MainMenu.py b/qt/py/ui_MainMenu.py index 91562f7..5a2e36a 100644 --- a/qt/py/ui_MainMenu.py +++ b/qt/py/ui_MainMenu.py @@ -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! ################################################################################ @@ -145,10 +145,20 @@ 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") - 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") + + self.horizontalLayout.addWidget(self.script_btn) + + + self.vertical_layout_controls.addLayout(self.horizontalLayout) self.horizontalLayout_5 = QHBoxLayout() self.horizontalLayout_5.setObjectName(u"horizontalLayout_5") @@ -380,6 +390,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)) diff --git a/qt/ui/MainMenu.ui b/qt/ui/MainMenu.ui index f6b4bdd..46c38a6 100644 --- a/qt/ui/MainMenu.ui +++ b/qt/ui/MainMenu.ui @@ -222,11 +222,22 @@ - - - Start Download - - + + + + + Start Download + + + + + + + Run Script + + + + From 9c15eac1fd0799553de4d7d413c0f1abad377739 Mon Sep 17 00:00:00 2001 From: yeah-its-gloria <32610623+yeah-its-gloria@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:03:07 +0200 Subject: [PATCH 2/5] Verify titles Name archives properly using the database Fix UI problems on macOS --- NUSGet.py | 110 ++++++++++++++++++++++++++++------------ modules/download_dsi.py | 4 +- modules/download_wii.py | 4 +- qt/py/ui_MainMenu.py | 59 +++++++++++++-------- qt/ui/MainMenu.ui | 45 +++++++++++----- 5 files changed, 151 insertions(+), 71 deletions(-) diff --git a/NUSGet.py b/NUSGet.py index 1848d34..cd6f5c1 100644 --- a/NUSGet.py +++ b/NUSGet.py @@ -231,21 +231,9 @@ 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 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 - self.ui.create_dec_chkbox.isChecked() is False): - msg_box = QMessageBox() - msg_box.setIcon(QMessageBox.Icon.Critical) - msg_box.setStandardButtons(QMessageBox.StandardButton.Ok) - msg_box.setDefaultButton(QMessageBox.StandardButton.Ok) - msg_box.setWindowTitle(app.translate("MainWindow", "No Output Selected")) - msg_box.setText(app.translate("MainWindow", "You have not selected any format to output the data in!")) - msg_box.setInformativeText(app.translate("MainWindow", "Please select at least one option for how you would " - "like the download to be saved.")) - msg_box.exec() - return + 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) @@ -260,6 +248,24 @@ class MainWindow(QMainWindow, Ui_MainWindow): 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 + self.ui.create_dec_chkbox.isChecked() is False): + msg_box = QMessageBox() + msg_box.setIcon(QMessageBox.Icon.Critical) + msg_box.setStandardButtons(QMessageBox.StandardButton.Ok) + msg_box.setDefaultButton(QMessageBox.StandardButton.Ok) + msg_box.setWindowTitle(app.translate("MainWindow", "No Output Selected")) + msg_box.setText(app.translate("MainWindow", "You have not selected any format to output the data in!")) + msg_box.setInformativeText(app.translate("MainWindow", "Please select at least one option for how you would " + "like the download to be saved.")) + msg_box.exec() + return + + 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(), @@ -363,34 +369,72 @@ class MainWindow(QMainWindow, Ui_MainWindow): 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 title in content: + + for index, title in enumerate(content): decoded = title.replace("\n", "").split(" ", 1) - if len(decoded[0]) != 16 or len(decoded[1]) != 4: - QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "This script is invalid."), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok) + 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", "This script is invalid."), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok) + 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 - titles.append((decoded[0], str(version))) + 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 - 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) + region = None + found_ver = False + if title_["TID"][-2:] == "XX": + global regions + for region_ in regions: + for code in regions[region_]: + if code == tid[:-2]: + region = region_ + break + + if region is None: + QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "Title #%n belongs to an unknown region.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok) + return + else: + region = "World" + + 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.") diff --git a/modules/download_dsi.py b/modules/download_dsi.py index bfecbd3..ab58339 100644 --- a/modules/download_dsi.py +++ b/modules/download_dsi.py @@ -134,10 +134,10 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_ return 1 return 0 -def run_nus_download_dsi_batch(out_folder: pathlib.Path, titles: List[Tuple[str, str]], pack_tad_chkbox: bool, keep_enc_chkbox: bool, +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, None, progress_callback) + 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 diff --git a/modules/download_wii.py b/modules/download_wii.py index 0592e1e..becad70 100644 --- a/modules/download_wii.py +++ b/modules/download_wii.py @@ -167,11 +167,11 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_ return 1 return 0 -def run_nus_download_wii_batch(out_folder: pathlib.Path, titles: List[Tuple[str, str]], pack_wad_chkbox: bool, keep_enc_chkbox: bool, +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, None, progress_callback) + 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 diff --git a/qt/py/ui_MainMenu.py b/qt/py/ui_MainMenu.py index 5a2e36a..42ef40d 100644 --- a/qt/py/ui_MainMenu.py +++ b/qt/py/ui_MainMenu.py @@ -111,7 +111,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) @@ -149,11 +149,21 @@ class Ui_MainWindow(object): 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.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) @@ -163,7 +173,9 @@ class Ui_MainWindow(object): self.horizontalLayout_5 = QHBoxLayout() self.horizontalLayout_5.setObjectName(u"horizontalLayout_5") self.verticalLayout_7 = QVBoxLayout() + self.verticalLayout_7.setSpacing(10) self.verticalLayout_7.setObjectName(u"verticalLayout_7") + self.verticalLayout_7.setSizeConstraint(QLayout.SizeConstraint.SetNoConstraint) self.label_3 = QLabel(self.centralwidget) self.label_3.setObjectName(u"label_3") self.label_3.setFont(font) @@ -174,11 +186,11 @@ class Ui_MainWindow(object): 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) @@ -202,8 +214,8 @@ class Ui_MainWindow(object): 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) @@ -222,8 +234,8 @@ class Ui_MainWindow(object): 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) @@ -242,8 +254,8 @@ class Ui_MainWindow(object): 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) @@ -261,9 +273,12 @@ class Ui_MainWindow(object): self.use_wiiu_nus_row.setObjectName(u"use_wiiu_nus_row") 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) + sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred) + sizePolicy4.setHorizontalStretch(0) + sizePolicy4.setVerticalStretch(0) + sizePolicy4.setHeightForWidth(self.use_wiiu_nus_chkbox.sizePolicy().hasHeightForWidth()) + self.use_wiiu_nus_chkbox.setSizePolicy(sizePolicy4) + self.use_wiiu_nus_chkbox.setLayoutDirection(Qt.LayoutDirection.LeftToRight) self.use_wiiu_nus_chkbox.setText(u"") self.use_wiiu_nus_chkbox.setChecked(True) @@ -283,8 +298,8 @@ class Ui_MainWindow(object): 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) @@ -299,11 +314,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.Preferred, QSizePolicy.Policy.Minimum) self.verticalLayout_7.addItem(self.horizontalSpacer) @@ -323,8 +338,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) @@ -343,7 +358,7 @@ class Ui_MainWindow(object): 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.Preferred, QSizePolicy.Policy.Minimum) self.verticalLayout_8.addItem(self.horizontalSpacer_2) diff --git a/qt/ui/MainMenu.ui b/qt/ui/MainMenu.ui index 46c38a6..9c1cc4b 100644 --- a/qt/ui/MainMenu.ui +++ b/qt/ui/MainMenu.ui @@ -33,7 +33,6 @@ - 75 true @@ -159,7 +158,7 @@ - QLayout::SetDefaultConstraint + QLayout::SizeConstraint::SetDefaultConstraint @@ -225,6 +224,12 @@ + + + 0 + 0 + + Start Download @@ -232,6 +237,12 @@ + + + 0 + 0 + + Run Script @@ -243,11 +254,16 @@ + + 10 + + + QLayout::SizeConstraint::SetNoConstraint + - 75 true @@ -385,13 +401,13 @@ - + 0 0 - Qt::LeftToRight + Qt::LayoutDirection::LeftToRight @@ -449,10 +465,10 @@ - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Expanding + QSizePolicy::Policy::Ignored @@ -465,7 +481,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal + + + QSizePolicy::Policy::Preferred @@ -483,7 +502,6 @@ - 75 true @@ -528,10 +546,10 @@ - Qt::Vertical + Qt::Orientation::Vertical - QSizePolicy::Expanding + QSizePolicy::Policy::Expanding @@ -544,7 +562,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal + + + QSizePolicy::Policy::Preferred From dd79be0b48cf23624af62f6e48ec2de68e7e3cb1 Mon Sep 17 00:00:00 2001 From: yeah-its-gloria <32610623+yeah-its-gloria@users.noreply.github.com> Date: Mon, 21 Oct 2024 23:22:51 +0200 Subject: [PATCH 3/5] Fix version lookup Checking regions was pretty superfluous anyway, since it only served to *potentially* speed up the lookup. --- NUSGet.py | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/NUSGet.py b/NUSGet.py index cd6f5c1..d100eff 100644 --- a/NUSGet.py +++ b/NUSGet.py @@ -400,26 +400,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): if not ((title_["TID"][-2:] == "XX" and title_["TID"][:-2] == tid[:-2]) or title_["TID"] == tid): continue - region = None found_ver = False - if title_["TID"][-2:] == "XX": - global regions - for region_ in regions: - for code in regions[region_]: - if code == tid[:-2]: - region = region_ - break - - if region is None: - QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "Title #%n belongs to an unknown region.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok) - return - else: - region = "World" - - for db_version in title_["Versions"][region]: - if db_version == version: - found_ver = True - break + 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) From 33b30b4aa59cbddcd7dab6cea3762a2df70b5e71 Mon Sep 17 00:00:00 2001 From: yeah-its-gloria <32610623+yeah-its-gloria@users.noreply.github.com> Date: Mon, 21 Oct 2024 23:44:27 +0200 Subject: [PATCH 4/5] Clean up the UI --- NUSGet.py | 4 +++ qt/py/ui_MainMenu.py | 85 +++++++++++++++++++++++--------------------- qt/ui/MainMenu.ui | 28 ++++++--------- 3 files changed, 59 insertions(+), 58 deletions(-) diff --git a/NUSGet.py b/NUSGet.py index d100eff..fe90675 100644 --- a/NUSGet.py +++ b/NUSGet.py @@ -125,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) diff --git a/qt/py/ui_MainMenu.py b/qt/py/ui_MainMenu.py index 42ef40d..58e8640 100644 --- a/qt/py/ui_MainMenu.py +++ b/qt/py/ui_MainMenu.py @@ -25,9 +25,12 @@ class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") - MainWindow.resize(1010, 625) - MainWindow.setMinimumSize(QSize(1010, 625)) - MainWindow.setMaximumSize(QSize(1010, 625)) + MainWindow.resize(1077, 784) + sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) + MainWindow.setSizePolicy(sizePolicy) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.horizontalLayout_3 = QHBoxLayout(self.centralwidget) @@ -44,11 +47,11 @@ class Ui_MainWindow(object): self.platform_tabs = QTabWidget(self.centralwidget) self.platform_tabs.setObjectName(u"platform_tabs") - sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.platform_tabs.sizePolicy().hasHeightForWidth()) - self.platform_tabs.setSizePolicy(sizePolicy) + sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Expanding) + sizePolicy1.setHorizontalStretch(0) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth(self.platform_tabs.sizePolicy().hasHeightForWidth()) + self.platform_tabs.setSizePolicy(sizePolicy1) self.platform_tabs.setMinimumSize(QSize(410, 0)) self.platform_tabs.setMaximumSize(QSize(410, 16777215)) self.wii_tab = QWidget() @@ -149,21 +152,21 @@ class Ui_MainWindow(object): 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) + sizePolicy2 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.download_btn.sizePolicy().hasHeightForWidth()) + self.download_btn.setSizePolicy(sizePolicy2) 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) + sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) + sizePolicy3.setHorizontalStretch(0) + sizePolicy3.setVerticalStretch(0) + sizePolicy3.setHeightForWidth(self.script_btn.sizePolicy().hasHeightForWidth()) + self.script_btn.setSizePolicy(sizePolicy3) self.horizontalLayout.addWidget(self.script_btn) @@ -186,11 +189,11 @@ class Ui_MainWindow(object): 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") - 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) + sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) + sizePolicy4.setHorizontalStretch(0) + sizePolicy4.setVerticalStretch(0) + sizePolicy4.setHeightForWidth(self.pack_archive_chkbox.sizePolicy().hasHeightForWidth()) + self.pack_archive_chkbox.setSizePolicy(sizePolicy4) self.pack_archive_chkbox.setText(u"") self.pack_archive_row.addWidget(self.pack_archive_chkbox) @@ -214,8 +217,8 @@ class Ui_MainWindow(object): 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") - sizePolicy3.setHeightForWidth(self.keep_enc_chkbox.sizePolicy().hasHeightForWidth()) - self.keep_enc_chkbox.setSizePolicy(sizePolicy3) + sizePolicy4.setHeightForWidth(self.keep_enc_chkbox.sizePolicy().hasHeightForWidth()) + self.keep_enc_chkbox.setSizePolicy(sizePolicy4) self.keep_enc_chkbox.setText(u"") self.keep_enc_chkbox.setChecked(True) @@ -234,8 +237,8 @@ class Ui_MainWindow(object): 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") - sizePolicy3.setHeightForWidth(self.create_dec_chkbox.sizePolicy().hasHeightForWidth()) - self.create_dec_chkbox.setSizePolicy(sizePolicy3) + sizePolicy4.setHeightForWidth(self.create_dec_chkbox.sizePolicy().hasHeightForWidth()) + self.create_dec_chkbox.setSizePolicy(sizePolicy4) self.create_dec_chkbox.setText(u"") self.create_dec_row.addWidget(self.create_dec_chkbox) @@ -254,8 +257,8 @@ class Ui_MainWindow(object): self.use_local_chkbox = QCheckBox(self.centralwidget) self.use_local_chkbox.setObjectName(u"use_local_chkbox") self.use_local_chkbox.setEnabled(True) - sizePolicy3.setHeightForWidth(self.use_local_chkbox.sizePolicy().hasHeightForWidth()) - self.use_local_chkbox.setSizePolicy(sizePolicy3) + sizePolicy4.setHeightForWidth(self.use_local_chkbox.sizePolicy().hasHeightForWidth()) + self.use_local_chkbox.setSizePolicy(sizePolicy4) self.use_local_chkbox.setText(u"") self.use_local_row.addWidget(self.use_local_chkbox) @@ -273,11 +276,11 @@ class Ui_MainWindow(object): self.use_wiiu_nus_row.setObjectName(u"use_wiiu_nus_row") self.use_wiiu_nus_chkbox = QCheckBox(self.centralwidget) self.use_wiiu_nus_chkbox.setObjectName(u"use_wiiu_nus_chkbox") - sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred) - sizePolicy4.setHorizontalStretch(0) - sizePolicy4.setVerticalStretch(0) - sizePolicy4.setHeightForWidth(self.use_wiiu_nus_chkbox.sizePolicy().hasHeightForWidth()) - self.use_wiiu_nus_chkbox.setSizePolicy(sizePolicy4) + sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred) + sizePolicy5.setHorizontalStretch(0) + sizePolicy5.setVerticalStretch(0) + sizePolicy5.setHeightForWidth(self.use_wiiu_nus_chkbox.sizePolicy().hasHeightForWidth()) + self.use_wiiu_nus_chkbox.setSizePolicy(sizePolicy5) self.use_wiiu_nus_chkbox.setLayoutDirection(Qt.LayoutDirection.LeftToRight) self.use_wiiu_nus_chkbox.setText(u"") self.use_wiiu_nus_chkbox.setChecked(True) @@ -298,8 +301,8 @@ class Ui_MainWindow(object): self.patch_ios_chkbox = QCheckBox(self.centralwidget) self.patch_ios_chkbox.setObjectName(u"patch_ios_chkbox") self.patch_ios_chkbox.setEnabled(False) - sizePolicy3.setHeightForWidth(self.patch_ios_chkbox.sizePolicy().hasHeightForWidth()) - self.patch_ios_chkbox.setSizePolicy(sizePolicy3) + sizePolicy4.setHeightForWidth(self.patch_ios_chkbox.sizePolicy().hasHeightForWidth()) + self.patch_ios_chkbox.setSizePolicy(sizePolicy4) self.patch_ios_chkbox.setText(u"") self.patch_ios_row.addWidget(self.patch_ios_chkbox) @@ -314,7 +317,7 @@ class Ui_MainWindow(object): self.verticalLayout_7.addLayout(self.patch_ios_row) - self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Ignored) + self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred) self.verticalLayout_7.addItem(self.verticalSpacer_2) @@ -338,8 +341,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) - sizePolicy3.setHeightForWidth(self.pack_vwii_mode_chkbox.sizePolicy().hasHeightForWidth()) - self.pack_vwii_mode_chkbox.setSizePolicy(sizePolicy3) + sizePolicy4.setHeightForWidth(self.pack_vwii_mode_chkbox.sizePolicy().hasHeightForWidth()) + self.pack_vwii_mode_chkbox.setSizePolicy(sizePolicy4) self.pack_vwii_mode_chkbox.setText(u"") self.pack_vwii_mode_row.addWidget(self.pack_vwii_mode_chkbox) @@ -358,7 +361,7 @@ class Ui_MainWindow(object): self.verticalLayout_8.addItem(self.verticalSpacer) - self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Minimum) + self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum) self.verticalLayout_8.addItem(self.horizontalSpacer_2) @@ -380,7 +383,7 @@ class Ui_MainWindow(object): MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") - self.menubar.setGeometry(QRect(0, 0, 1010, 30)) + self.menubar.setGeometry(QRect(0, 0, 1077, 24)) MainWindow.setMenuBar(self.menubar) self.retranslateUi(MainWindow) diff --git a/qt/ui/MainMenu.ui b/qt/ui/MainMenu.ui index 9c1cc4b..09afa9c 100644 --- a/qt/ui/MainMenu.ui +++ b/qt/ui/MainMenu.ui @@ -6,21 +6,15 @@ 0 0 - 1010 - 625 + 1077 + 784 - - - 1010 - 625 - - - - - 1010 - 625 - + + + 0 + 0 + MainWindow @@ -468,7 +462,7 @@ Qt::Orientation::Vertical - QSizePolicy::Policy::Ignored + QSizePolicy::Policy::Preferred @@ -565,7 +559,7 @@ Qt::Orientation::Horizontal - QSizePolicy::Policy::Preferred + QSizePolicy::Policy::MinimumExpanding @@ -608,8 +602,8 @@ p, li { white-space: pre-wrap; } 0 0 - 1010 - 30 + 1077 + 24 From f55cb0570369304121cdbe3a47f872f29e76337e Mon Sep 17 00:00:00 2001 From: yeah-its-gloria <32610623+yeah-its-gloria@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:46:58 +0200 Subject: [PATCH 5/5] Apply UI fixes --- qt/py/ui_MainMenu.py | 123 ++++++++++++++++++++++++++----------------- qt/ui/MainMenu.ui | 113 +++++++++++++++++++++++++++++++++------ 2 files changed, 172 insertions(+), 64 deletions(-) mode change 100644 => 100755 qt/ui/MainMenu.ui diff --git a/qt/py/ui_MainMenu.py b/qt/py/ui_MainMenu.py index 58e8640..9454195 100644 --- a/qt/py/ui_MainMenu.py +++ b/qt/py/ui_MainMenu.py @@ -25,16 +25,14 @@ class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") - MainWindow.resize(1077, 784) - sizePolicy = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) - MainWindow.setSizePolicy(sizePolicy) + MainWindow.resize(1010, 625) + MainWindow.setMinimumSize(QSize(1010, 625)) + MainWindow.setMaximumSize(QSize(1010, 625)) self.centralwidget = QWidget(MainWindow) 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) @@ -47,11 +45,11 @@ class Ui_MainWindow(object): self.platform_tabs = QTabWidget(self.centralwidget) self.platform_tabs.setObjectName(u"platform_tabs") - sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Expanding) - sizePolicy1.setHorizontalStretch(0) - sizePolicy1.setVerticalStretch(0) - sizePolicy1.setHeightForWidth(self.platform_tabs.sizePolicy().hasHeightForWidth()) - self.platform_tabs.setSizePolicy(sizePolicy1) + sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.platform_tabs.sizePolicy().hasHeightForWidth()) + self.platform_tabs.setSizePolicy(sizePolicy) self.platform_tabs.setMinimumSize(QSize(410, 0)) self.platform_tabs.setMaximumSize(QSize(410, 16777215)) self.wii_tab = QWidget() @@ -152,21 +150,21 @@ class Ui_MainWindow(object): self.horizontalLayout.setObjectName(u"horizontalLayout") self.download_btn = QPushButton(self.centralwidget) self.download_btn.setObjectName(u"download_btn") - sizePolicy2 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed) - sizePolicy2.setHorizontalStretch(0) - sizePolicy2.setVerticalStretch(0) - sizePolicy2.setHeightForWidth(self.download_btn.sizePolicy().hasHeightForWidth()) - self.download_btn.setSizePolicy(sizePolicy2) + 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.horizontalLayout.addWidget(self.download_btn) self.script_btn = QPushButton(self.centralwidget) self.script_btn.setObjectName(u"script_btn") - sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) - sizePolicy3.setHorizontalStretch(0) - sizePolicy3.setVerticalStretch(0) - sizePolicy3.setHeightForWidth(self.script_btn.sizePolicy().hasHeightForWidth()) - self.script_btn.setSizePolicy(sizePolicy3) + 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) @@ -175,10 +173,11 @@ class Ui_MainWindow(object): 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(10) + self.verticalLayout_7.setSpacing(5) self.verticalLayout_7.setObjectName(u"verticalLayout_7") - self.verticalLayout_7.setSizeConstraint(QLayout.SizeConstraint.SetNoConstraint) + 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) @@ -186,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") - sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) - sizePolicy4.setHorizontalStretch(0) - sizePolicy4.setVerticalStretch(0) - sizePolicy4.setHeightForWidth(self.pack_archive_chkbox.sizePolicy().hasHeightForWidth()) - self.pack_archive_chkbox.setSizePolicy(sizePolicy4) + 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) @@ -214,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") - sizePolicy4.setHeightForWidth(self.keep_enc_chkbox.sizePolicy().hasHeightForWidth()) - self.keep_enc_chkbox.setSizePolicy(sizePolicy4) + 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) @@ -226,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) @@ -234,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") - sizePolicy4.setHeightForWidth(self.create_dec_chkbox.sizePolicy().hasHeightForWidth()) - self.create_dec_chkbox.setSizePolicy(sizePolicy4) + 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) @@ -253,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) - sizePolicy4.setHeightForWidth(self.use_local_chkbox.sizePolicy().hasHeightForWidth()) - self.use_local_chkbox.setSizePolicy(sizePolicy4) + 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) @@ -273,14 +287,13 @@ 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") - sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Preferred) - sizePolicy5.setHorizontalStretch(0) - sizePolicy5.setVerticalStretch(0) - sizePolicy5.setHeightForWidth(self.use_wiiu_nus_chkbox.sizePolicy().hasHeightForWidth()) - self.use_wiiu_nus_chkbox.setSizePolicy(sizePolicy5) + 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) @@ -289,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) @@ -297,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) - sizePolicy4.setHeightForWidth(self.patch_ios_chkbox.sizePolicy().hasHeightForWidth()) - self.patch_ios_chkbox.setSizePolicy(sizePolicy4) + 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) @@ -310,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) @@ -317,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.Preferred) + 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.Preferred, QSizePolicy.Policy.Minimum) + self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum) self.verticalLayout_7.addItem(self.horizontalSpacer) @@ -330,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) @@ -341,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) - sizePolicy4.setHeightForWidth(self.pack_vwii_mode_chkbox.sizePolicy().hasHeightForWidth()) - self.pack_vwii_mode_chkbox.setSizePolicy(sizePolicy4) + 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) @@ -350,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) @@ -357,7 +381,7 @@ 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) @@ -383,7 +407,7 @@ class Ui_MainWindow(object): MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") - self.menubar.setGeometry(QRect(0, 0, 1077, 24)) + self.menubar.setGeometry(QRect(0, 0, 1010, 30)) MainWindow.setMenuBar(self.menubar) self.retranslateUi(MainWindow) @@ -421,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"\n" -"\n" "


", None)) # retranslateUi diff --git a/qt/ui/MainMenu.ui b/qt/ui/MainMenu.ui old mode 100644 new mode 100755 index 09afa9c..8b900c7 --- a/qt/ui/MainMenu.ui +++ b/qt/ui/MainMenu.ui @@ -6,21 +6,30 @@ 0 0 - 1077 - 784 + 1010 + 625
- - - 0 - 0 - + + + 1010 + 625 + + + + + 1010 + 625 + MainWindow + + QLayout::SizeConstraint::SetDefaultConstraint + @@ -246,13 +255,16 @@ + + QLayout::SizeConstraint::SetMinimumSize + - 10 + 5 - QLayout::SizeConstraint::SetNoConstraint + QLayout::SizeConstraint::SetMinimumSize @@ -268,6 +280,9 @@ + + 10 + @@ -283,6 +298,12 @@ + + + 0 + 0 + + Pack installable archive (WAD/TAD) @@ -305,6 +326,9 @@ + + 10 + @@ -323,6 +347,12 @@ + + + 0 + 0 + + Keep encrypted contents @@ -335,6 +365,9 @@ + + 10 + @@ -350,6 +383,12 @@ + + + 0 + 0 + + Create decrypted contents (*.app) @@ -362,6 +401,9 @@ + + 10 + @@ -380,6 +422,12 @@ + + + 0 + 0 + + Use local files, if they exist @@ -392,10 +440,16 @@ + + 10 + + + QLayout::SizeConstraint::SetDefaultConstraint + - + 0 0 @@ -413,6 +467,12 @@ + + + 0 + 0 + + Use the Wii U NUS (faster, only effects Wii/vWii) @@ -425,6 +485,9 @@ + + 10 + @@ -446,6 +509,12 @@ true + + + 0 + 0 + + Apply patches to IOS (Applies to WADs only) @@ -462,7 +531,7 @@ Qt::Orientation::Vertical - QSizePolicy::Policy::Preferred + QSizePolicy::Policy::Ignored @@ -478,7 +547,7 @@ Qt::Orientation::Horizontal - QSizePolicy::Policy::Preferred + QSizePolicy::Policy::MinimumExpanding @@ -492,6 +561,9 @@ + + QLayout::SizeConstraint::SetMinimumSize + @@ -527,6 +599,12 @@ true + + + 0 + 0 + + Re-encrypt title using the Wii Common Key @@ -543,7 +621,7 @@ Qt::Orientation::Vertical - QSizePolicy::Policy::Expanding + QSizePolicy::Policy::MinimumExpanding @@ -586,8 +664,11 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css"> p, li { white-space: pre-wrap; } +hr { height: 1px; border-width: 0; } +li.unchecked::marker { content: "\2610"; } +li.checked::marker { content: "\2612"; } </style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;"> <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> @@ -602,8 +683,8 @@ p, li { white-space: pre-wrap; } 0 0 - 1077 - 24 + 1010 + 30