00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <qguardedptr.h>
00026 #include <qlabel.h>
00027 #include <qsplitter.h>
00028 #include <qlayout.h>
00029 #include <qframe.h>
00030 #include <qpushbutton.h>
00031 #include <qtimer.h>
00032
00033
00034
00035 #include <kdebug.h>
00036 #include <klistview.h>
00037 #include <klocale.h>
00038 #include <kstandarddirs.h>
00039 #include <kio/previewjob.h>
00040 #include <kapplication.h>
00041 #include <kaboutdata.h>
00042 #include <khelpmenu.h>
00043 #include <kiconloader.h>
00044 #include <kpopupmenu.h>
00045
00046
00047
00048 #include "libkipi/version.h"
00049
00050
00051
00052 #include "imagedialog.h"
00053
00054 const int PREVIEW_SIZE = 128;
00055
00056 namespace KIPI
00057 {
00058
00059 struct AlbumLVI : public KListViewItem {
00060 AlbumLVI(KListView* parent, const KIPI::ImageCollection& album)
00061 : KListViewItem(parent, album.name())
00062 , _album(album) {}
00063
00064 const KIPI::ImageCollection& _album;
00065 };
00066
00067
00068 struct ImageLVI : public KListViewItem {
00069 ImageLVI(KListView* parent, const KURL& url)
00070 : KListViewItem(parent, url.fileName()), _url(url) {}
00071
00072 KURL _url;
00073 };
00074
00075
00076 struct ImageDialog::Private {
00077 KURL _url;
00078 KURL::List _urls;
00079 KIPI::Interface* _interface;
00080 KListView* _albumList;
00081 KListView* _imageList;
00082 QLabel* _preview;
00083 QValueList<ImageCollection> _albums;
00084 bool _singleSelection;
00085 };
00086
00087
00088 ImageDialog::ImageDialog(QWidget* parent, KIPI::Interface* interface,
00089 bool singleSelection)
00090 : KDialogBase(KDialogBase::Plain, i18n("Select Image From Album"), Help|Ok|Cancel,
00091 Ok, parent, "album-dialog", true, true)
00092 {
00093 d = new Private;
00094 d->_interface=interface;
00095 d->_singleSelection = singleSelection;
00096
00097 QWidget* box = plainPage();
00098 QVBoxLayout *dvlay = new QVBoxLayout( box, 6 );
00099
00100
00101
00102 QFrame *headerFrame = new QFrame( box );
00103 headerFrame->setFrameStyle(QFrame::Panel|QFrame::Sunken);
00104 QHBoxLayout* layout = new QHBoxLayout( headerFrame );
00105 layout->setMargin( 2 );
00106 layout->setSpacing( 0 );
00107 QLabel *pixmapLabelLeft = new QLabel( headerFrame, "pixmapLabelLeft" );
00108 pixmapLabelLeft->setScaledContents( false );
00109 layout->addWidget( pixmapLabelLeft );
00110 QLabel *labelTitle = new QLabel( i18n("Select Image From Album"), headerFrame, "labelTitle" );
00111 layout->addWidget( labelTitle );
00112 layout->setStretchFactor( labelTitle, 1 );
00113 dvlay->addWidget( headerFrame );
00114
00115 QString directory;
00116 KGlobal::dirs()->addResourceType("kipi_banner_left", KGlobal::dirs()->kde_default("data") + "kipi/data");
00117 directory = KGlobal::dirs()->findResourceDir("kipi_banner_left", "banner_left.png");
00118
00119 pixmapLabelLeft->setPaletteBackgroundColor( QColor(201, 208, 255) );
00120 pixmapLabelLeft->setPixmap( QPixmap( directory + "banner_left.png" ) );
00121 labelTitle->setPaletteBackgroundColor( QColor(201, 208, 255) );
00122
00123
00124
00125
00126
00127 KAboutData* about = new KAboutData("kipiplugins",
00128 I18N_NOOP("Image selector dialog"),
00129 kipi_version,
00130 I18N_NOOP("A Kipi dialog for image selection"),
00131 KAboutData::License_GPL,
00132 "(c) 2004,2005, Kipi development team",
00133 0,
00134 "http://extragear.kde.org/apps/kipi");
00135
00136 QPushButton *helpButton = actionButton( Help );
00137 KHelpMenu* helpMenu = new KHelpMenu(this, about, false);
00138 helpMenu->menu()->removeItemAt(0);
00139 helpMenu->menu()->insertItem(i18n("Kipi Plugins Handbooks"), this, SLOT(slotHelp()), 0, -1, 0);
00140 helpButton->setPopup( helpMenu->menu() );
00141
00142
00143
00144 QSplitter* splitter = new QSplitter(box);
00145
00146 d->_albumList=new KListView(splitter);
00147 d->_albumList->addColumn(i18n("Album Name"));
00148 d->_albumList->setMinimumWidth(200);
00149 d->_albumList->setResizeMode(QListView::LastColumn);
00150
00151 d->_imageList=new KListView(splitter);
00152 d->_imageList->addColumn(i18n("Image Name"));
00153 d->_imageList->setMinimumWidth(200);
00154 d->_imageList->setSelectionMode(singleSelection ? QListView::Single :
00155 QListView::Extended);
00156 d->_imageList->setResizeMode(QListView::LastColumn);
00157
00158 d->_preview=new QLabel(splitter);
00159 d->_preview->setAlignment(AlignHCenter | AlignVCenter | WordBreak);
00160 d->_preview->setFixedWidth(PREVIEW_SIZE);
00161 d->_preview->setText(i18n("No image selected"));
00162
00163 dvlay->addWidget( splitter );
00164
00165 d->_albums=d->_interface->allAlbums();
00166 QValueList<ImageCollection>::ConstIterator it=d->_albums.begin();
00167
00168 for(; it!=d->_albums.end(); ++it) {
00169 new AlbumLVI(d->_albumList, *it);
00170 }
00171 QTimer::singleShot(0, this, SLOT(slotInitialShow()));
00172
00173 connect(d->_albumList, SIGNAL(selectionChanged(QListViewItem*)),
00174 this, SLOT(fillImageList(QListViewItem*)) );
00175
00176 if (singleSelection)
00177 connect(d->_imageList, SIGNAL(selectionChanged(QListViewItem*)),
00178 this, SLOT(slotImageSelected(QListViewItem*)) );
00179 else
00180 connect(d->_imageList, SIGNAL(selectionChanged()),
00181 this, SLOT(slotImagesSelected()));
00182
00183 enableButtonOK(false);
00184 }
00185
00186
00187 ImageDialog::~ImageDialog() {
00188 delete d;
00189 }
00190
00191
00192 KURL ImageDialog::url() const {
00193 return d->_url;
00194 }
00195
00196 KURL::List ImageDialog::urls() const
00197 {
00198 return d->_urls;
00199 }
00200
00201 KURL ImageDialog::getImageURL(QWidget* parent, KIPI::Interface* interface) {
00202 ImageDialog dlg(parent, interface, true);
00203 if (dlg.exec() == QDialog::Accepted) {
00204 return dlg.url();
00205 } else {
00206 return KURL();
00207 }
00208 }
00209
00210 KURL::List ImageDialog::getImageURLs(QWidget* parent, Interface* interface)
00211 {
00212 ImageDialog dlg(parent, interface, false);
00213 if (dlg.exec() == QDialog::Accepted)
00214 return dlg.urls();
00215 else
00216 {
00217 KURL::List urls;
00218 return urls;
00219 }
00220 }
00221
00222
00223 void ImageDialog::fillImageList(QListViewItem* item) {
00224 d->_imageList->clear();
00225 if (!item) return;
00226
00227 const KIPI::ImageCollection& album=static_cast<AlbumLVI*>(item)->_album;
00228 KURL::List images=album.images();
00229
00230 KURL::List::ConstIterator it=images.begin();
00231 for (;it!=images.end(); ++it) {
00232 new ImageLVI(d->_imageList, *it);
00233 }
00234 }
00235
00236
00237 void ImageDialog::slotImageSelected(QListViewItem* item) {
00238 if (!item) {
00239 enableButtonOK(false);
00240 d->_preview->setText(i18n("No image selected"));
00241 d->_url=KURL();
00242 return;
00243 }
00244 enableButtonOK(true);
00245 d->_url=static_cast<ImageLVI*>(item)->_url;
00246 d->_preview->clear();
00247
00248 KIO::PreviewJob* thumbJob = KIO::filePreview(d->_url, PREVIEW_SIZE);
00249 connect( thumbJob, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)),
00250 SLOT(slotGotPreview(const KFileItem* , const QPixmap&)));
00251 }
00252
00253 void ImageDialog::slotImagesSelected()
00254 {
00255 d->_url = KURL();
00256 d->_urls.clear();
00257 d->_preview->clear();
00258
00259 QListViewItem* selectedItem = 0;
00260 QListViewItem* listItem = d->_imageList->firstChild();
00261 while (listItem)
00262 {
00263 if (listItem->isSelected())
00264 {
00265 selectedItem = listItem;
00266 d->_urls.append(static_cast<ImageLVI*>(listItem)->_url);
00267 }
00268 listItem = listItem->nextSibling();
00269 }
00270
00271 if (!selectedItem)
00272 {
00273 enableButtonOK(false);
00274 d->_preview->setText(i18n("No images selected"));
00275 d->_url=KURL();
00276 d->_urls.clear();
00277 return;
00278 }
00279
00280 enableButtonOK(true);
00281
00282 if (d->_urls.count() == 1)
00283 {
00284 d->_url = d->_urls.first();
00285
00286 KIO::PreviewJob* thumbJob = KIO::filePreview(d->_url, PREVIEW_SIZE);
00287 connect( thumbJob, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)),
00288 SLOT(slotGotPreview(const KFileItem* , const QPixmap&)));
00289 }
00290 else
00291 {
00292 d->_url = d->_urls.first();
00293 d->_preview->setText(i18n("1 image selected", "%n images selected", d->_urls.count()));
00294 }
00295 }
00296
00297 void ImageDialog::slotGotPreview(const KFileItem*, const QPixmap& pix) {
00298
00299 d->_preview->setPixmap(pix);
00300 }
00301
00302 void ImageDialog::slotHelp( void )
00303 {
00304 KApplication::kApplication()->invokeHelp("", "kipi-plugins");
00305 }
00306
00307 void ImageDialog::slotInitialShow()
00308 {
00309 ImageCollection current = d->_interface->currentAlbum();
00310
00311 QListViewItemIterator it( d->_albumList );
00312 while ( it.current() )
00313 {
00314 AlbumLVI* lvi = static_cast<AlbumLVI*>( it.current() );
00315 if ( lvi->_album == current )
00316 {
00317 d->_albumList->ensureItemVisible( lvi );
00318 d->_albumList->setSelected( lvi, true );
00319 break;
00320 }
00321 ++it;
00322 }
00323 }
00324
00325 }
00326
00327 #include "imagedialog.moc"