imagewidget.cpp
00001 /* 00002 This file is part of KAddressBook. 00003 Copyright (c) 2003 Tobias Koenig <tokoe@kde.org> 00004 00005 This program is free software; you can redistribute it and/or modify 00006 it under the terms of the GNU General Public License as published by 00007 the Free Software Foundation; either version 2 of the License, or 00008 (at your option) any later version. 00009 00010 This program is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 GNU General Public License for more details. 00014 00015 You should have received a copy of the GNU General Public License 00016 along with this program; if not, write to the Free Software 00017 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 00018 00019 As a special exception, permission is given to link this program 00020 with any edition of TQt, and distribute the resulting executable, 00021 without including the source code for TQt in the source distribution. 00022 */ 00023 00024 #include <tdeabc/picture.h> 00025 #include <kdebug.h> 00026 #include <kdialog.h> 00027 #include <tdefiledialog.h> 00028 #include <tdeglobalsettings.h> 00029 #include <kiconloader.h> 00030 #include <kimageio.h> 00031 #include <tdeio/netaccess.h> 00032 #include <tdelocale.h> 00033 #include <tdemessagebox.h> 00034 #include <kurldrag.h> 00035 #include <libtdepim/kpixmapregionselectordialog.h> 00036 00037 #include <tqapplication.h> 00038 #include <tqdragobject.h> 00039 #include <tqeventloop.h> 00040 #include <tqgroupbox.h> 00041 #include <tqlabel.h> 00042 #include <tqlayout.h> 00043 #include <tqpixmap.h> 00044 #include <tqpopupmenu.h> 00045 00046 #include <unistd.h> 00047 00048 #include "imagewidget.h" 00049 00050 ImageLoader::ImageLoader( TQWidget *parent ) 00051 : TQObject( 0, "ImageLoader" ), mParent( parent ) 00052 { 00053 } 00054 00055 TDEABC::Picture ImageLoader::loadPicture( const KURL &url, bool *ok ) 00056 { 00057 TDEABC::Picture picture; 00058 TQString tempFile; 00059 00060 if ( url.isEmpty() ) 00061 return picture; 00062 00063 (*ok) = false; 00064 00065 TQImage image; 00066 if ( url.isLocalFile() ) { 00067 image.load( url.path() ); 00068 picture.setData( image ); 00069 (*ok) = true; 00070 } else if ( TDEIO::NetAccess::download( url, tempFile, mParent ) ) { 00071 image.load( tempFile ); 00072 picture.setData( image ); 00073 (*ok) = true; 00074 TDEIO::NetAccess::removeTempFile( tempFile ); 00075 } 00076 00077 if ( !(*ok) ) { 00078 // image does not exist (any more) 00079 KMessageBox::sorry( mParent, i18n( "This contact's image cannot be found." ) ); 00080 return picture; 00081 } 00082 00083 TQPixmap pixmap = picture.data(); 00084 00085 TQPixmap selectedPixmap = KPIM::KPixmapRegionSelectorDialog::getSelectedImage( pixmap, 100, 140, mParent ); 00086 if ( selectedPixmap.isNull() ) { 00087 (*ok) = false; 00088 return picture; 00089 } 00090 00091 image = selectedPixmap; 00092 if ( image.height() != 140 || image.width() != 100 ) { 00093 if ( image.height() > image.width() ) 00094 image = image.scaleHeight( 140 ); 00095 else 00096 image = image.scaleWidth( 100 ); 00097 } 00098 00099 picture.setData( image ); 00100 (*ok) = true; 00101 00102 return picture; 00103 } 00104 00105 00106 ImageButton::ImageButton( const TQString &title, TQWidget *parent ) 00107 : TQPushButton( title, parent ), 00108 mReadOnly( false ), mImageLoader( 0 ) 00109 { 00110 setAcceptDrops( true ); 00111 00112 connect( this, TQT_SIGNAL( clicked() ), TQT_SLOT( load() ) ); 00113 } 00114 00115 void ImageButton::setReadOnly( bool readOnly ) 00116 { 00117 mReadOnly = readOnly; 00118 } 00119 00120 void ImageButton::setPicture( const TDEABC::Picture &picture ) 00121 { 00122 mPicture = picture; 00123 updateGUI(); 00124 } 00125 00126 TDEABC::Picture ImageButton::picture() const 00127 { 00128 return mPicture; 00129 } 00130 00131 void ImageButton::setImageLoader( ImageLoader *loader ) 00132 { 00133 mImageLoader = loader; 00134 } 00135 00136 void ImageButton::startDrag() 00137 { 00138 if ( !mPicture.data().isNull() ) { 00139 TQImageDrag *drag = new TQImageDrag( mPicture.data(), this ); 00140 drag->dragCopy(); 00141 } 00142 } 00143 00144 void ImageButton::updateGUI() 00145 { 00146 if ( mPicture.data().isNull() ) 00147 setPixmap( TDEGlobal::iconLoader()->iconPath( "preferences-desktop-personal", TDEIcon::Desktop ) ); 00148 else 00149 setPixmap( mPicture.data() ); 00150 } 00151 00152 void ImageButton::dragEnterEvent( TQDragEnterEvent *event ) 00153 { 00154 bool accepted = false; 00155 00156 if ( TQImageDrag::canDecode( event ) ) 00157 accepted = true; 00158 00159 if ( TQUriDrag::canDecode( event ) ) 00160 accepted = true; 00161 00162 event->accept( accepted ); 00163 } 00164 00165 void ImageButton::dropEvent( TQDropEvent *event ) 00166 { 00167 if ( mReadOnly ) 00168 return; 00169 00170 if ( TQImageDrag::canDecode( event ) ) { 00171 TQPixmap pm; 00172 00173 if ( TQImageDrag::decode( event, pm ) ) { 00174 mPicture.setData( pm.convertToImage() ); 00175 updateGUI(); 00176 emit changed(); 00177 } 00178 } 00179 00180 if ( TQUriDrag::canDecode( event ) ) { 00181 KURL::List urls; 00182 if ( KURLDrag::decode( event, urls ) ) { 00183 if ( urls.isEmpty() ) { // oops, no data 00184 event->accept( false ); 00185 return; 00186 } 00187 } 00188 00189 if ( mImageLoader ) { 00190 bool ok = false; 00191 TDEABC::Picture pic = mImageLoader->loadPicture( urls[ 0 ], &ok ); 00192 if ( ok ) { 00193 mPicture = pic; 00194 updateGUI(); 00195 emit changed(); 00196 } 00197 } 00198 } 00199 } 00200 00201 void ImageButton::mousePressEvent( TQMouseEvent *event ) 00202 { 00203 mDragStartPos = event->pos(); 00204 TQPushButton::mousePressEvent( event ); 00205 } 00206 00207 void ImageButton::mouseMoveEvent( TQMouseEvent *event ) 00208 { 00209 if ( (event->state() & Qt::LeftButton) && 00210 (event->pos() - mDragStartPos).manhattanLength() > 00211 TDEGlobalSettings::dndEventDelay() ) { 00212 startDrag(); 00213 } 00214 } 00215 00216 void ImageButton::contextMenuEvent( TQContextMenuEvent *event ) 00217 { 00218 TQPopupMenu menu( this ); 00219 menu.insertItem( i18n( "Reset" ), this, TQT_SLOT( clear() ) ); 00220 menu.exec( event->globalPos() ); 00221 } 00222 00223 void ImageButton::load() 00224 { 00225 if ( mReadOnly ) 00226 return; 00227 KURL url = KFileDialog::getOpenURL( TQString(), KImageIO::pattern(), this ); 00228 if ( url.isValid() ) { 00229 if ( mImageLoader ) { 00230 bool ok = false; 00231 TDEABC::Picture pic = mImageLoader->loadPicture( url, &ok ); 00232 if ( ok ) { 00233 mPicture = pic; 00234 updateGUI(); 00235 emit changed(); 00236 } 00237 } 00238 } 00239 } 00240 00241 void ImageButton::clear() 00242 { 00243 mPicture = TDEABC::Picture(); 00244 updateGUI(); 00245 00246 emit changed(); 00247 } 00248 00249 ImageBaseWidget::ImageBaseWidget( const TQString &title, 00250 TQWidget *parent, const char *name ) 00251 : TQWidget( parent, name ), mReadOnly( false ) 00252 { 00253 mImageLoader = new ImageLoader( this ); 00254 00255 TQVBoxLayout *topLayout = new TQVBoxLayout( this, KDialog::marginHint(), 00256 KDialog::spacingHint() ); 00257 TQGroupBox *box = new TQGroupBox( 0, Qt::Vertical, title, this ); 00258 TQVBoxLayout *layout = new TQVBoxLayout( box->layout(), KDialog::spacingHint() ); 00259 00260 mImageButton = new ImageButton( i18n( "Picture" ), box ); 00261 mImageButton->setFixedSize( 100, 140 ); 00262 mImageButton->setImageLoader( mImageLoader ); 00263 layout->addWidget( mImageButton ); 00264 00265 topLayout->addWidget( box ); 00266 00267 connect( mImageButton, TQT_SIGNAL( changed() ), TQT_SIGNAL( changed() ) ); 00268 } 00269 00270 ImageBaseWidget::~ImageBaseWidget() 00271 { 00272 delete mImageLoader; 00273 mImageLoader = 0; 00274 } 00275 00276 void ImageBaseWidget::setReadOnly( bool readOnly ) 00277 { 00278 mReadOnly = readOnly; 00279 mImageButton->setReadOnly( mReadOnly ); 00280 } 00281 00282 void ImageBaseWidget::setImage( const TDEABC::Picture &photo ) 00283 { 00284 mImageButton->setPicture( photo ); 00285 } 00286 00287 TDEABC::Picture ImageBaseWidget::image() const 00288 { 00289 return mImageButton->picture(); 00290 } 00291 00292 00293 ImageWidget::ImageWidget( TDEABC::AddressBook *ab, TQWidget *parent, const char *name ) 00294 : KAB::ContactEditorWidget( ab, parent, name ) 00295 { 00296 TQHBoxLayout *layout = new TQHBoxLayout( this, KDialog::marginHint(), 00297 KDialog::spacingHint() ); 00298 00299 mPhotoWidget = new ImageBaseWidget( TDEABC::Addressee::photoLabel(), this ); 00300 layout->addWidget( mPhotoWidget ); 00301 00302 mLogoWidget = new ImageBaseWidget( TDEABC::Addressee::logoLabel(), this ); 00303 layout->addWidget( mLogoWidget ); 00304 00305 connect( mPhotoWidget, TQT_SIGNAL( changed() ), TQT_SLOT( setModified() ) ); 00306 connect( mLogoWidget, TQT_SIGNAL( changed() ), TQT_SLOT( setModified() ) ); 00307 } 00308 00309 void ImageWidget::loadContact( TDEABC::Addressee *addr ) 00310 { 00311 mPhotoWidget->setImage( addr->photo() ); 00312 mLogoWidget->setImage( addr->logo() ); 00313 } 00314 00315 void ImageWidget::storeContact( TDEABC::Addressee *addr ) 00316 { 00317 addr->setPhoto( mPhotoWidget->image() ); 00318 addr->setLogo( mLogoWidget->image() ); 00319 } 00320 00321 void ImageWidget::setReadOnly( bool readOnly ) 00322 { 00323 mPhotoWidget->setReadOnly( readOnly ); 00324 mLogoWidget->setReadOnly( readOnly ); 00325 } 00326 00327 #include "imagewidget.moc"