Skip to content

Commit 03dae63

Browse files
committed
Add a management class for creating Directory objects.
Create a DirectorManager class that is owned by the Library or Device objects and provided to methods that need to create Directory objects. This will allow information to be provided through the Directory object. For example: - If the directory is on a removable device. - A mount point that may change on future uses. - Whether paths should be relative or absolute.
1 parent fdb3f7a commit 03dae63

10 files changed

Lines changed: 54 additions & 28 deletions

src/core/metatypes.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ void RegisterMetaTypes() {
7272
qRegisterMetaType<GstElement*>("GstElement*");
7373
qRegisterMetaType<GstEngine::OutputDetails>("GstEngine::OutputDetails");
7474
qRegisterMetaType<GstEnginePipeline*>("GstEnginePipeline*");
75+
qRegisterMetaType<DirectoryManager*>("DirectoryManager*");
7576
qRegisterMetaType<PlaylistItemList>("PlaylistItemList");
7677
qRegisterMetaType<PlaylistItemPtr>("PlaylistItemPtr");
7778
qRegisterMetaType<PodcastEpisodeList>("PodcastEpisodeList");

src/devices/connecteddevice.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ ConnectedDevice::ConnectedDevice(const QUrl& url, DeviceLister* lister,
4040
unique_id_(unique_id),
4141
database_id_(database_id),
4242
manager_(manager),
43+
directory_manager_(new DirectoryManager),
4344
model_(nullptr),
4445
song_count_(0) {
4546
qLog(Info) << "connected" << url << unique_id << first_time;
@@ -61,12 +62,12 @@ ConnectedDevice::ConnectedDevice(const QUrl& url, DeviceLister* lister,
6162
model_ = new LibraryModel(backend_, app_, this);
6263
}
6364

64-
ConnectedDevice::~ConnectedDevice() {}
65+
ConnectedDevice::~ConnectedDevice() { delete directory_manager_; }
6566

6667
void ConnectedDevice::InitBackendDirectory(const QString& mount_point,
6768
bool first_time, bool rewrite_path) {
68-
if (first_time || backend_->GetAllDirectories().isEmpty()) {
69-
backend_->AddDirectory(mount_point);
69+
if (first_time || backend_->GetAllDirectories(directory_manager_).isEmpty()) {
70+
backend_->AddDirectory(directory_manager_, mount_point);
7071
} else {
7172
if (rewrite_path) {
7273
// This is a bit of a hack. The device might not be mounted at the same
@@ -76,7 +77,7 @@ void ConnectedDevice::InitBackendDirectory(const QString& mount_point,
7677

7778
// Get the directory it was mounted at last time. Devices only have one
7879
// directory (the root).
79-
Directory dir = backend_->GetAllDirectories()[0];
80+
Directory dir = backend_->GetAllDirectories(directory_manager_)[0];
8081
if (dir.path != mount_point) {
8182
// The directory is different, commence the munging.
8283
qLog(Info) << "Changing path from" << dir.path << "to" << mount_point;
@@ -85,7 +86,7 @@ void ConnectedDevice::InitBackendDirectory(const QString& mount_point,
8586
}
8687

8788
// Load the directory properly now
88-
backend_->LoadDirectoriesAsync();
89+
backend_->LoadDirectoriesAsync(directory_manager_);
8990
}
9091
}
9192

src/devices/connecteddevice.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class Application;
3030
class Database;
3131
class DeviceLister;
3232
class DeviceManager;
33+
class DirectoryManager;
3334
class LibraryBackend;
3435
class LibraryModel;
3536

@@ -42,7 +43,7 @@ class ConnectedDevice : public QObject,
4243
ConnectedDevice(const QUrl& url, DeviceLister* lister,
4344
const QString& unique_id, DeviceManager* manager,
4445
Application* app, int database_id, bool first_time);
45-
~ConnectedDevice();
46+
virtual ~ConnectedDevice();
4647

4748
virtual void Init() = 0;
4849
virtual void ConnectAsync();
@@ -84,6 +85,7 @@ class ConnectedDevice : public QObject,
8485
DeviceManager* manager_;
8586

8687
std::shared_ptr<LibraryBackend> backend_;
88+
DirectoryManager* directory_manager_;
8789
LibraryModel* model_;
8890

8991
int song_count_;

src/library/directory.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ Q_DECLARE_METATYPE(Directory)
3939
typedef QList<Directory> DirectoryList;
4040
Q_DECLARE_METATYPE(DirectoryList)
4141

42+
struct DirectoryManager {
43+
DirectoryManager() {}
44+
virtual ~DirectoryManager() {}
45+
virtual Directory GetDirectory(const QString& path) const {
46+
Directory dir;
47+
dir.path = path;
48+
return dir;
49+
}
50+
};
51+
Q_DECLARE_METATYPE(DirectoryManager)
52+
4253
struct Subdirectory {
4354
Subdirectory() : directory_id(-1), mtime(0) {}
4455

src/library/library.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ Library::Library(Application* app, QObject* parent)
3939
: QObject(parent),
4040
app_(app),
4141
backend_(nullptr),
42+
directory_manager_(new DirectoryManager),
4243
model_(nullptr),
4344
watcher_(nullptr),
4445
watcher_thread_(nullptr),
@@ -57,7 +58,7 @@ Library::Library(Application* app, QObject* parent)
5758
using smart_playlists::SearchTerm;
5859

5960
model_ = new LibraryModel(backend_, app_, this);
60-
dir_model_ = new LibraryDirectoryModel(backend_, this);
61+
dir_model_ = new LibraryDirectoryModel(backend_, directory_manager_, this);
6162
model_->set_show_smart_playlists(true);
6263
model_->set_default_smart_playlists(
6364
LibraryModel::DefaultGenerators()
@@ -172,7 +173,7 @@ void Library::Init() {
172173
connect(app_->player(), SIGNAL(Stopped()), SLOT(Stopped()));
173174

174175
// This will start the watcher checking for updates
175-
backend_->LoadDirectoriesAsync();
176+
backend_->LoadDirectoriesAsync(directory_manager_.get());
176177
}
177178

178179
void Library::IncrementalScan() { watcher_->IncrementalScanAsync(); }

src/library/library.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
class Application;
2929
class Database;
30+
class DirectoryManager;
3031
class LibraryBackend;
3132
class LibraryModel;
3233
class LibraryDirectoryModel;
@@ -80,6 +81,7 @@ class Library : public QObject {
8081
private:
8182
Application* app_;
8283
std::shared_ptr<LibraryBackend> backend_;
84+
std::shared_ptr<DirectoryManager> directory_manager_;
8385
LibraryModel* model_;
8486
LibraryDirectoryModel* dir_model_;
8587

src/library/librarybackend.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ void LibraryBackend::Init(Database* db, const QString& songs_table,
6363
subdirs_table_ = subdirs_table;
6464
}
6565

66-
void LibraryBackend::LoadDirectoriesAsync() {
67-
metaObject()->invokeMethod(this, "LoadDirectories", Qt::QueuedConnection);
66+
void LibraryBackend::LoadDirectoriesAsync(DirectoryManager* directory_manager) {
67+
metaObject()->invokeMethod(this, "LoadDirectories", Qt::QueuedConnection,
68+
Q_ARG(DirectoryManager*, directory_manager));
6869
}
6970

7071
void LibraryBackend::UpdateTotalSongCountAsync() {
@@ -99,8 +100,8 @@ void LibraryBackend::UpdateSongsRatingAsync(const QList<int>& ids,
99100
Q_ARG(float, rating));
100101
}
101102

102-
void LibraryBackend::LoadDirectories() {
103-
DirectoryList dirs = GetAllDirectories();
103+
void LibraryBackend::LoadDirectories(DirectoryManager* info) {
104+
DirectoryList dirs = GetAllDirectories(info);
104105

105106
QMutexLocker l(db_->Mutex());
106107
QSqlDatabase db(db_->Connect());
@@ -155,7 +156,9 @@ void LibraryBackend::ChangeDirPath(int id, const QString& old_path,
155156
t.Commit();
156157
}
157158

158-
DirectoryList LibraryBackend::GetAllDirectories() {
159+
DirectoryList LibraryBackend::GetAllDirectories(
160+
DirectoryManager* directory_manager) {
161+
Q_ASSERT(directory_manager);
159162
QMutexLocker l(db_->Mutex());
160163
QSqlDatabase db(db_->Connect());
161164

@@ -167,9 +170,8 @@ DirectoryList LibraryBackend::GetAllDirectories() {
167170
if (db_->CheckErrors(q)) return ret;
168171

169172
while (q.next()) {
170-
Directory dir;
173+
Directory dir = directory_manager->GetDirectory(q.value(1).toString());
171174
dir.id = q.value(0).toInt();
172-
dir.path = q.value(1).toString();
173175

174176
ret << dir;
175177
}
@@ -217,7 +219,9 @@ void LibraryBackend::UpdateTotalSongCount() {
217219
emit TotalSongCountUpdated(q.value(0).toInt());
218220
}
219221

220-
void LibraryBackend::AddDirectory(const QString& path) {
222+
void LibraryBackend::AddDirectory(DirectoryManager* directory_manager,
223+
const QString& path) {
224+
Q_ASSERT(directory_manager);
221225
QString canonical_path = QFileInfo(path).canonicalFilePath();
222226
QString db_path = canonical_path;
223227

@@ -238,8 +242,7 @@ void LibraryBackend::AddDirectory(const QString& path) {
238242
q.exec();
239243
if (db_->CheckErrors(q)) return;
240244

241-
Directory dir;
242-
dir.path = canonical_path;
245+
Directory dir = directory_manager->GetDirectory(canonical_path);
243246
dir.id = q.lastInsertId().toInt();
244247

245248
emit DirectoryDiscovered(dir, SubdirectoryList());

src/library/librarybackend.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ class LibraryBackendInterface : public QObject {
6969
virtual QString songs_table() const = 0;
7070

7171
// Get a list of directories in the library. Emits DirectoriesDiscovered.
72-
virtual void LoadDirectoriesAsync() = 0;
72+
virtual void LoadDirectoriesAsync(DirectoryManager* directory_manager) = 0;
7373

7474
// Counts the songs in the library. Emits TotalSongCountUpdated
7575
virtual void UpdateTotalSongCountAsync() = 0;
7676

7777
virtual SongList FindSongsInDirectory(int id) = 0;
7878
virtual SubdirectoryList SubdirsInDirectory(int id) = 0;
79-
virtual DirectoryList GetAllDirectories() = 0;
79+
virtual DirectoryList GetAllDirectories(DirectoryManager* info) = 0;
8080
virtual void ChangeDirPath(int id, const QString& old_path,
8181
const QString& new_path) = 0;
8282

@@ -118,7 +118,8 @@ class LibraryBackendInterface : public QObject {
118118
// songs.
119119
virtual Song GetSongByUrl(const QUrl& url, qint64 beginning = 0) = 0;
120120

121-
virtual void AddDirectory(const QString& path) = 0;
121+
virtual void AddDirectory(DirectoryManager* directory_manager,
122+
const QString& path) = 0;
122123
virtual void RemoveDirectory(int dir_id) = 0;
123124

124125
virtual bool ExecQuery(LibraryQuery* q) = 0;
@@ -142,14 +143,14 @@ class LibraryBackend : public LibraryBackendInterface {
142143
QString subdirs_table() const { return subdirs_table_; }
143144

144145
// Get a list of directories in the library. Emits DirectoriesDiscovered.
145-
void LoadDirectoriesAsync();
146+
void LoadDirectoriesAsync(DirectoryManager* directory_manager);
146147

147148
// Counts the songs in the library. Emits TotalSongCountUpdated
148149
void UpdateTotalSongCountAsync();
149150

150151
SongList FindSongsInDirectory(int id);
151152
SubdirectoryList SubdirsInDirectory(int id);
152-
DirectoryList GetAllDirectories();
153+
DirectoryList GetAllDirectories(DirectoryManager* directory_manager);
153154
void ChangeDirPath(int id, const QString& old_path, const QString& new_path);
154155

155156
QStringList GetAll(const QString& column,
@@ -186,7 +187,7 @@ class LibraryBackend : public LibraryBackendInterface {
186187
SongList GetSongsByUrl(const QUrl& url);
187188
Song GetSongByUrl(const QUrl& url, qint64 beginning = 0);
188189

189-
void AddDirectory(const QString& path);
190+
void AddDirectory(DirectoryManager* directory_manager, const QString& path);
190191
void RemoveDirectory(int dir_id);
191192

192193
bool ExecQuery(LibraryQuery* q);
@@ -203,7 +204,7 @@ class LibraryBackend : public LibraryBackendInterface {
203204
void DeleteAll();
204205

205206
public slots:
206-
void LoadDirectories();
207+
void LoadDirectories(DirectoryManager* directory_manager);
207208
void UpdateTotalSongCount();
208209
void AddOrUpdateSongs(const SongList& songs);
209210
void UpdateMTimesOnly(const SongList& songs);

src/library/librarydirectorymodel.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@
2525
#include "ui/iconloader.h"
2626

2727
LibraryDirectoryModel::LibraryDirectoryModel(
28-
std::shared_ptr<LibraryBackend> backend, QObject* parent)
28+
std::shared_ptr<LibraryBackend> backend,
29+
std::shared_ptr<DirectoryManager> directory_manager, QObject* parent)
2930
: QStandardItemModel(parent),
3031
dir_icon_(IconLoader::Load("document-open-folder", IconLoader::Base)),
31-
backend_(backend) {
32+
backend_(backend),
33+
directory_manager_(directory_manager) {
3234
connect(backend_.get(),
3335
SIGNAL(DirectoryDiscovered(Directory, SubdirectoryList)),
3436
SLOT(DirectoryDiscovered(Directory)));
@@ -67,7 +69,7 @@ void LibraryDirectoryModel::DirectoryDeleted(int dir_id) {
6769
void LibraryDirectoryModel::AddDirectory(const QString& path) {
6870
if (!backend_) return;
6971

70-
backend_->AddDirectory(path);
72+
backend_->AddDirectory(directory_manager_.get(), path);
7173
}
7274

7375
void LibraryDirectoryModel::RemoveDirectory(const QModelIndex& index) {

src/library/librarydirectorymodel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class LibraryDirectoryModel : public QStandardItemModel {
3232

3333
public:
3434
LibraryDirectoryModel(std::shared_ptr<LibraryBackend> backend,
35+
std::shared_ptr<DirectoryManager> directory_manager,
3536
QObject* parent = nullptr);
3637
~LibraryDirectoryModel();
3738

@@ -51,6 +52,7 @@ class LibraryDirectoryModel : public QStandardItemModel {
5152

5253
QIcon dir_icon_;
5354
std::shared_ptr<LibraryBackend> backend_;
55+
std::shared_ptr<DirectoryManager> directory_manager_;
5456
QList<std::shared_ptr<MusicStorage>> storage_;
5557
};
5658

0 commit comments

Comments
 (0)