libKipi
imagedialog.cpp
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of kipi-plugins project
4 * http://www.kipi-plugins.org
5 *
6 * Date : 2004-05-01
7 * Description : an image files selector dialog.
8 *
9 * Copyright (C) 2004-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
10 * Copyright (C) 2004-2005 by Renchi Raju <renchi.raju at kdemail.net>
11 * Copyright (C) 2004-2005 by Jesper K. Pedersen <blackie at kde.org>
12 * Copyright (C) 2004-2005 by Aurelien Gateau <aurelien dot gateau at free.fr>
13 *
14 * This program is free software; you can redistribute it
15 * and/or modify it under the terms of the GNU General
16 * Public License as published by the Free Software Foundation;
17 * either version 2, or (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * ============================================================ */
25
26// Qt includes.
27
28#include <qguardedptr.h>
29#include <qlabel.h>
30#include <qsplitter.h>
31#include <qlayout.h>
32#include <qframe.h>
33#include <qpushbutton.h>
34#include <qtimer.h>
35
36// KDE includes.
37
38#include <kdebug.h>
39#include <klistview.h>
40#include <klocale.h>
41#include <kstandarddirs.h>
42#include <kio/previewjob.h>
43#include <kapplication.h>
44#include <kaboutdata.h>
45#include <khelpmenu.h>
46#include <kiconloader.h>
47#include <kpopupmenu.h>
48
49// Include files for libKipi.
50
51#include "libkipi/version.h"
52
53// Local includes.
54
55#include "imagedialog.h"
56#include "imagedialog.moc"
57
58const int PREVIEW_SIZE = 128;
59
60namespace KIPI
61{
62
63struct AlbumLVI : public KListViewItem
64{
65 AlbumLVI(KListView* parent, const KIPI::ImageCollection& album)
66 : KListViewItem(parent, album.name()), _album(album) {}
67
69};
70
71
72struct ImageLVI : public KListViewItem
73{
74 ImageLVI(KListView* parent, const KURL& url)
75 : KListViewItem(parent, url.fileName()), _url(url) {}
76
77 KURL _url;
78};
79
80
82{
83 KURL _url;
84 KURL::List _urls;
86 KListView* _albumList;
87 KListView* _imageList;
88 QLabel* _preview;
89 QValueList<ImageCollection> _albums;
91};
92
93
94ImageDialog::ImageDialog(QWidget* parent, KIPI::Interface* interface,
95 bool singleSelection)
96 : KDialogBase(KDialogBase::Plain, i18n("Select Image From Album"), Help|Ok|Cancel,
97 Ok, parent, "album-dialog", true, true)
98{
99 d = new Private;
100 d->_interface=interface;
101 d->_singleSelection = singleSelection;
102
103 QWidget* box = plainPage();
104 QVBoxLayout *dvlay = new QVBoxLayout( box, 6 );
105
106 //---------------------------------------------
107
108 // About data and help button.
109
110 KAboutData* about = new KAboutData("kipiplugins",
111 I18N_NOOP("Image selector dialog"),
112 kipi_version,
113 I18N_NOOP("A Kipi dialog for image selection"),
114 KAboutData::License_GPL,
115 "(c) 2004,2007, Kipi development team",
116 0,
117 "http://www.kipi-plugins.org");
118
119 QPushButton *helpButton = actionButton( Help );
120 KHelpMenu* helpMenu = new KHelpMenu(this, about, false);
121 helpMenu->menu()->removeItemAt(0);
122 helpMenu->menu()->insertItem(i18n("Kipi Plugins Handbooks"), this, SLOT(slotHelp()), 0, -1, 0);
123 helpButton->setPopup( helpMenu->menu() );
124
125 //---------------------------------------------
126
127 QSplitter* splitter = new QSplitter(box);
128
129 d->_albumList=new KListView(splitter);
130 d->_albumList->addColumn(i18n("Album Name"));
131 d->_albumList->setMinimumWidth(200);
132 d->_albumList->setResizeMode(QListView::LastColumn);
133
134 d->_imageList=new KListView(splitter);
135 d->_imageList->addColumn(i18n("Image Name"));
136 d->_imageList->setMinimumWidth(200);
137 d->_imageList->setSelectionMode(singleSelection ? QListView::Single :
138 QListView::Extended);
139 d->_imageList->setResizeMode(QListView::LastColumn);
140
141 d->_preview=new QLabel(splitter);
142 d->_preview->setAlignment(AlignHCenter | AlignVCenter | WordBreak);
143 d->_preview->setFixedWidth(PREVIEW_SIZE);
144 d->_preview->setText(i18n("No image selected"));
145
146 dvlay->addWidget( splitter );
147
148 d->_albums=d->_interface->allAlbums();
149 QValueList<ImageCollection>::ConstIterator it=d->_albums.begin();
150
151 for(; it!=d->_albums.end(); ++it)
152 {
153 new AlbumLVI(d->_albumList, *it);
154 }
155 QTimer::singleShot(0, this, SLOT(slotInitialShow()));
156
157 connect(d->_albumList, SIGNAL(selectionChanged(QListViewItem*)),
158 this, SLOT(fillImageList(QListViewItem*)) );
159
160 if (singleSelection)
161 connect(d->_imageList, SIGNAL(selectionChanged(QListViewItem*)),
162 this, SLOT(slotImageSelected(QListViewItem*)) );
163 else
164 connect(d->_imageList, SIGNAL(selectionChanged()),
165 this, SLOT(slotImagesSelected()));
166
167 enableButtonOK(false);
168}
169
170
172{
173 delete d;
174}
175
176KURL ImageDialog::url() const
177{
178 return d->_url;
179}
180
181KURL::List ImageDialog::urls() const
182{
183 return d->_urls;
184}
185
186KURL ImageDialog::getImageURL(QWidget* parent, KIPI::Interface* interface)
187{
188 ImageDialog dlg(parent, interface, true);
189 if (dlg.exec() == QDialog::Accepted)
190 {
191 return dlg.url();
192 }
193 else
194 {
195 return KURL();
196 }
197}
198
199KURL::List ImageDialog::getImageURLs(QWidget* parent, Interface* interface)
200{
201 ImageDialog dlg(parent, interface, false);
202 if (dlg.exec() == QDialog::Accepted)
203 return dlg.urls();
204 else
205 {
206 KURL::List urls;
207 return urls;
208 }
209}
210
211void ImageDialog::fillImageList(QListViewItem* item)
212{
213 d->_imageList->clear();
214 if (!item) return;
215
216 const KIPI::ImageCollection& album=static_cast<AlbumLVI*>(item)->_album;
217 KURL::List images=album.images();
218
219 KURL::List::ConstIterator it=images.begin();
220 for (;it!=images.end(); ++it)
221 {
222 new ImageLVI(d->_imageList, *it);
223 }
224}
225
226void ImageDialog::slotImageSelected(QListViewItem* item)
227{
228 if (!item)
229 {
230 enableButtonOK(false);
231 d->_preview->setText(i18n("No image selected"));
232 d->_url=KURL();
233 return;
234 }
235 enableButtonOK(true);
236 d->_url=static_cast<ImageLVI*>(item)->_url;
237 d->_preview->clear();
238
239 KIO::PreviewJob* thumbJob = KIO::filePreview(d->_url, PREVIEW_SIZE);
240 connect( thumbJob, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)),
241 SLOT(slotGotPreview(const KFileItem* , const QPixmap&)));
242}
243
244void ImageDialog::slotImagesSelected()
245{
246 d->_url = KURL();
247 d->_urls.clear();
248 d->_preview->clear();
249
250 QListViewItem* selectedItem = 0;
251 QListViewItem* listItem = d->_imageList->firstChild();
252 while (listItem)
253 {
254 if (listItem->isSelected())
255 {
256 selectedItem = listItem;
257 d->_urls.append(static_cast<ImageLVI*>(listItem)->_url);
258 }
259 listItem = listItem->nextSibling();
260 }
261
262 if (!selectedItem)
263 {
264 enableButtonOK(false);
265 d->_preview->setText(i18n("No images selected"));
266 d->_url=KURL();
267 d->_urls.clear();
268 return;
269 }
270
271 enableButtonOK(true);
272
273 if (d->_urls.count() == 1)
274 {
275 d->_url = d->_urls.first();
276
277 KIO::PreviewJob* thumbJob = KIO::filePreview(d->_url, PREVIEW_SIZE);
278 connect( thumbJob, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)),
279 SLOT(slotGotPreview(const KFileItem* , const QPixmap&)));
280 }
281 else
282 {
283 d->_url = d->_urls.first();
284 d->_preview->setText(i18n("1 image selected", "%n images selected", d->_urls.count()));
285 }
286}
287
288void ImageDialog::slotGotPreview(const KFileItem*, const QPixmap& pix)
289{
290 d->_preview->setPixmap(pix);
291}
292
293void ImageDialog::slotHelp( void )
294{
295 KApplication::kApplication()->invokeHelp("", "kipi-plugins");
296}
297
298void ImageDialog::slotInitialShow()
299{
300 ImageCollection current = d->_interface->currentAlbum();
301
302 QListViewItemIterator it( d->_albumList );
303 while ( it.current() )
304 {
305 AlbumLVI* lvi = static_cast<AlbumLVI*>( it.current() );
306 if ( lvi->_album == current )
307 {
308 d->_albumList->ensureItemVisible( lvi );
309 d->_albumList->setSelected( lvi, true );
310 break;
311 }
312 ++it;
313 }
314}
315
316} // namespace KIPI
317
Definition imagecollection.h:53
KURL::List images() const
Definition imagecollection.cpp:95
static KURL getImageURL(QWidget *, Interface *)
Definition imagedialog.cpp:186
KURL::List urls() const
Definition imagedialog.cpp:181
KURL url() const
Definition imagedialog.cpp:176
~ImageDialog()
Definition imagedialog.cpp:171
static KURL::List getImageURLs(QWidget *, Interface *)
Definition imagedialog.cpp:199
ImageDialog(QWidget *, Interface *, bool singleSelection=false)
Definition imagedialog.cpp:94
Definition interface.h:64
const int PREVIEW_SIZE
Definition imagedialog.cpp:58
Definition batchprogressdialog.cpp:70
Definition imagedialog.cpp:64
const KIPI::ImageCollection & _album
Definition imagedialog.cpp:68
AlbumLVI(KListView *parent, const KIPI::ImageCollection &album)
Definition imagedialog.cpp:65
Definition imagedialog.cpp:82
QLabel * _preview
Definition imagedialog.cpp:88
KURL::List _urls
Definition imagedialog.cpp:84
KListView * _albumList
Definition imagedialog.cpp:86
KIPI::Interface * _interface
Definition imagedialog.cpp:85
QValueList< ImageCollection > _albums
Definition imagedialog.cpp:89
bool _singleSelection
Definition imagedialog.cpp:90
KListView * _imageList
Definition imagedialog.cpp:87
KURL _url
Definition imagedialog.cpp:83
Definition imagedialog.cpp:73
KURL _url
Definition imagedialog.cpp:77
ImageLVI(KListView *parent, const KURL &url)
Definition imagedialog.cpp:74