X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Futils%2Fresourcewidget.cpp;h=b88a0db9a91cd69fdeb0991667f8e42276ee53c1;hb=07cc32ca3557ccce583f95cbc8dd114d989b4f49;hp=cce3858314c4d6c7d9df39fc94d0491bb6ff84a9;hpb=2fed332cd224d0bf20b061eac6050516de58952d;p=kdenlive diff --git a/src/utils/resourcewidget.cpp b/src/utils/resourcewidget.cpp index cce38583..b88a0db9 100644 --- a/src/utils/resourcewidget.cpp +++ b/src/utils/resourcewidget.cpp @@ -23,15 +23,16 @@ #include "freesound.h" #include "openclipart.h" #include "archiveorg.h" +#include "kdenlivesettings.h" #include #include #include -#include +#include +#include #include #include -#include "kdenlivesettings.h" #include #include #include @@ -39,23 +40,38 @@ #include #include #include +#include + +#if KDE_IS_VERSION(4,4,0) +#include +#include +#endif +#include #ifdef USE_NEPOMUK -#if KDE_IS_VERSION(4,6,0) -#include -#include -#include -#include -#include -#include -#include + #if KDE_IS_VERSION(4,6,0) + #include + #include + #include + #include + #include + #include + #endif #endif + +#ifdef USE_NEPOMUKCORE + #include + #include + #include + #include + #include + #include #endif ResourceWidget::ResourceWidget(const QString & folder, QWidget * parent) : - QDialog(parent), - m_folder(folder), - m_currentService(NULL) + QDialog(parent), + m_folder(folder), + m_currentService(NULL) { setFont(KGlobalSettings::toolBarFont()); setupUi(this); @@ -71,11 +87,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(item_license, SIGNAL(leftClickedUrl(QString)), this, SLOT(slotOpenUrl(QString))); connect(service_list, SIGNAL(currentIndexChanged(int)), this, SLOT(slotChangeService())); - item_image->setFixedWidth(180); if (Solid::Networking::status() == Solid::Networking::Unconnected) { slotOffline(); } @@ -84,21 +97,54 @@ ResourceWidget::ResourceWidget(const QString & folder, QWidget * parent) : connect(page_next, SIGNAL(clicked()), this, SLOT(slotNextPage())); connect(page_prev, SIGNAL(clicked()), this, SLOT(slotPreviousPage())); connect(page_number, SIGNAL(valueChanged(int)), this, SLOT(slotStartSearch(int))); - connect(info_browser, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(slotOpenLink(const QUrl &))); + connect(info_browser, SIGNAL(anchorClicked(QUrl)), this, SLOT(slotOpenLink(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")); + +#if KDE_IS_VERSION(4,4,0) + m_busyWidget = new KPixmapSequenceOverlayPainter(this); + m_busyWidget->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + m_busyWidget->setWidget(search_results->viewport()); +#endif sound_box->setEnabled(false); search_text->setFocus(); #ifdef USE_NEPOMUK -#if KDE_IS_VERSION(4,6,0) + #if KDE_IS_VERSION(4,6,0) Nepomuk::ResourceManager::instance()->init(); -#endif + #endif #endif slotChangeService(); + loadConfig(); } ResourceWidget::~ResourceWidget() { - if (m_currentService) delete m_currentService; + delete m_currentService; + KIO::NetAccess::removeTempFile(m_tmpThumbFile); + saveConfig(); +} + +void ResourceWidget::loadConfig() +{ + KSharedConfigPtr config = KGlobal::config(); + KConfigGroup resourceConfig(config, "ResourceWidget"); + QList size; + size << 100 << 400; + splitter->setSizes(resourceConfig.readEntry( "mainSplitter", size)); +} + +void ResourceWidget::saveConfig() +{ + KSharedConfigPtr config = KGlobal::config(); + KConfigGroup resourceConfig(config, "ResourceWidget"); + resourceConfig.writeEntry(QLatin1String("mainsplitter"), splitter->size()); + config->sync(); } void ResourceWidget::slotStartSearch(int page) @@ -106,15 +152,22 @@ void ResourceWidget::slotStartSearch(int page) page_number->blockSignals(true); page_number->setValue(page); page_number->blockSignals(false); +#if KDE_IS_VERSION(4,4,0) + m_busyWidget->start(); +#endif 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,25 +175,41 @@ 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); } -void ResourceWidget::slotLoadThumb(const QString url) +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,51 +219,36 @@ 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); } -void ResourceWidget::slotDisplayMetaInfo(QMap metaInfo) +void ResourceWidget::slotDisplayMetaInfo(const QMap &metaInfo) { - if (metaInfo.contains("license")) { - parseLicense(metaInfo.value("license")); + if (metaInfo.contains(QLatin1String("license"))) { + parseLicense(metaInfo.value(QLatin1String("license"))); + } + if (metaInfo.contains(QLatin1String("description"))) { + slotSetDescription(metaInfo.value(QLatin1String("description"))); } } void ResourceWidget::slotPlaySound() { - if (!m_currentService) return; - bool started = m_currentService->startItemPreview(search_results->currentItem()); - if (started) button_preview->setText(i18n("Preview")); - else button_preview->setText(i18n("Stop")); -} - - -void ResourceWidget::slotForcePlaySound(bool play) -{ - /* - if (m_service != FREESOUND) return; - m_previewProcess->close(); - if (m_currentPreview.isEmpty()) return; - if (play) - m_previewProcess->start("ffplay", QStringList() << m_currentPreview << "-nodisp"); - */ -} - -void ResourceWidget::slotPreviewStatusChanged(QProcess::ProcessState state) -{ - /*if (state == QProcess::NotRunning) + if (!m_currentService) + return; + const bool started = m_currentService->startItemPreview(search_results->currentItem()); + if (started) button_preview->setText(i18n("Preview")); - else - button_preview->setText(i18n("Stop"));*/ + else + button_preview->setText(i18n("Stop")); } -void ResourceWidget::slotSaveItem(const QString originalUrl) + +void ResourceWidget::slotSaveItem(const QString &originalUrl) { //if (m_currentUrl.isEmpty()) return; QListWidgetItem *item = search_results->currentItem(); @@ -204,7 +258,7 @@ void ResourceWidget::slotSaveItem(const QString originalUrl) if (!path.endsWith('/')) path.append('/'); if (!originalUrl.isEmpty()) { path.append(KUrl(originalUrl).fileName()); - ext = "*." + KUrl(originalUrl).fileName().section(".", -1); + ext = "*." + KUrl(originalUrl).fileName().section('.', -1); m_currentInfo.itemDownload = originalUrl; } else { @@ -214,11 +268,17 @@ void ResourceWidget::slotSaveItem(const QString originalUrl) QString saveUrl = KFileDialog::getSaveFileName(KUrl(path), ext); KIO::UDSEntry entry; KUrl srcUrl(m_currentInfo.itemDownload); - if (saveUrl.isEmpty() || !KIO::NetAccess::stat(srcUrl, entry, this)) return; + if (saveUrl.isEmpty() || !KIO::NetAccess::stat(srcUrl, entry, this)) + return; KIO::FileCopyJob * getJob = KIO::file_copy(srcUrl, KUrl(saveUrl), -1, KIO::Overwrite); - KFileItem info(entry, srcUrl); + 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(); } @@ -229,16 +289,28 @@ void ResourceWidget::slotGotFile(KJob *job) KIO::FileCopyJob* copyJob = static_cast( job ); const KUrl filePath = copyJob->destUrl(); #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.setDescription(item_description->toPlainText()); - //res.setProperty( Soprano::Vocabulary::NAO::description(), + #if KDE_IS_VERSION(4,6,0) + Nepomuk::Resource res( filePath ); + 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::NCO::creator(), (Nepomuk::Variant) job->property("author") ); + //res.setDescription(item_description->toPlainText()); + //res.setProperty( Soprano::Vocabulary::NAO::description(), + #endif #endif + +#ifdef USE_NEPOMUKCORE + Nepomuk2::Resource res( filePath ); + res.setProperty( Nepomuk2::Vocabulary::NIE::license(), (Nepomuk2::Variant) job->property("license") ); + res.setProperty( Nepomuk2::Vocabulary::NIE::licenseType(), (Nepomuk2::Variant) job->property("licenseurl") ); + res.setProperty( Nepomuk2::Vocabulary::NDO::copiedFrom(), (Nepomuk2::Variant) job->property("originurl") ); + res.setProperty( Nepomuk2::Vocabulary::NCO::creator(), (Nepomuk2::Variant) job->property("author") ); + //res.setDescription(item_description->toPlainText()); + //res.setProperty( Soprano::Vocabulary::NAO::description(), #endif - emit addClip(filePath, QString());//, sound_name->url()); + + emit addClip(filePath, stringMap()); } void ResourceWidget::slotOpenUrl(const QString &url) @@ -248,33 +320,36 @@ void ResourceWidget::slotOpenUrl(const QString &url) void ResourceWidget::slotChangeService() { - if (m_currentService) { - delete m_currentService; - m_currentService = NULL; - } + delete m_currentService; + m_currentService = NULL; SERVICETYPE service = (SERVICETYPE) service_list->itemData(service_list->currentIndex()).toInt(); if (service == FREESOUND) { m_currentService = new FreeSound(search_results); - } - else if (service == OPENCLIPART) { + } else if (service == OPENCLIPART) { m_currentService = new OpenClipArt(search_results); - } - else if (service == ARCHIVEORG) { + } else if (service == ARCHIVEORG) { m_currentService = new ArchiveOrg(search_results); } - connect(m_currentService, SIGNAL(gotMetaInfo(const QString)), this, SLOT(slotGotMetaInfo(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(gotMetaInfo(QString)), this, SLOT(slotSetMetadata(QString))); + connect(m_currentService, SIGNAL(gotMetaInfo(QMap)), this, SLOT(slotDisplayMetaInfo(QMap))); + connect(m_currentService, SIGNAL(maxPages(int)), this, SLOT(slotSetMaximum(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(gotThumb(QString)), this, SLOT(slotLoadThumb(QString))); +#if KDE_IS_VERSION(4,4,0) + connect(m_currentService, SIGNAL(searchDone()), m_busyWidget, SLOT(stop())); +#endif 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(); + if (!search_text->text().isEmpty()) + slotStartSearch(); +} + +void ResourceWidget::slotSetMaximum(int max) +{ + page_number->setMaximum(max); } void ResourceWidget::slotOnline() @@ -291,14 +366,16 @@ void ResourceWidget::slotOffline() void ResourceWidget::slotNextPage() { - int ix = page_number->value(); - if (search_results->count() > 0) page_number->setValue(ix + 1); + const int ix = page_number->value(); + if (search_results->count() > 0) + page_number->setValue(ix + 1); } void ResourceWidget::slotPreviousPage() { - int ix = page_number->value(); - if (ix > 1) page_number->setValue(ix - 1); + const int ix = page_number->value(); + if (ix > 1) + page_number->setValue(ix - 1); } void ResourceWidget::parseLicense(const QString &licenseUrl) @@ -327,22 +404,61 @@ 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) +{ + if(m_desc != desc) { + m_desc = desc; + updateLayout(); + } +} + +void ResourceWidget::slotSetMetadata(const QString &desc) +{ + if (m_meta != desc) { + m_meta = desc; + updateLayout(); + } +} + +void ResourceWidget::slotSetImage(const QString &desc) +{ + m_image = QString::fromLatin1("").arg(desc).arg((int) (info_browser->width() * 0.9)); + updateLayout(); +} + +void ResourceWidget::slotSetTitle(const QString &desc) +{ + if (m_title != 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); +} + + +#include "resourcewidget.moc"