Refactor icon handling. Make empty-cover filtering work again.
This commit is contained in:
parent
deb7c33c64
commit
2c643513e2
|
@ -70,6 +70,9 @@ AlbumCoverManager::AlbumCoverManager(Application* app,
|
||||||
artist_icon_(IconLoader::Load("x-clementine-artist", IconLoader::Base)),
|
artist_icon_(IconLoader::Load("x-clementine-artist", IconLoader::Base)),
|
||||||
all_artists_icon_(
|
all_artists_icon_(
|
||||||
IconLoader::Load("x-clementine-album", IconLoader::Base)),
|
IconLoader::Load("x-clementine-album", IconLoader::Base)),
|
||||||
|
no_cover_icon_(IconLoader::Load("nocover", IconLoader::Other)),
|
||||||
|
no_cover_image_(GenerateNoCoverImage(no_cover_icon_)),
|
||||||
|
no_cover_item_icon_(QPixmap::fromImage(no_cover_image_)),
|
||||||
context_menu_(new QMenu(this)),
|
context_menu_(new QMenu(this)),
|
||||||
progress_bar_(new QProgressBar(this)),
|
progress_bar_(new QProgressBar(this)),
|
||||||
abort_progress_(new QPushButton(this)),
|
abort_progress_(new QPushButton(this)),
|
||||||
|
@ -91,22 +94,7 @@ AlbumCoverManager::AlbumCoverManager(Application* app,
|
||||||
|
|
||||||
album_cover_choice_controller_->SetApplication(app_);
|
album_cover_choice_controller_->SetApplication(app_);
|
||||||
|
|
||||||
// Get a square version of nocover.png
|
cover_searcher_ = new AlbumCoverSearcher(no_cover_item_icon_, app_, this);
|
||||||
no_cover_icon_ = IconLoader::Load("nocover", IconLoader::Other);
|
|
||||||
no_cover_image_ =
|
|
||||||
no_cover_icon_.pixmap(no_cover_icon_.availableSizes().last()).toImage();
|
|
||||||
QImage nocover(no_cover_image_);
|
|
||||||
nocover =
|
|
||||||
nocover.scaled(120, 120, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
|
||||||
QImage square_nocover(120, 120, QImage::Format_ARGB32);
|
|
||||||
square_nocover.fill(0);
|
|
||||||
QPainter p(&square_nocover);
|
|
||||||
p.setOpacity(0.4);
|
|
||||||
p.drawImage((120 - nocover.width()) / 2, (120 - nocover.height()) / 2,
|
|
||||||
nocover);
|
|
||||||
p.end();
|
|
||||||
|
|
||||||
cover_searcher_ = new AlbumCoverSearcher(no_cover_icon_, app_, this);
|
|
||||||
cover_export_ = new AlbumCoverExport(this);
|
cover_export_ = new AlbumCoverExport(this);
|
||||||
|
|
||||||
// Set up the status bar
|
// Set up the status bar
|
||||||
|
@ -331,9 +319,8 @@ void AlbumCoverManager::ArtistChanged(QListWidgetItem* current) {
|
||||||
// Don't show songs without an album, obviously
|
// Don't show songs without an album, obviously
|
||||||
if (info.album_name.isEmpty()) continue;
|
if (info.album_name.isEmpty()) continue;
|
||||||
|
|
||||||
QIcon no_cover(no_cover_icon_.pixmap(120, 120));
|
|
||||||
QListWidgetItem* item =
|
QListWidgetItem* item =
|
||||||
new QListWidgetItem(no_cover, info.album_name, ui_->albums);
|
new QListWidgetItem(no_cover_item_icon_, info.album_name, ui_->albums);
|
||||||
|
|
||||||
item->setData(Role_ArtistName, info.artist);
|
item->setData(Role_ArtistName, info.artist);
|
||||||
item->setData(Role_AlbumArtistName, info.album_artist);
|
item->setData(Role_AlbumArtistName, info.album_artist);
|
||||||
|
@ -397,7 +384,7 @@ void AlbumCoverManager::UpdateFilter() {
|
||||||
|
|
||||||
if (!should_hide) {
|
if (!should_hide) {
|
||||||
total_count++;
|
total_count++;
|
||||||
if (item->icon().cacheKey() == no_cover_icon_.cacheKey()) {
|
if (!ItemHasCover(item)) {
|
||||||
without_cover++;
|
without_cover++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -410,7 +397,7 @@ void AlbumCoverManager::UpdateFilter() {
|
||||||
bool AlbumCoverManager::ShouldHide(const QListWidgetItem& item,
|
bool AlbumCoverManager::ShouldHide(const QListWidgetItem& item,
|
||||||
const QString& filter,
|
const QString& filter,
|
||||||
HideCovers hide) const {
|
HideCovers hide) const {
|
||||||
bool has_cover = item.icon().cacheKey() != no_cover_icon_.cacheKey();
|
bool has_cover = ItemHasCover(&item);
|
||||||
if (hide == Hide_WithCovers && has_cover) {
|
if (hide == Hide_WithCovers && has_cover) {
|
||||||
return true;
|
return true;
|
||||||
} else if (hide == Hide_WithoutCovers && !has_cover) {
|
} else if (hide == Hide_WithoutCovers && !has_cover) {
|
||||||
|
@ -423,11 +410,12 @@ bool AlbumCoverManager::ShouldHide(const QListWidgetItem& item,
|
||||||
|
|
||||||
QStringList query = filter.split(' ');
|
QStringList query = filter.split(' ');
|
||||||
for (const QString& s : query) {
|
for (const QString& s : query) {
|
||||||
if (!item.text().contains(s, Qt::CaseInsensitive) &&
|
bool in_text = item.text().contains(s, Qt::CaseInsensitive);
|
||||||
!item.data(Role_ArtistName).toString().contains(
|
bool in_artist =
|
||||||
s, Qt::CaseInsensitive) &&
|
item.data(Role_ArtistName).toString().contains(s, Qt::CaseInsensitive);
|
||||||
!item.data(Role_AlbumArtistName).toString().contains(
|
bool in_albumartist = item.data(Role_AlbumArtistName).toString().contains(
|
||||||
s, Qt::CaseInsensitive)) {
|
s, Qt::CaseInsensitive);
|
||||||
|
if (!in_text && !in_artist && !in_albumartist) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -439,7 +427,7 @@ void AlbumCoverManager::FetchAlbumCovers() {
|
||||||
for (int i = 0; i < ui_->albums->count(); ++i) {
|
for (int i = 0; i < ui_->albums->count(); ++i) {
|
||||||
QListWidgetItem* item = ui_->albums->item(i);
|
QListWidgetItem* item = ui_->albums->item(i);
|
||||||
if (item->isHidden()) continue;
|
if (item->isHidden()) continue;
|
||||||
if (item->icon().cacheKey() != no_cover_icon_.cacheKey()) continue;
|
if (ItemHasCover(item)) continue;
|
||||||
|
|
||||||
quint64 id = cover_fetcher_->FetchAlbumCover(
|
quint64 id = cover_fetcher_->FetchAlbumCover(
|
||||||
EffectiveAlbumArtistName(item), item->data(Role_AlbumName).toString());
|
EffectiveAlbumArtistName(item), item->data(Role_AlbumName).toString());
|
||||||
|
@ -510,8 +498,7 @@ bool AlbumCoverManager::eventFilter(QObject* obj, QEvent* event) {
|
||||||
bool some_with_covers = false;
|
bool some_with_covers = false;
|
||||||
|
|
||||||
for (QListWidgetItem* item : context_menu_items_) {
|
for (QListWidgetItem* item : context_menu_items_) {
|
||||||
if (item->icon().cacheKey() != no_cover_icon_.cacheKey())
|
if (ItemHasCover(item)) some_with_covers = true;
|
||||||
some_with_covers = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
album_cover_choice_controller_->cover_from_file_action()->setEnabled(
|
album_cover_choice_controller_->cover_from_file_action()->setEnabled(
|
||||||
|
@ -678,7 +665,7 @@ void AlbumCoverManager::UnsetCover() {
|
||||||
|
|
||||||
// force the 'none' cover on all of the selected items
|
// force the 'none' cover on all of the selected items
|
||||||
for (QListWidgetItem* current : context_menu_items_) {
|
for (QListWidgetItem* current : context_menu_items_) {
|
||||||
current->setIcon(no_cover_icon_);
|
current->setIcon(no_cover_item_icon_);
|
||||||
current->setData(Role_PathManual, cover);
|
current->setData(Role_PathManual, cover);
|
||||||
|
|
||||||
// don't save the first one twice
|
// don't save the first one twice
|
||||||
|
@ -794,8 +781,7 @@ void AlbumCoverManager::ExportCovers() {
|
||||||
QListWidgetItem* item = ui_->albums->item(i);
|
QListWidgetItem* item = ui_->albums->item(i);
|
||||||
|
|
||||||
// skip hidden and coverless albums
|
// skip hidden and coverless albums
|
||||||
if (item->isHidden() ||
|
if (item->isHidden() || !ItemHasCover(item)) {
|
||||||
item->icon().cacheKey() == no_cover_icon_.cacheKey()) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -841,9 +827,32 @@ void AlbumCoverManager::UpdateExportStatus(int exported, int skipped, int max) {
|
||||||
}
|
}
|
||||||
|
|
||||||
QString AlbumCoverManager::EffectiveAlbumArtistName(
|
QString AlbumCoverManager::EffectiveAlbumArtistName(
|
||||||
QListWidgetItem* item) const {
|
const QListWidgetItem* item) const {
|
||||||
if (!item->data(Role_AlbumArtistName).toString().isEmpty()) {
|
if (!item->data(Role_AlbumArtistName).toString().isEmpty()) {
|
||||||
return item->data(Role_AlbumArtistName).toString();
|
return item->data(Role_AlbumArtistName).toString();
|
||||||
}
|
}
|
||||||
return item->data(Role_ArtistName).toString();
|
return item->data(Role_ArtistName).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QImage AlbumCoverManager::GenerateNoCoverImage(
|
||||||
|
const QIcon& no_cover_icon) const {
|
||||||
|
// Get a square version of nocover.png with some transparency:
|
||||||
|
QImage nocover =
|
||||||
|
no_cover_icon.pixmap(no_cover_icon.availableSizes().last()).toImage();
|
||||||
|
nocover =
|
||||||
|
nocover.scaled(120, 120, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
|
|
||||||
|
QImage square_nocover(120, 120, QImage::Format_ARGB32);
|
||||||
|
square_nocover.fill(0);
|
||||||
|
QPainter p(&square_nocover);
|
||||||
|
p.setOpacity(0.4);
|
||||||
|
p.drawImage((120 - nocover.width()) / 2, (120 - nocover.height()) / 2,
|
||||||
|
nocover);
|
||||||
|
p.end();
|
||||||
|
|
||||||
|
return square_nocover;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AlbumCoverManager::ItemHasCover(const QListWidgetItem* item) const {
|
||||||
|
return item->icon().cacheKey() != no_cover_item_icon_.cacheKey();
|
||||||
|
}
|
||||||
|
|
|
@ -130,7 +130,7 @@ signals:
|
||||||
QString InitialPathForOpenCoverDialog(const QString& path_automatic,
|
QString InitialPathForOpenCoverDialog(const QString& path_automatic,
|
||||||
const QString& first_file_name) const;
|
const QString& first_file_name) const;
|
||||||
|
|
||||||
QString EffectiveAlbumArtistName(QListWidgetItem* item) const;
|
QString EffectiveAlbumArtistName(const QListWidgetItem* item) const;
|
||||||
|
|
||||||
// Returns the selected element in form of a Song ready to be used
|
// Returns the selected element in form of a Song ready to be used
|
||||||
// by AlbumCoverChoiceController or invalid song if there's nothing
|
// by AlbumCoverChoiceController or invalid song if there's nothing
|
||||||
|
@ -169,10 +169,14 @@ signals:
|
||||||
AlbumCoverExport* cover_export_;
|
AlbumCoverExport* cover_export_;
|
||||||
AlbumCoverExporter* cover_exporter_;
|
AlbumCoverExporter* cover_exporter_;
|
||||||
|
|
||||||
|
QImage GenerateNoCoverImage(const QIcon& no_cover_icon) const;
|
||||||
|
bool ItemHasCover(const QListWidgetItem* item) const;
|
||||||
|
|
||||||
QIcon artist_icon_;
|
QIcon artist_icon_;
|
||||||
QIcon all_artists_icon_;
|
QIcon all_artists_icon_;
|
||||||
QIcon no_cover_icon_;
|
const QIcon no_cover_icon_;
|
||||||
QImage no_cover_image_;
|
const QImage no_cover_image_;
|
||||||
|
const QIcon no_cover_item_icon_;
|
||||||
|
|
||||||
QMenu* context_menu_;
|
QMenu* context_menu_;
|
||||||
QList<QListWidgetItem*> context_menu_items_;
|
QList<QListWidgetItem*> context_menu_items_;
|
||||||
|
|
|
@ -277,7 +277,7 @@
|
||||||
<enum>QListView::IconMode</enum>
|
<enum>QListView::IconMode</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="uniformItemSizes">
|
<property name="uniformItemSizes">
|
||||||
<bool>true</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
|
Loading…
Reference in New Issue