Merge pull request #7225 from spycrab/qt_gamelist

Qt/GameList: Multiple improvements
This commit is contained in:
spycrab 2018-07-06 22:31:03 +02:00 committed by GitHub
commit bfb7af4267
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 26 additions and 46 deletions

View File

@ -25,8 +25,8 @@ GameListModel::GameListModel(QObject* parent) : QAbstractTableModel(parent)
connect(&m_tracker, &GameTracker::GameRemoved, this, &GameListModel::RemoveGame); connect(&m_tracker, &GameTracker::GameRemoved, this, &GameListModel::RemoveGame);
connect(&Settings::Instance(), &Settings::PathAdded, &m_tracker, &GameTracker::AddDirectory); connect(&Settings::Instance(), &Settings::PathAdded, &m_tracker, &GameTracker::AddDirectory);
connect(&Settings::Instance(), &Settings::PathRemoved, &m_tracker, &GameTracker::RemoveDirectory); connect(&Settings::Instance(), &Settings::PathRemoved, &m_tracker, &GameTracker::RemoveDirectory);
connect(&Settings::Instance(), &Settings::PathReloadRequested, &m_tracker, connect(&Settings::Instance(), &Settings::GameListRefreshRequested, &m_tracker,
&GameTracker::ReloadDirectory); &GameTracker::RefreshAll);
connect(&Settings::Instance(), &Settings::TitleDBReloadRequested, this, connect(&Settings::Instance(), &Settings::TitleDBReloadRequested, this,
[this] { m_title_database = Core::TitleDatabase(); }); [this] { m_title_database = Core::TitleDatabase(); });

View File

@ -13,6 +13,8 @@
#include "DiscIO/DirectoryBlob.h" #include "DiscIO/DirectoryBlob.h"
#include "DolphinQt2/QtUtils/QueueOnObject.h" #include "DolphinQt2/QtUtils/QueueOnObject.h"
#include "DolphinQt2/QtUtils/RunOnObject.h"
#include "DolphinQt2/Settings.h" #include "DolphinQt2/Settings.h"
// NOTE: Qt likes to be case-sensitive here even though it shouldn't be thus this ugly regex hack // NOTE: Qt likes to be case-sensitive here even though it shouldn't be thus this ugly regex hack
@ -119,37 +121,10 @@ void GameTracker::StartInternal()
m_cache.Save(); m_cache.Save();
} }
// Works around a bug in QtCore that will cause crashes when QFileSystemWatcher::addPath
// is called on a directory that is located on a removable device
static bool IsOnRemovableMedia(const QString& dir)
{
#ifdef _WIN32
const QString absolute_dir = QFileInfo(dir).absolutePath();
if (absolute_dir.startsWith(QStringLiteral("//")))
return true;
const QString root_dir = QDir::toNativeSeparators(absolute_dir.left(3));
auto type = GetDriveType(root_dir.toStdWString().c_str());
switch (type)
{
case DRIVE_REMOVABLE:
case DRIVE_REMOTE:
case DRIVE_CDROM:
case DRIVE_UNKNOWN:
case DRIVE_NO_ROOT_DIR:
return true;
default:
return false;
}
#else
return false;
#endif
}
bool GameTracker::AddPath(const QString& dir) bool GameTracker::AddPath(const QString& dir)
{ {
if (Settings::Instance().IsAutoRefreshEnabled() && !IsOnRemovableMedia(dir)) if (Settings::Instance().IsAutoRefreshEnabled())
return addPath(dir); RunOnObject(this, [this, dir] { return addPath(dir); });
m_tracked_paths.push_back(dir); m_tracked_paths.push_back(dir);
@ -158,8 +133,8 @@ bool GameTracker::AddPath(const QString& dir)
bool GameTracker::RemovePath(const QString& dir) bool GameTracker::RemovePath(const QString& dir)
{ {
if (Settings::Instance().IsAutoRefreshEnabled() && !IsOnRemovableMedia(dir)) if (Settings::Instance().IsAutoRefreshEnabled())
return removePath(dir); RunOnObject(this, [this, dir] { return removePath(dir); });
const auto index = m_tracked_paths.indexOf(dir); const auto index = m_tracked_paths.indexOf(dir);
@ -181,10 +156,18 @@ void GameTracker::RemoveDirectory(const QString& dir)
m_load_thread.EmplaceItem(Command{CommandType::RemoveDirectory, dir}); m_load_thread.EmplaceItem(Command{CommandType::RemoveDirectory, dir});
} }
void GameTracker::ReloadDirectory(const QString& dir) void GameTracker::RefreshAll()
{ {
m_load_thread.EmplaceItem(Command{CommandType::RemoveDirectory, dir}); for (auto& file : m_tracked_files.keys())
m_load_thread.EmplaceItem(Command{CommandType::AddDirectory, dir}); emit GameRemoved(file.toStdString());
m_tracked_files.clear();
for (const QString& dir : Settings::Instance().GetPaths())
{
m_load_thread.EmplaceItem(Command{CommandType::RemoveDirectory, dir});
m_load_thread.EmplaceItem(Command{CommandType::AddDirectory, dir});
}
} }
void GameTracker::UpdateDirectory(const QString& dir) void GameTracker::UpdateDirectory(const QString& dir)

View File

@ -36,7 +36,7 @@ public:
void AddDirectory(const QString& dir); void AddDirectory(const QString& dir);
void RemoveDirectory(const QString& dir); void RemoveDirectory(const QString& dir);
void ReloadDirectory(const QString& dir); void RefreshAll();
signals: signals:
void GameLoaded(const std::shared_ptr<const UICommon::GameFile>& game); void GameLoaded(const std::shared_ptr<const UICommon::GameFile>& game);

View File

@ -533,9 +533,7 @@ void MainWindow::ConnectStack()
void MainWindow::RefreshGameList() void MainWindow::RefreshGameList()
{ {
Settings::Instance().ReloadTitleDB(); Settings::Instance().ReloadTitleDB();
Settings::Instance().RefreshGameList();
for (const auto& path : Settings::Instance().GetPaths())
Settings::Instance().ReloadPath(path);
} }
QString MainWindow::PromptFileName() QString MainWindow::PromptFileName()

View File

@ -123,9 +123,9 @@ void Settings::RemovePath(const QString& qpath)
emit PathRemoved(qpath); emit PathRemoved(qpath);
} }
void Settings::ReloadPath(const QString& qpath) void Settings::RefreshGameList()
{ {
emit PathReloadRequested(qpath); emit GameListRefreshRequested();
} }
void Settings::ReloadTitleDB() void Settings::ReloadTitleDB()

View File

@ -69,7 +69,7 @@ public:
void SetPreferredView(bool list); void SetPreferredView(bool list);
QString GetDefaultGame() const; QString GetDefaultGame() const;
void SetDefaultGame(QString path); void SetDefaultGame(QString path);
void ReloadPath(const QString& qpath); void RefreshGameList();
void ReloadTitleDB(); void ReloadTitleDB();
bool IsAutoRefreshEnabled() const; bool IsAutoRefreshEnabled() const;
void SetAutoRefreshEnabled(bool enabled); void SetAutoRefreshEnabled(bool enabled);
@ -137,7 +137,7 @@ signals:
void PathAdded(const QString&); void PathAdded(const QString&);
void PathRemoved(const QString&); void PathRemoved(const QString&);
void DefaultGameChanged(const QString&); void DefaultGameChanged(const QString&);
void PathReloadRequested(const QString&); void GameListRefreshRequested();
void TitleDBReloadRequested(); void TitleDBReloadRequested();
void AutoRefreshToggled(bool enabled); void AutoRefreshToggled(bool enabled);
void HideCursorChanged(); void HideCursorChanged();

View File

@ -137,8 +137,7 @@ QGroupBox* PathPane::MakeGameFolderBox()
connect(recursive_checkbox, &QCheckBox::toggled, this, [](bool checked) { connect(recursive_checkbox, &QCheckBox::toggled, this, [](bool checked) {
SConfig::GetInstance().m_RecursiveISOFolder = checked; SConfig::GetInstance().m_RecursiveISOFolder = checked;
for (const auto& path : Settings::Instance().GetPaths()) Settings::Instance().RefreshGameList();
Settings::Instance().ReloadPath(path);
}); });
connect(auto_checkbox, &QCheckBox::toggled, &Settings::Instance(), connect(auto_checkbox, &QCheckBox::toggled, &Settings::Instance(),