#include "select_volume.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "scraper_tableview.h" #include "scraper_lineedit.h" #include "volumes_model.h" #include "comic_vine_client.h" #include "scraper_scroll_label.h" #include "response_parser.h" #include "scraper_results_paginator.h" SelectVolume::SelectVolume(QWidget *parent) : ScraperSelector(parent), model(0) { proxyModel = new QSortFilterProxyModel; proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); QString labelStylesheet = "QLabel {color:white; font-size:12px;font-family:Arial;}"; QLabel *label = new QLabel(tr("Please, select the right series for your comic.")); label->setStyleSheet(labelStylesheet); auto l = new QVBoxLayout; QWidget *leftWidget = new QWidget; auto left = new QVBoxLayout; auto content = new QGridLayout; auto top = new QHBoxLayout; // widgets cover = new QLabel(); cover->setScaledContents(true); cover->setAlignment(Qt::AlignTop | Qt::AlignHCenter); cover->setMinimumSize(168, 168 * 5.0 / 3); cover->setStyleSheet("QLabel {background-color: #2B2B2B; color:white; font-size:12px; font-family:Arial; }"); detailLabel = new ScraperScrollLabel(); tableVolumes = new ScraperTableView(); tableVolumes->setSortingEnabled(true); tableVolumes->horizontalHeader()->setSectionsClickable(true); filterEdit = new ScraperLineEdit(tr("Filter:")); filterEdit->setMaximumWidth(200); filterEdit->setClearButtonEnabled(true); connect(filterEdit, &QLineEdit::textChanged, proxyModel, &QSortFilterProxyModel::setFilterFixedString); connect(tableVolumes->horizontalHeader(), &QHeaderView::sectionClicked, this, [=](int index) { tableVolumes->horizontalHeader()->sortIndicatorSection() == index ? tableVolumes->sortByColumn(index, tableVolumes->horizontalHeader()->sortIndicatorOrder() == Qt::AscendingOrder ? Qt::DescendingOrder : Qt::AscendingOrder) : tableVolumes->sortByColumn(index, Qt::AscendingOrder); }); // connections connect(tableVolumes, &QAbstractItemView::clicked, this, &SelectVolume::loadVolumeInfo); paginator->setCustomLabel(tr("volumes")); top->addWidget(label); top->addStretch(); top->addWidget(filterEdit); left->addWidget(cover); left->addWidget(detailLabel, 1); leftWidget->setMaximumWidth(180); leftWidget->setLayout(left); left->setContentsMargins(0, 0, 0, 0); leftWidget->setContentsMargins(0, 0, 0, 0); content->addWidget(leftWidget, 0, 0); content->addWidget(tableVolumes, 0, 1); content->addWidget(paginator, 1, 1); content->setColumnStretch(1, 1); content->setRowStretch(0, 1); l->addSpacing(15); l->addLayout(top); l->addSpacing(5); l->addLayout(content); l->setContentsMargins(0, 0, 0, 0); setLayout(l); setContentsMargins(0, 0, 0, 0); } void SelectVolume::load(const QString &json, const QString &searchString) { auto tempM = new VolumesModel(); tempM->load(json); // tableVolumes->setModel(tempM); proxyModel->setSourceModel(tempM); tableVolumes->setModel(proxyModel); tableVolumes->sortByColumn(0, Qt::AscendingOrder); tableVolumes->resizeColumnsToContents(); if (model != 0) delete model; model = tempM; if (model->rowCount() > 0) { tableVolumes->selectRow(0); loadVolumeInfo(proxyModel->index(0, 0)); } tableVolumes->setColumnWidth(0, 350); ScraperSelector::load(json, searchString); } void SelectVolume::clearFilter() { filterEdit->clear(); } SelectVolume::~SelectVolume() { } void SelectVolume::loadVolumeInfo(const QModelIndex &omi) { QString msgStyle = "%1"; QModelIndex mi = proxyModel->mapToSource(omi); if (!mi.isValid()) { cover->clear(); detailLabel->setAltText(msgStyle.arg(tr("Nothing found, clear the filter if any."))); return; } QString coverURL = model->getCoverURL(mi); QString id = model->getVolumeId(mi); cover->setText(msgStyle.arg(tr("loading cover"))); detailLabel->setAltText(msgStyle.arg(tr("loading description"))); auto comicVineClient = new ComicVineClient; connect(comicVineClient, &ComicVineClient::seriesCover, this, &SelectVolume::setCover); connect(comicVineClient, &ComicVineClient::finished, comicVineClient, &QObject::deleteLater); comicVineClient->getSeriesCover(coverURL); auto comicVineClient2 = new ComicVineClient; connect(comicVineClient2, &ComicVineClient::seriesDetail, this, &SelectVolume::setDescription); connect(comicVineClient2, &ComicVineClient::finished, comicVineClient2, &QObject::deleteLater); comicVineClient2->getSeriesDetail(id); } 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(w) / h; cover->setFixedSize(180, static_cast(180 / aspectRatio)); cover->update(); } void SelectVolume::setDescription(const QString &jsonDetail) { QJsonParseError Err; QVariantMap sc = QJsonDocument::fromJson(jsonDetail.toUtf8(), &Err).toVariant().toMap(); if (Err.error != QJsonParseError::NoError) { qDebug("Error detected"); return; } QVariant descriptionValues = sc.value("results").toMap().value("description"); bool valid = !descriptionValues.isNull() && descriptionValues.isValid(); detailLabel->setText(valid ? descriptionValues.toString().replace("getVolumeId(proxyModel->mapToSource(tableVolumes->currentIndex())); } int SelectVolume::getSelectedVolumeNumIssues() { return model->getNumIssues(proxyModel->mapToSource(tableVolumes->currentIndex())); } QString SelectVolume::getSelectedVolumePublisher() { return model->getPublisher(proxyModel->mapToSource(tableVolumes->currentIndex())); }