Skip to content

Commit

Permalink
Merge pull request #6675 from spycrab/qt_recursive
Browse files Browse the repository at this point in the history
Qt: Add "Search subdirectories" checkbox
  • Loading branch information
Tilka committed Apr 21, 2018
2 parents dabfecf + a452677 commit 7dc16ef
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 9 deletions.
2 changes: 2 additions & 0 deletions Source/Core/DolphinQt2/GameList/GameListModel.cpp
Expand Up @@ -22,6 +22,8 @@ GameListModel::GameListModel(QObject* parent) : QAbstractTableModel(parent)
[this](const QString& path) { RemoveGame(path.toStdString()); });
connect(&Settings::Instance(), &Settings::PathAdded, &m_tracker, &GameTracker::AddDirectory);
connect(&Settings::Instance(), &Settings::PathRemoved, &m_tracker, &GameTracker::RemoveDirectory);
connect(&Settings::Instance(), &Settings::PathReloadRequested, &m_tracker,
&GameTracker::ReloadDirectory);

for (const QString& dir : Settings::Instance().GetPaths())
m_tracker.AddDirectory(dir);
Expand Down
33 changes: 24 additions & 9 deletions Source/Core/DolphinQt2/GameList/GameTracker.cpp
Expand Up @@ -6,6 +6,7 @@
#include <QDirIterator>
#include <QFile>

#include "Core/ConfigManager.h"
#include "DiscIO/DirectoryBlob.h"
#include "DolphinQt2/GameList/GameTracker.h"
#include "DolphinQt2/QtUtils/QueueOnObject.h"
Expand Down Expand Up @@ -58,6 +59,12 @@ void GameTracker::RemoveDirectory(const QString& dir)
m_load_thread.EmplaceItem(Command{CommandType::RemoveDirectory, dir});
}

void GameTracker::ReloadDirectory(const QString& dir)
{
m_load_thread.EmplaceItem(Command{CommandType::RemoveDirectory, dir});
m_load_thread.EmplaceItem(Command{CommandType::AddDirectory, dir});
}

void GameTracker::UpdateDirectory(const QString& dir)
{
m_load_thread.EmplaceItem(Command{CommandType::UpdateDirectory, dir});
Expand All @@ -76,13 +83,21 @@ void GameTracker::AddDirectoryInternal(const QString& dir)
UpdateDirectoryInternal(dir);
}

static std::unique_ptr<QDirIterator> GetIterator(const QString& dir)
{
return std::make_unique<QDirIterator>(dir, game_filters, QDir::NoFilter,
SConfig::GetInstance().m_RecursiveISOFolder ?
QDirIterator::Subdirectories :
QDirIterator::NoIteratorFlags);
}

void GameTracker::RemoveDirectoryInternal(const QString& dir)
{
removePath(dir);
QDirIterator it(dir, game_filters, QDir::NoFilter, QDirIterator::Subdirectories);
while (it.hasNext())
auto it = GetIterator(dir);
while (it->hasNext())
{
QString path = QFileInfo(it.next()).canonicalFilePath();
QString path = QFileInfo(it->next()).canonicalFilePath();
if (m_tracked_files.contains(path))
{
m_tracked_files[path].remove(dir);
Expand All @@ -98,10 +113,10 @@ void GameTracker::RemoveDirectoryInternal(const QString& dir)

void GameTracker::UpdateDirectoryInternal(const QString& dir)
{
QDirIterator it(dir, game_filters, QDir::NoFilter, QDirIterator::Subdirectories);
while (it.hasNext())
auto it = GetIterator(dir);
while (it->hasNext())
{
QString path = QFileInfo(it.next()).canonicalFilePath();
QString path = QFileInfo(it->next()).canonicalFilePath();

if (m_tracked_files.contains(path))
{
Expand Down Expand Up @@ -147,7 +162,7 @@ void GameTracker::UpdateFileInternal(const QString& file)

QSet<QString> GameTracker::FindMissingFiles(const QString& dir)
{
QDirIterator it(dir, game_filters, QDir::NoFilter, QDirIterator::Subdirectories);
auto it = GetIterator(dir);

QSet<QString> missing_files;

Expand All @@ -157,9 +172,9 @@ QSet<QString> GameTracker::FindMissingFiles(const QString& dir)
missing_files.insert(key);
}

while (it.hasNext())
while (it->hasNext())
{
QString path = QFileInfo(it.next()).canonicalFilePath();
QString path = QFileInfo(it->next()).canonicalFilePath();
if (m_tracked_files.contains(path))
missing_files.remove(path);
}
Expand Down
1 change: 1 addition & 0 deletions Source/Core/DolphinQt2/GameList/GameTracker.h
Expand Up @@ -28,6 +28,7 @@ class GameTracker final : public QFileSystemWatcher

void AddDirectory(const QString& dir);
void RemoveDirectory(const QString& dir);
void ReloadDirectory(const QString& dir);

signals:
void GameLoaded(std::shared_ptr<const UICommon::GameFile> game);
Expand Down
5 changes: 5 additions & 0 deletions Source/Core/DolphinQt2/Settings.cpp
Expand Up @@ -80,6 +80,11 @@ void Settings::RemovePath(const QString& qpath)
emit PathRemoved(qpath);
}

void Settings::ReloadPath(const QString& qpath)
{
emit PathReloadRequested(qpath);
}

QString Settings::GetDefaultGame() const
{
return QString::fromStdString(SConfig::GetInstance().m_strDefaultISO);
Expand Down
2 changes: 2 additions & 0 deletions Source/Core/DolphinQt2/Settings.h
Expand Up @@ -65,6 +65,7 @@ class Settings final : public QObject
void SetPreferredView(bool list);
QString GetDefaultGame() const;
void SetDefaultGame(QString path);
void ReloadPath(const QString& qpath);

// Emulation
int GetStateSlot() const;
Expand Down Expand Up @@ -123,6 +124,7 @@ class Settings final : public QObject
void PathAdded(const QString&);
void PathRemoved(const QString&);
void DefaultGameChanged(const QString&);
void PathReloadRequested(const QString&);
void HideCursorChanged();
void VolumeChanged(int volume);
void NANDRefresh();
Expand Down
12 changes: 12 additions & 0 deletions Source/Core/DolphinQt2/Settings/PathPane.cpp
Expand Up @@ -2,6 +2,7 @@
// Licensed under GPLv2+
// Refer to the license.txt file included.

#include <QCheckBox>
#include <QFileDialog>
#include <QGroupBox>
#include <QLabel>
Expand Down Expand Up @@ -81,9 +82,20 @@ QGroupBox* PathPane::MakeGameFolderBox()
hlayout->addStretch();
QPushButton* add = new QPushButton(tr("Add"));
QPushButton* remove = new QPushButton(tr("Remove"));

auto* checkbox = new QCheckBox(tr("Search Subfolders"));
checkbox->setChecked(SConfig::GetInstance().m_RecursiveISOFolder);

hlayout->addWidget(add);
hlayout->addWidget(remove);
vlayout->addLayout(hlayout);
vlayout->addWidget(checkbox);

connect(checkbox, &QCheckBox::toggled, this, [this](bool checked) {
SConfig::GetInstance().m_RecursiveISOFolder = checked;
for (const auto& path : Settings::Instance().GetPaths())
Settings::Instance().ReloadPath(path);
});

connect(add, &QPushButton::clicked, this, &PathPane::Browse);
connect(remove, &QPushButton::clicked, this, &PathPane::RemovePath);
Expand Down

0 comments on commit 7dc16ef

Please sign in to comment.