Split search query in cover manager.

Add unit tests.
Fixes issue #119
This commit is contained in:
John Maguire 2010-03-26 12:22:19 +00:00
parent 5b468823d6
commit 2b812a76fd
6 changed files with 105 additions and 16 deletions

View File

@ -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 ; i<ui_.albums->count() ; ++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() {

View File

@ -22,6 +22,8 @@
#include <boost/shared_ptr.hpp>
#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<LibraryBackendInterface> 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<QListWidgetItem*> context_menu_items_;
FRIEND_TEST(AlbumCoverManagerTest, HidesItemsWithCover);
FRIEND_TEST(AlbumCoverManagerTest, HidesItemsWithoutCover);
FRIEND_TEST(AlbumCoverManagerTest, HidesItemsWithFilter);
};
#endif // ALBUMCOVERMANAGER_H

View File

@ -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<QUrl>)), SLOT(QueueFiles(QList<QUrl>)));
connect(ui_.file_view, SIGNAL(PathChanged(QString)), SLOT(FilePathChanged(QString)));

View File

@ -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)

View File

@ -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));
}

View File

@ -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();