diff --git a/src/albumcovermanager.cpp b/src/albumcovermanager.cpp index 041fb352a..3f9c676a5 100644 --- a/src/albumcovermanager.cpp +++ b/src/albumcovermanager.cpp @@ -42,8 +42,7 @@ AlbumCoverManager::AlbumCoverManager(QNetworkAccessManager* network, QWidget *pa cover_fetcher_(new AlbumCoverFetcher(network, this)), artist_icon_(":/artist.png"), all_artists_icon_(":/album.png"), - context_menu_(new QMenu(this)) -{ + context_menu_(new QMenu(this)) { ui_.setupUi(this); // Get a square version of nocover.png @@ -55,7 +54,13 @@ AlbumCoverManager::AlbumCoverManager(QNetworkAccessManager* network, QWidget *pa p.drawImage((120 - nocover.width()) / 2, (120 - nocover.height()) / 2, nocover); p.end(); no_cover_icon_ = QPixmap::fromImage(square_nocover); +} +AlbumCoverManager::~AlbumCoverManager() { + CancelRequests(); +} + +void AlbumCoverManager::Init() { // View menu QActionGroup* filter_group = new QActionGroup(this); filter_all_ = filter_group->addAction(tr("All albums")); @@ -109,10 +114,6 @@ AlbumCoverManager::AlbumCoverManager(QNetworkAccessManager* network, QWidget *pa constructed_ = true; } -AlbumCoverManager::~AlbumCoverManager() { - CancelRequests(); -} - void AlbumCoverManager::CoverLoaderInitialised() { connect(cover_loader_->Worker().get(), SIGNAL(ImageLoaded(quint64,QImage)), SLOT(CoverImageLoaded(quint64,QImage))); @@ -143,7 +144,9 @@ void AlbumCoverManager::closeEvent(QCloseEvent *) { void AlbumCoverManager::CancelRequests() { cover_loading_tasks_.clear(); - cover_loader_->Worker()->Clear(); + if (cover_loader_ && cover_loader_->Worker()) { + cover_loader_->Worker()->Clear(); + } cover_fetching_tasks_.clear(); cover_fetcher_->Clear(); @@ -229,15 +232,40 @@ void AlbumCoverManager::UpdateFilter() { const bool hide_with_covers = filter_without_covers_->isChecked(); const bool hide_without_covers = filter_with_covers_->isChecked(); - for (int i=0 ; icount() ; ++i) { - QListWidgetItem* item = ui_.albums->item(i); - QString text = item->text(); - bool has_cover = item->icon().cacheKey() != no_cover_icon_.cacheKey(); - - item->setHidden((!filter.isEmpty() && !text.toLower().contains(filter)) || - (has_cover && hide_with_covers) || - (!has_cover && hide_without_covers)); + HideCovers hide = Hide_None; + if (hide_with_covers) { + hide = Hide_WithCovers; + } else if (hide_without_covers) { + hide = Hide_WithoutCovers; } + + for (int i = 0; i < ui_.albums->count(); ++i) { + QListWidgetItem* item = ui_.albums->item(i); + item->setHidden(ShouldHide(*item, filter, hide)); + } +} + +bool AlbumCoverManager::ShouldHide( + const QListWidgetItem& item, const QString& filter, HideCovers hide) const { + bool has_cover = item.icon().cacheKey() != no_cover_icon_.cacheKey(); + if (hide == Hide_WithCovers && has_cover) { + return true; + } else if (hide == Hide_WithoutCovers && !has_cover) { + return true; + } + + if (filter.isEmpty()) { + return false; + } + + QStringList query = filter.split(' '); + foreach (const QString& s, query) { + if (item.text().contains(s, Qt::CaseInsensitive)) { + return false; + } + } + + return true; } void AlbumCoverManager::FetchAlbumCovers() { diff --git a/src/albumcovermanager.h b/src/albumcovermanager.h index 73685a30c..e7d5801d7 100644 --- a/src/albumcovermanager.h +++ b/src/albumcovermanager.h @@ -22,6 +22,8 @@ #include +#include "gtest/gtest_prod.h" + #include "ui_albumcovermanager.h" #include "backgroundthread.h" #include "albumcoverloader.h" @@ -41,6 +43,8 @@ class AlbumCoverManager : public QDialog { void Reset(); + void Init(); + public slots: void SetBackend(boost::shared_ptr backend); @@ -80,8 +84,16 @@ class AlbumCoverManager : public QDialog { Role_PathManual, }; + enum HideCovers { + Hide_None, + Hide_WithCovers, + Hide_WithoutCovers, + }; + void CancelRequests(); + bool ShouldHide(const QListWidgetItem& item, const QString& filter, HideCovers hide) const; + private: bool constructed_; @@ -104,6 +116,10 @@ class AlbumCoverManager : public QDialog { QMenu* context_menu_; QList context_menu_items_; + + FRIEND_TEST(AlbumCoverManagerTest, HidesItemsWithCover); + FRIEND_TEST(AlbumCoverManagerTest, HidesItemsWithoutCover); + FRIEND_TEST(AlbumCoverManagerTest, HidesItemsWithFilter); }; #endif // ALBUMCOVERMANAGER_H diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 3da809711..d6698a4d4 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -114,6 +114,8 @@ MainWindow::MainWindow(QNetworkAccessManager* network, QWidget *parent) ui_.radio_view->setModel(radio_model_); + cover_manager_->Init(); + // File view connections connect(ui_.file_view, SIGNAL(Queue(QList)), SLOT(QueueFiles(QList))); connect(ui_.file_view, SIGNAL(PathChanged(QString)), SLOT(FilePathChanged(QString))); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5330ed772..a7d560df4 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -75,3 +75,4 @@ add_test_file(librarybackend_test.cpp) add_test_file(albumcoverfetcher_test.cpp) add_test_file(xspfparser_test.cpp) add_test_file(library_test.cpp) +add_test_file(albumcovermanager_test.cpp) diff --git a/tests/albumcovermanager_test.cpp b/tests/albumcovermanager_test.cpp new file mode 100644 index 000000000..59e45f57a --- /dev/null +++ b/tests/albumcovermanager_test.cpp @@ -0,0 +1,42 @@ +#include "albumcovermanager.h" + +#include "gtest/gtest.h" + +#include "mock_networkaccessmanager.h" + +class AlbumCoverManagerTest : public ::testing::Test { + protected: + AlbumCoverManagerTest() + : manager_(&network_) { + } + + MockNetworkAccessManager network_; + AlbumCoverManager manager_; +}; + +TEST_F(AlbumCoverManagerTest, HidesItemsWithCover) { + QListWidgetItem hidden_item; + EXPECT_TRUE(manager_.ShouldHide(hidden_item, QString(), AlbumCoverManager::Hide_WithCovers)); + QListWidgetItem shown_item; + shown_item.setIcon(manager_.no_cover_icon_); + EXPECT_FALSE(manager_.ShouldHide(shown_item, QString(), AlbumCoverManager::Hide_WithCovers)); +} + +TEST_F(AlbumCoverManagerTest, HidesItemsWithoutCover) { + QListWidgetItem hidden_item; + hidden_item.setIcon(manager_.no_cover_icon_); + EXPECT_TRUE(manager_.ShouldHide(hidden_item, QString(), AlbumCoverManager::Hide_WithoutCovers)); + QListWidgetItem shown_item; + EXPECT_FALSE(manager_.ShouldHide(shown_item, QString(), AlbumCoverManager::Hide_WithoutCovers)); +} + +TEST_F(AlbumCoverManagerTest, HidesItemsWithFilter) { + QListWidgetItem hidden_item; + hidden_item.setText("barbaz"); + EXPECT_TRUE(manager_.ShouldHide(hidden_item, "foo", AlbumCoverManager::Hide_None)); + EXPECT_TRUE(manager_.ShouldHide(hidden_item, "foo abc", AlbumCoverManager::Hide_None)); + QListWidgetItem shown_item; + shown_item.setText("foobar"); + EXPECT_FALSE(manager_.ShouldHide(shown_item, "foo", AlbumCoverManager::Hide_None)); + EXPECT_FALSE(manager_.ShouldHide(shown_item, "abc bar", AlbumCoverManager::Hide_None)); +} diff --git a/tests/main.cpp b/tests/main.cpp index 42a0a2e90..6de11cda2 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -25,7 +25,7 @@ int main(int argc, char** argv) { testing::InitGoogleMock(&argc, argv); testing::AddGlobalTestEnvironment(new MetatypesEnvironment); - QCoreApplication a(argc, argv); + QApplication a(argc, argv); testing::AddGlobalTestEnvironment(new ResourcesEnvironment); return RUN_ALL_TESTS();