diff --git a/Qt/QtMain.cpp b/Qt/QtMain.cpp index f7a0daf63a..73b6f540ad 100644 --- a/Qt/QtMain.cpp +++ b/Qt/QtMain.cpp @@ -31,6 +31,7 @@ #endif #include "QtMain.h" #include "gfx_es2/gpu_features.h" +#include "i18n/i18n.h" #include "math/math_util.h" #include "thread/threadutil.h" #include "util/text/utf8.h" @@ -42,6 +43,7 @@ MainUI *emugl = NULL; static int refreshRate = 60000; static int browseFileEvent = -1; +static int browseFolderEvent = -1; #ifdef SDL extern void mixaudio(void *userdata, Uint8 *stream, int len) { @@ -115,6 +117,8 @@ void System_SendMessage(const char *command, const char *parameter) { qApp->exit(0); } else if (!strcmp(command, "browse_file")) { QCoreApplication::postEvent(emugl, new QEvent((QEvent::Type)browseFileEvent)); + } else if (!strcmp(command, "browse_folder")) { + QCoreApplication::postEvent(emugl, new QEvent((QEvent::Type)browseFolderEvent)); } } @@ -199,6 +203,7 @@ static int mainInternal(QApplication &a) { #endif browseFileEvent = QEvent::registerEventType(); + browseFolderEvent = QEvent::registerEventType(); int retval = a.exec(); delete emugl; @@ -409,6 +414,12 @@ bool MainUI::event(QEvent *e) NativeMessageReceived("boot", fileName.toStdString().c_str()); } break; + } else if (e->type() == browseFolderEvent) { + I18NCategory *mm = GetI18NCategory("MainMenu"); + QString fileName = QFileDialog::getExistingDirectory(nullptr, mm->T("Choose folder"), g_Config.currentDirectory.c_str()); + if (QDir(fileName).exists()) { + NativeMessageReceived("browse_folderSelect", fileName.toStdString().c_str()); + } } else { return QWidget::event(e); } diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 7d90d6763f..1fe8038cb8 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -67,12 +67,6 @@ #include "android/android-ndk-profiler/prof.h" #endif -#ifdef USING_QT_UI -#include -#include -#include -#endif - #include bool MainScreen::showHomebrewTab = false; @@ -447,12 +441,18 @@ GameBrowser::GameBrowser(std::string path, bool allowBrowsing, bool *gridStyle, Refresh(); } -void GameBrowser::FocusGame(std::string gamePath) { +void GameBrowser::FocusGame(const std::string &gamePath) { focusGamePath_ = gamePath; Refresh(); focusGamePath_.clear(); } +void GameBrowser::SetPath(const std::string &path) { + path_.SetPath(path); + g_Config.currentDirectory = path_.GetPath(); + Refresh(); +} + UI::EventReturn GameBrowser::LayoutChange(UI::EventParams &e) { *gridStyle_ = e.a == 0 ? true : false; Refresh(); @@ -466,14 +466,9 @@ UI::EventReturn GameBrowser::LastClick(UI::EventParams &e) { UI::EventReturn GameBrowser::HomeClick(UI::EventParams &e) { #ifdef __ANDROID__ - path_.SetPath(g_Config.memStickDirectory); + SetPath(g_Config.memStickDirectory); #elif defined(USING_QT_UI) - I18NCategory *mm = GetI18NCategory("MainMenu"); - QString fileName = QFileDialog::getExistingDirectory(NULL, "Browse for Folder", g_Config.currentDirectory.c_str()); - if (QDir(fileName).exists()) - path_.SetPath(fileName.toStdString()); - else - return UI::EVENT_DONE; + System_SendMessage("browse_folder", ""); #elif defined(_WIN32) #if PPSSPP_PLATFORM(UWP) // TODO UWP @@ -482,14 +477,12 @@ UI::EventReturn GameBrowser::HomeClick(UI::EventParams &e) { std::string folder = W32Util::BrowseForFolder(MainWindow::GetHWND(), mm->T("Choose folder")); if (!folder.size()) return UI::EVENT_DONE; - path_.SetPath(folder); + SetPath(folder); #endif #else - path_.SetPath(getenv("HOME")); + SetPath(getenv("HOME")); #endif - g_Config.currentDirectory = path_.GetPath(); - Refresh(); return UI::EVENT_DONE; } @@ -742,7 +735,7 @@ UI::EventReturn GameBrowser::GameButtonHighlight(UI::EventParams &e) { } UI::EventReturn GameBrowser::NavigateClick(UI::EventParams &e) { - DirButton *button = static_cast(e.v); + DirButton *button = static_cast(e.v); std::string text = button->GetPath(); if (button->PathAbsolute()) { path_.SetPath(text); @@ -1004,8 +997,16 @@ void MainScreen::sendMessage(const char *message, const char *value) { // Always call the base class method first to handle the most common messages. UIScreenWithBackground::sendMessage(message, value); - if (!strcmp(message, "boot") && screenManager()->topScreen() == this) { - screenManager()->switchScreen(new EmuScreen(value)); + if (screenManager()->topScreen() == this) { + if (!strcmp(message, "boot")) { + screenManager()->switchScreen(new EmuScreen(value)); + } + if (!strcmp(message, "browse_folderSelect")) { + int tab = tabHolder_->GetCurrentTab(); + if (tab >= 0 && tab < (int)gameBrowsers_.size()) { + gameBrowsers_[tab]->SetPath(value); + } + } } if (!strcmp(message, "permission_granted") && !strcmp(value, "storage")) { RecreateViews(); diff --git a/UI/MainScreen.h b/UI/MainScreen.h index d4957e1d7a..93d21a2984 100644 --- a/UI/MainScreen.h +++ b/UI/MainScreen.h @@ -34,7 +34,8 @@ public: UI::Choice *HomebrewStoreButton() { return homebrewStoreButton_; } - void FocusGame(std::string gamePath); + void FocusGame(const std::string &gamePath); + void SetPath(const std::string &path); protected: virtual bool DisplayTopBar();