imagedialog.cpp

Go to the documentation of this file.
00001 /* ============================================================
00002  * File   : imagedialog.cpp
00003  * Authors: KIPI team developers (see AUTHORS files for details)
00004  *      
00005  * Date   : 2004-05
00006  * Description : an image files selector dialog.
00007  *
00008  * Copyright 2004 by the KIPI team
00009  *
00010  * This program is free software; you can redistribute it
00011  * and/or modify it under the terms of the GNU Library General
00012  * Public License as published by the Free Software Foundation;
00013  * either version 2, or (at your option)
00014  * any later version.
00015  *
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU Library General Public License for more details.
00020  *
00021  * ============================================================ */
00022  
00023 // Qt includes.
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 // KDE includes.
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 // Include files for libKipi.
00047 
00048 #include "libkipi/version.h"
00049 
00050 // Local includes.
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 ); // to make sure the frame gets displayed
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     // About data and help button.
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 } // namespace KIPI
00326 
00327 #include "imagedialog.moc"

Generated on Tue Sep 25 22:34:22 2007 for libKipi by  doxygen 1.5.3