summaryrefslogtreecommitdiffstats
path: root/juk/webimagefetcherdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'juk/webimagefetcherdialog.cpp')
-rw-r--r--juk/webimagefetcherdialog.cpp235
1 files changed, 235 insertions, 0 deletions
diff --git a/juk/webimagefetcherdialog.cpp b/juk/webimagefetcherdialog.cpp
new file mode 100644
index 00000000..cc14ed61
--- /dev/null
+++ b/juk/webimagefetcherdialog.cpp
@@ -0,0 +1,235 @@
+/***************************************************************************
+ copyright : (C) 2004 Nathan Toone
+ email : nathan@toonetown.com
+ copyright : (C) 2007 Michael Pyne
+ email : michael.pyne@kdemail.net
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <kapplication.h>
+#include <kio/netaccess.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <krun.h>
+#include <kcombobox.h>
+#include <kiconloader.h>
+#include <kurllabel.h>
+
+#include <qvbox.h>
+#include <qlayout.h>
+#include <qimage.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qeventloop.h>
+
+#include "webimagefetcherdialog.h"
+#include "tag.h"
+
+WebImageFetcherDialog::WebImageFetcherDialog(const WebImageList &imageList,
+ const FileHandle &file,
+ QWidget *parent) :
+ KDialogBase(parent, "internet_image_fetcher", true, QString::null,
+ Ok | Cancel | User1 , NoDefault, true),
+ m_pixmap(QPixmap()),
+ m_imageList(imageList),
+ m_file(file)
+{
+ disableResize();
+
+ QWidget *mainBox = new QWidget(this);
+ QBoxLayout *mainLayout = new QVBoxLayout(mainBox);
+
+ m_iconWidget = new KIconView(mainBox);
+ m_iconWidget->setResizeMode(QIconView::Adjust);
+ m_iconWidget->setSpacing(10);
+ m_iconWidget->setFixedSize(500,550);
+ m_iconWidget->arrangeItemsInGrid();
+ m_iconWidget->setItemsMovable(false);
+ mainLayout->addWidget(m_iconWidget);
+ connect(m_iconWidget, SIGNAL(executed(QIconViewItem *)),
+ this, SLOT(slotOk()));
+
+ // Before changing the code below be sure to check the attribution terms
+ // of the Yahoo Image Search API.
+ // http://developer.yahoo.com/attribution/
+ KURLLabel *logoLabel = new KURLLabel(mainBox);
+ logoLabel->setURL("http://developer.yahoo.com/about/");
+ logoLabel->setPixmap(UserIcon("yahoo_credit"));
+ logoLabel->setMargin(15); // Allow large margin per attribution terms.
+ logoLabel->setUseTips(true); // Show URL in tooltip.
+ connect(logoLabel, SIGNAL(leftClickedURL(const QString &)),
+ SLOT(showCreditURL(const QString &)));
+
+ QBoxLayout *creditLayout = new QHBoxLayout(mainLayout);
+ creditLayout->addStretch(); // Left spacer
+ creditLayout->addWidget(logoLabel);
+ creditLayout->addStretch(); // Right spacer
+
+ setMainWidget(mainBox);
+ setButtonText(User1, i18n("New Search"));
+}
+
+WebImageFetcherDialog::~WebImageFetcherDialog()
+{
+}
+
+void WebImageFetcherDialog::showCreditURL(const QString &url)
+{
+ // Don't use static member since I'm sure that someday knowing my luck
+ // Yahoo will change their mimetype they serve.
+ (void) new KRun(KURL(url), topLevelWidget());
+}
+
+void WebImageFetcherDialog::setLayout()
+{
+ setCaption(QString("%1 - %2 (%3)")
+ .arg(m_file.tag()->artist())
+ .arg(m_file.tag()->album())
+ .arg(m_imageList.size()));
+
+ m_iconWidget->clear();
+ for(uint i = 0; i < m_imageList.size(); i++)
+ new CoverIconViewItem(m_iconWidget, m_imageList[i]);
+
+ adjustSize();
+}
+
+void WebImageFetcherDialog::setImageList(const WebImageList &imageList)
+{
+ m_imageList = imageList;
+}
+
+void WebImageFetcherDialog::setFile(const FileHandle &file)
+{
+ m_file = file;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// public slots
+////////////////////////////////////////////////////////////////////////////////
+
+void WebImageFetcherDialog::refreshScreen(WebImageList &imageList)
+{
+ setImageList(imageList);
+ setLayout();
+}
+
+int WebImageFetcherDialog::exec()
+{
+ setLayout();
+ return KDialogBase::exec();
+}
+
+void WebImageFetcherDialog::slotOk()
+{
+ uint selectedIndex = m_iconWidget->index(m_iconWidget->currentItem());
+ m_pixmap = pixmapFromURL(m_imageList[selectedIndex].imageURL());
+
+ if(m_pixmap.isNull()) {
+ KMessageBox::sorry(this,
+ i18n("The cover you have selected is unavailable. Please select another."),
+ i18n("Cover Unavailable"));
+ QPixmap blankPix;
+ blankPix.resize(80, 80);
+ blankPix.fill();
+ m_iconWidget->currentItem()->setPixmap(blankPix, true, true);
+ return;
+ }
+
+ accept();
+ emit coverSelected();
+}
+
+void WebImageFetcherDialog::slotCancel()
+{
+ m_pixmap = QPixmap();
+ reject();
+}
+
+void WebImageFetcherDialog::slotUser1()
+{
+ m_pixmap = QPixmap();
+ accept();
+ emit newSearchRequested();
+}
+
+QPixmap WebImageFetcherDialog::fetchedImage(uint index) const
+{
+ return (index > m_imageList.count()) ? QPixmap() : pixmapFromURL(m_imageList[index].imageURL());
+}
+
+QPixmap WebImageFetcherDialog::pixmapFromURL(const KURL &url) const
+{
+ QString file;
+
+ if(KIO::NetAccess::download(url, file, 0)) {
+ QPixmap pixmap = QPixmap(file);
+ KIO::NetAccess::removeTempFile(file);
+ return pixmap;
+ }
+ KIO::NetAccess::removeTempFile(file);
+ return QPixmap();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// CoverIconViewItem
+////////////////////////////////////////////////////////////////////////////////
+
+CoverIconViewItem::CoverIconViewItem(QIconView *parent, const WebImage &image) :
+ QObject(parent), KIconViewItem(parent, parent->lastItem(), image.size()), m_job(0)
+{
+ // Set up the iconViewItem
+
+ QPixmap mainMap;
+ mainMap.resize(80, 80);
+ mainMap.fill();
+ setPixmap(mainMap, true, true);
+
+ // Start downloading the image.
+
+ m_job = KIO::get(image.thumbURL(), false, false);
+ connect(m_job, SIGNAL(result(KIO::Job *)), this, SLOT(imageResult(KIO::Job *)));
+ connect(m_job, SIGNAL(data(KIO::Job *, const QByteArray &)),
+ this, SLOT(imageData(KIO::Job *, const QByteArray &)));
+}
+
+CoverIconViewItem::~CoverIconViewItem()
+{
+ if(m_job) {
+ m_job->kill();
+
+ // Drain results issued by KIO before being deleted,
+ // and before deleting the job.
+ kapp->eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
+
+ delete m_job;
+ }
+}
+
+void CoverIconViewItem::imageData(KIO::Job *, const QByteArray &data)
+{
+ int currentSize = m_buffer.size();
+ m_buffer.resize(currentSize + data.size(), QGArray::SpeedOptim);
+ memcpy(&(m_buffer.data()[currentSize]), data.data(), data.size());
+}
+
+void CoverIconViewItem::imageResult(KIO::Job *job)
+{
+ if(job->error())
+ return;
+
+ QPixmap iconImage(m_buffer);
+ iconImage = QImage(iconImage.convertToImage()).smoothScale(80, 80, QImage::ScaleMin);
+ setPixmap(iconImage, true, true);
+}
+
+#include "webimagefetcherdialog.moc"