From a835a4a2f78c199475768004d6dec576a54d469b Mon Sep 17 00:00:00 2001 From: Jonas Kvinge Date: Wed, 29 Apr 2020 00:33:38 +0200 Subject: [PATCH] Minor fixes to collection pixmap cache - Add variables for cache size defaults - Increase default disk cache size - Change the pixmap cache settings UI to look better - Add current pixmap disk cache used to settings --- src/collection/collectionmodel.cpp | 31 +-- src/collection/collectionmodel.h | 8 +- src/settings/collectionsettingspage.cpp | 41 ++-- src/settings/collectionsettingspage.h | 5 +- src/settings/collectionsettingspage.ui | 265 ++++++++++++++++-------- 5 files changed, 227 insertions(+), 123 deletions(-) diff --git a/src/collection/collectionmodel.cpp b/src/collection/collectionmodel.cpp index 3cfbf2955..1b7602ff8 100644 --- a/src/collection/collectionmodel.cpp +++ b/src/collection/collectionmodel.cpp @@ -74,7 +74,7 @@ using std::placeholders::_2; const char *CollectionModel::kSavedGroupingsSettingsGroup = "SavedGroupings"; const int CollectionModel::kPrettyCoverSize = 32; -const char *CollectionModel::kPixmapDiskCacheDir = "/pixmapcache"; +const char *CollectionModel::kPixmapDiskCacheDir = "pixmapcache"; QNetworkDiskCache *CollectionModel::sIconCache = nullptr; @@ -114,17 +114,18 @@ CollectionModel::CollectionModel(CollectionBackend *backend, Application *app, Q cover_loader_options_.pad_output_image_ = true; cover_loader_options_.scale_output_image_ = true; - if (app_) + if (app_) { connect(app_->album_cover_loader(), SIGNAL(AlbumCoverLoaded(quint64, AlbumCoverLoaderResult)), SLOT(AlbumCoverLoaded(quint64, AlbumCoverLoaderResult))); + } QIcon nocover = IconLoader::Load("cdcase"); no_cover_icon_ = nocover.pixmap(nocover.availableSizes().last()).scaled(kPrettyCoverSize, kPrettyCoverSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); //no_cover_icon_ = QPixmap(":/pictures/noalbumart.png").scaled(kPrettyCoverSize, kPrettyCoverSize, Qt::KeepAspectRatio, Qt::SmoothTransformation); - // When running under gdb, all calls to this constructor came from the same thread. - // If this ever changes, these two lines might need to be protected by a mutex. - if (sIconCache == nullptr) + if (sIconCache == nullptr) { sIconCache = new QNetworkDiskCache(this); + sIconCache->setCacheDirectory(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/" + kPixmapDiskCacheDir); + } connect(backend_, SIGNAL(SongsDiscovered(SongList)), SLOT(SongsDiscovered(SongList))); connect(backend_, SIGNAL(SongsDeleted(SongList)), SLOT(SongsDeleted(SongList))); @@ -186,16 +187,16 @@ void CollectionModel::ReloadSettings() { use_disk_cache_ = s.value(CollectionSettingsPage::kSettingsDiskCacheEnable, false).toBool(); - if (!use_disk_cache_) { - sIconCache->clear(); - } + QPixmapCache::setCacheLimit(MaximumCacheSize(&s, CollectionSettingsPage::kSettingsCacheSize, CollectionSettingsPage::kSettingsCacheSizeUnit, CollectionSettingsPage::kSettingsCacheSizeDefault) / 1024); - sIconCache->setCacheDirectory(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + kPixmapDiskCacheDir); - sIconCache->setMaximumCacheSize(MaximumCacheSize(&s, CollectionSettingsPage::kSettingsDiskCacheSize, CollectionSettingsPage::kSettingsDiskCacheSizeUnit)); - - QPixmapCache::setCacheLimit(MaximumCacheSize(&s, CollectionSettingsPage::kSettingsCacheSize, CollectionSettingsPage::kSettingsCacheSizeUnit) / 1024); + sIconCache->setMaximumCacheSize(MaximumCacheSize(&s, CollectionSettingsPage::kSettingsDiskCacheSize, CollectionSettingsPage::kSettingsDiskCacheSizeUnit, CollectionSettingsPage::kSettingsDiskCacheSizeDefault)); s.endGroup(); + + if (!use_disk_cache_) { + ClearDiskCache(); + } + } void CollectionModel::Init(bool async) { @@ -642,7 +643,7 @@ void CollectionModel::AlbumCoverLoaded(const quint64 id, const AlbumCoverLoaderR QNetworkCacheMetaData item_metadata; item_metadata.setSaveToDisk(true); item_metadata.setUrl(QUrl(cache_key)); - QIODevice* cache = sIconCache->prepare(item_metadata); + QIODevice *cache = sIconCache->prepare(item_metadata); if (cache) { result.image_scaled.save(cache, "XPM"); sIconCache->insert(cache); @@ -1538,9 +1539,9 @@ bool CollectionModel::CompareItems(const CollectionItem *a, const CollectionItem } -int CollectionModel::MaximumCacheSize(QSettings *s, const char *size_id, const char *size_unit_id) const { +int CollectionModel::MaximumCacheSize(QSettings *s, const char *size_id, const char *size_unit_id, const int cache_size_default) const { - int size = s->value(size_id, 80).toInt(); + int size = s->value(size_id, cache_size_default).toInt(); int unit = s->value(size_unit_id, CollectionSettingsPage::CacheSizeUnit::CacheSizeUnit_MB).toInt() + 1; do { diff --git a/src/collection/collectionmodel.h b/src/collection/collectionmodel.h index 68e4dbe56..f2be1b22c 100644 --- a/src/collection/collectionmodel.h +++ b/src/collection/collectionmodel.h @@ -41,6 +41,7 @@ #include #include #include +#include #include "core/simpletreemodel.h" #include "core/song.h" @@ -51,7 +52,6 @@ #include "covermanager/albumcoverloaderoptions.h" class QSettings; -class QNetworkDiskCache; class Application; class CollectionBackend; @@ -177,7 +177,9 @@ class CollectionModel : public SimpleTreeModel { static QString SortTextForYear(int year); static QString SortTextForBitrate(int bitrate); -signals: + quint64 icon_cache_disk_size() { return sIconCache->cacheSize(); } + + signals: void TotalSongCountUpdated(int count); void TotalArtistCountUpdated(int count); void TotalAlbumCountUpdated(int count); @@ -248,7 +250,7 @@ signals: QVariant AlbumIcon(const QModelIndex &idx); QVariant data(const CollectionItem *item, int role) const; bool CompareItems(const CollectionItem *a, const CollectionItem *b) const; - int MaximumCacheSize(QSettings *s, const char *size_id, const char *size_unit_id) const; + int MaximumCacheSize(QSettings *s, const char *size_id, const char *size_unit_id, const int cache_size_default) const; private: CollectionBackend *backend_; diff --git a/src/settings/collectionsettingspage.cpp b/src/settings/collectionsettingspage.cpp index b8381378b..50c396aa4 100644 --- a/src/settings/collectionsettingspage.cpp +++ b/src/settings/collectionsettingspage.cpp @@ -41,6 +41,8 @@ #include "core/application.h" #include "core/iconloader.h" +#include "core/utilities.h" +#include "collection/collectionmodel.h" #include "collection/collectiondirectorymodel.h" #include "collectionsettingspage.h" #include "playlist/playlistdelegates.h" @@ -54,6 +56,8 @@ const char *CollectionSettingsPage::kSettingsCacheSizeUnit = "cache_size_unit"; const char *CollectionSettingsPage::kSettingsDiskCacheEnable = "disk_cache_enable"; const char *CollectionSettingsPage::kSettingsDiskCacheSize = "disk_cache_size"; const char *CollectionSettingsPage::kSettingsDiskCacheSizeUnit = "disk_cache_size_unit"; +const int CollectionSettingsPage::kSettingsCacheSizeDefault = 160; +const int CollectionSettingsPage::kSettingsDiskCacheSizeDefault = 360; const QStringList CollectionSettingsPage::cacheUnitNames = { "KB", "MB", "GB", "TB" }; @@ -70,6 +74,9 @@ CollectionSettingsPage::CollectionSettingsPage(SettingsDialog *dialog) setWindowIcon(IconLoader::Load("library-music")); ui_->add->setIcon(IconLoader::Load("document-open-folder")); + ui_->combobox_cache_size->addItems(cacheUnitNames); + ui_->combobox_disk_cache_size->addItems(cacheUnitNames); + connect(ui_->add, SIGNAL(clicked()), SLOT(Add())); connect(ui_->remove, SIGNAL(clicked()), SLOT(Remove())); @@ -77,6 +84,10 @@ CollectionSettingsPage::CollectionSettingsPage(SettingsDialog *dialog) connect(ui_->radiobutton_cover_hash, SIGNAL(toggled(bool)), SLOT(CoverSaveInAlbumDirChanged())); connect(ui_->radiobutton_cover_pattern, SIGNAL(toggled(bool)), SLOT(CoverSaveInAlbumDirChanged())); + connect(ui_->checkbox_disk_cache, SIGNAL(stateChanged(int)), SLOT(DiskCacheEnable(int))); + connect(ui_->button_clear_disk_cache, SIGNAL(clicked()), dialog->app(), SIGNAL(ClearPixmapDiskCache())); + connect(ui_->button_clear_disk_cache, SIGNAL(clicked()), SLOT(ClearPixmapDiskCache())); + } CollectionSettingsPage::~CollectionSettingsPage() { delete ui_; } @@ -104,12 +115,16 @@ void CollectionSettingsPage::CurrentRowChanged(const QModelIndex& index) { ui_->remove->setEnabled(index.isValid()); } -void CollectionSettingsPage::DiskCacheEnable(int state) { +void CollectionSettingsPage::DiskCacheEnable(const int state) { + bool checked = state == Qt::Checked; - ui_->button_disk_cache->setEnabled(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() { @@ -151,22 +166,18 @@ void CollectionSettingsPage::Load() { ui_->checkbox_cover_lowercase->setChecked(s.value("cover_lowercase", true).toBool()); ui_->checkbox_cover_replace_spaces->setChecked(s.value("cover_replace_spaces", true).toBool()); - ui_->spinbox_cache_size->setValue(s.value(kSettingsCacheSize, 80).toInt()); - ui_->combobox_cache_size->addItems(cacheUnitNames); + ui_->spinbox_cache_size->setValue(s.value(kSettingsCacheSize, kSettingsCacheSizeDefault).toInt()); ui_->combobox_cache_size->setCurrentIndex(s.value(kSettingsCacheSizeUnit, (int) CacheSizeUnit_MB).toInt()); ui_->checkbox_disk_cache->setChecked(s.value(kSettingsDiskCacheEnable, false).toBool()); - ui_->label_disk_cache_size->setEnabled(ui_->checkbox_disk_cache->isChecked()); - ui_->spinbox_disk_cache_size->setEnabled(ui_->checkbox_disk_cache->isChecked()); - ui_->spinbox_disk_cache_size->setValue(s.value(kSettingsDiskCacheSize, 80).toInt()); - ui_->combobox_disk_cache_size->setEnabled(ui_->checkbox_disk_cache->isChecked()); - ui_->combobox_disk_cache_size->addItems(cacheUnitNames); + ui_->spinbox_disk_cache_size->setValue(s.value(kSettingsDiskCacheSize, kSettingsDiskCacheSizeDefault).toInt()); ui_->combobox_disk_cache_size->setCurrentIndex(s.value(kSettingsDiskCacheSizeUnit, (int) CacheSizeUnit_MB).toInt()); - connect(ui_->checkbox_disk_cache, SIGNAL(stateChanged(int)), SLOT(DiskCacheEnable(int))); - connect(ui_->button_disk_cache, SIGNAL(clicked()), dialog()->app(), SIGNAL(ClearPixmapDiskCache())); - s.endGroup(); + DiskCacheEnable(ui_->checkbox_disk_cache->checkState()); + + ui_->disk_cache_in_use->setText((dialog()->app()->collection_model()->icon_cache_disk_size() == 0 ? "empty" : Utilities::PrettySize(dialog()->app()->collection_model()->icon_cache_disk_size()))); + } void CollectionSettingsPage::Save() { @@ -232,3 +243,9 @@ void CollectionSettingsPage::CoverSaveInAlbumDirChanged() { } } + +void CollectionSettingsPage::ClearPixmapDiskCache() { + + ui_->disk_cache_in_use->setText("empty"); + +} diff --git a/src/settings/collectionsettingspage.h b/src/settings/collectionsettingspage.h index c008dc3c6..0259fc53e 100644 --- a/src/settings/collectionsettingspage.h +++ b/src/settings/collectionsettingspage.h @@ -47,6 +47,8 @@ class CollectionSettingsPage : public SettingsPage { static const char *kSettingsDiskCacheEnable; static const char *kSettingsDiskCacheSize; static const char *kSettingsDiskCacheSizeUnit; + static const int kSettingsCacheSizeDefault; + static const int kSettingsDiskCacheSizeDefault; enum CacheSizeUnit { CacheSizeUnit_KB, @@ -68,8 +70,9 @@ class CollectionSettingsPage : public SettingsPage { void Remove(); void CurrentRowChanged(const QModelIndex &index); - void DiskCacheEnable(int state); + void DiskCacheEnable(const int state); void CoverSaveInAlbumDirChanged(); + void ClearPixmapDiskCache(); private: Ui_CollectionSettingsPage *ui_; diff --git a/src/settings/collectionsettingspage.ui b/src/settings/collectionsettingspage.ui index 1efa0f81a..4772d6847 100644 --- a/src/settings/collectionsettingspage.ui +++ b/src/settings/collectionsettingspage.ui @@ -160,6 +160,9 @@ If there are no matches then it will use the largest image in the directory.Saving album covers + + 0 + @@ -249,98 +252,176 @@ If there are no matches then it will use the largest image in the directory. + + + + + + + Album cover pixmap cache + + - - - Album art cache - - - - - - - - - - - 0 - 0 - - - - Size - - - - - - - 1048576 - - - - - - - - 0 - 0 - - - - - - - - - - - - Enable Disk Cache - - - - - - - Clear Disk Cache - - - - - - - - - - - Disk Cache Size - - - - - - - 1048576 - - - - - - - - 0 - 0 - - - - - - - - - - + + + + + + 0 + 0 + + + + + 80 + 16777215 + + + + 1048576 + + + + + + + + 0 + 0 + + + + Size + + + + + + + + 0 + 0 + + + + + + + + Qt::Horizontal + + + + + + + + + + + Enable Disk Cache + + + + + + + Qt::Horizontal + + + + + + + + + + + + 0 + 0 + + + + Disk Cache Size + + + + + + + + 0 + 0 + + + + + + + + + 0 + 0 + + + + + 80 + 16777215 + + + + 1048576 + + + + + + + Qt::Horizontal + + + + + + + + + + + Current disk cache in use: + + + + + + + + + + + + + + + 0 + 0 + + + + Clear Disk Cache + + + + + + + Qt::Horizontal + + + + @@ -369,9 +450,9 @@ If there are no matches then it will use the largest image in the directory.spinbox_cache_size combobox_cache_size checkbox_disk_cache - button_disk_cache spinbox_disk_cache_size combobox_disk_cache_size + button_clear_disk_cache