From ef74a23b2fbb36d07eb877776a8c26c40a460cf8 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Wed, 4 Jan 2012 23:51:52 +0100 Subject: [PATCH] Various fixes and improvments to online resources --- src/utils/abstractservice.h | 2 + src/utils/archiveorg.cpp | 17 +++-- src/utils/freesound.cpp | 5 +- src/utils/openclipart.cpp | 43 ++++++----- src/utils/resourcewidget.cpp | 138 +++++++++++++++++++++++++---------- src/utils/resourcewidget.h | 15 +++- src/widgets/freesound_ui.ui | 65 ++++------------- 7 files changed, 168 insertions(+), 117 deletions(-) diff --git a/src/utils/abstractservice.h b/src/utils/abstractservice.h index 7f7c4ed0..cf514734 100644 --- a/src/utils/abstractservice.h +++ b/src/utils/abstractservice.h @@ -91,6 +91,8 @@ signals: void gotMetaInfo(QMap info); /** @brief We have an url for current item's preview thumbnail. */ void gotThumb(const QString url); + /** @brief The requested search query is finished. */ + void searchDone(); }; diff --git a/src/utils/archiveorg.cpp b/src/utils/archiveorg.cpp index de4bb332..86f9c7d1 100644 --- a/src/utils/archiveorg.cpp +++ b/src/utils/archiveorg.cpp @@ -117,6 +117,7 @@ void ArchiveOrg::slotShowResults(KJob* job) #endif m_listWidget->blockSignals(false); m_listWidget->setCurrentRow(0); + emit searchDone(); } @@ -138,10 +139,12 @@ OnlineItemInfo ArchiveOrg::displayItemDetails(QListWidgetItem *item) info.description = item->data(descriptionRole).toString(); m_metaInfo.insert("url", info.itemDownload); + m_metaInfo.insert("id", info.itemId); QString extraInfoUrl = item->data(downloadRole).toString(); if (!extraInfoUrl.isEmpty()) { KJob* resolveJob = KIO::storedGet( KUrl(extraInfoUrl), KIO::NoReload, KIO::HideProgressInfo ); + resolveJob->setProperty("id", info.itemId); connect( resolveJob, SIGNAL( result( KJob* ) ), this, SLOT( slotParseResults( KJob* ) ) ); } return info; @@ -152,7 +155,7 @@ void ArchiveOrg::slotParseResults(KJob* job) { KIO::StoredTransferJob* storedQueryJob = static_cast( job ); QDomDocument doc; - doc.setContent(storedQueryJob->data()); + doc.setContent(QString::fromUtf8(storedQueryJob->data())); QDomNodeList links = doc.elementsByTagName("a"); QString html = QString(""; @@ -165,6 +168,7 @@ void ArchiveOrg::slotParseResults(KJob* job) // sub folder contains image thumbs, display one. m_thumbsPath = m_metaInfo.value("url") + "/" + href; KJob* thumbJob = KIO::storedGet( KUrl(m_thumbsPath), KIO::NoReload, KIO::HideProgressInfo ); + thumbJob->setProperty("id", m_metaInfo.value("id")); connect( thumbJob, SIGNAL( result( KJob* ) ), this, SLOT( slotParseThumbs( KJob* ) ) ); } else if (!href.contains('/') && !href.endsWith(".xml")) { @@ -174,11 +178,11 @@ void ArchiveOrg::slotParseResults(KJob* job) html += ""; } else html += ""; - html += "").arg(link + "_preview").arg(link); + html += "").arg(link).arg(i18n("Preview")).arg(link + "_import").arg(i18n("Import")); } } html += "
" + KUrl(link).fileName() + QString("previewdownload
" + KUrl(link).fileName() + QString("%2%4
"; - emit gotMetaInfo(html); + if (m_metaInfo.value("id") == job->property("id").toString()) emit gotMetaInfo(html); } @@ -195,7 +199,7 @@ bool ArchiveOrg::startItemPreview(QListWidgetItem *item) } -void ArchiveOrg::stopItemPreview(QListWidgetItem *item) +void ArchiveOrg::stopItemPreview(QListWidgetItem */*item*/) { if (m_previewProcess && m_previewProcess->state() != QProcess::NotRunning) { m_previewProcess->close(); @@ -219,14 +223,15 @@ void ArchiveOrg::slotParseThumbs(KJob* job) { KIO::StoredTransferJob* storedQueryJob = static_cast( job ); QDomDocument doc; - doc.setContent(storedQueryJob->data()); + doc.setContent(QString::fromUtf8(storedQueryJob->data())); QDomNodeList links = doc.elementsByTagName("a"); if (links.isEmpty()) return; for (int i = 0; i < links.count(); i++) { QString href = links.at(i).toElement().attribute("href"); if (!href.contains('/') && i >= links.count() / 2) { QString thumbUrl = m_thumbsPath + href; - emit gotThumb(thumbUrl); + if (m_metaInfo.value("id") == job->property("id").toString()) + emit gotThumb(thumbUrl); break; } } diff --git a/src/utils/freesound.cpp b/src/utils/freesound.cpp index 5cbdf878..c74054ff 100644 --- a/src/utils/freesound.cpp +++ b/src/utils/freesound.cpp @@ -117,6 +117,7 @@ void FreeSound::slotShowResults(KJob* job) #endif m_listWidget->blockSignals(false); m_listWidget->setCurrentRow(0); + emit searchDone(); } @@ -204,7 +205,7 @@ void FreeSound::slotParseResults(KJob* job) } html +=""; if (infos.contains("description")) { - html += "" + infos.value("description").toString() + ""; + m_metaInfo.insert("description", infos.value("description").toString()); } } emit gotMetaInfo(html); @@ -226,7 +227,7 @@ bool FreeSound::startItemPreview(QListWidgetItem *item) } -void FreeSound::stopItemPreview(QListWidgetItem *item) +void FreeSound::stopItemPreview(QListWidgetItem */*item*/) { if (m_previewProcess && m_previewProcess->state() != QProcess::NotRunning) { m_previewProcess->close(); diff --git a/src/utils/openclipart.cpp b/src/utils/openclipart.cpp index 0ba51fa4..a1202661 100644 --- a/src/utils/openclipart.cpp +++ b/src/utils/openclipart.cpp @@ -58,30 +58,29 @@ void OpenClipArt::slotShowResults(KJob* job) KIO::StoredTransferJob* storedQueryJob = static_cast( job ); QDomDocument doc; - doc.setContent(storedQueryJob->data()); - QDomNodeList items = doc.documentElement().elementsByTagName("item"); - for (int i = 0; i < items.count(); i++) { - QDomElement currentClip = items.at(i).toElement(); - QDomElement title = currentClip.firstChildElement("title"); - QListWidgetItem *item = new QListWidgetItem(title.firstChild().nodeValue(), m_listWidget); - QDomElement thumb = currentClip.firstChildElement("media:thumbnail"); - item->setData(imageRole, thumb.attribute("url")); - emit gotThumb(thumb.attribute("url")); - QDomElement enclosure = currentClip.firstChildElement("enclosure"); - item->setData(downloadRole, enclosure.attribute("url")); - QDomElement link = currentClip.firstChildElement("link"); - item->setData(infoUrl, link.firstChild().nodeValue()); - QDomElement license = currentClip.firstChildElement("cc:license"); - item->setData(licenseRole, license.firstChild().nodeValue()); - QDomElement desc = currentClip.firstChildElement("description"); - item->setData(descriptionRole, desc.firstChild().nodeValue()); - QDomElement author = currentClip.firstChildElement("dc:creator"); - item->setData(authorRole, author.firstChild().nodeValue()); - item->setData(authorUrl, QString("http://openclipart.org/user-detail/") + author.firstChild().nodeValue()); - } - + doc.setContent(QString::fromAscii(storedQueryJob->data())); + QDomNodeList items = doc.documentElement().elementsByTagName("item"); + for (int i = 0; i < items.count(); i++) { + QDomElement currentClip = items.at(i).toElement(); + QDomElement title = currentClip.firstChildElement("title"); + QListWidgetItem *item = new QListWidgetItem(title.firstChild().nodeValue(), m_listWidget); + QDomElement thumb = currentClip.firstChildElement("media:thumbnail"); + item->setData(imageRole, thumb.attribute("url")); + QDomElement enclosure = currentClip.firstChildElement("enclosure"); + item->setData(downloadRole, enclosure.attribute("url")); + QDomElement link = currentClip.firstChildElement("link"); + item->setData(infoUrl, link.firstChild().nodeValue()); + QDomElement license = currentClip.firstChildElement("cc:license"); + item->setData(licenseRole, license.firstChild().nodeValue()); + QDomElement desc = currentClip.firstChildElement("description"); + item->setData(descriptionRole, desc.firstChild().nodeValue()); + QDomElement author = currentClip.firstChildElement("dc:creator"); + item->setData(authorRole, author.firstChild().nodeValue()); + item->setData(authorUrl, QString("http://openclipart.org/user-detail/") + author.firstChild().nodeValue()); + } m_listWidget->blockSignals(false); m_listWidget->setCurrentRow(0); + emit searchDone(); } diff --git a/src/utils/resourcewidget.cpp b/src/utils/resourcewidget.cpp index cce38583..39c8ec52 100644 --- a/src/utils/resourcewidget.cpp +++ b/src/utils/resourcewidget.cpp @@ -27,7 +27,8 @@ #include #include #include -#include +#include +#include #include #include @@ -39,14 +40,17 @@ #include #include #include +#include +#include + #ifdef USE_NEPOMUK #if KDE_IS_VERSION(4,6,0) #include #include #include -#include #include +#include #include #include #endif @@ -71,11 +75,8 @@ ResourceWidget::ResourceWidget(const QString & folder, QWidget * parent) : connect(search_results, SIGNAL(currentRowChanged(int)), this, SLOT(slotUpdateCurrentSound())); connect(button_preview, SIGNAL(clicked()), this, SLOT(slotPlaySound())); connect(button_import, SIGNAL(clicked()), this, SLOT(slotSaveItem())); - connect(sound_author, SIGNAL(leftClickedUrl(const QString &)), this, SLOT(slotOpenUrl(const QString &))); connect(item_license, SIGNAL(leftClickedUrl(const QString &)), this, SLOT(slotOpenUrl(const QString &))); - connect(sound_name, SIGNAL(leftClickedUrl(const QString &)), this, SLOT(slotOpenUrl(const QString &))); connect(service_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChangeService())); - item_image->setFixedWidth(180); if (Solid::Networking::status() == Solid::Networking::Unconnected) { slotOffline(); } @@ -86,6 +87,17 @@ ResourceWidget::ResourceWidget(const QString & folder, QWidget * parent) : connect(page_number, SIGNAL(valueChanged(int)), this, SLOT(slotStartSearch(int))); connect(info_browser, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(slotOpenLink(const QUrl &))); + m_autoPlay = new QAction(i18n("Auto Play"), this); + m_autoPlay->setCheckable(true); + QMenu *resourceMenu = new QMenu; + resourceMenu->addAction(m_autoPlay); + config_button->setMenu(resourceMenu); + config_button->setIcon(KIcon("configure")); + + m_busyWidget = new KPixmapSequenceOverlayPainter(this); + m_busyWidget->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + m_busyWidget->setWidget(search_results->viewport()); + sound_box->setEnabled(false); search_text->setFocus(); #ifdef USE_NEPOMUK @@ -99,6 +111,7 @@ ResourceWidget::ResourceWidget(const QString & folder, QWidget * parent) : ResourceWidget::~ResourceWidget() { if (m_currentService) delete m_currentService; + KIO::NetAccess::removeTempFile(m_tmpThumbFile); } void ResourceWidget::slotStartSearch(int page) @@ -106,15 +119,19 @@ void ResourceWidget::slotStartSearch(int page) page_number->blockSignals(true); page_number->setValue(page); page_number->blockSignals(false); + m_busyWidget->start(); m_currentService->slotStartSearch(search_text->text(), page); } void ResourceWidget::slotUpdateCurrentSound() { - item_image->setEnabled(false); - if (!sound_autoplay->isChecked()) m_currentService->stopItemPreview(NULL); - info_browser->clear(); + KIO::NetAccess::removeTempFile(m_tmpThumbFile); + if (!m_autoPlay->isChecked()) m_currentService->stopItemPreview(NULL); item_license->clear(); + m_title.clear(); + m_image.clear(); + m_desc.clear(); + m_meta.clear(); QListWidgetItem *item = search_results->currentItem(); if (!item) { sound_box->setEnabled(false); @@ -122,13 +139,25 @@ void ResourceWidget::slotUpdateCurrentSound() } m_currentInfo = m_currentService->displayItemDetails(item); - if (sound_autoplay->isChecked()) m_currentService->startItemPreview(item); + if (m_autoPlay->isChecked() && m_currentService->hasPreview) m_currentService->startItemPreview(item); sound_box->setEnabled(true); - sound_name->setText(item->text()); - sound_name->setUrl(m_currentInfo.infoUrl); - sound_author->setText(m_currentInfo.author); - sound_author->setUrl(m_currentInfo.authorUrl); - if (!m_currentInfo.description.isEmpty()) info_browser->setHtml("" + m_currentInfo.description + ""); + QString title = "

" + m_currentInfo.itemName; + if (!m_currentInfo.infoUrl.isEmpty()) title += QString(" (%2)").arg(m_currentInfo.infoUrl).arg(i18nc("the url link pointing to a web page", "link")); + title.append("

"); + + if (!m_currentInfo.authorUrl.isEmpty()) { + title += QString("").arg(m_currentInfo.authorUrl); + if (!m_currentInfo.author.isEmpty()) + title.append(m_currentInfo.author); + else title.append(i18n("Author")); + title.append("
"); + } + else if (!m_currentInfo.author.isEmpty()) + title.append(m_currentInfo.author + "
"); + else title.append("
"); + + slotSetTitle(title); + if (!m_currentInfo.description.isEmpty()) slotSetDescription(m_currentInfo.description); if (!m_currentInfo.license.isEmpty()) parseLicense(m_currentInfo.license); } @@ -138,9 +167,10 @@ void ResourceWidget::slotLoadThumb(const QString url) KUrl img(url); if (img.isEmpty()) return; if (KIO::NetAccess::exists(img, KIO::NetAccess::SourceSide, this)) { - QString tmpFile; - if (KIO::NetAccess::download(img, tmpFile, this)) { - QPixmap pix(tmpFile); + if (KIO::NetAccess::download(img, m_tmpThumbFile, this)) { + slotSetImage(m_tmpThumbFile); + /*QPixmap pix(tmpFile); + int newHeight = pix.height() * item_image->width() / pix.width(); if (newHeight > 200) { item_image->setScaledContents(false); @@ -150,11 +180,9 @@ void ResourceWidget::slotLoadThumb(const QString url) item_image->setScaledContents(true); item_image->setFixedHeight(newHeight); } - item_image->setPixmap(pix); - KIO::NetAccess::removeTempFile(tmpFile); + item_image->setPixmap(pix);*/ } } - item_image->setEnabled(true); } @@ -163,6 +191,9 @@ void ResourceWidget::slotDisplayMetaInfo(QMap metaInfo) if (metaInfo.contains("license")) { parseLicense(metaInfo.value("license")); } + if (metaInfo.contains("description")) { + slotSetDescription(metaInfo.value("description")); + } } @@ -219,6 +250,11 @@ void ResourceWidget::slotSaveItem(const QString originalUrl) KFileItem info(entry, srcUrl); getJob->setSourceSize(info.size()); + getJob->setProperty("license", item_license->text()); + getJob->setProperty("licenseurl", item_license->url()); + getJob->setProperty("originurl", m_currentInfo.itemDownload); + if (!m_currentInfo.authorUrl.isEmpty()) getJob->setProperty("author", m_currentInfo.authorUrl); + else if (!m_currentInfo.author.isEmpty()) getJob->setProperty("author", m_currentInfo.author); connect(getJob, SIGNAL(result(KJob*)), this, SLOT(slotGotFile(KJob*))); getJob->start(); } @@ -231,14 +267,16 @@ void ResourceWidget::slotGotFile(KJob *job) #ifdef USE_NEPOMUK #if KDE_IS_VERSION(4,6,0) Nepomuk::Resource res( filePath ); - res.setProperty( Nepomuk::Vocabulary::NIE::license(), (Nepomuk::Variant) item_license->text() ); - res.setProperty( Nepomuk::Vocabulary::NIE::licenseType(), (Nepomuk::Variant) item_license->url() ); - res.setProperty( Nepomuk::Vocabulary::NDO::copiedFrom(), sound_name->url() ); + res.setProperty( Nepomuk::Vocabulary::NIE::license(), (Nepomuk::Variant) job->property("license") ); + res.setProperty( Nepomuk::Vocabulary::NIE::licenseType(), (Nepomuk::Variant) job->property("licenseurl") ); + res.setProperty( Nepomuk::Vocabulary::NDO::copiedFrom(), (Nepomuk::Variant) job->property("originurl") ); + res.setProperty( Nepomuk::Vocabulary::NDO::copiedFrom(), (Nepomuk::Variant) job->property("originurl") ); + res.setProperty( Nepomuk::Vocabulary::NCO::creator(), (Nepomuk::Variant) job->property("author") ); //res.setDescription(item_description->toPlainText()); //res.setProperty( Soprano::Vocabulary::NAO::description(), #endif #endif - emit addClip(filePath, QString());//, sound_name->url()); + emit addClip(filePath, QString()); } void ResourceWidget::slotOpenUrl(const QString &url) @@ -263,17 +301,16 @@ void ResourceWidget::slotChangeService() m_currentService = new ArchiveOrg(search_results); } - connect(m_currentService, SIGNAL(gotMetaInfo(const QString)), this, SLOT(slotGotMetaInfo(const QString))); + connect(m_currentService, SIGNAL(gotMetaInfo(const QString)), this, SLOT(slotSetMetadata(const QString))); connect(m_currentService, SIGNAL(gotMetaInfo(QMap )), this, SLOT(slotDisplayMetaInfo(QMap ))); connect(m_currentService, SIGNAL(maxPages(int)), page_number, SLOT(setMaximum(int))); connect(m_currentService, SIGNAL(searchInfo(QString)), search_info, SLOT(setText(QString))); connect(m_currentService, SIGNAL(gotThumb(const QString)), this, SLOT(slotLoadThumb(const QString))); + connect(m_currentService, SIGNAL(searchDone()), m_busyWidget, SLOT(stop())); button_preview->setVisible(m_currentService->hasPreview); button_import->setVisible(!m_currentService->inlineDownload); - sound_autoplay->setVisible(m_currentService->hasPreview); search_info->setText(QString()); - info_browser->setVisible(m_currentService->hasMetadata); if (!search_text->text().isEmpty()) slotStartSearch(); } @@ -327,22 +364,49 @@ void ResourceWidget::parseLicense(const QString &licenseUrl) item_license->setUrl(licenseUrl); } -void ResourceWidget::slotGotMetaInfo(const QString info) -{ - info_browser->setHtml(info_browser->toHtml() + info); -} - void ResourceWidget::slotOpenLink(const QUrl &url) { QString path = url.toEncoded(); - if (path.endsWith("_preview")) { - path.chop(8); - slotOpenUrl(path); - } - else { + if (path.endsWith("_import")) { + path.chop(7); // import file in Kdenlive slotSaveItem(path); } + else { + slotOpenUrl(path); + } +} + +void ResourceWidget::slotSetDescription(const QString desc) +{ + m_desc = desc; + updateLayout(); +} + +void ResourceWidget::slotSetMetadata(const QString desc) +{ + m_meta = desc; + updateLayout(); } +void ResourceWidget::slotSetImage(const QString desc) +{ + m_image = QString("").arg(desc).arg((int) (info_browser->width() * 0.9)); + updateLayout(); +} + +void ResourceWidget::slotSetTitle(const QString desc) +{ + m_title = desc; + updateLayout(); +} + +void ResourceWidget::updateLayout() +{ + QString content = m_title; + if (!m_image.isEmpty()) content.append(m_image + "
"); + if (!m_desc.isEmpty()) content.append(m_desc); + if (!m_meta.isEmpty()) content.append(m_meta); + info_browser->setHtml(content); +} \ No newline at end of file diff --git a/src/utils/resourcewidget.h b/src/utils/resourcewidget.h index 575f4610..71253c76 100644 --- a/src/utils/resourcewidget.h +++ b/src/utils/resourcewidget.h @@ -30,6 +30,8 @@ #include #include +class KPixmapSequenceOverlayPainter; +class QAction; class ResourceWidget : public QDialog, public Ui::FreeSound_UI { @@ -54,17 +56,28 @@ private slots: void slotOffline(); void slotNextPage(); void slotPreviousPage(); - void slotGotMetaInfo(const QString info); void slotOpenLink(const QUrl &url); void slotLoadThumb(const QString url); /** @brief A file download is finished */ void slotGotFile(KJob *job); + void slotSetMetadata(const QString desc); + void slotSetDescription(const QString desc); + void slotSetImage(const QString desc); + void slotSetTitle(const QString desc); private: QString m_folder; AbstractService *m_currentService; void parseLicense(const QString &); OnlineItemInfo m_currentInfo; + KPixmapSequenceOverlayPainter *m_busyWidget; + QAction *m_autoPlay; + QString m_tmpThumbFile; + QString m_title; + QString m_image; + QString m_desc; + QString m_meta; + void updateLayout(); signals: void addClip(KUrl, const QString &); diff --git a/src/widgets/freesound_ui.ui b/src/widgets/freesound_ui.ui index a61d5c57..aab6824d 100644 --- a/src/widgets/freesound_ui.ui +++ b/src/widgets/freesound_ui.ui @@ -33,6 +33,16 @@ + + + + ... + + + QToolButton::InstantPopup + + + @@ -131,81 +141,38 @@ - - - - - - - Qt::AlignCenter - - - - + Import - - - - - 26 - 0 - - - - - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - - Qt::AlignCenter - - - - + Preview - - - - Auto play - - - - + License - + - + - + 0 0 -- 2.39.2