You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/juk/webimagefetcherdialog.cpp

236 lines
7.1 KiB

/***************************************************************************
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"