SelectVolume loads covers from ComicVine

This commit is contained in:
Luis Ángel San Martín 2013-10-12 21:18:59 +02:00
parent 9938167a90
commit 80d0236010
8 changed files with 112 additions and 47 deletions

View File

@ -9,9 +9,9 @@ static const QString CV_WEB_ADDRESS = "http://www.comicvine.com/api";
//gets any volumen containing any comic matching 'query' //gets any volumen containing any comic matching 'query'
static const QString CV_SEARCH = CV_WEB_ADDRESS + "/search/?api_key=" + CV_API_KEY + static const QString CV_SEARCH = CV_WEB_ADDRESS + "/search/?api_key=" + CV_API_KEY +
"&format=json&limit=100&resources=volume" "&format=json&limit=100&resources=volume"
"&field_list=name,start_year,publisher,id,image,count_of_issues" "&field_list=name,start_year,publisher,id,image,count_of_issues,deck"
"&query=%1&page=%2"; "&query=%1&page=%2";
//http://www.comicvine.com/api/search/?api_key=46680bebb358f1de690a5a365e15d325f9649f91&format=json&limit=100&resources=volume&field_list=name,start_year,publisher,id,image,count_of_issues&query=superman //http://www.comicvine.com/api/search/?api_key=46680bebb358f1de690a5a365e15d325f9649f91&format=json&limit=100&resources=volume&field_list=name,start_year,publisher,id,image,count_of_issues,deck&query=superman
//gets the detail for a volume %1 //gets the detail for a volume %1
static const QString CV_SERIES_DETAIL = CV_WEB_ADDRESS + "/volume/4050-%1/?api_key=" + CV_API_KEY + static const QString CV_SERIES_DETAIL = CV_WEB_ADDRESS + "/volume/4050-%1/?api_key=" + CV_API_KEY +
@ -54,6 +54,7 @@ void ComicVineClient::proccessVolumesSearchData(const QByteArray & data)
{ {
QString json(data); QString json(data);
emit searchResult(json); emit searchResult(json);
emit finished();
} }
void ComicVineClient::queryTimeOut() void ComicVineClient::queryTimeOut()

View File

@ -13,6 +13,7 @@ public:
signals: signals:
void searchResult(QString); void searchResult(QString);
void finished();
public slots: public slots:
void search(const QString & query, int page = 0); void search(const QString & query, int page = 0);
void getSeriesDetail(const QString & id); void getSeriesDetail(const QString & id);

View File

@ -22,7 +22,7 @@
ComicVineDialog::ComicVineDialog(QWidget *parent) : ComicVineDialog::ComicVineDialog(QWidget *parent) :
QDialog(parent),comicVineClient(new ComicVineClient) QDialog(parent)
{ {
doLayout(); doLayout();
doStackedWidgets(); doStackedWidgets();
@ -77,11 +77,11 @@ void ComicVineDialog::doLayout()
void ComicVineDialog::doStackedWidgets() void ComicVineDialog::doStackedWidgets()
{ {
doLoading(); doLoading();
content->addWidget(seriesQuestion = new SeriesQuestion); content->addWidget(seriesQuestionWidget = new SeriesQuestion);
content->addWidget(searchSingleComic = new SearchSingleComic); content->addWidget(searchSingleComicWidget = new SearchSingleComic);
content->addWidget(searchVolume = new SearchVolume); content->addWidget(searchVolumeWidget = new SearchVolume);
content->addWidget(selectVolume = new SelectVolume); content->addWidget(selectVolumeWidget = new SelectVolume);
content->addWidget(selectComic = new SelectComic); content->addWidget(selectComicWidget = new SelectComic);
} }
void ComicVineDialog::doConnections() void ComicVineDialog::doConnections()
@ -89,16 +89,14 @@ void ComicVineDialog::doConnections()
connect(closeButton,SIGNAL(clicked()),this,SLOT(close())); connect(closeButton,SIGNAL(clicked()),this,SLOT(close()));
connect(nextButton,SIGNAL(clicked()),this,SLOT(goNext())); connect(nextButton,SIGNAL(clicked()),this,SLOT(goNext()));
connect(searchButton,SIGNAL(clicked()),this,SLOT(search())); connect(searchButton,SIGNAL(clicked()),this,SLOT(search()));
connect(comicVineClient,SIGNAL(searchResult(QString)),this,SLOT(debugClientResults(QString)));
} }
void ComicVineDialog::goNext() void ComicVineDialog::goNext()
{ {
// //
if(content->currentWidget() == seriesQuestion) if(content->currentWidget() == seriesQuestionWidget)
{ {
if(seriesQuestion->getYes()) if(seriesQuestionWidget->getYes())
{ {
QString volumeSearchString = comics[0].getParentFolderName(); QString volumeSearchString = comics[0].getParentFolderName();
@ -107,7 +105,7 @@ void ComicVineDialog::goNext()
else else
{ {
showLoading(); showLoading();
comicVineClient->search(volumeSearchString); searchVolume(volumeSearchString);
status = AutoSearching; status = AutoSearching;
} }
@ -120,12 +118,12 @@ void ComicVineDialog::goNext()
titleHeader->setSubTitle(tr("comic %1 of %2 - %3").arg(currentIndex+1).arg(comics.length()).arg(title)); titleHeader->setSubTitle(tr("comic %1 of %2 - %3").arg(currentIndex+1).arg(comics.length()).arg(title));
showLoading(); showLoading();
comicVineClient->search(title); searchVolume(title);
status = AutoSearching; status = AutoSearching;
mode = SingleComicInList; mode = SingleComicInList;
} }
} }
else if (content->currentWidget() == searchSingleComic) { else if (content->currentWidget() == searchSingleComicWidget) {
} }
} }
@ -148,7 +146,7 @@ void ComicVineDialog::show()
titleHeader->setSubTitle(title); titleHeader->setSubTitle(title);
showLoading(); showLoading();
comicVineClient->search(title); searchVolume(title);
status = AutoSearching; status = AutoSearching;
mode = SingleComic; mode = SingleComic;
}else if(comics.length()>1) }else if(comics.length()>1)
@ -205,7 +203,7 @@ void ComicVineDialog::debugClientResults(const QString & string)
void ComicVineDialog::showSeriesQuestion() void ComicVineDialog::showSeriesQuestion()
{ {
status = AskingForInfo; status = AskingForInfo;
content->setCurrentWidget(seriesQuestion); content->setCurrentWidget(seriesQuestionWidget);
backButton->setHidden(true); backButton->setHidden(true);
skipButton->setHidden(true); skipButton->setHidden(true);
nextButton->setVisible(true); nextButton->setVisible(true);
@ -216,7 +214,7 @@ void ComicVineDialog::showSeriesQuestion()
void ComicVineDialog::showSearchSingleComic() void ComicVineDialog::showSearchSingleComic()
{ {
status = AskingForInfo; status = AskingForInfo;
content->setCurrentWidget(searchSingleComic); content->setCurrentWidget(searchSingleComicWidget);
backButton->setHidden(true); backButton->setHidden(true);
skipButton->setHidden(true); skipButton->setHidden(true);
nextButton->setHidden(true); nextButton->setHidden(true);
@ -227,7 +225,7 @@ void ComicVineDialog::showSearchSingleComic()
void ComicVineDialog::showSearchVolume() void ComicVineDialog::showSearchVolume()
{ {
status = AskingForInfo; status = AskingForInfo;
content->setCurrentWidget(searchVolume); content->setCurrentWidget(searchVolumeWidget);
backButton->setHidden(true); backButton->setHidden(true);
nextButton->setHidden(true); nextButton->setHidden(true);
searchButton->setVisible(true); searchButton->setVisible(true);
@ -241,14 +239,14 @@ void ComicVineDialog::showSearchVolume()
void ComicVineDialog::showSelectVolume(const QString & json) void ComicVineDialog::showSelectVolume(const QString & json)
{ {
content->setCurrentWidget(selectVolume); content->setCurrentWidget(selectVolumeWidget);
selectVolume->load(json); selectVolumeWidget->load(json);
} }
void ComicVineDialog::showSelectComic(const QString &json) void ComicVineDialog::showSelectComic(const QString &json)
{ {
content->setCurrentWidget(selectComic); content->setCurrentWidget(selectComicWidget);
selectComic->load(json); selectComicWidget->load(json);
} }
void ComicVineDialog::showLoading() void ComicVineDialog::showLoading()
@ -273,22 +271,30 @@ void ComicVineDialog::search()
} }
} }
void ComicVineDialog::searchVolume(const QString &v)
{
ComicVineClient * comicVineClient = new ComicVineClient;
connect(comicVineClient,SIGNAL(searchResult(QString)),this,SLOT(debugClientResults(QString)));
connect(comicVineClient,SIGNAL(finished()),comicVineClient,SLOT(deleteLater()));
comicVineClient->search(v);
}
void ComicVineDialog::launchSearchVolume() void ComicVineDialog::launchSearchVolume()
{ {
showLoading(); showLoading();
//TODO: check if volume info is empty. //TODO: check if volume info is empty.
comicVineClient->search(searchVolume->getVolumeInfo()); searchVolume(searchVolumeWidget->getVolumeInfo());
} }
void ComicVineDialog::launchSearchComic() void ComicVineDialog::launchSearchComic()
{ {
showLoading(); showLoading();
QString volumeInfo = searchSingleComic->getVolumeInfo(); QString volumeInfo = searchSingleComicWidget->getVolumeInfo();
QString comicInfo = searchSingleComic->getComicInfo(); QString comicInfo = searchSingleComicWidget->getComicInfo();
int comicNumber = searchSingleComic->getComicNumber(); int comicNumber = searchSingleComicWidget->getComicNumber();
if(comicInfo.isEmpty() && comicNumber == -1) if(comicInfo.isEmpty() && comicNumber == -1)
comicVineClient->search(volumeInfo); searchVolume(volumeInfo);
} }

View File

@ -41,6 +41,7 @@ protected slots:
void showSearchVolume(); void showSearchVolume();
void showLoading(); void showLoading();
void search(); void search();
void searchVolume(const QString & v);
void launchSearchVolume(); void launchSearchVolume();
void launchSearchComic(); void launchSearchComic();
void showSelectVolume(const QString & json); void showSelectVolume(const QString & json);
@ -65,8 +66,6 @@ private:
ScrapperMode mode; ScrapperMode mode;
ScrapperStatus status; ScrapperStatus status;
ComicVineClient * comicVineClient;
int currentIndex; int currentIndex;
TitleHeader * titleHeader; TitleHeader * titleHeader;
@ -90,11 +89,11 @@ private:
QList<ComicDB> comics; QList<ComicDB> comics;
SeriesQuestion * seriesQuestion; SeriesQuestion * seriesQuestionWidget;
SearchSingleComic * searchSingleComic; SearchSingleComic * searchSingleComicWidget;
SearchVolume * searchVolume; SearchVolume * searchVolumeWidget;
SelectVolume * selectVolume; SelectVolume * selectVolumeWidget;
SelectComic * selectComic; SelectComic * selectComicWidget;
}; };
#endif // COMIC_VINE_DIALOG_H #endif // COMIC_VINE_DIALOG_H

View File

@ -28,15 +28,18 @@ void VolumesModel::load(const QString &json)
int numResults = sc.property("number_of_total_results").toString().toInt(); //fix to weird behaviour using hasNext int numResults = sc.property("number_of_total_results").toString().toInt(); //fix to weird behaviour using hasNext
QScriptValueIterator it(sc.property("results")); QScriptValueIterator it(sc.property("results"));
bool test; bool test;
QScriptValue resultsValue;
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
QString numIssues = it.value().property("count_of_issues").toString(); resultsValue = it.value();
QString year = it.value().property("start_year").toString(); QString numIssues = resultsValue.property("count_of_issues").toString();
QString name = it.value().property("name").toString(); QString year = resultsValue.property("start_year").toString();
QString publisher = it.value().property("publisher").property("name").toString(); QString name = resultsValue.property("name").toString();
QString url = it.value().property("image").property("screen_url").toString(); QString publisher = resultsValue.property("publisher").property("name").toString();
QString url = resultsValue.property("image").property("medium_url").toString();
QString deck = resultsValue.property("deck").toString();
QStringList & l = *(new QStringList); QStringList & l = *(new QStringList);
l << name << year << numIssues << publisher << url; l << name << year << numIssues << publisher << url << deck;
test = name.isEmpty() && year.isEmpty() && numIssues.isEmpty() && url.isEmpty(); test = name.isEmpty() && year.isEmpty() && numIssues.isEmpty() && url.isEmpty();
if(numResults>0 && !test) if(numResults>0 && !test)
_data.push_back(&l); _data.push_back(&l);

View File

@ -21,6 +21,7 @@ public:
QVariant headerData(int section, Qt::Orientation orientation, QVariant headerData(int section, Qt::Orientation orientation,
int role = Qt::DisplayRole) const; int role = Qt::DisplayRole) const;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
signals: signals:
public slots: public slots:
@ -28,11 +29,14 @@ public slots:
private: private:
QList <QList <QString> * > _data; QList <QList <QString> * > _data;
public:
enum Column { enum Column {
SERIES, SERIES = 0,
YEAR, YEAR,
ISSUES, ISSUES,
PUBLISHER PUBLISHER,
COVER_URL,
DECK
}; };
}; };

View File

@ -6,8 +6,10 @@
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QHeaderView> #include <QHeaderView>
#include <QScrollBar> #include <QScrollBar>
#include <QModelIndex>
#include "volumes_model.h" #include "volumes_model.h"
#include "http_worker.h"
SelectVolume::SelectVolume(QWidget *parent) SelectVolume::SelectVolume(QWidget *parent)
:QWidget(parent),model(0) :QWidget(parent),model(0)
@ -40,8 +42,11 @@ SelectVolume::SelectVolume(QWidget *parent)
//widgets //widgets
cover = new QLabel(); cover = new QLabel();
cover->setScaledContents(true);
cover->setAlignment(Qt::AlignTop|Qt::AlignHCenter);
detailLabel = new QLabel(); detailLabel = new QLabel();
detailLabel->setStyleSheet(labelStylesheet); detailLabel->setStyleSheet(labelStylesheet);
detailLabel->setWordWrap(true);
tableVolumes = new QTableView(); tableVolumes = new QTableView();
tableVolumes->setStyleSheet(tableStylesheet); tableVolumes->setStyleSheet(tableStylesheet);
@ -78,17 +83,23 @@ SelectVolume::SelectVolume(QWidget *parent)
tableVolumes->setSelectionMode(QAbstractItemView::SingleSelection); tableVolumes->setSelectionMode(QAbstractItemView::SingleSelection);
//connections
connect(tableVolumes,SIGNAL(clicked(QModelIndex)),this,SLOT(loadVolumeInfo(QModelIndex)));
left->addWidget(cover); left->addWidget(cover);
left->addWidget(detailLabel); left->addWidget(detailLabel);
left->addStretch(); left->addStretch();
leftWidget->setMaximumWidth(168); leftWidget->setMaximumWidth(180);
leftWidget->setLayout(left); leftWidget->setLayout(left);
left->setContentsMargins(0,0,0,0);
leftWidget->setContentsMargins(0,0,0,0);
content->addWidget(leftWidget); content->addWidget(leftWidget);
content->addWidget(tableVolumes,0,Qt::AlignRight); content->addWidget(tableVolumes,0,Qt::AlignRight|Qt::AlignTop);
l->addSpacing(15); l->addSpacing(15);
l->addWidget(label); l->addWidget(label);
l->addSpacing(5);
l->addLayout(content); l->addLayout(content);
l->addStretch(); l->addStretch();
@ -99,7 +110,7 @@ SelectVolume::SelectVolume(QWidget *parent)
void SelectVolume::load(const QString & json) void SelectVolume::load(const QString & json)
{ {
VolumesModel * tempM = new VolumesModel();; VolumesModel * tempM = new VolumesModel();
tempM->load(json); tempM->load(json);
tableVolumes->setModel(tempM); tableVolumes->setModel(tempM);
@ -107,11 +118,47 @@ void SelectVolume::load(const QString & json)
tableVolumes->setFixedSize(419,341); tableVolumes->setFixedSize(419,341);
if(tempM->rowCount()>0)
{
tableVolumes->selectRow(0);
loadVolumeInfo(tempM->index(0,0));
}
if(model != 0) if(model != 0)
delete model; delete model;
else else
model = tempM; model = tempM;
} }
SelectVolume::~SelectVolume() {} SelectVolume::~SelectVolume() {}
void SelectVolume::loadVolumeInfo(const QModelIndex & mi)
{
QStringList * data = static_cast<QStringList *>(mi.internalPointer());
QString coverURL = data->at(VolumesModel::COVER_URL);
QString deck = data->at(VolumesModel::DECK);
//cover->setText(coverURL);
detailLabel->setText(deck);
HttpWorker * search = new HttpWorker(coverURL);
connect(search,SIGNAL(dataReady(const QByteArray &)),this,SLOT(setCover(const QByteArray &)));
connect(search,SIGNAL(timeout()),this,SLOT(queryTimeOut())); //TODO
connect(search,SIGNAL(finished()),search,SLOT(deleteLater()));
search->get();
}
void SelectVolume::setCover(const QByteArray & data)
{
QPixmap p;
p.loadFromData(data);
int w = p.width();
int h = p.height();
cover->setPixmap(p);
float aspectRatio = static_cast<float>(w)/h;
cover->setFixedSize(180,static_cast<int>(180/aspectRatio));
cover->update();
}

View File

@ -6,6 +6,7 @@
class QLabel; class QLabel;
class QTableView; class QTableView;
class VolumesModel; class VolumesModel;
class QModelIndex;
class SelectVolume : public QWidget class SelectVolume : public QWidget
{ {
@ -14,6 +15,9 @@ public:
SelectVolume(QWidget * parent = 0); SelectVolume(QWidget * parent = 0);
void load(const QString & json); void load(const QString & json);
virtual ~SelectVolume(); virtual ~SelectVolume();
public slots:
void loadVolumeInfo(const QModelIndex & mi);
void setCover(const QByteArray &);
private: private:
QLabel * cover; QLabel * cover;
QLabel * detailLabel; QLabel * detailLabel;