diff --git a/rpcs3/rpcs3qt.vcxproj b/rpcs3/rpcs3qt.vcxproj index 8974aa2466..cd3288ed42 100644 --- a/rpcs3/rpcs3qt.vcxproj +++ b/rpcs3/rpcs3qt.vcxproj @@ -392,11 +392,6 @@ true true - - true - true - true - true true @@ -537,11 +532,6 @@ true true - - true - true - true - true true @@ -692,11 +682,6 @@ true true - - true - true - true - true true @@ -837,11 +822,6 @@ true true - - true - true - true - true true @@ -937,8 +917,6 @@ true true - - @@ -1409,25 +1387,6 @@ $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) - - $(QTDIR)\bin\moc.exe;%(FullPath) - Moc%27ing game_list_grid.h... - .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DLLVM_AVAILABLE -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\." - $(QTDIR)\bin\moc.exe;%(FullPath) - Moc%27ing game_list_grid.h... - .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -D_SCL_SECURE_NO_WARNINGS -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\.." "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\." - $(QTDIR)\bin\moc.exe;%(FullPath) - Moc%27ing game_list_grid.h... - .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\." - $(QTDIR)\bin\moc.exe;%(FullPath) - Moc%27ing game_list_grid.h... - .\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DQT_OPENGL_LIB -DQT_WIDGETS_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_WINEXTRAS_LIB -DLLVM_AVAILABLE -D_SCL_SECURE_NO_WARNINGS -D_UNICODE "-I.\..\Vulkan\Vulkan-LoaderAndValidationLayers\include" "-I.\.." "-I.\..\3rdparty\minidx12\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtOpenGL" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtQuick" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtQml" "-I$(QTDIR)\include\QtNetwork" "-I$(QTDIR)\include\QtCore" "-I.\debug" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)\." "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(NOINHERIT)\." - - diff --git a/rpcs3/rpcs3qt.vcxproj.filters b/rpcs3/rpcs3qt.vcxproj.filters index ba790832e1..41f3a0f91c 100644 --- a/rpcs3/rpcs3qt.vcxproj.filters +++ b/rpcs3/rpcs3qt.vcxproj.filters @@ -513,24 +513,6 @@ Generated Files\Debug - LLVM - - Gui - - - Generated Files\Release - LLVM - - - Generated Files\Debug - - - Generated Files\Release - - - Generated Files\Debug - LLVM - - - Gui - @@ -567,9 +549,6 @@ Gui - - Gui - @@ -665,8 +644,5 @@ Gui - - Gui - \ No newline at end of file diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 2da3b38f9e..9a224810b4 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -20,82 +20,46 @@ #include #include #include -#include static const std::string m_class_name = "GameViewer"; inline std::string sstr(const QString& _in) { return _in.toUtf8().toStdString(); } +// Auxiliary classes +class sortGameData +{ + int sortColumn; + bool sortAscending; + +public: + sortGameData(u32 column, bool ascending) : sortColumn(column), sortAscending(ascending) {} + bool operator()(const GameInfo& game1, const GameInfo& game2) const + { + // Note that the column index has to match the appropriate GameInfo member + switch (sortColumn - 1) // skip *icon* column + { + case 0: return sortAscending ? (game1.name < game2.name) : (game1.name > game2.name); + case 1: return sortAscending ? (game1.serial < game2.serial) : (game1.serial > game2.serial); + case 2: return sortAscending ? (game1.fw < game2.fw) : (game1.fw > game2.fw); + case 3: return sortAscending ? (game1.app_ver < game2.app_ver) : (game1.app_ver > game2.app_ver); + case 4: return sortAscending ? (game1.category < game2.category) : (game1.category > game2.category); + case 5: return sortAscending ? (game1.root < game2.root) : (game1.root > game2.root); + default: return false; + } + } +}; + game_list_frame::game_list_frame(std::shared_ptr settings, Render_Creator r_Creator, QWidget *parent) : QDockWidget(tr("Game List"), parent), xgui_settings(settings), m_Render_Creator(r_Creator) { - m_isListLayout = xgui_settings->GetValue(GUI::gl_listMode).toBool(); - m_Icon_Size_Str = xgui_settings->GetValue(GUI::gl_iconSize).toString(); - m_Margin_Factor = xgui_settings->GetValue(GUI::gl_marginFactor).toReal(); - m_Text_Factor = xgui_settings->GetValue(GUI::gl_textFactor).toReal(); - m_showToolBar = xgui_settings->GetValue(GUI::gl_toolBarVisible).toBool(); + m_Icon_Size = GUI::gl_icon_size.at(m_gui_settings->GetValue(GUI::gl_iconSize).toString()); - // get icon size from list - int icon_size_index = 0; - for (int i = 0; i < GUI::gl_icon_size.count(); i++) - { - if (GUI::gl_icon_size.at(i).first == m_Icon_Size_Str) - { - m_Icon_Size = GUI::gl_icon_size.at(i).second; - icon_size_index = i; - break; - } - } + m_columns = columns_arr(m_Icon_Size); - // Save factors for first setup - xgui_settings->SetValue(GUI::gl_marginFactor, m_Margin_Factor); - xgui_settings->SetValue(GUI::gl_textFactor, m_Text_Factor); - xgui_settings->SetValue(GUI::gl_toolBarVisible, m_showToolBar); - - m_Game_Dock = new QMainWindow(this); - m_Game_Dock->setWindowFlags(Qt::Widget); - - // Set up toolbar - m_Tool_Bar = new QToolBar(m_Game_Dock); - m_Tool_Bar->setMovable(false); - m_Tool_Bar->setVisible(m_showToolBar); - - m_Search_Bar = new QLineEdit(m_Tool_Bar); - m_Search_Bar->setPlaceholderText(tr("Search games ...")); - m_Search_Bar->setEnabled(false); // delete this on implementation - - m_Slider_Mode = new QSlider(Qt::Horizontal, m_Tool_Bar); - m_Slider_Mode->setRange(0, 1); - m_Slider_Mode->setSliderPosition(m_isListLayout ? 0 : 1); - m_Slider_Mode->setFixedWidth(30); - - m_Slider_Size = new QSlider(Qt::Horizontal , m_Tool_Bar); - m_Slider_Size->setRange(0, GUI::gl_icon_size.size() - 1); - m_Slider_Size->setSliderPosition(icon_size_index); - m_Slider_Size->setFixedWidth(100); - - m_Tool_Bar->addWidget(m_Search_Bar); - m_Tool_Bar->addWidget(new QLabel(" ")); - m_Tool_Bar->addSeparator(); - m_Tool_Bar->addWidget(new QLabel(tr(" List "))); - m_Tool_Bar->addWidget(m_Slider_Mode); - m_Tool_Bar->addWidget(new QLabel(tr(" Grid "))); - m_Tool_Bar->addSeparator(); - m_Tool_Bar->addWidget(new QLabel(tr(" Tiny "))); // Can this be any easier? - m_Tool_Bar->addWidget(m_Slider_Size); - m_Tool_Bar->addWidget(new QLabel(tr(" Large "))); - - m_Game_Dock->addToolBar(m_Tool_Bar); - setWidget(m_Game_Dock); - - bool showText = (m_Icon_Size_Str != GUI::gl_icon_key_small && m_Icon_Size_Str != GUI::gl_icon_key_tiny); - m_xgrid.reset(new game_list_grid(m_Icon_Size, m_Margin_Factor, m_Text_Factor, showText, m_Game_Dock)); - - gameList = new QTableWidget(m_Game_Dock); + gameList = new QTableWidget(this); gameList->setShowGrid(false); gameList->setItemDelegate(new table_item_delegate(this)); gameList->setSelectionBehavior(QAbstractItemView::SelectRows); gameList->setSelectionMode(QAbstractItemView::SingleSelection); - gameList->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); gameList->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); gameList->verticalHeader()->setMinimumSectionSize(m_Icon_Size.height()); gameList->verticalHeader()->setMaximumSectionSize(m_Icon_Size.height()); @@ -103,7 +67,7 @@ game_list_frame::game_list_frame(std::shared_ptr settings, Render_ gameList->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu); gameList->setContextMenuPolicy(Qt::CustomContextMenu); - gameList->setColumnCount(8); + gameList->setColumnCount(7); gameList->setHorizontalHeaderItem(0, new QTableWidgetItem(tr("Icon"))); gameList->setHorizontalHeaderItem(1, new QTableWidgetItem(tr("Name"))); gameList->setHorizontalHeaderItem(2, new QTableWidgetItem(tr("Serial"))); @@ -111,22 +75,8 @@ game_list_frame::game_list_frame(std::shared_ptr settings, Render_ gameList->setHorizontalHeaderItem(4, new QTableWidgetItem(tr("App version"))); gameList->setHorizontalHeaderItem(5, new QTableWidgetItem(tr("Category"))); gameList->setHorizontalHeaderItem(6, new QTableWidgetItem(tr("Path"))); - gameList->setHorizontalHeaderItem(7, new QTableWidgetItem(tr("Missingno"))); // Holds index which points back to original array - gameList->setColumnHidden(7, true); // Comment this if your sorting ever for whatever reason messes up. - - if (m_isListLayout) - { - m_xgrid.get()->hide(); - gameList->show(); - m_Game_Dock->setCentralWidget(gameList); - } - else - { - gameList->hide(); - m_xgrid.get()->show(); - m_Game_Dock->setCentralWidget(m_xgrid.get()); - } + setWidget(gameList); // Actions showIconColAct = new QAction(tr("Show Icons"), this); @@ -149,12 +99,6 @@ game_list_frame::game_list_frame(std::shared_ptr settings, Render_ connect(gameList, &QTableWidget::doubleClicked, this, &game_list_frame::doubleClickedSlot); connect(gameList->horizontalHeader(), &QHeaderView::sectionClicked, this, &game_list_frame::OnColClicked); - connect(m_xgrid.get(), &QTableWidget::doubleClicked, this, &game_list_frame::doubleClickedSlot); - connect(m_xgrid.get(), &QTableWidget::customContextMenuRequested, this, &game_list_frame::ShowContextMenu); - - connect(m_Slider_Size, &QSlider::valueChanged, [=](int value) { emit RequestIconSizeActSet(value); }); - connect(m_Slider_Mode, &QSlider::valueChanged, [=](int value) { emit RequestListModeActSet(value); }); - for (int col = 0; col < columnActs.count(); ++col) { columnActs[col]->setCheckable(true); @@ -176,12 +120,11 @@ game_list_frame::game_list_frame(std::shared_ptr settings, Render_ gameList->setColumnHidden(col, !val); // Negate because it's a set col hidden and we have menu say show. xgui_settings->SetGamelistColVisibility(col, val); }; - columnActs[col]->setChecked(xgui_settings->GetGamelistColVisibility(col)); connect(columnActs[col], &QAction::triggered, l_CallBack); } // Init - Refresh(true); // Data MUST be loaded so that first settings load will reset columns to correct width w/r to data. + Refresh(); // Data MUST be loaded so that first settings load will reset columns to correct width w/r to data. LoadSettings(); } @@ -195,9 +138,7 @@ void game_list_frame::LoadSettings() columnActs[col]->setChecked(vis); gameList->setColumnHidden(col, !vis); } - bool sortAsc = Qt::SortOrder(xgui_settings->GetValue(GUI::gl_sortAsc).toBool()); - m_colSortOrder = sortAsc ? Qt::AscendingOrder : Qt::DescendingOrder; - + m_sortAscending = xgui_settings->GetValue(GUI::gl_sortAsc).toBool(); m_sortColumn = xgui_settings->GetValue(GUI::gl_sortCol).toInt(); m_categoryFilters = xgui_settings->GetGameListCategoryFilters(); @@ -213,7 +154,7 @@ void game_list_frame::LoadSettings() gameList->horizontalHeader()->restoreState(state); } - Refresh(true); + Refresh(); } game_list_frame::~game_list_frame() @@ -223,22 +164,21 @@ game_list_frame::~game_list_frame() void game_list_frame::OnColClicked(int col) { - if (col == 0) return; // Don't "sort" icons. - if (col == m_sortColumn) { - m_colSortOrder = (m_colSortOrder == Qt::AscendingOrder) ? Qt::DescendingOrder : Qt::AscendingOrder; + m_sortAscending ^= true; } else { - m_colSortOrder = Qt::AscendingOrder; + m_sortAscending = true; } m_sortColumn = col; - xgui_settings->SetValue(GUI::gl_sortAsc, m_colSortOrder == Qt::AscendingOrder); + xgui_settings->SetValue(GUI::gl_sortAsc, m_sortAscending); xgui_settings->SetValue(GUI::gl_sortCol, col); - gameList->sortByColumn(m_sortColumn, m_colSortOrder); + // Sort entries, update columns and refresh the panel + Refresh(); } @@ -316,15 +256,17 @@ void game_list_frame::LoadPSF() game.category = sstr(category::unknown); } - m_game_data.push_back({ game, *GetImage(game.icon_path, m_Icon_Size) }); + m_game_data.push_back(game); } - auto op = [](const GUI_GameInfo& game1, const GUI_GameInfo& game2) { - return game1.info.name < game2.info.name; - }; + // Sort entries and update columns + std::sort(m_game_data.begin(), m_game_data.end(), sortGameData(m_sortColumn, m_sortAscending)); + m_columns.Update(m_game_data); +} - // Sort by name at the very least. - std::sort(m_game_data.begin(), m_game_data.end(), op); +void game_list_frame::ShowData() +{ + m_columns.ShowData(gameList); } // Filter for Categories @@ -349,52 +291,20 @@ void game_list_frame::FilterData() } } -void game_list_frame::Refresh(bool fromDrive) +void game_list_frame::Refresh() { - if (fromDrive) - { - LoadGames(); - LoadPSF(); - } - - if (m_isListLayout) - { - int row = gameList->currentRow(); - - if (fromDrive) - { - PopulateUI(); - } - - FilterData(); - gameList->selectRow(row); - gameList->sortByColumn(m_sortColumn, m_colSortOrder); - gameList->setColumnHidden(7, true); - gameList->resizeRowsToContents(); - gameList->resizeColumnToContents(0); - } - else - { - if (m_Icon_Size.width() > 0 && m_Icon_Size.height() > 0) - { - m_games_per_row = width() / (m_Icon_Size.width() + m_Icon_Size.width() * m_xgrid.get()->getMarginFactor() * 2); - } - else - { - m_games_per_row = 0; - } - - m_xgrid.reset(MakeGrid(m_games_per_row, m_Icon_Size)); - connect(m_xgrid.get(), &QTableWidget::doubleClicked, this, &game_list_frame::doubleClickedSlot); - connect(m_xgrid.get(), &QTableWidget::customContextMenuRequested, this, &game_list_frame::ShowContextMenu); - m_Game_Dock->setCentralWidget(m_xgrid.get()); - } + int row = gameList->currentRow(); + LoadGames(); + LoadPSF(); + ShowData(); + FilterData(); + gameList->selectRow(row); } void game_list_frame::ToggleCategoryFilter(QString category, bool show) { if (show) { m_categoryFilters.append(category); } else { m_categoryFilters.removeAll(category); } - Refresh(false); + Refresh(); } void game_list_frame::SaveSettings() @@ -404,7 +314,7 @@ void game_list_frame::SaveSettings() xgui_settings->SetGamelistColVisibility(col, columnActs[col]->isChecked()); } xgui_settings->SetValue(GUI::gl_sortCol, m_sortColumn); - xgui_settings->SetValue(GUI::gl_sortAsc, m_colSortOrder == Qt::AscendingOrder); + xgui_settings->SetValue(GUI::gl_sortAsc, m_sortAscending); xgui_settings->SetValue(GUI::gl_state, gameList->horizontalHeader()->saveState()); } @@ -428,83 +338,46 @@ static void open_dir(const std::string& spath) void game_list_frame::doubleClickedSlot(const QModelIndex& index) { - int i; + int i = index.row(); + QString category = qstr(m_game_data[i].category); - if (m_isListLayout) - { - i = gameList->item(index.row(), 7)->text().toInt(); - } - else - { - i = m_xgrid->item(index.row(), index.column())->data(Qt::ItemDataRole::UserRole).toInt(); - } - - QString category = qstr(m_game_data[i].info.category); - // Boot these categories if (category == category::hdd_Game || category == category::disc_Game || category == category::audio_Video) { - const std::string& path = Emu.GetGameDir() + m_game_data[i].info.root; + const std::string& path = Emu.GetGameDir() + m_game_data[i].root; emit RequestIconPathSet(path); - + Emu.Stop(); - + if (!Emu.BootGame(path)) { - LOG_ERROR(LOADER, "Failed to boot /dev_hdd0/game/%s", m_game_data[i].info.root); + LOG_ERROR(LOADER, "Failed to boot /dev_hdd0/game/%s", m_game_data[i].root); } else { LOG_SUCCESS(LOADER, "Boot from gamelist per doubleclick: done"); - emit RequestAddRecentGame(q_string_pair(qstr(path), qstr("[" + m_game_data[i].info.serial + "] " + m_game_data[i].info.name))); + emit RequestAddRecentGame(q_string_pair(qstr(path), qstr("[" + m_game_data[i].serial + "] " + m_game_data[i].name))); } } else { - open_dir(Emu.GetGameDir() + m_game_data[i].info.root); + open_dir(Emu.GetGameDir() + m_game_data[i].root); } } -void game_list_frame::ShowContextMenu(const QPoint &pos) -{ - int index; - - if (m_isListLayout) - { - int row = gameList->indexAt(pos).row(); - QTableWidgetItem* item = gameList->item(row, 7); - if (item == nullptr) return; // null happens if you are double clicking in dockwidget area on nothing. - index = item->text().toInt(); - } - else - { - int row = m_xgrid->indexAt(pos).row(); - int col = m_xgrid->indexAt(pos).column(); - QTableWidgetItem* item = m_xgrid->item(row, col); - if (item == nullptr) return; // null happens if you are double clicking in dockwidget area on nothing. - index = item->data(Qt::ItemDataRole::UserRole).toInt(); - if (index == -1) return; // empty item shouldn't have context menu - } - ShowSpecifiedContextMenu(pos, index); -} - -void game_list_frame::ShowSpecifiedContextMenu(const QPoint &pos, int row) +void game_list_frame::ShowContextMenu(const QPoint &pos) // this is a slot { + int row = gameList->indexAt(pos).row(); + if (row == -1) { return; // invalid } - QPoint globalPos; - - if (m_isListLayout) - { - globalPos = gameList->mapToGlobal(pos); - } - else - { - globalPos = m_xgrid->mapToGlobal(pos); - } + // for most widgets + QPoint globalPos = gameList->mapToGlobal(pos); + // for QAbstractScrollArea and derived classes you would use: + // QPoint globalPos = myWidget->viewport()->mapToGlobal(pos); QMenu myMenu; @@ -524,25 +397,25 @@ void game_list_frame::ShowSpecifiedContextMenu(const QPoint &pos, int row) QAction* checkCompat = myMenu.addAction(tr("&Check Game Compatibility")); connect(boot, &QAction::triggered, [=]() {Boot(row); }); - connect(configure, &QAction::triggered, [=]() { - settings_dialog(xgui_settings, m_Render_Creator, this, &m_game_data[row].info).exec(); + connect(configure, &QAction::triggered, [=](){ + settings_dialog(xgui_settings, m_Render_Creator, this, &m_game_data[row]).exec(); }); - connect(removeGame, &QAction::triggered, [=]() { + connect(removeGame, &QAction::triggered, [=](){ if (QMessageBox::question(this, tr("Confirm Delete"), tr("Permanently delete files?")) == QMessageBox::Yes) - fs::remove_all(Emu.GetGameDir() + m_game_data[row].info.root); - Refresh(true); + fs::remove_all(Emu.GetGameDir() + m_game_data[row].root); + Refresh(); }); connect(removeConfig, &QAction::triggered, [=]() {RemoveCustomConfiguration(row); }); - connect(openGameFolder, &QAction::triggered, [=]() {open_dir(Emu.GetGameDir() + m_game_data[row].info.root); }); - connect(openConfig, &QAction::triggered, [=]() {open_dir(fs::get_config_dir() + "data/" + m_game_data[row].info.serial); }); + connect(openGameFolder, &QAction::triggered, [=]() {open_dir(Emu.GetGameDir() + m_game_data[row].root); }); + connect(openConfig, &QAction::triggered, [=]() {open_dir(fs::get_config_dir() + "data/" + m_game_data[row].serial); }); connect(checkCompat, &QAction::triggered, [=]() { - QString serial = qstr(m_game_data[row].info.serial); + QString serial = qstr(m_game_data[row].serial); QString link = "https://rpcs3.net/compatibility?g=" + serial; QDesktopServices::openUrl(QUrl(link)); }); //Disable options depending on software category - QString category = qstr(m_game_data[row].info.category); + QString category = qstr(m_game_data[row].category); if (category == category::disc_Game) { @@ -563,32 +436,32 @@ void game_list_frame::ShowSpecifiedContextMenu(const QPoint &pos, int row) openConfig->setEnabled(false); checkCompat->setEnabled(false); } - + myMenu.exec(globalPos); } void game_list_frame::Boot(int row) { - const std::string& path = Emu.GetGameDir() + m_game_data[row].info.root; + const std::string& path = Emu.GetGameDir() + m_game_data[row].root; emit RequestIconPathSet(path); Emu.Stop(); if (!Emu.BootGame(path)) { - QMessageBox::warning(this, tr("Warning!"), tr("Failed to boot ") + qstr(m_game_data[row].info.root)); - LOG_ERROR(LOADER, "Failed to boot /dev_hdd0/game/%s", m_game_data[row].info.root); + QMessageBox::warning(this, tr("Warning!"), tr("Failed to boot ") + qstr(m_game_data[row].root)); + LOG_ERROR(LOADER, "Failed to boot /dev_hdd0/game/%s", m_game_data[row].root); } else { LOG_SUCCESS(LOADER, "Boot from gamelist per Boot: done"); - emit RequestAddRecentGame(q_string_pair(qstr(path), qstr("[" + m_game_data[row].info.serial + "] " + m_game_data[row].info.name))); + emit RequestAddRecentGame(q_string_pair(qstr(path), qstr("[" + m_game_data[row].serial + "] " + m_game_data[row].name))); } } void game_list_frame::RemoveCustomConfiguration(int row) { - const std::string config_path = fs::get_config_dir() + "data/" + m_game_data[row].info.serial + "/config.yml"; + const std::string config_path = fs::get_config_dir() + "data/" + m_game_data[row].serial + "/config.yml"; if (fs::is_file(config_path)) { @@ -612,58 +485,164 @@ void game_list_frame::RemoveCustomConfiguration(int row) } } -void game_list_frame::ResizeIcons(const QSize& size, const int& idx) +void game_list_frame::ResizeIcons(QSize size) { - m_Slider_Size->setSliderPosition(idx); - m_Icon_Size_Str = GUI::gl_icon_size.at(idx).first; - - xgui_settings->SetValue(GUI::gl_iconSize, m_Icon_Size_Str); - + m_columns.m_Icon_Size = size; m_Icon_Size = size; - - if (m_isListLayout) - { - gameList->verticalHeader()->setMinimumSectionSize(m_Icon_Size.height()); - gameList->verticalHeader()->setMaximumSectionSize(m_Icon_Size.height()); - } - else - { - m_xgrid->setIconSize(m_Icon_Size); - } - Refresh(true); + gameList->verticalHeader()->setMinimumSectionSize(m_Icon_Size.height()); + gameList->verticalHeader()->setMaximumSectionSize(m_Icon_Size.height()); + Refresh(); } -void game_list_frame::SetListMode(const bool& isList) +columns_arr::columns_arr(QSize icon_Size) : m_Icon_Size(icon_Size) { - m_isListLayout = isList; + m_img_list = new QList(); - m_Slider_Mode->setSliderPosition(isList ? 0 : 1); + m_columns.clear(); + m_columns.emplace_back(0, 90, "Icon"); + m_columns.emplace_back(1, 160, "Name"); + m_columns.emplace_back(2, 85, "Serial"); + m_columns.emplace_back(3, 55, "FW"); + m_columns.emplace_back(4, 55, "App version"); + m_columns.emplace_back(5, 75, "Category"); + m_columns.emplace_back(6, 160, "Path"); + m_col_icon = &m_columns[0]; + m_col_name = &m_columns[1]; + m_col_serial = &m_columns[2]; + m_col_fw = &m_columns[3]; + m_col_app_ver = &m_columns[4]; + m_col_category = &m_columns[5]; + m_col_path = &m_columns[6]; +} - xgui_settings->SetValue(GUI::gl_listMode, isList); - - Refresh(true); - - if (m_isListLayout) +Column* columns_arr::GetColumnByPos(u32 pos) +{ + std::vector columns; + for (u32 pos = 0; poshide(); - gameList->show(); - gameList->verticalHeader()->setMinimumSectionSize(m_Icon_Size.height()); - gameList->verticalHeader()->setMaximumSectionSize(m_Icon_Size.height()); - m_Game_Dock->setCentralWidget(gameList); + for (u32 c = 0; chide(); - m_xgrid.get()->show(); - m_Game_Dock->setCentralWidget(m_xgrid.get()); + if (!columns[c]->shown) + { + pos++; + continue; + } + if (columns[c]->pos != pos) continue; + return columns[c]; + } + + return NULL; +} + +void columns_arr::Update(const std::vector& game_data) +{ + m_img_list->clear(); + m_col_icon->data.clear(); + m_col_name->data.clear(); + m_col_serial->data.clear(); + m_col_fw->data.clear(); + m_col_app_ver->data.clear(); + m_col_category->data.clear(); + m_col_path->data.clear(); + m_icon_indexes.clear(); + + if (m_columns.size() == 0) return; + + for (const auto& game : game_data) + { + m_col_icon->data.push_back(game.icon_path); + m_col_name->data.push_back(game.name); + m_col_serial->data.push_back(game.serial); + m_col_fw->data.push_back(game.fw); + m_col_app_ver->data.push_back(game.app_ver); + m_col_category->data.push_back(game.category); + m_col_path->data.push_back(game.root); + } + + int c = 0; + // load icons + for (const auto& path : m_col_icon->data) + { + QImage* img = new QImage(m_Icon_Size, QImage::Format_ARGB32); + if (!path.empty()) + { + // Load image. + bool success = img->load(qstr(path)); + if (success) + { + m_img_list->append(new QImage(img->scaled(m_Icon_Size, Qt::KeepAspectRatio, Qt::TransformationMode::SmoothTransformation))); + } + else { + // IIRC a load failure means blank image which is fine to have as a placeholder. + QString abspath = QDir(qstr(path)).absolutePath(); + LOG_ERROR(HLE, "Could not load game icon image from path %s", sstr(abspath)); + img->fill(QColor(0, 0, 0, 0)); + m_img_list->append(img); + } + } + else + { + LOG_ERROR(HLE, "Could not load game icon image from empty path"); + img->fill(QColor(0, 0, 0, 0)); + m_img_list->append(img); + } + m_icon_indexes.push_back(c); + c++; } } -void game_list_frame::SetToolBarVisible(const bool& showToolBar) +void columns_arr::ShowData(QTableWidget* table) { - m_showToolBar = showToolBar; - m_Tool_Bar->setVisible(showToolBar); - xgui_settings->SetValue(GUI::gl_toolBarVisible, showToolBar); + // Hack to delete everything without removing the headers. + table->setRowCount(0); + + // Expect number of columns to be the same as number of icons. + table->setRowCount(m_img_list->length()); + + // Add icons. + for (int r = 0; r < m_img_list->length(); ++r) + { + QTableWidgetItem* iconItem = new QTableWidgetItem; + iconItem->setFlags(iconItem->flags() & ~Qt::ItemIsEditable); + iconItem->setData(Qt::DecorationRole, QPixmap::fromImage(*m_img_list->at(m_icon_indexes[r]))); + table->setItem(r, 0, iconItem); + } + + // Add the other data. + for (int c = 1; c < table->columnCount(); ++c) + { + Column* col = GetColumnByPos(c); + + if (!col) + { + LOG_ERROR(HLE, "Columns loaded with error!"); + return; + } + + int numRows = col->data.size(); + if (numRows != table->rowCount()) + { + table->setRowCount(numRows); + LOG_WARNING(HLE, "Warning. Columns are of different size: number of icons %d number wanted: %d", m_img_list->length(), numRows); + } + + for (int r = 0; rdata.size(); ++r) + { + QTableWidgetItem* curr = new QTableWidgetItem; + curr->setFlags(curr->flags() & ~Qt::ItemIsEditable); + QString text = qstr(col->data[r]); + curr->setText(text); + table->setItem(r, c, curr); + } + table->resizeRowsToContents(); + table->resizeColumnToContents(0); + } } void game_list_frame::closeEvent(QCloseEvent *event) @@ -671,156 +650,3 @@ void game_list_frame::closeEvent(QCloseEvent *event) QDockWidget::closeEvent(event); emit game_list_frameClosed(); } - -void game_list_frame::resizeEvent(QResizeEvent *event) -{ - if (!m_isListLayout) - { - Refresh(false); - } - QDockWidget::resizeEvent(event); -} - -/** - Cleans and readds entries to table widget in UI. -*/ -void game_list_frame::PopulateUI() -{ - // Hack to delete everything without removing the headers. - gameList->setRowCount(0); - - gameList->setRowCount(m_game_data.size()); - - auto l_GetItem = [](const std::string& text) - { - QTableWidgetItem* curr = new QTableWidgetItem; - curr->setFlags(curr->flags() & ~Qt::ItemIsEditable); - QString qtext = qstr(text); - curr->setText(qtext); - return curr; - }; - - int row = 0; - for (GUI_GameInfo game : m_game_data) - { - - // Icon - QTableWidgetItem* iconItem = new QTableWidgetItem; - iconItem->setFlags(iconItem->flags() & ~Qt::ItemIsEditable); - iconItem->setData(Qt::DecorationRole, QPixmap::fromImage(game.icon)); - gameList->setItem(row, 0, iconItem); - - gameList->setItem(row, 1, l_GetItem(game.info.name)); - gameList->setItem(row, 2, l_GetItem(game.info.serial)); - gameList->setItem(row, 3, l_GetItem(game.info.fw)); - gameList->setItem(row, 4, l_GetItem(game.info.app_ver)); - gameList->setItem(row, 5, l_GetItem(game.info.category)); - gameList->setItem(row, 6, l_GetItem(game.info.root)); - - // A certain magical index which points back to the original game index. - // Essentially, this column makes the tablewidget's row into a map, accomplishing what columns did but much simpler. - QTableWidgetItem* index = new QTableWidgetItem; - index->setText(QString::number(row)); - gameList->setItem(row, 7, index); - - row++; - } -} - -QImage* game_list_frame::GetImage(const std::string& path, const QSize& size) -{ - // Icon - QImage* img = new QImage(); - - if (!path.empty() && img->load(qstr(path))) - { - QImage* scaled = new QImage(img->scaled(size, Qt::KeepAspectRatio, Qt::TransformationMode::SmoothTransformation)); - delete img; // no leaks - img = scaled; - } - else - { - img = new QImage(m_Icon_Size, QImage::Format_ARGB32); - QString abspath = QDir(qstr(path)).absolutePath(); - LOG_ERROR(HLE, "Count not load image from path %s", sstr(abspath)); - img->fill(QColor(0, 0, 0, 0)); - } - return img; -} - - -game_list_grid* game_list_frame::MakeGrid(uint maxCols, const QSize& image_size) -{ - uint r = 0; - uint c = 0; - - game_list_grid* grid; - - bool showText = m_Icon_Size_Str != GUI::gl_icon_key_small && m_Icon_Size_Str != GUI::gl_icon_key_tiny; - - if (m_Icon_Size_Str == GUI::gl_icon_key_medium) - { - grid = new game_list_grid(image_size, m_Margin_Factor, m_Text_Factor * 2, showText, m_Game_Dock); - } - else - { - grid = new game_list_grid(image_size, m_Margin_Factor, m_Text_Factor, showText, m_Game_Dock); - } - - // Get number of things that'll be in grid. - int entries = 0; - for (GUI_GameInfo game : m_game_data) - { - if (qstr(game.info.category) == category::disc_Game || qstr(game.info.category) == category::hdd_Game) - { - ++entries; - } - } - - // Edge cases! - if (maxCols == 0) - { - maxCols = 1; - } - if (maxCols > entries) - { - maxCols = entries; - } - - int needsExtraRow = entries % maxCols != 0; - int maxRows = needsExtraRow + entries / maxCols; - grid->setRowCount(maxRows); - grid->setColumnCount(maxCols); - - for (uint i = 0; i < m_game_data.size(); i++) - { - QString category = qstr(m_game_data[i].info.category); - - if (category == category::hdd_Game || category == category::disc_Game) - { - grid->addItem(&m_game_data[i].icon, qstr(m_game_data[i].info.name), i, r, c); - - if (++c >= maxCols) - { - c = 0; - r++; - } - } - } - - if (c != 0) - { // if left over games exist -- if empty entries exist - for (int col = c; col < maxCols; ++col) - { - QTableWidgetItem* emptyItem = new QTableWidgetItem(); - emptyItem->setFlags(Qt::NoItemFlags); - emptyItem->setData(Qt::UserRole, -1); - grid->setItem(r, col, emptyItem); - } - } - - grid->resizeColumnsToContents(); - grid->resizeRowsToContents(); - - return grid; -} \ No newline at end of file diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index a36ffd5f40..6ae893fde7 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -4,18 +4,63 @@ #include "stdafx.h" #include "Emu/GameInfo.h" -#include "game_list_grid.h" #include "gui_settings.h" #include "emu_settings.h" #include #include #include -#include -#include -#include -#include +struct Column +{ + u32 pos; + u32 width; + bool shown; + std::vector data; + + const std::string name; + const u32 def_pos; + const u32 def_width; + + Column(const u32 _def_pos, const u32 _def_width, const std::string& _name) + : def_pos(_def_pos) + , def_width(_def_width) + , pos(_def_pos) + , width(_def_width) + , shown(true) + , name(_name) + { + data.clear(); + } + +}; + +struct columns_arr +{ + std::vector m_columns; + + columns_arr(){}; + columns_arr(QSize icon_Size); + + Column* GetColumnByPos(u32 pos); + +public: + Column* m_col_icon; + Column* m_col_name; + Column* m_col_serial; + Column* m_col_fw; + Column* m_col_app_ver; + Column* m_col_category; + Column* m_col_path; + + QSize m_Icon_Size; + QList* m_img_list; + std::vector m_icon_indexes; + + void Update(const std::vector& game_data); + + void ShowData(QTableWidget* list); +}; namespace category { @@ -27,20 +72,23 @@ namespace category const QString unknown = QObject::tr("Unknown"); } -/* Having the icons associated with the game info simplifies logic internally */ -typedef struct GUI_GameInfo -{ - GameInfo info; - QImage icon; -}; - class game_list_frame : public QDockWidget { Q_OBJECT + int m_sortColumn; + bool m_sortAscending; + std::vector m_games; + std::vector m_game_data; + gui_settings* m_gui_settings = new gui_settings(this); + QSize m_Icon_Size; + columns_arr m_columns; + QStringList m_categoryFilters; + Render_Creator m_Render_Creator; + public: explicit game_list_frame(std::shared_ptr settings, Render_Creator r_Creator, QWidget *parent = nullptr); ~game_list_frame(); - void Refresh(const bool fromDrive); + void Refresh(); void ToggleCategoryFilter(QString category, bool show); /** Loads from settings. Public so that main frame can easily reset these settings if needed. */ @@ -51,46 +99,31 @@ public: public slots: /** Resize Gamelist Icons to size */ - void ResizeIcons(const QSize& size, const int& idx); - void SetListMode(const bool& isList); - void SetToolBarVisible(const bool& showToolBar); + void ResizeIcons(QSize size); private slots: void Boot(int row); void RemoveCustomConfiguration(int row); + void OnColClicked(int col); - - void ShowContextMenu(const QPoint &pos); - void ShowSpecifiedContextMenu(const QPoint &pos, int index); // Different name because the notation for overloaded connects is messy - void doubleClickedSlot(const QModelIndex& index); signals: void game_list_frameClosed(); void RequestIconPathSet(const std::string path); void RequestAddRecentGame(const q_string_pair& entry); - void RequestIconSizeActSet(const int& idx); - void RequestListModeActSet(const int& idx); protected: /** Override inherited method from Qt to allow signalling when close happened.*/ void closeEvent(QCloseEvent* event); - void resizeEvent(QResizeEvent *event); private: - game_list_grid* MakeGrid(uint maxCols, const QSize& image_size); + QTableWidget *gameList; + + void ShowContextMenu(const QPoint &pos); + void doubleClickedSlot(const QModelIndex& index); + void LoadGames(); void LoadPSF(); + void ShowData(); void FilterData(); - void PopulateUI(); - QImage* GetImage(const std::string& path, const QSize& size); - - // Which widget we are displaying depends on if we are in grid or list mode. - QMainWindow* m_Game_Dock; - QToolBar* m_Tool_Bar; - QLineEdit* m_Search_Bar; - QSlider* m_Slider_Size; - QSlider* m_Slider_Mode; - QTableWidget *gameList; - std::unique_ptr m_xgrid; - // Actions regarding showing/hiding columns QAction* showIconColAct; QAction* showNameColAct; @@ -101,24 +134,7 @@ private: QAction* showPathColAct; QList columnActs; - - // TODO: Reorganize this into a sensible order for private variables. std::shared_ptr xgui_settings; - - int m_sortColumn; - Qt::SortOrder m_colSortOrder; - bool m_isListLayout = true; - bool m_showToolBar = true; - std::vector m_games; - std::vector m_game_data; - QSize m_Icon_Size; - QString m_Icon_Size_Str; - qreal m_Margin_Factor; - qreal m_Text_Factor; - QStringList m_categoryFilters; - Render_Creator m_Render_Creator; - - uint m_games_per_row = 0; }; #endif // GAMELISTFRAME_H diff --git a/rpcs3/rpcs3qt/game_list_grid.cpp b/rpcs3/rpcs3qt/game_list_grid.cpp deleted file mode 100644 index b2bae22a6b..0000000000 --- a/rpcs3/rpcs3qt/game_list_grid.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "game_list_grid.h" -#include "game_list_grid_delegate.h" - -#include - -game_list_grid::game_list_grid(const QSize& icon_size, const qreal& margin_factor, const qreal& text_factor, const bool& showText, QWidget* parent) - : QTableWidget(parent), m_icon_size(icon_size), m_margin_factor(margin_factor), m_text_factor(text_factor), m_text_enabled(showText) -{ - QSize item_size; - if (m_text_enabled) - { - item_size = m_icon_size + QSize(m_icon_size.width() * m_margin_factor * 2, m_icon_size.height() * m_margin_factor * (m_text_factor + 1)); - } - else - { - item_size = m_icon_size + m_icon_size * m_margin_factor * 2; - } - - grid_item_delegate = new game_list_grid_delegate(item_size, m_margin_factor, m_text_factor, this); - setItemDelegate(grid_item_delegate); - setSelectionBehavior(QAbstractItemView::SelectItems); - setSelectionMode(QAbstractItemView::SingleSelection); - setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); - setContextMenuPolicy(Qt::CustomContextMenu); - verticalHeader()->setVisible(false); - horizontalHeader()->setVisible(false); - setShowGrid(false); -} - -game_list_grid::~game_list_grid() -{ -} - -void game_list_grid::enableText(const bool& enabled) -{ - m_text_enabled = enabled; -} - -void game_list_grid::setIconSize(const QSize& size) -{ - if (m_text_enabled) - { - grid_item_delegate->setItemSize(size + QSize(size.width() * m_margin_factor * 2, size.height() * m_margin_factor * (m_text_factor + 1))); - } - else - { - grid_item_delegate->setItemSize(size + size * m_margin_factor * 2); - } -} - -void game_list_grid::addItem(const QImage* img, const QString& name, const int& idx, const int& row, const int& col) -{ - QImage raw_img = QImage(*img); - - // define size of expanded image, which is raw image size + margins - QSize exp_size; - if (m_text_enabled) - { - exp_size = m_icon_size + QSize(m_icon_size.width() * m_margin_factor * 2, m_icon_size.height() * m_margin_factor * (m_text_factor + 1)); - } - else - { - exp_size = m_icon_size + m_icon_size * m_margin_factor * 2; - } - - // define offset for raw image placement - QPoint offset = QPoint(m_icon_size.width() * m_margin_factor, m_icon_size.height() * m_margin_factor); - - // create empty canvas for expanded image - QImage exp_img = QImage(exp_size, QImage::Format_ARGB32); - exp_img.fill(Qt::transparent); - - // place raw image inside expanded image - QPainter painter(&exp_img); - painter.drawImage(offset, raw_img); - painter.end(); - - // create item with expanded image, title and position - QTableWidgetItem* item = new QTableWidgetItem(); - item->setData(Qt::ItemDataRole::DecorationRole, QPixmap::fromImage(exp_img)); - item->setData(Qt::ItemDataRole::UserRole, idx); - item->setData(Qt::ItemDataRole::ToolTipRole, name); - if (m_text_enabled) { item->setData(Qt::ItemDataRole::DisplayRole, name); } - setItem(row, col, item); -} - -qreal game_list_grid::getMarginFactor() -{ - return m_margin_factor; -} diff --git a/rpcs3/rpcs3qt/game_list_grid.h b/rpcs3/rpcs3qt/game_list_grid.h deleted file mode 100644 index 1faae4d942..0000000000 --- a/rpcs3/rpcs3qt/game_list_grid.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef GAME_LIST_GRID_H -#define GAME_LIST_GRID_H - -#include "game_list_grid_delegate.h" - -#include -#include -#include -#include -#include -#include - -class game_list_grid : public QTableWidget -{ - Q_OBJECT - - QSize m_icon_size; - qreal m_margin_factor; - qreal m_text_factor; - bool m_text_enabled = true; - -public: - explicit game_list_grid(const QSize& icon_size, const qreal& margin_factor, const qreal& text_factor, const bool& showText, QWidget* parent = 0); - ~game_list_grid(); - - void enableText(const bool& enabled); - void setIconSize(const QSize& size); - void addItem(const QImage* img, const QString& name, const int& idx, const int& row, const int& col); - - qreal getMarginFactor(); - -private: - game_list_grid_delegate* grid_item_delegate; -}; - -#endif \ No newline at end of file diff --git a/rpcs3/rpcs3qt/game_list_grid_delegate.cpp b/rpcs3/rpcs3qt/game_list_grid_delegate.cpp deleted file mode 100644 index 0547b8bd4b..0000000000 --- a/rpcs3/rpcs3qt/game_list_grid_delegate.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "game_list_grid_delegate.h" - -game_list_grid_delegate::game_list_grid_delegate(const QSize& size, const qreal& margin_factor, const qreal& text_factor, QObject *parent) - : QAbstractItemDelegate(parent), m_size(size), m_margin_factor(margin_factor), m_text_factor(text_factor) -{ -} - -game_list_grid_delegate::~game_list_grid_delegate() -{ -} - -void game_list_grid_delegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const -{ - QRect r = option.rect; - - painter->eraseRect(r); - - //Color: #333 - QPen fontPen(QColor::fromRgb(51, 51, 51), 1, Qt::SolidLine); - - //Get title and image - QPixmap image = (qvariant_cast(index.data(Qt::DecorationRole))); - QString title = index.data(Qt::DisplayRole).toString(); - - // image - if (image.isNull() == false) - { - painter->drawPixmap(r, image); - } - - // Add selection overlay - if (option.state & QStyle::State_Selected) - { - QLinearGradient gradientSelected(r.left(), r.top(), r.left(), r.height() + r.top()); - gradientSelected.setColorAt(0.0, QColor::fromRgba(qRgba(119, 213, 247, 128))); - gradientSelected.setColorAt(0.9, QColor::fromRgba(qRgba(27, 134, 183, 128))); - gradientSelected.setColorAt(1.0, QColor::fromRgba(qRgba(0, 120, 174, 128))); - painter->fillRect(r, gradientSelected); - } - - int h = r.height() / (1 + m_margin_factor + m_margin_factor*m_text_factor); - int height = r.height() - h - h * m_margin_factor; - int top = r.bottom() - height; - - // title - painter->setPen(fontPen); - painter->setFont(QFont("Lucida Grande", 8, QFont::DemiBold)); - painter->drawText(QRect(r.left(), top, r.width(), height), Qt::TextWordWrap | Qt::AlignCenter, title); -} - -QSize game_list_grid_delegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const -{ - return m_size; -} diff --git a/rpcs3/rpcs3qt/game_list_grid_delegate.h b/rpcs3/rpcs3qt/game_list_grid_delegate.h deleted file mode 100644 index 16ecb41b37..0000000000 --- a/rpcs3/rpcs3qt/game_list_grid_delegate.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef GAME_LIST_GRID_DELEGATE -#define GAME_LIST_GRID_DELEGATE - -#include -#include - -class game_list_grid_delegate : public QAbstractItemDelegate -{ -public: - game_list_grid_delegate(const QSize& imageSize, const qreal& margin_factor, const qreal& margin_ratio, QObject *parent = 0); - - void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const; - QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const; - void setItemSize(const QSize& size) { m_size = size; }; - virtual ~game_list_grid_delegate(); -private: - QSize m_size; - qreal m_margin_factor; - qreal m_text_factor; -}; - -#endif diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index 68acf31a8c..39ae3c8f6c 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -28,19 +28,15 @@ typedef struct GUI_SAVE typedef std::map icon_size; typedef QPair q_string_pair; -typedef QPair q_size_pair; typedef QList q_pair_list; -typedef QList q_size_list; namespace GUI { - const QString gl_icon_key_tiny = "tiny"; const QString gl_icon_key_small = "small"; const QString gl_icon_key_medium = "medium"; const QString gl_icon_key_large = "large"; - const q_size_list gl_icon_size = { - { gl_icon_key_tiny, QSize(40, 22) }, + const icon_size gl_icon_size = { { gl_icon_key_small, QSize(80, 44) }, { gl_icon_key_medium, QSize(160, 88) }, { gl_icon_key_large, QSize(320, 176) } @@ -54,9 +50,9 @@ namespace GUI const GUI_SAVE rg_freeze = GUI_SAVE(main_window, "recentGamesFrozen", false); const GUI_SAVE rg_entries = GUI_SAVE(main_window, "recentGamesNames", QVariant::fromValue(q_pair_list())); - const GUI_SAVE ib_pkg_success = GUI_SAVE( main_window, "infoBoxEnabledInstallPKG", true ); - const GUI_SAVE ib_pup_success = GUI_SAVE( main_window, "infoBoxEnabledInstallPUP", true ); - const GUI_SAVE ib_show_welcome = GUI_SAVE( main_window, "infoBoxEnabledWelcome", true ); + const GUI_SAVE ib_pkg_success = GUI_SAVE( main_window, "infoBoxEnabledInstallPKG", true ); + const GUI_SAVE ib_pup_success = GUI_SAVE( main_window, "infoBoxEnabledInstallPUP", true ); + const GUI_SAVE ib_show_welcome = GUI_SAVE(main_window, "infoBoxEnabledWelcome", true); const GUI_SAVE fd_install_pkg = GUI_SAVE( main_window, "lastExplorePathPKG", "" ); const GUI_SAVE fd_install_pup = GUI_SAVE( main_window, "lastExplorePathPUP", "" ); @@ -79,14 +75,10 @@ namespace GUI const GUI_SAVE cat_unknown = GUI_SAVE( game_list, "categoryVisibleUnknown", true ); const GUI_SAVE cat_other = GUI_SAVE( game_list, "categoryVisibleOther", true ); - const GUI_SAVE gl_sortAsc = GUI_SAVE( game_list, "sortAsc", true ); - const GUI_SAVE gl_sortCol = GUI_SAVE( game_list, "sortCol", 1 ); - const GUI_SAVE gl_state = GUI_SAVE( game_list, "state", QByteArray() ); - const GUI_SAVE gl_iconSize = GUI_SAVE( game_list, "iconSize", gl_icon_key_small ); - const GUI_SAVE gl_listMode = GUI_SAVE( game_list, "listMode", true ); - const GUI_SAVE gl_textFactor = GUI_SAVE( game_list, "textFactor", (qreal) 2.0 ); - const GUI_SAVE gl_marginFactor = GUI_SAVE( game_list, "marginFactor", (qreal) 0.09 ); - const GUI_SAVE gl_toolBarVisible = GUI_SAVE( game_list, "toolBarVisible", true ); + const GUI_SAVE gl_sortAsc = GUI_SAVE( game_list, "sortAsc", true ); + const GUI_SAVE gl_sortCol = GUI_SAVE( game_list, "sortCol", 1 ); + const GUI_SAVE gl_state = GUI_SAVE( game_list, "state", QByteArray() ); + const GUI_SAVE gl_iconSize = GUI_SAVE( game_list, "iconSize", gl_icon_key_small); const GUI_SAVE l_tty = GUI_SAVE( logger, "TTY", true ); const GUI_SAVE l_level = GUI_SAVE( logger, "level", (uint)(logs::level::success) ); diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index f780bf11d6..1d7bc7bf93 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -351,7 +351,7 @@ void main_window::InstallPkg() QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { fs::remove_all(local_path); - gameListFrame->Refresh(true); + gameListFrame->Refresh(); LOG_SUCCESS(LOADER, "PKG: removed incomplete installation in %s", local_path); return; } @@ -377,7 +377,7 @@ void main_window::InstallPkg() if (progress >= 1.) { - gameListFrame->Refresh(true); + gameListFrame->Refresh(); LOG_SUCCESS(GENERAL, "Successfully installed %s.", fileName); guiSettings->ShowInfoBox(GUI::ib_pkg_success, tr("Success!"), tr("Successfully installed software from package!"), this); @@ -1027,9 +1027,6 @@ void main_window::CreateActions() showControlsAct = new QAction(tr("Show Controls"), this); showControlsAct->setCheckable(true); - showGameListToolBarAct = new QAction(tr("Show Tool Bar"), this); - showGameListToolBarAct->setCheckable(true); - refreshGameListAct = new QAction(tr("&Refresh Game List"), this); showCatHDDGameAct = new QAction(category::hdd_Game, this); @@ -1050,18 +1047,6 @@ void main_window::CreateActions() showCatUnknownAct = new QAction(category::unknown, this); showCatUnknownAct->setCheckable(true); - columnVisibleActGroup = new QActionGroup(this); - columnVisibleActGroup->addAction(showCatHDDGameAct); - columnVisibleActGroup->addAction(showCatDiscGameAct); - columnVisibleActGroup->addAction(showCatHomeAct); - columnVisibleActGroup->addAction(showCatAudioVideoAct); - columnVisibleActGroup->addAction(showCatGameDataAct); - columnVisibleActGroup->addAction(showCatUnknownAct); - columnVisibleActGroup->setExclusive(false); - - setIconSizeTinyAct = new QAction(tr("Tiny"), this); - setIconSizeTinyAct->setCheckable(true); - setIconSizeSmallAct = new QAction(tr("Small"), this); setIconSizeSmallAct->setCheckable(true); @@ -1072,23 +1057,11 @@ void main_window::CreateActions() setIconSizeLargeAct->setCheckable(true); iconSizeActGroup = new QActionGroup(this); - iconSizeActGroup->addAction(setIconSizeTinyAct); iconSizeActGroup->addAction(setIconSizeSmallAct); iconSizeActGroup->addAction(setIconSizeMediumAct); iconSizeActGroup->addAction(setIconSizeLargeAct); setIconSizeSmallAct->setChecked(true); - setlistModeListAct = new QAction(tr("List"), this); - setlistModeListAct->setCheckable(true); - - setlistModeGridAct = new QAction(tr("Grid"), this); - setlistModeGridAct->setCheckable(true); - - listModeActGroup = new QActionGroup(this); - listModeActGroup->addAction(setlistModeListAct); - listModeActGroup->addAction(setlistModeGridAct); - setlistModeListAct->setChecked(true); - aboutAct = new QAction(tr("&About"), this); aboutAct->setStatusTip(tr("Show the application's About box")); @@ -1193,26 +1166,32 @@ void main_window::CreateConnects() checked ? controls->show() : controls->hide(); guiSettings->SetValue(GUI::mw_controls, checked); }); - connect(showGameListToolBarAct, &QAction::triggered, this, [=](bool checked){ - gameListFrame->SetToolBarVisible(checked); - }); connect(refreshGameListAct, &QAction::triggered, [=](){ - gameListFrame->Refresh(true); + gameListFrame->Refresh(); }); - connect(columnVisibleActGroup, &QActionGroup::triggered, [=](QAction* act) - { - QString cat; - const bool& checked = act->isChecked(); - - if (act == showCatHDDGameAct) cat = category::hdd_Game; - else if (act == showCatDiscGameAct) cat = category::disc_Game; - else if (act == showCatHomeAct) cat = category::home; - else if (act == showCatAudioVideoAct) cat = category::audio_Video; - else if (act == showCatGameDataAct) cat = category::game_Data; - else if (act == showCatUnknownAct) cat = category::unknown; - - gameListFrame->ToggleCategoryFilter(cat, checked); - guiSettings->SetCategoryVisibility(cat, checked); + connect(showCatHDDGameAct, &QAction::triggered, [=](bool checked){ + gameListFrame->ToggleCategoryFilter(category::hdd_Game, checked); + guiSettings->SetCategoryVisibility(category::hdd_Game, checked); + }); + connect(showCatDiscGameAct, &QAction::triggered, [=](bool checked){ + gameListFrame->ToggleCategoryFilter(category::disc_Game, checked); + guiSettings->SetCategoryVisibility(category::disc_Game, checked); + }); + connect(showCatHomeAct, &QAction::triggered, [=](bool checked){ + gameListFrame->ToggleCategoryFilter(category::home, checked); + guiSettings->SetCategoryVisibility(category::home, checked); + }); + connect(showCatAudioVideoAct, &QAction::triggered, [=](bool checked){ + gameListFrame->ToggleCategoryFilter(category::audio_Video, checked); + guiSettings->SetCategoryVisibility(category::audio_Video, checked); + }); + connect(showCatGameDataAct, &QAction::triggered, [=](bool checked){ + gameListFrame->ToggleCategoryFilter(category::game_Data, checked); + guiSettings->SetCategoryVisibility(category::game_Data, checked); + }); + connect(showCatUnknownAct, &QAction::triggered, [=](bool checked) { + gameListFrame->ToggleCategoryFilter(category::unknown, checked); + guiSettings->SetCategoryVisibility(category::unknown, checked); }); connect(aboutAct, &QAction::triggered, this, &main_window::About); connect(aboutQtAct, &QAction::triggered, qApp, &QApplication::aboutQt); @@ -1228,33 +1207,10 @@ void main_window::CreateConnects() if (act == setIconSizeLargeAct) key = GUI::gl_icon_key_large; else if (act == setIconSizeMediumAct) key = GUI::gl_icon_key_medium; - else if (act == setIconSizeSmallAct) key = GUI::gl_icon_key_small; - else key = GUI::gl_icon_key_tiny; + else key = GUI::gl_icon_key_small; guiSettings->SetValue(GUI::gl_iconSize, key); - - for (int i = 0; i < GUI::gl_icon_size.count(); i++) - { - if (GUI::gl_icon_size.at(i).first == key) - { - gameListFrame->ResizeIcons(GUI::gl_icon_size.at(i).second, i); - break; - } - } - }); - connect (gameListFrame, &game_list_frame::RequestIconSizeActSet, [=](const int& idx) - { - iconSizeActGroup->actions().at(idx)->trigger(); - }); - connect(gameListFrame, &game_list_frame::RequestListModeActSet, [=](const int& idx) - { - listModeActGroup->actions().at(idx)->trigger(); - }); - connect(listModeActGroup, &QActionGroup::triggered, [=](QAction* act) - { - bool isList = act == setlistModeListAct; - gameListFrame->SetListMode(isList); - columnVisibleActGroup->setEnabled(isList); + gameListFrame->ResizeIcons(GUI::gl_icon_size.at(key)); }); } @@ -1305,17 +1261,20 @@ void main_window::CreateMenus() viewMenu->addAction(showControlsAct); viewMenu->addSeparator(); viewMenu->addAction(showGameListAct); - viewMenu->addAction(showGameListToolBarAct); viewMenu->addAction(refreshGameListAct); QMenu *categoryMenu = viewMenu->addMenu(tr("Show Categories")); - categoryMenu->addActions(columnVisibleActGroup->actions()); + categoryMenu->addAction(showCatHDDGameAct); + categoryMenu->addAction(showCatDiscGameAct); + categoryMenu->addAction(showCatHomeAct); + categoryMenu->addAction(showCatAudioVideoAct); + categoryMenu->addAction(showCatGameDataAct); + categoryMenu->addAction(showCatUnknownAct); QMenu *iconSizeMenu = viewMenu->addMenu(tr("Icon Size")); - iconSizeMenu->addActions(iconSizeActGroup->actions()); - - QMenu *listModeMenu = viewMenu->addMenu(tr("Game List Mode")); - listModeMenu->addActions(listModeActGroup->actions()); + iconSizeMenu->addAction(setIconSizeSmallAct); + iconSizeMenu->addAction(setIconSizeMediumAct); + iconSizeMenu->addAction(setIconSizeLargeAct); QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAct); @@ -1426,7 +1385,6 @@ void main_window::ConfigureGuiFromSettings(bool configureAll) showGameListAct->setChecked(guiSettings->GetValue(GUI::mw_gamelist).toBool()); showDebuggerAct->setChecked(guiSettings->GetValue(GUI::mw_debugger).toBool()); showControlsAct->setChecked(guiSettings->GetValue(GUI::mw_controls).toBool()); - showGameListToolBarAct->setChecked(guiSettings->GetValue(GUI::gl_toolBarVisible).toBool()); guiSettings->GetValue(GUI::mw_controls).toBool() ? controls->show() : controls->hide(); showCatHDDGameAct->setChecked(guiSettings->GetCategoryVisibility(category::hdd_Game)); @@ -1439,15 +1397,7 @@ void main_window::ConfigureGuiFromSettings(bool configureAll) QString key = guiSettings->GetValue(GUI::gl_iconSize).toString(); if (key == GUI::gl_icon_key_large) setIconSizeLargeAct->setChecked(true); else if (key == GUI::gl_icon_key_medium) setIconSizeMediumAct->setChecked(true); - else if (key == GUI::gl_icon_key_small) setIconSizeSmallAct->setChecked(true); - else setIconSizeTinyAct->setChecked(true); - - - bool isListMode = guiSettings->GetValue(GUI::gl_listMode).toBool(); - if (isListMode) setlistModeListAct->setChecked(true); - else setlistModeGridAct->setChecked(true); - columnVisibleActGroup->setEnabled(isListMode); - + else setIconSizeSmallAct->setChecked(true); if (configureAll) { diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index abe87457a5..0ae1989fab 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -98,8 +98,6 @@ private: QList m_recentGameActs; QActionGroup* iconSizeActGroup; - QActionGroup* listModeActGroup; - QActionGroup* columnVisibleActGroup; QAction *bootElfAct; QAction *bootGameAct; @@ -127,19 +125,15 @@ private: QAction *showGameListAct; QAction *showControlsAct; QAction *refreshGameListAct; - QAction *showGameListToolBarAct; QAction* showCatHDDGameAct; QAction* showCatDiscGameAct; QAction* showCatHomeAct; QAction* showCatAudioVideoAct; QAction* showCatGameDataAct; QAction* showCatUnknownAct; - QAction* setIconSizeTinyAct; QAction* setIconSizeSmallAct; QAction* setIconSizeMediumAct; QAction* setIconSizeLargeAct; - QAction* setlistModeListAct; - QAction* setlistModeGridAct; QAction *aboutAct; QAction *aboutQtAct;