Skip to content

Commit

Permalink
Merge pull request #3388 from spxtr/DQt2
Browse files Browse the repository at this point in the history
DQt2: Implement Paths config dialog
  • Loading branch information
phire committed Jan 1, 2016
2 parents 5cd4619 + 5b2a764 commit d2e9688
Show file tree
Hide file tree
Showing 15 changed files with 376 additions and 47 deletions.
1 change: 1 addition & 0 deletions Source/Core/DolphinQt2/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ set(SRCS
Resources.cpp
Settings.cpp
ToolBar.cpp
Config/PathDialog.cpp
GameList/GameFile.cpp
GameList/GameList.cpp
GameList/GameListModel.cpp
Expand Down
185 changes: 185 additions & 0 deletions Source/Core/DolphinQt2/Config/PathDialog.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
// Copyright 2015 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#include <QAction>
#include <QDialogButtonBox>
#include <QDir>
#include <QFileDialog>
#include <QFont>
#include <QLabel>
#include <QLineEdit>
#include <QListWidget>
#include <QPushButton>
#include <QSize>
#include <QVBoxLayout>

#include "DolphinQt2/Settings.h"
#include "DolphinQt2/Config/PathDialog.h"

PathDialog::PathDialog(QWidget* parent)
: QDialog(parent)
{
setWindowTitle(tr("Paths"));
setAttribute(Qt::WA_DeleteOnClose);

QVBoxLayout* layout = new QVBoxLayout;
layout->addWidget(MakeGameFolderBox());
layout->addLayout(MakePathsLayout());

QDialogButtonBox* ok_box = new QDialogButtonBox(QDialogButtonBox::Ok);
connect(ok_box, &QDialogButtonBox::accepted, this, &PathDialog::accept);
layout->addWidget(ok_box);

setLayout(layout);
}

void PathDialog::Browse()
{
QString dir = QFileDialog::getExistingDirectory(this,
tr("Select a Directory"),
QDir::currentPath());
if (!dir.isEmpty())
{
Settings settings;
QStringList game_folders = settings.GetPaths();
if (!game_folders.contains(dir))
{
game_folders << dir;
settings.SetPaths(game_folders);
m_path_list->addItem(dir);
emit PathAdded(dir);
}
}
}

void PathDialog::BrowseDefaultGame()
{
QString file = QFileDialog::getOpenFileName(this,
tr("Select a Game"),
QDir::currentPath(),
tr("All GC/Wii files (*.elf *.dol *.gcm *.iso *.wbfs *.ciso *.gcz *.wad);;"
"All Files (*)"));
if (!file.isEmpty())
{
m_game_edit->setText(file);
Settings().SetDefaultGame(file);
}
}

void PathDialog::BrowseDVDRoot()
{
QString dir = QFileDialog::getExistingDirectory(this,
tr("Select DVD Root"),
QDir::currentPath());
if (!dir.isEmpty())
{
m_dvd_edit->setText(dir);
Settings().SetDVDRoot(dir);
}
}

void PathDialog::BrowseApploader()
{
QString file = QFileDialog::getOpenFileName(this,
tr("Select an Apploader"),
QDir::currentPath(),
tr("Apploaders (*.img)"));
if (!file.isEmpty())
{
m_app_edit->setText(file);
Settings().SetApploader(file);
}
}

void PathDialog::BrowseWiiNAND()
{
QString dir = QFileDialog::getExistingDirectory(this,
tr("Select Wii NAND Root"),
QDir::currentPath());
if (!dir.isEmpty())
{
m_nand_edit->setText(dir);
Settings().SetWiiNAND(dir);
}
}

QGroupBox* PathDialog::MakeGameFolderBox()
{
QGroupBox* game_box = new QGroupBox(tr("Game Folders"));
game_box->setMinimumSize(QSize(400, 250));
QVBoxLayout* vlayout = new QVBoxLayout;

m_path_list = new QListWidget;
m_path_list->insertItems(0, Settings().GetPaths());
m_path_list->setSpacing(1);
vlayout->addWidget(m_path_list);

QHBoxLayout* hlayout = new QHBoxLayout;

hlayout->addStretch();
QPushButton* add = new QPushButton(tr("Add"));
QPushButton* remove = new QPushButton(tr("Remove"));
hlayout->addWidget(add);
hlayout->addWidget(remove);
vlayout->addLayout(hlayout);

connect(add, &QPushButton::clicked, this, &PathDialog::Browse);
connect(remove, &QPushButton::clicked, this, &PathDialog::RemovePath);

game_box->setLayout(vlayout);
return game_box;
}

QGridLayout* PathDialog::MakePathsLayout()
{
QGridLayout* layout = new QGridLayout;
layout->setColumnStretch(1, 1);

m_game_edit = new QLineEdit(Settings().GetDefaultGame());
connect(m_game_edit, &QLineEdit::editingFinished,
[=]{ Settings().SetDefaultGame(m_game_edit->text()); });
QPushButton* game_open = new QPushButton;
connect(game_open, &QPushButton::clicked, this, &PathDialog::BrowseDefaultGame);
layout->addWidget(new QLabel(tr("Default Game")), 0, 0);
layout->addWidget(m_game_edit, 0, 1);
layout->addWidget(game_open, 0, 2);

m_dvd_edit = new QLineEdit(Settings().GetDVDRoot());
connect(m_dvd_edit, &QLineEdit::editingFinished,
[=]{ Settings().SetDVDRoot(m_dvd_edit->text()); });
QPushButton* dvd_open = new QPushButton;
connect(dvd_open, &QPushButton::clicked, this, &PathDialog::BrowseDVDRoot);
layout->addWidget(new QLabel(tr("DVD Root")), 1, 0);
layout->addWidget(m_dvd_edit, 1, 1);
layout->addWidget(dvd_open, 1, 2);

m_app_edit = new QLineEdit(Settings().GetApploader());
connect(m_app_edit, &QLineEdit::editingFinished,
[=]{ Settings().SetApploader(m_app_edit->text()); });
QPushButton* app_open = new QPushButton;
connect(app_open, &QPushButton::clicked, this, &PathDialog::BrowseApploader);
layout->addWidget(new QLabel(tr("Apploader")), 2, 0);
layout->addWidget(m_app_edit, 2, 1);
layout->addWidget(app_open, 2, 2);

m_nand_edit = new QLineEdit(Settings().GetWiiNAND());
connect(m_nand_edit, &QLineEdit::editingFinished,
[=]{ Settings().SetWiiNAND(m_nand_edit->text()); });
QPushButton* nand_open = new QPushButton;
connect(nand_open, &QPushButton::clicked, this, &PathDialog::BrowseWiiNAND);
layout->addWidget(new QLabel(tr("Wii NAND Root")), 3, 0);
layout->addWidget(m_nand_edit, 3, 1);
layout->addWidget(nand_open, 3, 2);

return layout;
}

void PathDialog::RemovePath()
{
int row = m_path_list->currentRow();
if (row < 0)
return;
emit PathRemoved(m_path_list->takeItem(row)->text());
Settings().RemovePath(row);
}
40 changes: 40 additions & 0 deletions Source/Core/DolphinQt2/Config/PathDialog.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright 2015 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#include <QDialog>
#include <QGridLayout>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QListWidget>

class PathDialog final : public QDialog
{
Q_OBJECT
public:
explicit PathDialog(QWidget* parent = nullptr);

public slots:
void Browse();
void BrowseDefaultGame();
void BrowseDVDRoot();
void BrowseApploader();
void BrowseWiiNAND();

signals:
void PathAdded(QString path);
void PathRemoved(QString path);

private:
QGroupBox* MakeGameFolderBox();
QGridLayout* MakePathsLayout();
void RemovePath();

QListWidget* m_path_list;
QLineEdit* m_game_edit;
QLineEdit* m_dvd_edit;
QLineEdit* m_app_edit;
QLineEdit* m_nand_edit;
};
1 change: 1 addition & 0 deletions Source/Core/DolphinQt2/GameList/GameList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ GameList::GameList(QWidget* parent): QStackedWidget(parent)
connect(m_table, &QTableView::doubleClicked, this, &GameList::GameSelected);
connect(m_list, &QListView::doubleClicked, this, &GameList::GameSelected);
connect(this, &GameList::DirectoryAdded, m_model, &GameListModel::DirectoryAdded);
connect(this, &GameList::DirectoryRemoved, m_model, &GameListModel::DirectoryRemoved);

addWidget(m_table);
addWidget(m_list);
Expand Down
1 change: 1 addition & 0 deletions Source/Core/DolphinQt2/GameList/GameList.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public slots:
signals:
void GameSelected();
void DirectoryAdded(QString dir);
void DirectoryRemoved(QString dir);

private:
void MakeTableView();
Expand Down
29 changes: 21 additions & 8 deletions Source/Core/DolphinQt2/GameList/GameListModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ GameListModel::GameListModel(QObject* parent)
connect(&m_tracker, &GameTracker::GameLoaded, this, &GameListModel::UpdateGame);
connect(&m_tracker, &GameTracker::GameRemoved, this, &GameListModel::RemoveGame);
connect(this, &GameListModel::DirectoryAdded, &m_tracker, &GameTracker::AddDirectory);
connect(this, &GameListModel::DirectoryRemoved, &m_tracker, &GameTracker::RemoveDirectory);
}

QVariant GameListModel::data(const QModelIndex& index, int role) const
Expand Down Expand Up @@ -67,24 +68,36 @@ int GameListModel::columnCount(const QModelIndex& parent) const
return NUM_COLS;
}


void GameListModel::UpdateGame(QSharedPointer<GameFile> game)
{
QString path = game->GetPath();
if (m_entries.contains(path))
RemoveGame(path);

beginInsertRows(QModelIndex(), m_games.size(), m_games.size());
m_entries[path] = m_games.size();
m_games.append(game);
int entry = FindGame(path);
if (entry < 0)
entry = m_games.size();

beginInsertRows(QModelIndex(), entry, entry);
m_games.insert(entry, game);
endInsertRows();
}

void GameListModel::RemoveGame(QString path)
{
int entry = m_entries[path];
int entry = FindGame(path);
if (entry < 0)
return;

beginRemoveRows(QModelIndex(), entry, entry);
m_entries.remove(path);
m_games.removeAt(entry);
endRemoveRows();
}

int GameListModel::FindGame(const QString& path) const
{
for (int i = 0; i < m_games.size(); i++)
{
if (m_games[i]->GetPath() == path)
return i;
}
return -1;
}
6 changes: 4 additions & 2 deletions Source/Core/DolphinQt2/GameList/GameListModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,12 @@ public slots:

signals:
void DirectoryAdded(QString dir);
void DirectoryRemoved(QString dir);

private:
// Index in m_games, or -1 if it isn't found
int FindGame(const QString& path) const;

GameTracker m_tracker;
QList<QSharedPointer<GameFile>> m_games;
// Path -> index in m_games
QMap<QString, int> m_entries;
};
32 changes: 29 additions & 3 deletions Source/Core/DolphinQt2/GameList/GameTracker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,46 @@ GameTracker::~GameTracker()

void GameTracker::AddDirectory(QString dir)
{
if (!QFileInfo(dir).exists())
return;
addPath(dir);
UpdateDirectory(dir);
}

void GameTracker::RemoveDirectory(QString dir)
{
removePath(dir);
QDirIterator it(dir, game_filters, QDir::NoFilter, QDirIterator::Subdirectories);
while (it.hasNext())
{
QString path = QFileInfo(it.next()).canonicalFilePath();
if (m_tracked_files.contains(path))
{
m_tracked_files[path]--;
if (m_tracked_files[path] == 0)
{
removePath(path);
m_tracked_files.remove(path);
emit GameRemoved(path);
}
}
}
}

void GameTracker::UpdateDirectory(const QString& dir)
{
QDirIterator it(dir, game_filters);
QDirIterator it(dir, game_filters, QDir::NoFilter, QDirIterator::Subdirectories);
while (it.hasNext())
{
QString path = QFileInfo(it.next()).canonicalFilePath();
if (!m_tracked_files.contains(path))
if (m_tracked_files.contains(path))
{
m_tracked_files[path]++;
}
else
{
addPath(path);
m_tracked_files.insert(path);
m_tracked_files[path] = 1;
emit PathChanged(path);
}
}
Expand Down
6 changes: 4 additions & 2 deletions Source/Core/DolphinQt2/GameList/GameTracker.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#pragma once

#include <QFileSystemWatcher>
#include <QSet>
#include <QMap>
#include <QSharedPointer>
#include <QString>
#include <QStringList>
Expand All @@ -31,6 +31,7 @@ class GameTracker final : public QFileSystemWatcher

public slots:
void AddDirectory(QString dir);
void RemoveDirectory(QString dir);

signals:
void GameLoaded(QSharedPointer<GameFile> game);
Expand All @@ -42,7 +43,8 @@ public slots:
void UpdateDirectory(const QString& dir);
void UpdateFile(const QString& path);

QSet<QString> m_tracked_files;
// game path -> number of directories that track it
QMap<QString, int> m_tracked_files;
QThread m_loader_thread;
GameLoader* m_loader;
};
Expand Down

0 comments on commit d2e9688

Please sign in to comment.