diff --git a/.gitignore b/.gitignore index 16bd306..bc63159 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ NUSGet.build/ NUSGet.dist/ NUSGet.onefile-build/ NUSGet +NUSGet.app/ .installed.cfg *.egg MANIFEST diff --git a/NUSGet.py b/NUSGet.py index 9cf2a2d..02e04e7 100644 --- a/NUSGet.py +++ b/NUSGet.py @@ -1,5 +1,5 @@ # "NUSGet.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah +# Copyright 2024-2025 NinjaCheetah and Contributors # Nuitka options. These determine compilation settings based on the current OS. # nuitka-project-if: {OS} == "Darwin": @@ -27,6 +27,7 @@ from PySide6.QtGui import QIcon from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox, QStyleFactory, QFileDialog from PySide6.QtCore import QRunnable, Slot, QThreadPool, Signal, QObject, QLibraryInfo, QTranslator, QLocale +from qt.py.ui_AboutDialog import AboutNUSGet from qt.py.ui_MainMenu import Ui_MainWindow from modules.core import * @@ -35,7 +36,7 @@ from modules.download_batch import run_nus_download_batch from modules.download_wii import run_nus_download_wii from modules.download_dsi import run_nus_download_dsi -nusget_version = "1.3.2" +nusget_version = "1.4.0" regions = {"World": ["41"], "USA/NTSC": ["45"], "Europe/PAL": ["50"], "Japan": ["4A"], "Korea": ["4B"], "China": ["43"], "Australia/NZ": ["55"]} @@ -80,6 +81,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.ui.download_btn.clicked.connect(self.download_btn_pressed) self.ui.script_btn.clicked.connect(self.script_btn_pressed) self.ui.custom_out_dir_btn.clicked.connect(self.choose_output_dir) + # About and About Qt Buttons + self.ui.actionAbout.triggered.connect(self.about_nusget) + self.ui.actionAbout_Qt.triggered.connect(lambda: QMessageBox.aboutQt(self)) self.ui.pack_archive_chkbox.toggled.connect( lambda: connect_is_enabled_to_checkbox([self.ui.archive_file_entry], self.ui.pack_archive_chkbox)) self.ui.custom_out_dir_chkbox.toggled.connect( @@ -564,6 +568,11 @@ class MainWindow(QMainWindow, Ui_MainWindow): config_data["out_path"] = str(out_path.absolute()) save_config(config_data) + def about_nusget(self): + version_str = app.translate("MainWindow", "Version {nusget_version}".format(nusget_version=nusget_version)) + about_box = AboutNUSGet(version_str) + about_box.exec() + if __name__ == "__main__": app = QApplication(sys.argv) diff --git a/NUSGet.pyproject b/NUSGet.pyproject index 97ced09..1b987c2 100644 --- a/NUSGet.pyproject +++ b/NUSGet.pyproject @@ -3,6 +3,7 @@ "NUSGet.py", "./modules/core.py", "./qt/ui/MainMenu.ui", + "./qt/ui/AboutNUSGet.ui", "./resources/translations/nusget_es.ts", "./resources/translations/nusget_no.ts", "./resources/translations/nusget_nb.ts", diff --git a/modules/core.py b/modules/core.py index a82da9e..11820a2 100644 --- a/modules/core.py +++ b/modules/core.py @@ -1,5 +1,5 @@ # "modules/core.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah +# Copyright 2024-2025 NinjaCheetah & Contributors import os import json diff --git a/modules/download_wii.py b/modules/download_wii.py index 51d993f..6064da3 100644 --- a/modules/download_wii.py +++ b/modules/download_wii.py @@ -1,5 +1,5 @@ # "modules/download_wii.py", licensed under the MIT license -# Copyright 2024-2025 NinjaCheetah +# Copyright 2024-2025 NinjaCheetah & Contributors import pathlib diff --git a/qt/py/ui_AboutDialog.py b/qt/py/ui_AboutDialog.py new file mode 100644 index 0000000..16cc3e2 --- /dev/null +++ b/qt/py/ui_AboutDialog.py @@ -0,0 +1,13 @@ +# "qt/py/ui_AboutDialog.py", licensed under the MIT license +# Copyright 2024-2025 NinjaCheetah and Contributors + +from PySide6.QtWidgets import QDialog +from qt.py.ui_AboutNUSGet import Ui_AboutNUSGet + +class AboutNUSGet(QDialog): + def __init__(self, version_str): + super().__init__() + self.ui = Ui_AboutNUSGet() + self.ui.setupUi(self) + + self.ui.version_lbl.setText(version_str) diff --git a/qt/py/ui_AboutNUSGet.py b/qt/py/ui_AboutNUSGet.py new file mode 100644 index 0000000..457ef46 --- /dev/null +++ b/qt/py/ui_AboutNUSGet.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'AboutNUSGet.ui' +## +## Created by: Qt User Interface Compiler version 6.9.0 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QAbstractButton, QApplication, QDialog, QDialogButtonBox, + QHBoxLayout, QLabel, QLayout, QSizePolicy, + QSpacerItem, QTextBrowser, QVBoxLayout, QWidget) + +class Ui_AboutNUSGet(object): + def setupUi(self, AboutNUSGet): + if not AboutNUSGet.objectName(): + AboutNUSGet.setObjectName(u"AboutNUSGet") + AboutNUSGet.resize(400, 300) + self.verticalLayout = QVBoxLayout(AboutNUSGet) + self.verticalLayout.setObjectName(u"verticalLayout") + self.outer_layout = QHBoxLayout() + self.outer_layout.setObjectName(u"outer_layout") + self.icon_layout = QVBoxLayout() + self.icon_layout.setObjectName(u"icon_layout") + self.icon_layout.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint) + self.icon_lbl = QLabel(AboutNUSGet) + icon = QIcon("resources/icon.png") + pixmap = icon.pixmap(QSize(75, 75)) + self.icon_lbl.setPixmap(pixmap) + self.icon_lbl.setObjectName(u"icon_lbl") + self.icon_lbl.setMaximumSize(QSize(75, 75)) + + self.icon_layout.addWidget(self.icon_lbl) + + self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.icon_layout.addItem(self.verticalSpacer) + + + self.outer_layout.addLayout(self.icon_layout) + + self.details_layout = QVBoxLayout() + self.details_layout.setObjectName(u"details_layout") + self.about_title_lbl = QLabel(AboutNUSGet) + self.about_title_lbl.setObjectName(u"about_title_lbl") + font = QFont() + font.setPointSize(15) + font.setBold(True) + self.about_title_lbl.setFont(font) + + self.details_layout.addWidget(self.about_title_lbl) + + self.version_lbl = QLabel(AboutNUSGet) + self.version_lbl.setObjectName(u"version_lbl") + font1 = QFont() + font1.setBold(True) + self.version_lbl.setFont(font1) + + self.details_layout.addWidget(self.version_lbl) + + self.detail_text_lbl = QLabel(AboutNUSGet) + self.detail_text_lbl.setObjectName(u"detail_text_lbl") + self.detail_text_lbl.setWordWrap(True) + + self.details_layout.addWidget(self.detail_text_lbl) + + self.textBrowser = QTextBrowser(AboutNUSGet) + self.textBrowser.setObjectName(u"textBrowser") + + self.details_layout.addWidget(self.textBrowser) + + self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.details_layout.addItem(self.verticalSpacer_2) + + self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.details_layout.addItem(self.horizontalSpacer) + + + self.outer_layout.addLayout(self.details_layout) + + + self.verticalLayout.addLayout(self.outer_layout) + + self.buttonBox = QDialogButtonBox(AboutNUSGet) + self.buttonBox.setObjectName(u"buttonBox") + self.buttonBox.setOrientation(Qt.Orientation.Horizontal) + self.buttonBox.setStandardButtons(QDialogButtonBox.StandardButton.Close) + + self.verticalLayout.addWidget(self.buttonBox) + + + self.retranslateUi(AboutNUSGet) + self.buttonBox.accepted.connect(AboutNUSGet.accept) + self.buttonBox.rejected.connect(AboutNUSGet.reject) + + QMetaObject.connectSlotsByName(AboutNUSGet) + # setupUi + + def retranslateUi(self, AboutNUSGet): + AboutNUSGet.setWindowTitle(QCoreApplication.translate("AboutNUSGet", u"Dialog", None)) + self.icon_lbl.setText("") + self.about_title_lbl.setText(QCoreApplication.translate("AboutNUSGet", u"About NUSGet", None)) + self.version_lbl.setText(QCoreApplication.translate("AboutNUSGet", u"Placeholder Version String", None)) + self.detail_text_lbl.setText(QCoreApplication.translate("AboutNUSGet", u"Copyright (c) 2024-2025 NinjaCheetah & Contributors", None)) + self.textBrowser.setHtml(QCoreApplication.translate("AboutNUSGet", u"\n" +"
\n" +"Translations
\n" +"German (Deutsch): yeah-its-gloria
\n" +"Italian (Italiano): LNLenost
\n" +"Korean (\ud55c\uad6d\uc5b4): DDinghoya
\n" +"Norwegian (Norsk): rolfiee
\n" +"Romanian (Rom\u00e2n\u0103): " + "NotImplementedLife
", None)) + # retranslateUi + diff --git a/qt/py/ui_MainMenu.py b/qt/py/ui_MainMenu.py index 0ab0937..f5f7095 100644 --- a/qt/py/ui_MainMenu.py +++ b/qt/py/ui_MainMenu.py @@ -11,15 +11,16 @@ from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, QMetaObject, QObject, QPoint, QRect, QSize, QTime, QUrl, Qt) -from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, - QFont, QFontDatabase, QGradient, QIcon, - QImage, QKeySequence, QLinearGradient, QPainter, - QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient, + QCursor, QFont, QFontDatabase, QGradient, + QIcon, QImage, QKeySequence, QLinearGradient, + QPainter, QPalette, QPixmap, QRadialGradient, + QTransform) from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QHBoxLayout, QHeaderView, QLabel, QLayout, QLineEdit, - QMainWindow, QMenuBar, QPushButton, QSizePolicy, - QSpacerItem, QTabWidget, QTextBrowser, QTreeView, - QVBoxLayout, QWidget) + QMainWindow, QMenu, QMenuBar, QPushButton, + QSizePolicy, QSpacerItem, QTabWidget, QTextBrowser, + QTreeView, QVBoxLayout, QWidget) class Ui_MainWindow(object): def setupUi(self, MainWindow): @@ -28,6 +29,13 @@ class Ui_MainWindow(object): MainWindow.resize(1010, 625) MainWindow.setMinimumSize(QSize(1010, 625)) MainWindow.setMaximumSize(QSize(1010, 625)) + self.actionAbout = QAction(MainWindow) + self.actionAbout.setObjectName(u"actionAbout") + icon = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.HelpAbout)) + self.actionAbout.setIcon(icon) + self.actionAbout_Qt = QAction(MainWindow) + self.actionAbout_Qt.setObjectName(u"actionAbout_Qt") + self.actionAbout_Qt.setIcon(icon) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.horizontalLayout_3 = QHBoxLayout(self.centralwidget) @@ -457,8 +465,15 @@ class Ui_MainWindow(object): self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") self.menubar.setGeometry(QRect(0, 0, 1010, 21)) + self.menuHelp = QMenu(self.menubar) + self.menuHelp.setObjectName(u"menuHelp") MainWindow.setMenuBar(self.menubar) + self.menubar.addAction(self.menuHelp.menuAction()) + self.menuHelp.addAction(self.actionAbout) + self.menuHelp.addAction(self.actionAbout_Qt) + self.menuHelp.addSeparator() + self.retranslateUi(MainWindow) self.platform_tabs.setCurrentIndex(0) @@ -470,6 +485,8 @@ class Ui_MainWindow(object): def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) + self.actionAbout.setText(QCoreApplication.translate("MainWindow", u"About", None)) + self.actionAbout_Qt.setText(QCoreApplication.translate("MainWindow", u"About Qt", None)) self.tree_filter_input.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Search", None)) self.tree_filter_reset_btn.setText(QCoreApplication.translate("MainWindow", u"Clear", None)) self.platform_tabs.setTabText(self.platform_tabs.indexOf(self.wii_tab), QCoreApplication.translate("MainWindow", u"Wii", None)) @@ -509,5 +526,6 @@ class Ui_MainWindow(object): "li.checked::marker { content: \"\\2612\"; }\n" "\n" "