22#include "imagewidget.h"
24#include <kabc/addressee.h>
25#include <kfiledialog.h>
26#include <kglobalsettings.h>
29#include <kio/netaccess.h>
30#include <klocalizedstring.h>
31#include <kmessagebox.h>
32#include <kpixmapregionselectordialog.h>
34#include <QtCore/QMimeData>
36#include <QDragEnterEvent>
46 ImageLoader(QWidget *parent = 0);
48 QImage loadImage(
const KUrl &url,
bool *ok);
54ImageLoader::ImageLoader(QWidget *parent)
59QImage ImageLoader::loadImage(
const KUrl &url,
bool *ok)
70 if (url.isLocalFile()) {
71 if (image.load(url.toLocalFile())) {
74 }
else if (KIO::NetAccess::download(url, tempFile, mParent)) {
75 if (image.load(tempFile)) {
78 KIO::NetAccess::removeTempFile(tempFile);
83 KMessageBox::sorry(mParent, i18n(
"This contact's image cannot be found."));
87 QPixmap pixmap = QPixmap::fromImage(image);
89 image = KPixmapRegionSelectorDialog::getSelectedImage(pixmap, 1, 1, mParent);
95 if (image.height() > 720 || image.width() > 720) {
96 if (image.height() > image.width()) {
97 image = image.scaledToHeight(720);
99 image = image.scaledToWidth(720);
108ImageWidget::ImageWidget(Type type, QWidget *parent)
109 : QPushButton(parent)
115 setAcceptDrops(
true);
117 setIconSize(QSize(100, 100));
118 setFixedSize(QSize(120, 120));
120 connect(
this, SIGNAL(clicked()), SLOT(changeImage()));
122 if (mType == Photo) {
123 setToolTip(i18n(
"The photo of the contact (click to change)"));
125 setToolTip(i18n(
"The logo of the company (click to change)"));
131ImageWidget::~ImageWidget()
136void ImageWidget::loadContact(
const KABC::Addressee &contact)
138 mPicture = (mType == Photo ? contact.photo() : contact.logo());
139 if (mPicture.isIntern() && !mPicture.data().isNull()) {
146void ImageWidget::storeContact(KABC::Addressee &contact)
const
148 if (mType == Photo) {
149 contact.setPhoto(mPicture);
151 contact.setLogo(mPicture);
155void ImageWidget::setReadOnly(
bool readOnly)
157 mReadOnly = readOnly;
160void ImageWidget::updateView()
163 setIcon(QPixmap::fromImage(mPicture.data()));
165 if (mType == Photo) {
166 setIcon(KIcon(QLatin1String(
"user-identity")));
168 setIcon(KIcon(QLatin1String(
"image-x-generic")));
173void ImageWidget::dragEnterEvent(QDragEnterEvent *event)
175 const QMimeData *mimeData =
event->mimeData();
176 event->setAccepted(mimeData->hasImage() || mimeData->hasUrls());
179void ImageWidget::dropEvent(QDropEvent *event)
185 const QMimeData *mimeData =
event->mimeData();
186 if (mimeData->hasImage()) {
187 mPicture.setData(qvariant_cast<QImage>(mimeData->imageData()));
192 const KUrl::List urls = KUrl::List::fromMimeData(mimeData);
193 if (urls.isEmpty()) {
194 event->setAccepted(
false);
197 const QImage image = imageLoader()->loadImage(urls.first(), &ok);
199 mPicture.setData(image);
206void ImageWidget::mousePressEvent(QMouseEvent *event)
208 mDragStartPos =
event->pos();
209 QPushButton::mousePressEvent(event);
212void ImageWidget::mouseMoveEvent(QMouseEvent *event)
214 if ((event->buttons() & Qt::LeftButton) &&
215 (event->pos() - mDragStartPos).manhattanLength() > KGlobalSettings::dndEventDelay()) {
218 QDrag *drag =
new QDrag(
this);
219 drag->setMimeData(
new QMimeData());
220 drag->mimeData()->setImageData(mPicture.data());
226void ImageWidget::contextMenuEvent(QContextMenuEvent *event)
230 if (mType == Photo) {
232 menu.addAction(i18n(
"Change photo..."),
this, SLOT(changeImage()));
236 menu.addAction(i18n(
"Save photo..."),
this, SLOT(saveImage()));
239 menu.addAction(i18n(
"Remove photo"),
this, SLOT(deleteImage()));
244 menu.addAction(i18n(
"Change logo..."),
this, SLOT(changeImage()));
248 menu.addAction(i18n(
"Save logo..."),
this, SLOT(saveImage()));
251 menu.addAction(i18n(
"Remove logo"),
this, SLOT(deleteImage()));
256 menu.exec(event->globalPos());
259void ImageWidget::changeImage()
265 const KUrl url = KFileDialog::getOpenUrl(QUrl(), KImageIO::pattern(),
this);
268 const QImage image = imageLoader()->loadImage(url, &ok);
270 mPicture.setData(image);
277void ImageWidget::saveImage()
279 const QString fileName = KFileDialog::getSaveFileName(KUrl(), KImageIO::pattern(),
this, QString(), KFileDialog::ConfirmOverwrite);
280 if (!fileName.isEmpty()) {
281 mPicture.data().save(fileName);
285void ImageWidget::deleteImage()
288 mPicture.setData(QImage());
292ImageLoader *ImageWidget::imageLoader()
295 mImageLoader =
new ImageLoader;