mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	qt: Add UI to display game properties and disable add-ons
This commit is contained in:
		
							parent
							
								
									5f0217592b
								
							
						
					
					
						commit
						60e27252a5
					
				| @ -35,6 +35,8 @@ add_executable(yuzu | ||||
|     configuration/configure_mouse_advanced.h | ||||
|     configuration/configure_system.cpp | ||||
|     configuration/configure_system.h | ||||
|     configuration/configure_per_general.cpp | ||||
|     configuration/configure_per_general.h | ||||
|     configuration/configure_touchscreen_advanced.cpp | ||||
|     configuration/configure_touchscreen_advanced.h | ||||
|     configuration/configure_web.cpp | ||||
| @ -86,6 +88,7 @@ set(UIS | ||||
|     configuration/configure_input.ui | ||||
|     configuration/configure_input_player.ui | ||||
|     configuration/configure_mouse_advanced.ui | ||||
|     configuration/configure_per_general.ui | ||||
|     configuration/configure_system.ui | ||||
|     configuration/configure_touchscreen_advanced.ui | ||||
|     configuration/configure_web.ui | ||||
|  | ||||
							
								
								
									
										166
									
								
								src/yuzu/configuration/configure_per_general.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								src/yuzu/configuration/configure_per_general.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,166 @@ | ||||
| // Copyright 2016 Citra Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <algorithm> | ||||
| #include <memory> | ||||
| #include <utility> | ||||
| #include <QMenu> | ||||
| #include <QMessageBox> | ||||
| #include <QStandardItemModel> | ||||
| #include <QString> | ||||
| #include <QTimer> | ||||
| #include <QTreeView> | ||||
| #include "common/param_package.h" | ||||
| #include "core/file_sys/control_metadata.h" | ||||
| #include "core/file_sys/patch_manager.h" | ||||
| #include "core/file_sys/xts_archive.h" | ||||
| #include "core/loader/loader.h" | ||||
| #include "input_common/main.h" | ||||
| #include "yuzu/configuration/config.h" | ||||
| #include "yuzu/configuration/configure_input.h" | ||||
| #include "yuzu/configuration/configure_per_general.h" | ||||
| #include "yuzu/ui_settings.h" | ||||
| 
 | ||||
| ConfigurePerGameGeneral::ConfigurePerGameGeneral(u64 title_id, QWidget* parent) | ||||
|     : QDialog(parent), ui(std::make_unique<Ui::ConfigurePerGameGeneral>()), title_id(title_id) { | ||||
| 
 | ||||
|     ui->setupUi(this); | ||||
|     setFocusPolicy(Qt::ClickFocus); | ||||
|     setWindowTitle(tr("Properties")); | ||||
| 
 | ||||
|     layout = new QVBoxLayout; | ||||
|     tree_view = new QTreeView; | ||||
|     item_model = new QStandardItemModel(tree_view); | ||||
|     tree_view->setModel(item_model); | ||||
|     tree_view->setAlternatingRowColors(true); | ||||
|     tree_view->setSelectionMode(QHeaderView::SingleSelection); | ||||
|     tree_view->setSelectionBehavior(QHeaderView::SelectRows); | ||||
|     tree_view->setVerticalScrollMode(QHeaderView::ScrollPerPixel); | ||||
|     tree_view->setHorizontalScrollMode(QHeaderView::ScrollPerPixel); | ||||
|     tree_view->setSortingEnabled(true); | ||||
|     tree_view->setEditTriggers(QHeaderView::NoEditTriggers); | ||||
|     tree_view->setUniformRowHeights(true); | ||||
|     tree_view->setContextMenuPolicy(Qt::NoContextMenu); | ||||
| 
 | ||||
|     item_model->insertColumns(0, 2); | ||||
|     item_model->setHeaderData(0, Qt::Horizontal, "Patch Name"); | ||||
|     item_model->setHeaderData(1, Qt::Horizontal, "Version"); | ||||
| 
 | ||||
|     // We must register all custom types with the Qt Automoc system so that we are able to use it
 | ||||
|     // with signals/slots. In this case, QList falls under the umbrells of custom types.
 | ||||
|     qRegisterMetaType<QList<QStandardItem*>>("QList<QStandardItem*>"); | ||||
| 
 | ||||
|     layout->setContentsMargins(0, 0, 0, 0); | ||||
|     layout->setSpacing(0); | ||||
|     layout->addWidget(tree_view); | ||||
| 
 | ||||
|     ui->scrollArea->setLayout(layout); | ||||
| 
 | ||||
|     scene = new QGraphicsScene; | ||||
|     ui->icon_view->setScene(scene); | ||||
| 
 | ||||
|     connect(item_model, &QStandardItemModel::itemChanged, | ||||
|             [&]() { UISettings::values.is_game_list_reload_pending.exchange(true); }); | ||||
| 
 | ||||
|     this->loadConfiguration(); | ||||
| } | ||||
| 
 | ||||
| void ConfigurePerGameGeneral::applyConfiguration() { | ||||
|     std::vector<std::string> disabled_addons; | ||||
| 
 | ||||
|     for (const auto& item : list_items) { | ||||
|         const auto disabled = item.front()->checkState() == Qt::Unchecked; | ||||
|         if (disabled) | ||||
|             disabled_addons.push_back(item.front()->text().toStdString()); | ||||
|     } | ||||
| 
 | ||||
|     Settings::values.disabled_addons[title_id] = disabled_addons; | ||||
| } | ||||
| 
 | ||||
| void ConfigurePerGameGeneral::loadFromFile(FileSys::VirtualFile file) { | ||||
|     this->file = std::move(file); | ||||
|     this->loadConfiguration(); | ||||
| } | ||||
| 
 | ||||
| void ConfigurePerGameGeneral::loadConfiguration() { | ||||
|     if (file == nullptr) | ||||
|         return; | ||||
| 
 | ||||
|     const auto loader = Loader::GetLoader(file); | ||||
| 
 | ||||
|     ui->display_title_id->setText(fmt::format("{:016X}", title_id).c_str()); | ||||
| 
 | ||||
|     FileSys::PatchManager pm{title_id}; | ||||
|     const auto control = pm.GetControlMetadata(); | ||||
| 
 | ||||
|     if (control.first != nullptr) { | ||||
|         ui->display_version->setText(QString::fromStdString(control.first->GetVersionString())); | ||||
|         ui->display_name->setText(QString::fromStdString(control.first->GetApplicationName())); | ||||
|         ui->display_developer->setText(QString::fromStdString(control.first->GetDeveloperName())); | ||||
|     } else { | ||||
|         std::string title; | ||||
|         if (loader->ReadTitle(title) == Loader::ResultStatus::Success) | ||||
|             ui->display_name->setText(QString::fromStdString(title)); | ||||
| 
 | ||||
|         std::string developer; | ||||
|         if (loader->ReadDeveloper(developer) == Loader::ResultStatus::Success) | ||||
|             ui->display_developer->setText(QString::fromStdString(developer)); | ||||
| 
 | ||||
|         ui->display_version->setText("1.0.0"); | ||||
|     } | ||||
| 
 | ||||
|     if (control.second != nullptr) { | ||||
|         scene->clear(); | ||||
| 
 | ||||
|         QPixmap map; | ||||
|         const auto bytes = control.second->ReadAllBytes(); | ||||
|         map.loadFromData(bytes.data(), bytes.size()); | ||||
| 
 | ||||
|         scene->addPixmap(map.scaled(ui->icon_view->width(), ui->icon_view->height(), | ||||
|                                     Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); | ||||
|     } else { | ||||
|         std::vector<u8> bytes; | ||||
|         if (loader->ReadIcon(bytes) == Loader::ResultStatus::Success) { | ||||
|             scene->clear(); | ||||
| 
 | ||||
|             QPixmap map; | ||||
|             map.loadFromData(bytes.data(), bytes.size()); | ||||
| 
 | ||||
|             scene->addPixmap(map.scaled(ui->icon_view->width(), ui->icon_view->height(), | ||||
|                                         Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     FileSys::VirtualFile update_raw; | ||||
|     loader->ReadUpdateRaw(update_raw); | ||||
| 
 | ||||
|     const auto& disabled = Settings::values.disabled_addons[title_id]; | ||||
| 
 | ||||
|     for (const auto& patch : pm.GetPatchVersionNames(update_raw)) { | ||||
|         QStandardItem* first_item = new QStandardItem; | ||||
|         const auto name = QString::fromStdString(patch.first).replace("[D] ", ""); | ||||
|         first_item->setText(name); | ||||
|         first_item->setCheckable(true); | ||||
| 
 | ||||
|         const auto patch_disabled = | ||||
|             std::find(disabled.begin(), disabled.end(), name.toStdString()) != disabled.end(); | ||||
| 
 | ||||
|         first_item->setCheckState(patch_disabled ? Qt::Unchecked : Qt::Checked); | ||||
| 
 | ||||
|         list_items.push_back(QList<QStandardItem*>{ | ||||
|             first_item, new QStandardItem{QString::fromStdString(patch.second)}}); | ||||
|         item_model->appendRow(list_items.back()); | ||||
|     } | ||||
| 
 | ||||
|     tree_view->setColumnWidth(0, 5 * tree_view->width() / 16); | ||||
| 
 | ||||
|     ui->display_filename->setText(QString::fromStdString(file->GetName())); | ||||
| 
 | ||||
|     ui->display_format->setText( | ||||
|         QString::fromStdString(Loader::GetFileTypeString(loader->GetFileType()))); | ||||
| 
 | ||||
|     QLocale locale = this->locale(); | ||||
|     QString valueText = locale.formattedDataSize(file->GetSize()); | ||||
|     ui->display_size->setText(valueText); | ||||
| } | ||||
							
								
								
									
										56
									
								
								src/yuzu/configuration/configure_per_general.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/yuzu/configuration/configure_per_general.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| // Copyright 2016 Citra Emulator Project
 | ||||
| // Licensed under GPLv2 or any later version
 | ||||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <array> | ||||
| #include <functional> | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <unordered_map> | ||||
| #include <QKeyEvent> | ||||
| #include <QList> | ||||
| #include <QWidget> | ||||
| #include <boost/optional.hpp> | ||||
| #include "common/param_package.h" | ||||
| #include "core/file_sys/vfs.h" | ||||
| #include "core/settings.h" | ||||
| #include "input_common/main.h" | ||||
| #include "ui_configure_per_general.h" | ||||
| #include "yuzu/configuration/config.h" | ||||
| 
 | ||||
| class QTreeView; | ||||
| class QGraphicsScene; | ||||
| class QStandardItem; | ||||
| class QStandardItemModel; | ||||
| 
 | ||||
| namespace Ui { | ||||
| class ConfigurePerGameGeneral; | ||||
| } | ||||
| 
 | ||||
| class ConfigurePerGameGeneral : public QDialog { | ||||
|     Q_OBJECT | ||||
| 
 | ||||
| public: | ||||
|     explicit ConfigurePerGameGeneral(u64 title_id, QWidget* parent = nullptr); | ||||
| 
 | ||||
|     /// Save all button configurations to settings file
 | ||||
|     void applyConfiguration(); | ||||
| 
 | ||||
|     void loadFromFile(FileSys::VirtualFile file); | ||||
| 
 | ||||
| private: | ||||
|     std::unique_ptr<Ui::ConfigurePerGameGeneral> ui; | ||||
|     FileSys::VirtualFile file; | ||||
|     u64 title_id; | ||||
| 
 | ||||
|     QVBoxLayout* layout; | ||||
|     QTreeView* tree_view; | ||||
|     QStandardItemModel* item_model; | ||||
|     QGraphicsScene* scene; | ||||
| 
 | ||||
|     std::vector<QList<QStandardItem*>> list_items; | ||||
| 
 | ||||
|     void loadConfiguration(); | ||||
| }; | ||||
							
								
								
									
										276
									
								
								src/yuzu/configuration/configure_per_general.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										276
									
								
								src/yuzu/configuration/configure_per_general.ui
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,276 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <ui version="4.0"> | ||||
|  <class>ConfigurePerGameGeneral</class> | ||||
|  <widget class="QDialog" name="ConfigurePerGameGeneral"> | ||||
|   <property name="geometry"> | ||||
|    <rect> | ||||
|     <x>0</x> | ||||
|     <y>0</y> | ||||
|     <width>400</width> | ||||
|     <height>520</height> | ||||
|    </rect> | ||||
|   </property> | ||||
|   <property name="windowTitle"> | ||||
|    <string>ConfigurePerGameGeneral</string> | ||||
|   </property> | ||||
|   <layout class="QHBoxLayout" name="HorizontalLayout"> | ||||
|    <item> | ||||
|     <layout class="QVBoxLayout" name="VerticalLayout"> | ||||
|      <item> | ||||
|       <widget class="QGroupBox" name="GeneralGroupBox"> | ||||
|        <property name="title"> | ||||
|         <string>Info</string> | ||||
|        </property> | ||||
|        <layout class="QHBoxLayout" name="GeneralHorizontalLayout"> | ||||
|         <item> | ||||
|          <layout class="QGridLayout" name="gridLayout_2"> | ||||
|           <item row="6" column="1" colspan="2"> | ||||
|            <widget class="QLineEdit" name="display_filename"> | ||||
|             <property name="enabled"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|             <property name="readOnly"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="0" column="1"> | ||||
|            <widget class="QLineEdit" name="display_name"> | ||||
|             <property name="enabled"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|             <property name="readOnly"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="1" column="0"> | ||||
|            <widget class="QLabel" name="label_2"> | ||||
|             <property name="text"> | ||||
|              <string>Developer</string> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="5" column="1" colspan="2"> | ||||
|            <widget class="QLineEdit" name="display_size"> | ||||
|             <property name="enabled"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|             <property name="readOnly"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="0" column="0"> | ||||
|            <widget class="QLabel" name="label"> | ||||
|             <property name="text"> | ||||
|              <string>Name</string> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="6" column="0"> | ||||
|            <widget class="QLabel" name="label_7"> | ||||
|             <property name="text"> | ||||
|              <string>Filename</string> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="2" column="0"> | ||||
|            <widget class="QLabel" name="label_3"> | ||||
|             <property name="text"> | ||||
|              <string>Version</string> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="4" column="0"> | ||||
|            <widget class="QLabel" name="label_5"> | ||||
|             <property name="text"> | ||||
|              <string>Format</string> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="2" column="1"> | ||||
|            <widget class="QLineEdit" name="display_version"> | ||||
|             <property name="enabled"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|             <property name="readOnly"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="4" column="1"> | ||||
|            <widget class="QLineEdit" name="display_format"> | ||||
|             <property name="enabled"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|             <property name="readOnly"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="5" column="0"> | ||||
|            <widget class="QLabel" name="label_6"> | ||||
|             <property name="text"> | ||||
|              <string>Size</string> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="1" column="1"> | ||||
|            <widget class="QLineEdit" name="display_developer"> | ||||
|             <property name="enabled"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|             <property name="readOnly"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="3" column="0"> | ||||
|            <widget class="QLabel" name="label_4"> | ||||
|             <property name="text"> | ||||
|              <string>Title ID</string> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="3" column="1"> | ||||
|            <widget class="QLineEdit" name="display_title_id"> | ||||
|             <property name="enabled"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|             <property name="readOnly"> | ||||
|              <bool>true</bool> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|           <item row="0" column="2" rowspan="5"> | ||||
|            <widget class="QGraphicsView" name="icon_view"> | ||||
|             <property name="sizePolicy"> | ||||
|              <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> | ||||
|               <horstretch>0</horstretch> | ||||
|               <verstretch>0</verstretch> | ||||
|              </sizepolicy> | ||||
|             </property> | ||||
|             <property name="minimumSize"> | ||||
|              <size> | ||||
|               <width>128</width> | ||||
|               <height>128</height> | ||||
|              </size> | ||||
|             </property> | ||||
|             <property name="maximumSize"> | ||||
|              <size> | ||||
|               <width>128</width> | ||||
|               <height>128</height> | ||||
|              </size> | ||||
|             </property> | ||||
|             <property name="verticalScrollBarPolicy"> | ||||
|              <enum>Qt::ScrollBarAlwaysOff</enum> | ||||
|             </property> | ||||
|             <property name="horizontalScrollBarPolicy"> | ||||
|              <enum>Qt::ScrollBarAlwaysOff</enum> | ||||
|             </property> | ||||
|             <property name="sizeAdjustPolicy"> | ||||
|              <enum>QAbstractScrollArea::AdjustToContents</enum> | ||||
|             </property> | ||||
|             <property name="interactive"> | ||||
|              <bool>false</bool> | ||||
|             </property> | ||||
|            </widget> | ||||
|           </item> | ||||
|          </layout> | ||||
|         </item> | ||||
|        </layout> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QGroupBox" name="PerformanceGroupBox"> | ||||
|        <property name="title"> | ||||
|         <string>Add-Ons</string> | ||||
|        </property> | ||||
|        <layout class="QHBoxLayout" name="PerformanceHorizontalLayout"> | ||||
|         <item> | ||||
|          <widget class="QScrollArea" name="scrollArea"> | ||||
|           <property name="widgetResizable"> | ||||
|            <bool>true</bool> | ||||
|           </property> | ||||
|           <widget class="QWidget" name="scrollAreaWidgetContents"> | ||||
|            <property name="geometry"> | ||||
|             <rect> | ||||
|              <x>0</x> | ||||
|              <y>0</y> | ||||
|              <width>350</width> | ||||
|              <height>169</height> | ||||
|             </rect> | ||||
|            </property> | ||||
|           </widget> | ||||
|          </widget> | ||||
|         </item> | ||||
|         <item> | ||||
|          <layout class="QVBoxLayout" name="PerformanceVerticalLayout"/> | ||||
|         </item> | ||||
|        </layout> | ||||
|       </widget> | ||||
|      </item> | ||||
|      <item> | ||||
|       <spacer name="verticalSpacer"> | ||||
|        <property name="orientation"> | ||||
|         <enum>Qt::Vertical</enum> | ||||
|        </property> | ||||
|        <property name="sizeType"> | ||||
|         <enum>QSizePolicy::Fixed</enum> | ||||
|        </property> | ||||
|        <property name="sizeHint" stdset="0"> | ||||
|         <size> | ||||
|          <width>20</width> | ||||
|          <height>40</height> | ||||
|         </size> | ||||
|        </property> | ||||
|       </spacer> | ||||
|      </item> | ||||
|      <item> | ||||
|       <widget class="QDialogButtonBox" name="buttonBox"> | ||||
|        <property name="standardButtons"> | ||||
|         <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> | ||||
|        </property> | ||||
|       </widget> | ||||
|      </item> | ||||
|     </layout> | ||||
|    </item> | ||||
|   </layout> | ||||
|  </widget> | ||||
|  <resources/> | ||||
|  <connections> | ||||
|   <connection> | ||||
|    <sender>buttonBox</sender> | ||||
|    <signal>accepted()</signal> | ||||
|    <receiver>ConfigurePerGameGeneral</receiver> | ||||
|    <slot>accept()</slot> | ||||
|    <hints> | ||||
|     <hint type="sourcelabel"> | ||||
|      <x>269</x> | ||||
|      <y>567</y> | ||||
|     </hint> | ||||
|     <hint type="destinationlabel"> | ||||
|      <x>269</x> | ||||
|      <y>294</y> | ||||
|     </hint> | ||||
|    </hints> | ||||
|   </connection> | ||||
|   <connection> | ||||
|    <sender>buttonBox</sender> | ||||
|    <signal>rejected()</signal> | ||||
|    <receiver>ConfigurePerGameGeneral</receiver> | ||||
|    <slot>reject()</slot> | ||||
|    <hints> | ||||
|     <hint type="sourcelabel"> | ||||
|      <x>269</x> | ||||
|      <y>567</y> | ||||
|     </hint> | ||||
|     <hint type="destinationlabel"> | ||||
|      <x>269</x> | ||||
|      <y>294</y> | ||||
|     </hint> | ||||
|    </hints> | ||||
|   </connection> | ||||
|  </connections> | ||||
| </ui> | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Zach Hilman
						Zach Hilman