From 4dbc546e7bf10c76bd992b3828ada1c087e2ad09 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 28 Jul 2017 22:03:48 +0200 Subject: [PATCH] GUI: add custom config indicator (#3108) * game_list: add custom config indicator * icon resize: get rid of duplicate call (great performance boost) * icon resize: only save on slider release or clicks (performance) refactoring shenanigans * game_list: skip filtered out games in Refresh (performance) * settings_dialog: remove unnecessary show() that caused glitches * gs_frame: add disableMouse setting * fix travis warnings --- rpcs3/Icons/cog_black.png | Bin 0 -> 10279 bytes rpcs3/Icons/cog_gray.png | Bin 0 -> 8251 bytes rpcs3/Json/tooltips.json | 3 +- rpcs3/resources.qrc | 2 + rpcs3/rpcs3_app.cpp | 10 ++- rpcs3/rpcs3qt/game_list_frame.cpp | 133 +++++++++++++++++----------- rpcs3/rpcs3qt/game_list_frame.h | 14 ++- rpcs3/rpcs3qt/gl_gs_frame.cpp | 4 +- rpcs3/rpcs3qt/gl_gs_frame.h | 2 +- rpcs3/rpcs3qt/gs_frame.cpp | 8 +- rpcs3/rpcs3qt/gs_frame.h | 5 +- rpcs3/rpcs3qt/gui_settings.h | 7 +- rpcs3/rpcs3qt/main_window.cpp | 27 ++++-- rpcs3/rpcs3qt/main_window.h | 5 +- rpcs3/rpcs3qt/pad_settings_dialog.h | 2 +- rpcs3/rpcs3qt/settings_dialog.cpp | 6 +- rpcs3/rpcs3qt/settings_dialog.ui | 9 +- 17 files changed, 154 insertions(+), 83 deletions(-) create mode 100644 rpcs3/Icons/cog_black.png create mode 100644 rpcs3/Icons/cog_gray.png diff --git a/rpcs3/Icons/cog_black.png b/rpcs3/Icons/cog_black.png new file mode 100644 index 0000000000000000000000000000000000000000..960f1adc138ecbf10d9787ff81b932b3b3dd605b GIT binary patch literal 10279 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 Jmup&w{vVWztF8b5 literal 0 HcmV?d00001 diff --git a/rpcs3/Json/tooltips.json b/rpcs3/Json/tooltips.json index 7c95072d11..3b8f388916 100644 --- a/rpcs3/Json/tooltips.json +++ b/rpcs3/Json/tooltips.json @@ -54,7 +54,8 @@ "alwaysStart": "Leave this enabled unless you are a developer.", "startGameFullscreen": "Automatically puts the game window in fullscreen.\nDouble click on the game window or press alt+enter to toggle fullscreen and windowed mode.", "showFPSInTitle": "It can be useful to disable it with buggy screen recording software that fail to select a window with ever changing title.", - "gs_resizeOnBoot": "Automatically resizes the game window on boot.\nThis does not change the internal game resolution." + "gs_resizeOnBoot": "Automatically resizes the game window on boot.\nThis does not change the internal game resolution.", + "gs_disableMouse": "Disables the activation of fullscreen mode per doubleclick while the game screen is active.\nCheck this if you want to play with mouse and keyboard (for example with UCR)." } }, "gpu": { diff --git a/rpcs3/resources.qrc b/rpcs3/resources.qrc index 11d8bf7e6e..553ef477a3 100644 --- a/rpcs3/resources.qrc +++ b/rpcs3/resources.qrc @@ -43,5 +43,7 @@ Icons/play_blue.png Icons/restart_blue.png Icons/stop_blue.png + Icons/cog_black.png + Icons/cog_gray.png diff --git a/rpcs3/rpcs3_app.cpp b/rpcs3/rpcs3_app.cpp index 7defcb07e3..1cc122d580 100644 --- a/rpcs3/rpcs3_app.cpp +++ b/rpcs3/rpcs3_app.cpp @@ -162,13 +162,15 @@ void rpcs3_app::InitializeCallbacks() h = guiSettings->GetValue(GUI::gs_height).toInt(); } + bool disableMouse = guiSettings->GetValue(GUI::gs_disableMouse).toBool(); + switch (video_renderer type = g_cfg.video.renderer) { - case video_renderer::null: return std::make_unique("Null", w, h, RPCS3MainWin->GetAppIcon()); - case video_renderer::opengl: return std::make_unique(w, h, RPCS3MainWin->GetAppIcon()); - case video_renderer::vulkan: return std::make_unique("Vulkan", w, h, RPCS3MainWin->GetAppIcon()); + case video_renderer::null: return std::make_unique("Null", w, h, RPCS3MainWin->GetAppIcon(), disableMouse); + case video_renderer::opengl: return std::make_unique(w, h, RPCS3MainWin->GetAppIcon(), disableMouse); + case video_renderer::vulkan: return std::make_unique("Vulkan", w, h, RPCS3MainWin->GetAppIcon(), disableMouse); #ifdef _MSC_VER - case video_renderer::dx12: return std::make_unique("DirectX 12", w, h, RPCS3MainWin->GetAppIcon()); + case video_renderer::dx12: return std::make_unique("DirectX 12", w, h, RPCS3MainWin->GetAppIcon(), disableMouse); #endif default: fmt::throw_exception("Invalid video renderer: %s" HERE, type); } diff --git a/rpcs3/rpcs3qt/game_list_frame.cpp b/rpcs3/rpcs3qt/game_list_frame.cpp index 5676c19175..d877d03101 100644 --- a/rpcs3/rpcs3qt/game_list_frame.cpp +++ b/rpcs3/rpcs3qt/game_list_frame.cpp @@ -213,6 +213,13 @@ game_list_frame::game_list_frame(std::shared_ptr settings, const R connect(m_xgrid, &QTableWidget::customContextMenuRequested, this, &game_list_frame::ShowContextMenu); connect(m_Slider_Size, &QSlider::valueChanged, this, &game_list_frame::RequestIconSizeActSet); + connect(m_Slider_Size, &QSlider::sliderReleased, this, [&]{ xgui_settings->SetValue(GUI::gl_iconSize, m_Slider_Size->value()); }); + connect(m_Slider_Size, &QSlider::actionTriggered, [&](int action){ + if (action != QAbstractSlider::SliderNoAction && action != QAbstractSlider::SliderMove) + { // we only want to save on mouseclicks or slider release (the other connect handles this) + Q_EMIT RequestSaveSliderPos(true); // actionTriggered happens before the value was changed + } + }); connect(m_modeActs, &QActionGroup::triggered, [=](QAction* act) { Q_EMIT RequestListModeActSet(act == m_modeActList.action); @@ -317,10 +324,10 @@ void game_list_frame::OnColClicked(int col) // Filter for Categories void game_list_frame::FilterData() { - for (int i = 0; i < gameList->rowCount(); ++i) + for (auto& game : m_game_data) { bool match = false; - const QString category = qstr(m_game_data[i].info.category); + const QString category = qstr(game.info.category); for (const auto& filter : m_categoryFilters) { if (category.contains(filter)) @@ -329,7 +336,7 @@ void game_list_frame::FilterData() break; } } - gameList->setRowHidden(i, !match || !SearchMatchesApp(m_game_data[i].info.name, m_game_data[i].info.serial)); + game.isVisible = match && SearchMatchesApp(game.info.name, game.info.serial); } } @@ -432,27 +439,17 @@ void game_list_frame::Refresh(bool fromDrive) // Load Image QImage img; - QPixmap pxmap; - if (!game.icon_path.empty() && img.load(qstr(game.icon_path))) + if (game.icon_path.empty() || !img.load(qstr(game.icon_path))) { - QImage scaled = QImage(m_Icon_Size, QImage::Format_ARGB32); - scaled.fill(m_Icon_Color); - QPainter painter(&scaled); - painter.drawImage(QPoint(0,0), img.scaled(m_Icon_Size, Qt::KeepAspectRatio, Qt::TransformationMode::SmoothTransformation)); - painter.end(); - pxmap = QPixmap::fromImage(scaled); - } - else - { - img = QImage(m_Icon_Size, QImage::Format_ARGB32); - QString abspath = QDir(qstr(game.icon_path)).absolutePath(); - LOG_ERROR(GENERAL, "Could not load image from path %s", sstr(abspath)); - img.fill(QColor(0, 0, 0, 0)); - pxmap = QPixmap::fromImage(img); + LOG_ERROR(GENERAL, "Could not load image from path %s", sstr(QDir(qstr(game.icon_path)).absolutePath())); } - m_game_data.push_back({ game, img, pxmap, bootable }); + bool hasCustomConfig = fs::is_file(fs::get_config_dir() + "data/" + game.serial + "/config.yml"); + + QPixmap pxmap = PaintedPixmap(img, hasCustomConfig); + + m_game_data.push_back({ game, img, pxmap, true, bootable, hasCustomConfig }); } auto op = [](const GUI_GameInfo& game1, const GUI_GameInfo& game2) { @@ -467,8 +464,8 @@ void game_list_frame::Refresh(bool fromDrive) if (m_isListLayout) { - int row = PopulateGameList(); FilterData(); + int row = PopulateGameList(); gameList->selectRow(row); SortGameList(); gameList->scrollTo(gameList->currentIndex(), QAbstractItemView::PositionAtCenter); @@ -628,6 +625,7 @@ void game_list_frame::ShowSpecifiedContextMenu(const QPoint &pos, int row) connect(boot, &QAction::triggered, [=]() {Boot(row); }); connect(configure, &QAction::triggered, [=]() { settings_dialog (xgui_settings, m_Render_Creator, 0, this, &currGame).exec(); + Refresh(true); }); connect(removeGame, &QAction::triggered, [=]() { @@ -638,7 +636,7 @@ void game_list_frame::ShowSpecifiedContextMenu(const QPoint &pos, int row) Refresh(); } }); - connect(removeConfig, &QAction::triggered, [=]() {RemoveCustomConfiguration(row); }); + connect(removeConfig, &QAction::triggered, [=]() {RemoveCustomConfiguration(row); Refresh(true); }); connect(openGameFolder, &QAction::triggered, [=]() {open_dir(currGame.path); }); connect(openConfig, &QAction::triggered, [=]() {open_dir(fs::get_config_dir() + "data/" + currGame.serial); }); connect(checkCompat, &QAction::triggered, [=]() { @@ -667,10 +665,7 @@ void game_list_frame::ShowSpecifiedContextMenu(const QPoint &pos, int row) } // Disable removeconfig if no config exists. - if (fs::is_file(fs::get_config_dir() + "data/" + currGame.serial + "/config.yml") == false) - { - removeConfig->setEnabled(false); - } + removeConfig->setEnabled(m_game_data[row].hasCustomConfig); myMenu.exec(globalPos); } @@ -720,6 +715,30 @@ void game_list_frame::RemoveCustomConfiguration(int row) } } +QPixmap game_list_frame::PaintedPixmap(const QImage& img, bool paintConfigIcon) +{ + QImage scaled = QImage(m_Icon_Size, QImage::Format_ARGB32); + scaled.fill(m_Icon_Color); + + QPainter painter(&scaled); + + if (!img.isNull()) + { + painter.drawImage(QPoint(0, 0), img.scaled(m_Icon_Size, Qt::KeepAspectRatio, Qt::TransformationMode::SmoothTransformation)); + } + + if (paintConfigIcon && !m_isListLayout) + { + int width = m_Icon_Size.width() * 0.2; + QPoint origin = QPoint(m_Icon_Size.width() - width, 0); + painter.drawImage(origin, QImage(":/Icons/cog_gray.png").scaled(QSize(width, width), Qt::KeepAspectRatio, Qt::TransformationMode::SmoothTransformation)); + } + + painter.end(); + + return QPixmap::fromImage(scaled); +} + void game_list_frame::ResizeIcons(const int& sliderPos) { m_icon_size_index = sliderPos; @@ -730,21 +749,19 @@ void game_list_frame::ResizeIcons(const int& sliderPos) m_Slider_Size->setSliderPosition(sliderPos); } - xgui_settings->SetValue(GUI::gl_iconSize, sliderPos); - - for (size_t i = 0; i < m_game_data.size(); i++) + for (auto& game : m_game_data) { - QImage scaled = QImage(m_Icon_Size, QImage::Format_ARGB32); - scaled.fill(m_Icon_Color); - QPainter painter(&scaled); - painter.drawImage(QPoint(0, 0), m_game_data[i].icon.scaled(m_Icon_Size, Qt::KeepAspectRatio, Qt::TransformationMode::SmoothTransformation)); - painter.end(); - m_game_data[i].pxmap = QPixmap::fromImage(scaled); + game.pxmap = PaintedPixmap(game.icon, game.hasCustomConfig); } Refresh(); } +int game_list_frame::GetSliderValue() +{ + return m_Slider_Size->value(); +} + void game_list_frame::SetListMode(const bool& isList) { m_oldLayoutIsList = m_isListLayout; @@ -756,7 +773,7 @@ void game_list_frame::SetListMode(const bool& isList) m_modeActList.action->setIcon(m_isListLayout ? m_modeActList.colored : m_modeActList.gray); m_modeActGrid.action->setIcon(m_isListLayout ? m_modeActGrid.gray : m_modeActGrid.colored); - Refresh(); + Refresh(true); m_Central_Widget->setCurrentWidget(m_isListLayout ? gameList : m_xgrid); } @@ -836,8 +853,7 @@ int game_list_frame::PopulateGameList() std::string selected_item = CurrentSelectionIconPath(); gameList->clearContents(); - - gameList->setRowCount(m_game_data.size()); + gameList->setRowCount((int)m_game_data.size()); auto l_GetItem = [](const std::string& text) { @@ -848,30 +864,43 @@ int game_list_frame::PopulateGameList() }; int row = 0; - for (const GUI_GameInfo& game : m_game_data) + for (size_t i = 0; i < m_game_data.size(); i++) { + if (!m_game_data[i].isVisible) + { + continue; + } + // Icon QTableWidgetItem* iconItem = new QTableWidgetItem; iconItem->setFlags(iconItem->flags() & ~Qt::ItemIsEditable); - iconItem->setData(Qt::DecorationRole, game.pxmap); - iconItem->setData(Qt::UserRole, row); + iconItem->setData(Qt::DecorationRole, m_game_data[i].pxmap); + iconItem->setData(Qt::UserRole, (int)i); + + QTableWidgetItem* titleItem = l_GetItem(m_game_data[i].info.name); + if (m_game_data[i].hasCustomConfig) + { + titleItem->setIcon(QIcon(":/Icons/cog_black.png")); + } + gameList->setItem(row, 0, iconItem); + gameList->setItem(row, 1, titleItem); + gameList->setItem(row, 2, l_GetItem(m_game_data[i].info.serial)); + gameList->setItem(row, 3, l_GetItem(m_game_data[i].info.fw)); + gameList->setItem(row, 4, l_GetItem(m_game_data[i].info.app_ver)); + gameList->setItem(row, 5, l_GetItem(m_game_data[i].info.category)); + gameList->setItem(row, 6, l_GetItem(m_game_data[i].info.path)); + gameList->setItem(row, 7, l_GetItem(GetStringFromU32(m_game_data[i].info.resolution, resolution::mode, true))); + gameList->setItem(row, 8, l_GetItem(GetStringFromU32(m_game_data[i].info.sound_format, sound::format, true))); + gameList->setItem(row, 9, l_GetItem(GetStringFromU32(m_game_data[i].info.parental_lvl, parental::level))); - 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.path)); - gameList->setItem(row, 7, l_GetItem(GetStringFromU32(game.info.resolution, resolution::mode, true))); - gameList->setItem(row, 8, l_GetItem(GetStringFromU32(game.info.sound_format, sound::format, true))); - gameList->setItem(row, 9, l_GetItem(GetStringFromU32(game.info.parental_lvl, parental::level))); - - if (selected_item == game.info.icon_path) result = row; + if (selected_item == m_game_data[i].info.icon_path) result = row; row++; } + gameList->setRowCount(row); + return result; } diff --git a/rpcs3/rpcs3qt/game_list_frame.h b/rpcs3/rpcs3qt/game_list_frame.h index bb5d40277d..f4e2167f20 100644 --- a/rpcs3/rpcs3qt/game_list_frame.h +++ b/rpcs3/rpcs3qt/game_list_frame.h @@ -149,15 +149,17 @@ namespace sound } /* Having the icons associated with the game info simplifies logic internally */ -typedef struct GUI_GameInfo +struct GUI_GameInfo { GameInfo info; QImage icon; QPixmap pxmap; + bool isVisible; bool bootable; + bool hasCustomConfig; }; -typedef struct Tool_Bar_Button +struct Tool_Bar_Button { QAction* action; QIcon colored; @@ -190,6 +192,8 @@ public: /** Resize Gamelist Icons to size given by slider position */ void ResizeIcons(const int& sliderPos); + int GetSliderValue(); + public Q_SLOTS: void SetListMode(const bool& isList); void SetToolBarVisible(const bool& showToolBar); @@ -211,11 +215,13 @@ Q_SIGNALS: void RequestIconSizeActSet(const int& idx); void RequestListModeActSet(const bool& isList); void RequestCategoryActSet(const int& id); + void RequestSaveSliderPos(const bool& save); protected: /** Override inherited method from Qt to allow signalling when close happened.*/ - void closeEvent(QCloseEvent* event); - void resizeEvent(QResizeEvent *event); + void closeEvent(QCloseEvent* event) override; + void resizeEvent(QResizeEvent *event) override; private: + QPixmap PaintedPixmap(const QImage& img, bool paintConfigIcon = false); void PopulateGameGrid(uint maxCols, const QSize& image_size, const QColor& image_color); void FilterData(); void SortGameList(); diff --git a/rpcs3/rpcs3qt/gl_gs_frame.cpp b/rpcs3/rpcs3qt/gl_gs_frame.cpp index 2ecccf23bc..db4302e627 100644 --- a/rpcs3/rpcs3qt/gl_gs_frame.cpp +++ b/rpcs3/rpcs3qt/gl_gs_frame.cpp @@ -5,8 +5,8 @@ #include #include -gl_gs_frame::gl_gs_frame(int w, int h, QIcon appIcon) - : gs_frame("OpenGL", w, h, appIcon) +gl_gs_frame::gl_gs_frame(int w, int h, QIcon appIcon, bool disableMouse) + : gs_frame("OpenGL", w, h, appIcon, disableMouse) { setSurfaceType(QSurface::OpenGLSurface); diff --git a/rpcs3/rpcs3qt/gl_gs_frame.h b/rpcs3/rpcs3qt/gl_gs_frame.h index 123c0d59a9..239225d04e 100644 --- a/rpcs3/rpcs3qt/gl_gs_frame.h +++ b/rpcs3/rpcs3qt/gl_gs_frame.h @@ -9,7 +9,7 @@ private: QSurfaceFormat m_format; public: - gl_gs_frame(int w, int h, QIcon appIcon); + gl_gs_frame(int w, int h, QIcon appIcon, bool disableMouse); void* make_context() override; void set_current(draw_context_t context) override; diff --git a/rpcs3/rpcs3qt/gs_frame.cpp b/rpcs3/rpcs3qt/gs_frame.cpp index 5b7f1078a3..af8ea6ca92 100644 --- a/rpcs3/rpcs3qt/gs_frame.cpp +++ b/rpcs3/rpcs3qt/gs_frame.cpp @@ -10,11 +10,9 @@ inline QString qstr(const std::string& _in) { return QString::fromUtf8(_in.data(), _in.size()); } -gs_frame::gs_frame(const QString& title, int w, int h, QIcon appIcon) - : QWindow() +gs_frame::gs_frame(const QString& title, int w, int h, QIcon appIcon, bool disableMouse) + : QWindow(), m_windowTitle(title), m_disable_mouse(disableMouse) { - m_windowTitle = title; - if (!Emu.GetTitle().empty()) { m_windowTitle += qstr(" | " + Emu.GetTitle()); @@ -201,6 +199,8 @@ void gs_frame::flip(draw_context_t, bool /*skip_frame*/) void gs_frame::mouseDoubleClickEvent(QMouseEvent* ev) { + if (m_disable_mouse) return; + if (ev->button() == Qt::LeftButton) { OnFullScreen(); diff --git a/rpcs3/rpcs3qt/gs_frame.h b/rpcs3/rpcs3qt/gs_frame.h index da83298794..cbe36b0c74 100644 --- a/rpcs3/rpcs3qt/gs_frame.h +++ b/rpcs3/rpcs3qt/gs_frame.h @@ -12,13 +12,14 @@ class gs_frame : public QWindow, public GSFrameBase u64 m_frames = 0; QString m_windowTitle; bool m_show_fps; + bool m_disable_mouse; public: - gs_frame(const QString& title, int w, int h, QIcon appIcon); + gs_frame(const QString& title, int w, int h, QIcon appIcon, bool disableMouse); protected: virtual void paintEvent(QPaintEvent *event); - void keyPressEvent(QKeyEvent *keyEvent); + void keyPressEvent(QKeyEvent *keyEvent) override; void OnFullScreen(); void close() override; diff --git a/rpcs3/rpcs3qt/gui_settings.h b/rpcs3/rpcs3qt/gui_settings.h index 5ff1ece1f6..d6376d8ef9 100644 --- a/rpcs3/rpcs3qt/gui_settings.h +++ b/rpcs3/rpcs3qt/gui_settings.h @@ -113,9 +113,10 @@ namespace GUI const GUI_SAVE m_saveNotes = GUI_SAVE(meta, "saveNotes", QVariantMap()); const GUI_SAVE m_showDebugTab = GUI_SAVE(meta, "showDebugTab", false); - const GUI_SAVE gs_resize = GUI_SAVE(gs_frame, "resize", false); - const GUI_SAVE gs_width = GUI_SAVE(gs_frame, "width", 1280); - const GUI_SAVE gs_height = GUI_SAVE(gs_frame, "height", 720); + const GUI_SAVE gs_disableMouse = GUI_SAVE(gs_frame, "disableMouse", false); + const GUI_SAVE gs_resize = GUI_SAVE(gs_frame, "resize", false); + const GUI_SAVE gs_width = GUI_SAVE(gs_frame, "width", 1280); + const GUI_SAVE gs_height = GUI_SAVE(gs_frame, "height", 720); } /** Class for GUI settings.. diff --git a/rpcs3/rpcs3qt/main_window.cpp b/rpcs3/rpcs3qt/main_window.cpp index e7c4817f3c..8078dc7bb3 100644 --- a/rpcs3/rpcs3qt/main_window.cpp +++ b/rpcs3/rpcs3qt/main_window.cpp @@ -812,7 +812,7 @@ void main_window::BootRecentAction(const QAction* act) } // path is invalid: remove action from list return - if (containsPath && nam.isEmpty() || !QFileInfo(pth).isDir() && !QFileInfo(pth).isFile()) + if ((containsPath && nam.isEmpty()) || (!QFileInfo(pth).isDir() && !QFileInfo(pth).isFile())) { if (containsPath) { @@ -867,7 +867,7 @@ void main_window::BootRecentAction(const QAction* act) QAction* main_window::CreateRecentAction(const q_string_pair& entry, const uint& sc_idx) { // if path is not valid remove from list - if (entry.second.isEmpty() || !QFileInfo(entry.first).isDir() && !QFileInfo(entry.first).isFile()) + if (entry.second.isEmpty() || (!QFileInfo(entry.first).isDir() && !QFileInfo(entry.first).isFile())) { if (m_rg_entries.contains(entry)) { @@ -1147,11 +1147,20 @@ void main_window::CreateConnects() }); connect(ui->aboutQtAct, &QAction::triggered, qApp, &QApplication::aboutQt); auto resizeIcons = [=](const int& index){ - if (ui->sizeSlider->value() != index) + int val = ui->sizeSlider->value(); + if (val != index) { ui->sizeSlider->setSliderPosition(index); } - gameListFrame->ResizeIcons(index); + if (val != gameListFrame->GetSliderValue()) + { + if (m_save_slider_pos) + { + m_save_slider_pos = false; + guiSettings->SetValue(GUI::gl_iconSize, index); + } + gameListFrame->ResizeIcons(index); + } }; connect(iconSizeActGroup, &QActionGroup::triggered, [=](QAction* act) { @@ -1175,6 +1184,7 @@ void main_window::CreateConnects() resizeIcons(idx); }); + connect(gameListFrame, &game_list_frame::RequestSaveSliderPos, [=](const bool& save){ m_save_slider_pos = true; }); connect(gameListFrame, &game_list_frame::RequestListModeActSet, [=](const bool& isList) { isList ? ui->setlistModeListAct->trigger() : ui->setlistModeGridAct->trigger(); @@ -1212,6 +1222,13 @@ void main_window::CreateConnects() connect(ui->toolbar_grid, &QAction::triggered, [=]() { ui->setlistModeGridAct->trigger(); }); //connect(ui->toolbar_sort, &QAction::triggered, gameListFrame, sort); connect(ui->sizeSlider, &QSlider::valueChanged, resizeIcons); + connect(ui->sizeSlider, &QSlider::sliderReleased, this, [&] { guiSettings->SetValue(GUI::gl_iconSize, ui->sizeSlider->value()); }); + connect(ui->sizeSlider, &QSlider::actionTriggered, [&](int action) { + if (action != QAbstractSlider::SliderNoAction && action != QAbstractSlider::SliderMove) + { // we only want to save on mouseclicks or slider release (the other connect handles this) + m_save_slider_pos = true; // actionTriggered happens before the value was changed + } + }); connect(ui->searchBar, &QLineEdit::textChanged, gameListFrame, &game_list_frame::SetSearchText); } @@ -1359,7 +1376,7 @@ void main_window::ConfigureGuiFromSettings(bool configureAll) void main_window::keyPressEvent(QKeyEvent *keyEvent) { - if ((keyEvent->modifiers() & Qt::AltModifier) && keyEvent->key() == Qt::Key_Return || isFullScreen() && keyEvent->key() == Qt::Key_Escape) + if (((keyEvent->modifiers() & Qt::AltModifier) && keyEvent->key() == Qt::Key_Return) || (isFullScreen() && keyEvent->key() == Qt::Key_Escape)) { ui->toolbar_fullscreen->trigger(); } diff --git a/rpcs3/rpcs3qt/main_window.h b/rpcs3/rpcs3qt/main_window.h index f1e95c0a06..2e861e2912 100644 --- a/rpcs3/rpcs3qt/main_window.h +++ b/rpcs3/rpcs3qt/main_window.h @@ -29,6 +29,7 @@ class main_window : public QMainWindow Ui::main_window *ui; bool m_sys_menu_opened; + bool m_save_slider_pos = false; Render_Creator m_Render_Creator; @@ -92,8 +93,8 @@ private: void ConfigureGuiFromSettings(bool configureAll = false); void EnableMenus(bool enabled); - void keyPressEvent(QKeyEvent *keyEvent); - void mouseDoubleClickEvent(QMouseEvent *event); + void keyPressEvent(QKeyEvent *keyEvent) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; QAction* CreateRecentAction(const q_string_pair& entry, const uint& sc_idx); void BootRecentAction(const QAction* act); diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.h b/rpcs3/rpcs3qt/pad_settings_dialog.h index 337deb79e3..a8fcdc631e 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.h +++ b/rpcs3/rpcs3qt/pad_settings_dialog.h @@ -71,7 +71,7 @@ public: virtual void Init(const u32 max_connect) override; explicit pad_settings_dialog(QWidget *parent = 0); ~pad_settings_dialog(); - void keyPressEvent(QKeyEvent *keyEvent); + void keyPressEvent(QKeyEvent *keyEvent) override; void UpdateLabel(); void UpdateTimerLabel(const u32 id); void SwitchButtons(const bool IsEnabled); diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index e353de9070..bfb1415690 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -677,6 +677,8 @@ settings_dialog::settings_dialog(std::shared_ptr xSettings, const ui->gs_resizeOnBoot->setToolTip(json_emu_misc["gs_resizeOnBoot"].toString()); + ui->gs_disableMouse->setToolTip(json_emu_misc["gs_disableMouse"].toString()); + ui->cb_show_welcome->setToolTip(json_emu_gui["show_welcome"].toString()); xemu_settings->EnhanceCheckBox(ui->exitOnStop, emu_settings::ExitRPCS3OnFinish); @@ -779,6 +781,9 @@ settings_dialog::settings_dialog(std::shared_ptr xSettings, const addColoredIcon(ui->pb_gl_tool_icon_color, xgui_settings->GetValue(GUI::gl_toolIconColor).value(), QIcon(":/Icons/home_blue.png"), GUI::gl_tool_icon_color); addColoredIcon(ui->pb_tool_icon_color, xgui_settings->GetValue(GUI::mw_toolIconColor).value(), QIcon(":/Icons/stop.png"), GUI::mw_tool_icon_color); + ui->gs_disableMouse->setChecked(xgui_settings->GetValue(GUI::gs_disableMouse).toBool()); + connect(ui->gs_disableMouse, &QCheckBox::clicked, [=](bool val) { xgui_settings->SetValue(GUI::gs_disableMouse, val); }); + bool enableButtons = xgui_settings->GetValue(GUI::gs_resize).toBool(); ui->gs_resizeOnBoot->setChecked(enableButtons); ui->gs_width->setEnabled(enableButtons); @@ -960,7 +965,6 @@ void settings_dialog::OnApplyStylesheet() int settings_dialog::exec() { - show(); for (int i = 0; i < ui->tabWidget->count(); i++) { ui->tabWidget->setCurrentIndex(i); diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index 3418cf6fa6..367218bb90 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -36,7 +36,7 @@ - 1 + 0 @@ -1102,6 +1102,13 @@ Viewport + + + + Don't use doubleclick for Fullscreen mode + + +