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>
36 #include <QDragEnterEvent>
46 ImageLoader( QWidget *parent = 0 );
48 QImage loadImage(
const KUrl &url,
bool *ok );
55 ImageLoader::ImageLoader( QWidget *parent )
60 QImage ImageLoader::loadImage(
const KUrl &url,
bool *ok )
65 if ( url.isEmpty() ) {
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, 1, 1, mParent );
91 if ( image.isNull() ) {
96 if ( image.height() > 720 || image.width() > 720 ) {
97 if ( image.height() > image.width() )
98 image = image.scaledToHeight( 720 );
100 image = image.scaledToWidth( 720 );
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)" ) );
134 ImageWidget::~ImageWidget()
139 void ImageWidget::loadContact(
const KABC::Addressee &contact )
141 mPicture = ( mType == Photo ? contact.photo() : contact.logo() );
142 if ( mPicture.isIntern() && !mPicture.data().isNull() ) {
149 void ImageWidget::storeContact( KABC::Addressee &contact )
const
151 if ( mType == Photo ) {
152 contact.setPhoto( mPicture );
154 contact.setLogo( mPicture );
158 void ImageWidget::setReadOnly(
bool readOnly )
160 mReadOnly = readOnly;
163 void ImageWidget::updateView()
166 setIcon( QPixmap::fromImage( mPicture.data() ) );
168 if ( mType == Photo ) {
169 setIcon( KIcon( QLatin1String(
"user-identity" ) ) );
171 setIcon( KIcon( QLatin1String(
"image-x-generic" ) ) );
176 void ImageWidget::dragEnterEvent( QDragEnterEvent *event )
178 const QMimeData *mimeData =
event->mimeData();
179 event->setAccepted( mimeData->hasImage() || mimeData->hasUrls() );
182 void ImageWidget::dropEvent( QDropEvent *event )
188 const QMimeData *mimeData =
event->mimeData();
189 if ( mimeData->hasImage() ) {
190 mPicture.setData( qvariant_cast<QImage>( mimeData->imageData() ) );
195 const KUrl::List urls = KUrl::List::fromMimeData( mimeData );
196 if ( urls.isEmpty() ) {
197 event->setAccepted(
false );
200 const QImage image = imageLoader()->loadImage( urls.first(), &ok );
202 mPicture.setData( image );
209 void ImageWidget::mousePressEvent( QMouseEvent *event )
211 mDragStartPos =
event->pos();
212 QPushButton::mousePressEvent( event );
215 void ImageWidget::mouseMoveEvent( QMouseEvent *event )
217 if ( ( event->buttons() & Qt::LeftButton ) &&
218 ( event->pos() - mDragStartPos ).manhattanLength() > KGlobalSettings::dndEventDelay() ) {
221 QDrag *drag =
new QDrag(
this );
222 drag->setMimeData(
new QMimeData() );
223 drag->mimeData()->setImageData( mPicture.data() );
229 void ImageWidget::contextMenuEvent( QContextMenuEvent *event )
233 if ( mType == Photo ) {
235 menu.addAction( i18n(
"Change photo..." ),
this, SLOT(changeImage()) );
239 menu.addAction( i18n(
"Save photo..." ),
this, SLOT(saveImage()) );
242 menu.addAction( i18n(
"Remove photo" ),
this, SLOT(deleteImage()) );
247 menu.addAction( i18n(
"Change logo..." ),
this, SLOT(changeImage()) );
251 menu.addAction( i18n(
"Save logo..." ),
this, SLOT(saveImage()) );
254 menu.addAction( i18n(
"Remove logo" ),
this, SLOT(deleteImage()) );
259 menu.exec( event->globalPos() );
262 void ImageWidget::changeImage()
268 const KUrl url = KFileDialog::getOpenUrl( QUrl(), KImageIO::pattern(),
this );
269 if ( url.isValid() ) {
271 const QImage image = imageLoader()->loadImage( url, &ok );
273 mPicture.setData( image );
280 void ImageWidget::saveImage()
282 const QString fileName = KFileDialog::getSaveFileName( KUrl(), KImageIO::pattern(),
this );
283 if ( !fileName.isEmpty() ) {
284 mPicture.data().save( fileName );
288 void ImageWidget::deleteImage()
291 mPicture.setData( QImage() );
295 ImageLoader* ImageWidget::imageLoader()
297 if ( !mImageLoader ) {
298 mImageLoader =
new ImageLoader;