diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 89b4f0970..31d14312c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -198,6 +198,7 @@ set(SOURCES settings/settingspage.cpp settings/behavioursettingspage.cpp settings/collectionsettingspage.cpp + settings/collectionsettingsdirectorymodel.cpp settings/backendsettingspage.cpp settings/playlistsettingspage.cpp settings/scrobblersettingspage.cpp @@ -441,6 +442,7 @@ set(HEADERS settings/settingspage.h settings/behavioursettingspage.h settings/collectionsettingspage.h + settings/collectionsettingsdirectorymodel.h settings/backendsettingspage.h settings/playlistsettingspage.h settings/scrobblersettingspage.h diff --git a/src/collection/collection.cpp b/src/collection/collection.cpp index 184f2ad34..b6a46e8bc 100644 --- a/src/collection/collection.cpp +++ b/src/collection/collection.cpp @@ -108,7 +108,7 @@ void SCollection::Init() { watcher_->set_task_manager(app_->task_manager()); QObject::connect(&*backend_, &CollectionBackend::Error, this, &SCollection::Error); - QObject::connect(&*backend_, &CollectionBackend::DirectoryDiscovered, watcher_, &CollectionWatcher::AddDirectory); + QObject::connect(&*backend_, &CollectionBackend::DirectoryAdded, watcher_, &CollectionWatcher::AddDirectory); QObject::connect(&*backend_, &CollectionBackend::DirectoryDeleted, watcher_, &CollectionWatcher::RemoveDirectory); QObject::connect(&*backend_, &CollectionBackend::SongsRatingChanged, this, &SCollection::SongsRatingChanged); QObject::connect(&*backend_, &CollectionBackend::SongsStatisticsChanged, this, &SCollection::SongsPlaycountChanged); diff --git a/src/collection/collectionbackend.cpp b/src/collection/collectionbackend.cpp index 0c6bc70f9..ddbb0cb80 100644 --- a/src/collection/collectionbackend.cpp +++ b/src/collection/collectionbackend.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -162,7 +163,7 @@ void CollectionBackend::LoadDirectories() { QSqlDatabase db(db_->Connect()); for (const CollectionDirectory &dir : dirs) { - emit DirectoryDiscovered(dir, SubdirsInDirectory(dir.id, db)); + emit DirectoryAdded(dir, SubdirsInDirectory(dir.id, db)); } } @@ -334,38 +335,56 @@ void CollectionBackend::UpdateTotalAlbumCount() { } -void CollectionBackend::AddDirectory(const QString &path) { +void CollectionBackend::AddDirectoryAsync(const QString &path) { + QMetaObject::invokeMethod(this, "AddDirectory", Qt::QueuedConnection, Q_ARG(QString, path)); +} - QString canonical_path = QFileInfo(path).canonicalFilePath(); - QString db_path = canonical_path; +void CollectionBackend::AddDirectory(const QString &path) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); + { + SqlQuery q(db); + q.prepare(QStringLiteral("SELECT ROWID FROM %1 WHERE path = :path").arg(dirs_table_)); + q.BindValue(QStringLiteral(":path"), path); + if (!q.Exec()) { + db_->ReportErrors(q); + return; + } + if (q.next()) { + return; + } + } + SqlQuery q(db); q.prepare(QStringLiteral("INSERT INTO %1 (path, subdirs) VALUES (:path, 1)").arg(dirs_table_)); - q.BindValue(QStringLiteral(":path"), db_path); + q.BindValue(QStringLiteral(":path"), path); if (!q.Exec()) { db_->ReportErrors(q); return; } CollectionDirectory dir; - dir.path = canonical_path; + dir.path = path; dir.id = q.lastInsertId().toInt(); - emit DirectoryDiscovered(dir, CollectionSubdirectoryList()); + emit DirectoryAdded(dir, CollectionSubdirectoryList()); } +void CollectionBackend::RemoveDirectoryAsync(const CollectionDirectory &dir) { + QMetaObject::invokeMethod(this, "RemoveDirectory", Qt::QueuedConnection, Q_ARG(CollectionDirectory, dir)); +} + void CollectionBackend::RemoveDirectory(const CollectionDirectory &dir) { - QMutexLocker l(db_->Mutex()); - QSqlDatabase db(db_->Connect()); - // Remove songs first DeleteSongs(FindSongsInDirectory(dir.id)); + QMutexLocker l(db_->Mutex()); + QSqlDatabase db(db_->Connect()); + ScopedTransaction transaction(&db); // Delete the subdirs that were in this directory @@ -390,10 +409,10 @@ void CollectionBackend::RemoveDirectory(const CollectionDirectory &dir) { } } - emit DirectoryDeleted(dir); - transaction.Commit(); + emit DirectoryDeleted(dir); + } SongList CollectionBackend::FindSongsInDirectory(const int id) { @@ -470,7 +489,7 @@ void CollectionBackend::SongPathChanged(const Song &song, const QFileInfo &new_f // Take a song and update its path Song updated_song = song; updated_song.set_source(source_); - updated_song.set_url(QUrl::fromLocalFile(new_file.absoluteFilePath())); + updated_song.set_url(QUrl::fromLocalFile(QDir::cleanPath(new_file.filePath()))); updated_song.set_basefilename(new_file.fileName()); updated_song.InitArtManual(); if (updated_song.is_collection_song() && new_collection_directory_id) { diff --git a/src/collection/collectionbackend.h b/src/collection/collectionbackend.h index 8cbee265c..9b987954e 100644 --- a/src/collection/collectionbackend.h +++ b/src/collection/collectionbackend.h @@ -132,8 +132,8 @@ class CollectionBackendInterface : public QObject { virtual Song GetSongByUrl(const QUrl &url, const qint64 beginning = 0) = 0; virtual Song GetSongByUrlAndTrack(const QUrl &url, const int track) = 0; - virtual void AddDirectory(const QString &path) = 0; - virtual void RemoveDirectory(const CollectionDirectory &dir) = 0; + virtual void AddDirectoryAsync(const QString &path) = 0; + virtual void RemoveDirectoryAsync(const CollectionDirectory &dir) = 0; }; class CollectionBackend : public CollectionBackendInterface { @@ -206,8 +206,8 @@ class CollectionBackend : public CollectionBackendInterface { Song GetSongByUrl(const QUrl &url, qint64 beginning = 0) override; Song GetSongByUrlAndTrack(const QUrl &url, const int track) override; - void AddDirectory(const QString &path) override; - void RemoveDirectory(const CollectionDirectory &dir) override; + void AddDirectoryAsync(const QString &path) override; + void RemoveDirectoryAsync(const CollectionDirectory &dir) override; bool ExecCollectionQuery(CollectionQuery *query, SongList &songs); bool ExecCollectionQuery(CollectionQuery *query, SongMap &songs); @@ -239,6 +239,8 @@ class CollectionBackend : public CollectionBackendInterface { void UpdateTotalSongCount(); void UpdateTotalArtistCount(); void UpdateTotalAlbumCount(); + void AddDirectory(const QString &path); + void RemoveDirectory(const CollectionDirectory &dir); void AddOrUpdateSongs(const SongList &songs); void UpdateSongsBySongID(const SongMap &new_songs); void UpdateMTimesOnly(const SongList &songs); @@ -270,7 +272,7 @@ class CollectionBackend : public CollectionBackendInterface { void ExpireSongs(const int directory_id, const int expire_unavailable_songs_days); signals: - void DirectoryDiscovered(const CollectionDirectory &dir, const CollectionSubdirectoryList &subdir); + void DirectoryAdded(const CollectionDirectory &dir, const CollectionSubdirectoryList &subdir); void DirectoryDeleted(const CollectionDirectory &dir); void SongsDiscovered(const SongList &songs); diff --git a/src/collection/collectiondirectorymodel.cpp b/src/collection/collectiondirectorymodel.cpp index ef0453f75..0a36a9d75 100644 --- a/src/collection/collectiondirectorymodel.cpp +++ b/src/collection/collectiondirectorymodel.cpp @@ -2,6 +2,7 @@ * Strawberry Music Player * This file was part of Clementine. * Copyright 2010, David Sansome + * Copyright 2018-2024, Jonas Kvinge * * Strawberry is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -44,12 +45,15 @@ CollectionDirectoryModel::CollectionDirectoryModel(SharedPtr dir_icon_(IconLoader::Load(QStringLiteral("document-open-folder"))), backend_(backend) { - QObject::connect(&*backend_, &CollectionBackend::DirectoryDiscovered, this, &CollectionDirectoryModel::DirectoryDiscovered); - QObject::connect(&*backend_, &CollectionBackend::DirectoryDeleted, this, &CollectionDirectoryModel::DirectoryDeleted); + QObject::connect(&*backend_, &CollectionBackend::DirectoryAdded, this, &CollectionDirectoryModel::AddDirectory); + QObject::connect(&*backend_, &CollectionBackend::DirectoryDeleted, this, &CollectionDirectoryModel::RemoveDirectory); } -void CollectionDirectoryModel::DirectoryDiscovered(const CollectionDirectory &dir) { +void CollectionDirectoryModel::AddDirectory(const CollectionDirectory &dir) { + + directories_.insert(dir.id, dir); + paths_.append(dir.path); QStandardItem *item = new QStandardItem(dir.path); item->setData(dir.id, kIdRole); @@ -59,7 +63,10 @@ void CollectionDirectoryModel::DirectoryDiscovered(const CollectionDirectory &di } -void CollectionDirectoryModel::DirectoryDeleted(const CollectionDirectory &dir) { +void CollectionDirectoryModel::RemoveDirectory(const CollectionDirectory &dir) { + + directories_.remove(dir.id); + paths_.removeAll(dir.path); for (int i = 0; i < rowCount(); ++i) { if (item(i, 0)->data(kIdRole).toInt() == dir.id) { @@ -71,26 +78,6 @@ void CollectionDirectoryModel::DirectoryDeleted(const CollectionDirectory &dir) } -void CollectionDirectoryModel::AddDirectory(const QString &path) { - - if (!backend_) return; - - backend_->AddDirectory(path); - -} - -void CollectionDirectoryModel::RemoveDirectory(const QModelIndex &idx) { - - if (!backend_ || !idx.isValid()) return; - - CollectionDirectory dir; - dir.path = idx.data().toString(); - dir.id = idx.data(kIdRole).toInt(); - - backend_->RemoveDirectory(dir); - -} - QVariant CollectionDirectoryModel::data(const QModelIndex &idx, int role) const { switch (role) { diff --git a/src/collection/collectiondirectorymodel.h b/src/collection/collectiondirectorymodel.h index b15d9b66f..c70c89a5c 100644 --- a/src/collection/collectiondirectorymodel.h +++ b/src/collection/collectiondirectorymodel.h @@ -2,6 +2,7 @@ * Strawberry Music Player * This file was part of Clementine. * Copyright 2010, David Sansome + * Copyright 2018-2024, Jonas Kvinge * * Strawberry is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,15 +27,17 @@ #include #include #include +#include #include #include +#include #include #include "core/shared_ptr.h" +#include "collectiondirectory.h" class QModelIndex; -struct CollectionDirectory; class CollectionBackend; class MusicStorage; @@ -44,22 +47,24 @@ class CollectionDirectoryModel : public QStandardItemModel { public: explicit CollectionDirectoryModel(SharedPtr collection_backend, QObject *parent = nullptr); - // To be called by GUIs - void AddDirectory(const QString &path); - void RemoveDirectory(const QModelIndex &idx); - QVariant data(const QModelIndex &idx, int role) const override; + SharedPtr backend() const { return backend_; } + + QMap directories() const { return directories_; } + QStringList paths() const { return paths_; } + private slots: - // To be called by the backend - void DirectoryDiscovered(const CollectionDirectory &directories); - void DirectoryDeleted(const CollectionDirectory &directories); + void AddDirectory(const CollectionDirectory &directory); + void RemoveDirectory(const CollectionDirectory &directory); private: static const int kIdRole = Qt::UserRole + 1; QIcon dir_icon_; SharedPtr backend_; + QMap directories_; + QStringList paths_; QList> storage_; }; diff --git a/src/device/filesystemdevice.cpp b/src/device/filesystemdevice.cpp index 60df123c0..16f717e6b 100644 --- a/src/device/filesystemdevice.cpp +++ b/src/device/filesystemdevice.cpp @@ -53,7 +53,7 @@ FilesystemDevice::FilesystemDevice(const QUrl &url, DeviceLister *lister, const watcher_->set_backend(backend_); watcher_->set_task_manager(app_->task_manager()); - QObject::connect(&*backend_, &CollectionBackend::DirectoryDiscovered, watcher_, &CollectionWatcher::AddDirectory); + QObject::connect(&*backend_, &CollectionBackend::DirectoryAdded, watcher_, &CollectionWatcher::AddDirectory); QObject::connect(&*backend_, &CollectionBackend::DirectoryDeleted, watcher_, &CollectionWatcher::RemoveDirectory); QObject::connect(watcher_, &CollectionWatcher::NewOrUpdatedSongs, &*backend_, &CollectionBackend::AddOrUpdateSongs); QObject::connect(watcher_, &CollectionWatcher::SongsMTimeUpdated, &*backend_, &CollectionBackend::UpdateMTimesOnly); diff --git a/src/settings/collectionsettingsdirectorymodel.cpp b/src/settings/collectionsettingsdirectorymodel.cpp new file mode 100644 index 000000000..8eb0e6d5c --- /dev/null +++ b/src/settings/collectionsettingsdirectorymodel.cpp @@ -0,0 +1,63 @@ +/* + * Strawberry Music Player + * Copyright 2024, Jonas Kvinge + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#include "config.h" + +#include +#include +#include + +#include "core/iconloader.h" +#include "collectionsettingsdirectorymodel.h" + +CollectionSettingsDirectoryModel::CollectionSettingsDirectoryModel(QObject *parent) + : QStandardItemModel(parent), + dir_icon_(IconLoader::Load(QStringLiteral("document-open-folder"))) {} + +void CollectionSettingsDirectoryModel::AddDirectory(const QString &path) { + + QStandardItem *item = new QStandardItem(path); + item->setIcon(dir_icon_); + appendRow(item); + + paths_ << path; + +} + +void CollectionSettingsDirectoryModel::AddDirectories(const QStringList &paths) { + + for (const QString &path : paths) { + AddDirectory(path); + } + +} + +void CollectionSettingsDirectoryModel::RemoveDirectory(const QModelIndex &idx) { + + if (!idx.isValid()) return; + + const QString path = data(idx).toString(); + + removeRow(idx.row()); + + if (paths_.contains(path)) { + paths_.removeAll(path); + } + +} diff --git a/src/settings/collectionsettingsdirectorymodel.h b/src/settings/collectionsettingsdirectorymodel.h new file mode 100644 index 000000000..0022c97c6 --- /dev/null +++ b/src/settings/collectionsettingsdirectorymodel.h @@ -0,0 +1,48 @@ +/* + * Strawberry Music Player + * Copyright 2024, Jonas Kvinge + * + * Strawberry is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Strawberry is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Strawberry. If not, see . + * + */ + +#ifndef COLLECTIONSETTINGSDIRECTORYMODEL_H +#define COLLECTIONSETTINGSDIRECTORYMODEL_H + +#include "config.h" + +#include +#include +#include +#include +#include + +class CollectionSettingsDirectoryModel : public QStandardItemModel { + Q_OBJECT + + public: + explicit CollectionSettingsDirectoryModel(QObject *parent = nullptr); + + void AddDirectory(const QString &path); + void AddDirectories(const QStringList &paths); + void RemoveDirectory(const QModelIndex &idx); + + QStringList paths() const { return paths_; } + + private: + QIcon dir_icon_; + QStringList paths_; +}; + +#endif // COLLECTIONSETTINGSDIRECTORYMODEL_H diff --git a/src/settings/collectionsettingspage.cpp b/src/settings/collectionsettingspage.cpp index 42ce7dcc9..40b647f8a 100644 --- a/src/settings/collectionsettingspage.cpp +++ b/src/settings/collectionsettingspage.cpp @@ -2,7 +2,7 @@ * Strawberry Music Player * This file was part of Clementine. * Copyright 2010, David Sansome - * Copyright 2018-2021, Jonas Kvinge + * Copyright 2018-2024, Jonas Kvinge * * Strawberry is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -47,9 +48,12 @@ #include "utilities/strutils.h" #include "utilities/timeutils.h" #include "collection/collection.h" +#include "collection/collectionbackend.h" #include "collection/collectionmodel.h" +#include "collection/collectiondirectory.h" #include "collection/collectiondirectorymodel.h" #include "collectionsettingspage.h" +#include "collectionsettingsdirectorymodel.h" #include "playlist/playlistdelegates.h" #include "settings/settingsdialog.h" #include "settings/settingspage.h" @@ -67,6 +71,9 @@ const int CollectionSettingsPage::kSettingsDiskCacheSizeDefault = 360; CollectionSettingsPage::CollectionSettingsPage(SettingsDialog *dialog, QWidget *parent) : SettingsPage(dialog, parent), ui_(new Ui_CollectionSettingsPage), + collection_backend_(dialog->app()->collection_backend()), + collectionsettings_directory_model_(new CollectionSettingsDirectoryModel(this)), + collection_directory_model_(dialog->collection_directory_model()), initialized_model_(false) { ui_->setupUi(this); @@ -74,7 +81,7 @@ CollectionSettingsPage::CollectionSettingsPage(SettingsDialog *dialog, QWidget * // Icons setWindowIcon(IconLoader::Load(QStringLiteral("library-music"), true, 0, 32)); - ui_->add->setIcon(IconLoader::Load(QStringLiteral("document-open-folder"))); + ui_->add_directory->setIcon(IconLoader::Load(QStringLiteral("document-open-folder"))); ui_->combobox_cache_size->addItem(QStringLiteral("KB"), static_cast(CacheSizeUnit::KB)); ui_->combobox_cache_size->addItem(QStringLiteral("MB"), static_cast(CacheSizeUnit::MB)); @@ -83,8 +90,8 @@ CollectionSettingsPage::CollectionSettingsPage(SettingsDialog *dialog, QWidget * ui_->combobox_disk_cache_size->addItem(QStringLiteral("MB"), static_cast(CacheSizeUnit::MB)); ui_->combobox_disk_cache_size->addItem(QStringLiteral("GB"), static_cast(CacheSizeUnit::GB)); - QObject::connect(ui_->add, &QPushButton::clicked, this, &CollectionSettingsPage::Add); - QObject::connect(ui_->remove, &QPushButton::clicked, this, &CollectionSettingsPage::Remove); + QObject::connect(ui_->add_directory, &QPushButton::clicked, this, &CollectionSettingsPage::AddDirectory); + QObject::connect(ui_->remove_directory, &QPushButton::clicked, this, &CollectionSettingsPage::RemoveDirectory); #ifdef HAVE_SONGFINGERPRINTING QObject::connect(ui_->song_tracking, &QCheckBox::toggled, this, &CollectionSettingsPage::SongTrackingToggled); @@ -111,56 +118,6 @@ CollectionSettingsPage::CollectionSettingsPage(SettingsDialog *dialog, QWidget * CollectionSettingsPage::~CollectionSettingsPage() { delete ui_; } -void CollectionSettingsPage::Add() { - - Settings s; - s.beginGroup(kSettingsGroup); - - QString path(s.value("last_path", QStandardPaths::writableLocation(QStandardPaths::MusicLocation)).toString()); - path = QFileDialog::getExistingDirectory(this, tr("Add directory..."), path); - - if (!path.isEmpty()) { - dialog()->collection_directory_model()->AddDirectory(path); - } - - s.setValue("last_path", path); - - set_changed(); - -} - -void CollectionSettingsPage::Remove() { - - dialog()->collection_directory_model()->RemoveDirectory(ui_->list->currentIndex()); - set_changed(); - -} - -void CollectionSettingsPage::CurrentRowChanged(const QModelIndex &idx) { - ui_->remove->setEnabled(idx.isValid()); -} - -void CollectionSettingsPage::SongTrackingToggled() { - - ui_->mark_songs_unavailable->setEnabled(!ui_->song_tracking->isChecked()); - if (ui_->song_tracking->isChecked()) { - ui_->mark_songs_unavailable->setChecked(true); - } - -} - -void CollectionSettingsPage::DiskCacheEnable(const int state) { - - bool checked = state == Qt::Checked; - ui_->label_disk_cache_size->setEnabled(checked); - ui_->spinbox_disk_cache_size->setEnabled(checked); - ui_->combobox_disk_cache_size->setEnabled(checked); - ui_->label_disk_cache_in_use->setEnabled(checked); - ui_->disk_cache_in_use->setEnabled(checked); - ui_->button_clear_disk_cache->setEnabled(checked); - -} - void CollectionSettingsPage::Load() { if (!initialized_model_) { @@ -168,12 +125,17 @@ void CollectionSettingsPage::Load() { QObject::disconnect(ui_->list->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &CollectionSettingsPage::CurrentRowChanged); } - ui_->list->setModel(dialog()->collection_directory_model()); + ui_->list->setModel(collectionsettings_directory_model_); initialized_model_ = true; QObject::connect(ui_->list->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &CollectionSettingsPage::CurrentRowChanged); } + ui_->list->model()->removeRows(0, ui_->list->model()->rowCount()); + for (const QString &path : collection_directory_model_->paths()) { + collectionsettings_directory_model_->AddDirectory(path); + } + Settings s; s.beginGroup(kSettingsGroup); @@ -261,6 +223,69 @@ void CollectionSettingsPage::Save() { s.endGroup(); + for (const CollectionDirectory &dir : collection_directory_model_->directories()) { + if (!collectionsettings_directory_model_->paths().contains(dir.path)) { + collection_backend_->RemoveDirectoryAsync(dir); + } + } + + for (const QString &path : collectionsettings_directory_model_->paths()) { + if (!collection_directory_model_->paths().contains(path)) { + collection_backend_->AddDirectoryAsync(path); + } + } + +} + +void CollectionSettingsPage::AddDirectory() { + + Settings s; + s.beginGroup(kSettingsGroup); + + QString path = s.value("last_path", QStandardPaths::writableLocation(QStandardPaths::MusicLocation)).toString(); + path = QDir::cleanPath(QFileDialog::getExistingDirectory(this, tr("Add directory..."), path)); + + if (!path.isEmpty()) { + collectionsettings_directory_model_->AddDirectory(path); + } + + s.setValue("last_path", path); + + set_changed(); + +} + +void CollectionSettingsPage::RemoveDirectory() { + + collectionsettings_directory_model_->RemoveDirectory(ui_->list->currentIndex()); + + set_changed(); + +} + +void CollectionSettingsPage::CurrentRowChanged(const QModelIndex &idx) { + ui_->remove_directory->setEnabled(idx.isValid()); +} + +void CollectionSettingsPage::SongTrackingToggled() { + + ui_->mark_songs_unavailable->setEnabled(!ui_->song_tracking->isChecked()); + if (ui_->song_tracking->isChecked()) { + ui_->mark_songs_unavailable->setChecked(true); + } + +} + +void CollectionSettingsPage::DiskCacheEnable(const int state) { + + bool checked = state == Qt::Checked; + ui_->label_disk_cache_size->setEnabled(checked); + ui_->spinbox_disk_cache_size->setEnabled(checked); + ui_->combobox_disk_cache_size->setEnabled(checked); + ui_->label_disk_cache_in_use->setEnabled(checked); + ui_->disk_cache_in_use->setEnabled(checked); + ui_->button_clear_disk_cache->setEnabled(checked); + } void CollectionSettingsPage::ClearPixmapDiskCache() { diff --git a/src/settings/collectionsettingspage.h b/src/settings/collectionsettingspage.h index 7ce6178da..3bcd159ff 100644 --- a/src/settings/collectionsettingspage.h +++ b/src/settings/collectionsettingspage.h @@ -2,7 +2,7 @@ * Strawberry Music Player * This file was part of Clementine. * Copyright 2010, David Sansome - * Copyright 2018-2021, Jonas Kvinge + * Copyright 2018-2024, Jonas Kvinge * * Strawberry is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -30,8 +30,13 @@ #include "settingspage.h" +#include "core/shared_ptr.h" + class QModelIndex; class SettingsDialog; +class CollectionBackend; +class CollectionDirectoryModel; +class CollectionSettingsDirectoryModel; class Ui_CollectionSettingsPage; class CollectionSettingsPage : public SettingsPage { @@ -61,8 +66,8 @@ class CollectionSettingsPage : public SettingsPage { void Save() override; private slots: - void Add(); - void Remove(); + void AddDirectory(); + void RemoveDirectory(); void CurrentRowChanged(const QModelIndex &idx); void SongTrackingToggled(); @@ -74,6 +79,9 @@ class CollectionSettingsPage : public SettingsPage { private: Ui_CollectionSettingsPage *ui_; + SharedPtr collection_backend_; + CollectionSettingsDirectoryModel *collectionsettings_directory_model_; + CollectionDirectoryModel *collection_directory_model_; bool initialized_model_; }; diff --git a/src/settings/collectionsettingspage.ui b/src/settings/collectionsettingspage.ui index 52ad72a3b..d02d747b0 100644 --- a/src/settings/collectionsettingspage.ui +++ b/src/settings/collectionsettingspage.ui @@ -6,8 +6,8 @@ 0 0 - 519 - 920 + 565 + 973 @@ -39,7 +39,7 @@ - + Add new folder... @@ -49,7 +49,7 @@ - + Remove folder @@ -58,7 +58,7 @@ - Qt::Vertical + Qt::Orientation::Vertical @@ -167,7 +167,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -288,7 +288,7 @@ If there are no matches then it will use the largest image in the directory. - Qt::Horizontal + Qt::Orientation::Horizontal @@ -312,7 +312,7 @@ If there are no matches then it will use the largest image in the directory. - Qt::Horizontal + Qt::Orientation::Horizontal @@ -371,7 +371,7 @@ If there are no matches then it will use the largest image in the directory. - Qt::Horizontal + Qt::Orientation::Horizontal @@ -415,7 +415,7 @@ If there are no matches then it will use the largest image in the directory. - Qt::Horizontal + Qt::Orientation::Horizontal @@ -476,7 +476,7 @@ If there are no matches then it will use the largest image in the directory. - Qt::Horizontal + Qt::Orientation::Horizontal @@ -502,8 +502,8 @@ If there are no matches then it will use the largest image in the directory. list - add - remove + add_directory + remove_directory startup_scan monitor song_tracking diff --git a/tests/src/collectionbackend_test.cpp b/tests/src/collectionbackend_test.cpp index 0d5c05c9f..f81a7e9d5 100644 --- a/tests/src/collectionbackend_test.cpp +++ b/tests/src/collectionbackend_test.cpp @@ -78,7 +78,7 @@ TEST_F(CollectionBackendTest, EmptyDatabase) { TEST_F(CollectionBackendTest, AddDirectory) { - QSignalSpy spy(&*backend_, &CollectionBackend::DirectoryDiscovered); + QSignalSpy spy(&*backend_, &CollectionBackend::DirectoryAdded); backend_->AddDirectory(QStringLiteral("/tmp"));