22 #include "imagewidget.h"
24 #include <kabc/addressee.h>
25 #include <kfiledialog.h>
26 #include <kglobalsettings.h>
29 #include <kio/netaccess.h>
31 #include <kmessagebox.h>
32 #include <kpixmapregionselectordialog.h>
34 #include <QtCore/QMimeData>
35 #include <QtGui/QDrag>
36 #include <QtGui/QDragEnterEvent>
37 #include <QtGui/QDropEvent>
38 #include <QtGui/QMenu>
46 ImageLoader( QWidget *parent = 0 );
48 QImage loadImage(
const KUrl &url,
bool *ok );
56 ImageLoader::ImageLoader( QWidget *parent )
61 QImage ImageLoader::loadImage(
const KUrl &url,
bool *ok )
71 if ( url.isLocalFile() ) {
72 if ( image.load( url.toLocalFile() ) ) {
75 }
else if ( KIO::NetAccess::download( url, tempFile, mParent ) ) {
76 if ( image.load( tempFile ) ) {
79 KIO::NetAccess::removeTempFile( tempFile );
84 KMessageBox::sorry( mParent, i18n(
"This contact's image cannot be found." ) );
88 QPixmap pixmap = QPixmap::fromImage( image );
90 image = KPixmapRegionSelectorDialog::getSelectedImage( pixmap, 100, 100, mParent );
91 if ( image.isNull() ) {
96 if ( image.height() != 140 || image.width() != 100 ) {
97 if ( image.height() > image.width() )
98 image = image.scaledToHeight( 140 );
100 image = image.scaledToWidth( 100 );
111 ImageWidget::ImageWidget( Type type, QWidget *parent )
112 : QPushButton( parent ),
118 setAcceptDrops(
true );
120 setIconSize( QSize( 100, 100 ) );
121 setFixedSize( QSize( 120, 120 ) );
123 connect(
this, SIGNAL(clicked()), SLOT(changeImage()) );
125 if ( mType == Photo )
126 setToolTip( i18n(
"The photo of the contact (click to change)" ) );
128 setToolTip( i18n(
"The logo of the company (click to change)" ) );
133 ImageWidget::~ImageWidget()
138 void ImageWidget::loadContact(
const KABC::Addressee &contact )
140 const KABC::Picture picture = (mType == Photo ? contact.photo() : contact.logo());
141 if ( picture.isIntern() && !picture.data().isNull() ) {
143 mImage = picture.data();
149 void ImageWidget::storeContact( KABC::Addressee &contact )
const
151 if ( mType == Photo )
152 contact.setPhoto( mImage );
154 contact.setLogo( mImage );
157 void ImageWidget::setReadOnly(
bool readOnly )
159 mReadOnly = readOnly;
162 void ImageWidget::updateView()
165 setIcon( QPixmap::fromImage( mImage ) );
167 if ( mType == Photo )
168 setIcon( KIcon( QLatin1String(
"user-identity" ) ) );
170 setIcon( KIcon( QLatin1String(
"image-x-generic" ) ) );
174 void ImageWidget::dragEnterEvent( QDragEnterEvent *event )
176 const QMimeData *mimeData =
event->mimeData();
177 event->setAccepted( mimeData->hasImage() || mimeData->hasUrls() );
180 void ImageWidget::dropEvent( QDropEvent *event )
185 const QMimeData *mimeData =
event->mimeData();
186 if ( mimeData->hasImage() ) {
187 mImage = 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 );
206 void ImageWidget::mousePressEvent( QMouseEvent *event )
208 mDragStartPos =
event->pos();
209 QPushButton::mousePressEvent( event );
212 void 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( mImage );
226 void ImageWidget::contextMenuEvent( QContextMenuEvent *event )
230 if ( mType == Photo ) {
232 menu.addAction( i18n(
"Change photo..." ),
this, SLOT(changeImage()) );
235 menu.addAction( i18n(
"Save photo..." ),
this, SLOT(saveImage()) );
238 menu.addAction( i18n(
"Remove photo" ),
this, SLOT(deleteImage()) );
242 menu.addAction( i18n(
"Change logo..." ),
this, SLOT(changeImage()) );
245 menu.addAction( i18n(
"Save logo..." ),
this, SLOT(saveImage()) );
248 menu.addAction( i18n(
"Remove logo" ),
this, SLOT(deleteImage()) );
252 menu.exec( event->globalPos() );
255 void ImageWidget::changeImage()
260 const KUrl url = KFileDialog::getOpenUrl( QString(), KImageIO::pattern(),
this );
261 if ( url.isValid() ) {
263 const QImage image = imageLoader()->loadImage( url, &ok );
272 void ImageWidget::saveImage()
274 const QString fileName = KFileDialog::getSaveFileName( KUrl(), KImageIO::pattern(),
this );
275 if ( !fileName.isEmpty() )
276 mImage.save( fileName );
279 void ImageWidget::deleteImage()
286 ImageLoader* ImageWidget::imageLoader()
289 mImageLoader =
new ImageLoader;
294 #include "imagewidget.moc"