00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
#include <kabc/picture.h>
00025
#include <kdebug.h>
00026
#include <kdialog.h>
00027
#include <kglobalsettings.h>
00028
#include <kiconloader.h>
00029
#include <kio/netaccess.h>
00030
#include <klocale.h>
00031
#include <kurlrequester.h>
00032
#include <kimageio.h>
00033
00034
#include <qcheckbox.h>
00035
#include <qdragobject.h>
00036
#include <qgroupbox.h>
00037
#include <qlabel.h>
00038
#include <qlayout.h>
00039
#include <qpixmap.h>
00040
00041
#include "imagewidget.h"
00042
00043 ImageLabel::ImageLabel(
const QString &title, QWidget *parent )
00044 : QLabel( title, parent ), mReadOnly( false )
00045 {
00046 setAcceptDrops(
true );
00047 }
00048
00049
void ImageLabel::setReadOnly(
bool readOnly )
00050 {
00051 mReadOnly = readOnly;
00052 }
00053
00054
void ImageLabel::startDrag()
00055 {
00056
if ( pixmap() && !pixmap()->isNull() ) {
00057 QImageDrag *drag =
new QImageDrag( pixmap()->convertToImage(),
this );
00058 drag->dragCopy();
00059 }
00060 }
00061
00062
void ImageLabel::dragEnterEvent( QDragEnterEvent *event )
00063 {
00064 event->accept( QImageDrag::canDecode( event ) );
00065 }
00066
00067
void ImageLabel::dropEvent( QDropEvent *event )
00068 {
00069 QPixmap pm;
00070
if ( QImageDrag::decode( event, pm ) && !mReadOnly ) {
00071 setPixmap( pm );
00072 emit changed();
00073 }
00074 }
00075
00076
void ImageLabel::mousePressEvent( QMouseEvent *event )
00077 {
00078 mDragStartPos = event->pos();
00079 QLabel::mousePressEvent( event );
00080 }
00081
00082
void ImageLabel::mouseMoveEvent( QMouseEvent *event )
00083 {
00084
if ( (event->state() & LeftButton) &&
00085 (event->pos() - mDragStartPos).manhattanLength() >
00086 KGlobalSettings::dndEventDelay() ) {
00087 startDrag();
00088 }
00089 }
00090
00091
00092 ImageWidget::ImageWidget(
const QString &title, QWidget *parent,
const char *name )
00093 : QWidget( parent, name ), mReadOnly( false )
00094 {
00095 QHBoxLayout *topLayout =
new QHBoxLayout(
this, KDialog::marginHint(),
00096 KDialog::spacingHint() );
00097 QGroupBox *box =
new QGroupBox( 0, Qt::Vertical, title,
this );
00098 QGridLayout *boxLayout =
new QGridLayout( box->layout(), 4, 2,
00099 KDialog::spacingHint() );
00100 boxLayout->setRowStretch( 3, 1 );
00101
00102 mImageLabel =
new ImageLabel( i18n(
"Picture" ), box );
00103 mImageLabel->setFixedSize( 50, 70 );
00104 mImageLabel->setScaledContents(
true );
00105 mImageLabel->setFrameStyle( QFrame::Panel | QFrame::Sunken );
00106 boxLayout->addMultiCellWidget( mImageLabel, 0, 2, 0, 0, AlignTop );
00107
00108 mImageUrl =
new KURLRequester( box );
00109 mImageUrl->setFilter( KImageIO::pattern() );
00110 mImageUrl->setMode( KFile::File );
00111 boxLayout->addWidget( mImageUrl, 0, 1 );
00112
00113 mUseImageUrl =
new QCheckBox( i18n(
"Store as URL" ), box );
00114 mUseImageUrl->setEnabled(
false );
00115 boxLayout->addWidget( mUseImageUrl, 1, 1 );
00116
00117 mClearButton =
new KPushButton( KStdGuiItem::clear(), box );
00118 mClearButton->setEnabled(
false );
00119 boxLayout->addMultiCellWidget( mClearButton, 3, 3, 0, 1 );
00120
00121 topLayout->addWidget( box );
00122
00123 connect( mImageLabel, SIGNAL( changed() ),
00124 SLOT( imageChanged() ) );
00125 connect( mImageUrl, SIGNAL( textChanged(
const QString& ) ),
00126 SIGNAL( changed() ) );
00127 connect( mImageUrl, SIGNAL( urlSelected(
const QString& ) ),
00128 SLOT( loadImage() ) );
00129 connect( mImageUrl, SIGNAL( urlSelected(
const QString& ) ),
00130 SIGNAL( changed() ) );
00131 connect( mImageUrl, SIGNAL( urlSelected(
const QString& ) ),
00132 SLOT( updateGUI() ) );
00133 connect( mUseImageUrl, SIGNAL( toggled(
bool ) ),
00134 SIGNAL( changed() ) );
00135 connect( mClearButton, SIGNAL( clicked() ),
00136 SLOT( clear() ) );
00137 }
00138
00139 ImageWidget::~ImageWidget()
00140 {
00141 }
00142
00143
void ImageWidget::setReadOnly(
bool readOnly )
00144 {
00145 mReadOnly = readOnly;
00146 mImageLabel->setReadOnly( mReadOnly );
00147 mImageUrl->setEnabled( !mReadOnly );
00148 }
00149
00150
void ImageWidget::setImage(
const KABC::Picture &photo )
00151 {
00152
bool blocked = signalsBlocked();
00153 blockSignals(
true );
00154
00155
if ( photo.isIntern() ) {
00156 mImageLabel->setPixmap( photo.data() );
00157 mUseImageUrl->setChecked(
false );
00158 }
else {
00159 mImageUrl->setURL( photo.url() );
00160
if ( !photo.url().isEmpty() )
00161 mUseImageUrl->setChecked(
true );
00162 loadImage();
00163 }
00164
00165 blockSignals( blocked );
00166
00167 updateGUI();
00168 }
00169
00170 KABC::Picture ImageWidget::image()
const
00171
{
00172 KABC::Picture photo;
00173
00174
if ( mUseImageUrl->isChecked() )
00175 photo.setUrl( mImageUrl->url() );
00176
else {
00177 QPixmap *px = mImageLabel->pixmap();
00178
if ( px ) {
00179
if ( px->height() > px->width() )
00180 photo.setData( px->convertToImage().scaleHeight( 140 ) );
00181
else
00182 photo.setData( px->convertToImage().scaleWidth( 100 ) );
00183
00184 photo.setType(
"PNG" );
00185 }
00186 }
00187
00188
return photo;
00189 }
00190
00191
void ImageWidget::loadImage()
00192 {
00193 mImageLabel->setPixmap( loadPixmap( KURL( mImageUrl->url() ) ) );
00194 }
00195
00196
void ImageWidget::updateGUI()
00197 {
00198
if ( !mReadOnly ) {
00199 mUseImageUrl->setEnabled( !mImageUrl->url().isEmpty() );
00200 mClearButton->setEnabled( !mImageUrl->url().isEmpty() || ( mImageLabel->pixmap() && !mImageLabel->pixmap()->isNull() ) );
00201 }
00202 }
00203
00204
void ImageWidget::clear()
00205 {
00206 mImageLabel->clear();
00207 mImageUrl->clear();
00208 mUseImageUrl->setChecked(
false );
00209
00210 updateGUI();
00211
00212 emit changed();
00213 }
00214
00215
void ImageWidget::imageChanged()
00216 {
00217 updateGUI();
00218
00219 emit changed();
00220 }
00221
00222 QPixmap ImageWidget::loadPixmap(
const KURL &url )
00223 {
00224 QString tempFile;
00225 QPixmap pixmap;
00226
00227
if ( url.isEmpty() )
00228
return pixmap;
00229
00230
if ( url.isLocalFile() )
00231 pixmap = QPixmap( url.path() );
00232
else if ( KIO::NetAccess::download( url, tempFile,
this ) ) {
00233 pixmap = QPixmap( tempFile );
00234 KIO::NetAccess::removeTempFile( tempFile );
00235 }
00236
00237
return pixmap;
00238 }
00239
00240
#include "imagewidget.moc"