summaryrefslogtreecommitdiffstats
path: root/libkipi/libkipi/imagecollectionselector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libkipi/libkipi/imagecollectionselector.cpp')
-rw-r--r--libkipi/libkipi/imagecollectionselector.cpp348
1 files changed, 348 insertions, 0 deletions
diff --git a/libkipi/libkipi/imagecollectionselector.cpp b/libkipi/libkipi/imagecollectionselector.cpp
new file mode 100644
index 0000000..c8a8625
--- /dev/null
+++ b/libkipi/libkipi/imagecollectionselector.cpp
@@ -0,0 +1,348 @@
+/* ============================================================
+ * File : imagecollectionselector.cpp
+ * Authors: KIPI team developers (see AUTHORS files for details)
+ *
+ * Date : 2004-07
+ * Description :
+ *
+ * Copyright 2004 by the KIPI team
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU Library General
+ * Public License as published by the Free Software Foundation;
+ * either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Library General Public License for more details.
+ *
+ * ============================================================ */
+
+// Qt includes.
+
+#include <qheader.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qlabel.h>
+#include <qvgroupbox.h>
+#include <qtimer.h>
+
+// KDE includes.
+
+#include <kbuttonbox.h>
+#include <kdialog.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kio/previewjob.h>
+
+// KIPI includes.
+
+#include "libkipi/interface.h"
+
+// Local includes.
+
+#include "imagecollectionselector.h"
+
+namespace KIPI
+{
+
+class ImageCollectionItem : public QCheckListItem
+{
+public:
+ ImageCollectionItem(ImageCollectionSelector* selector,
+ QListView * parent, ImageCollection collection)
+ : QCheckListItem( parent, collection.name(), QCheckListItem::CheckBox),
+ _imageCollection(collection), _selector(selector)
+ {}
+
+ ImageCollection imageCollection() const { return _imageCollection; }
+
+protected:
+
+ virtual void stateChange(bool val)
+ {
+ QCheckListItem::stateChange(val);
+ _selector->emitSelectionChanged();
+ }
+
+private:
+
+ ImageCollection _imageCollection;
+ ImageCollectionSelector* _selector;
+};
+
+struct ImageCollectionSelector::Private {
+ Interface* _interface;
+ KListView* _list;
+ QLabel* _thumbLabel;
+ QLabel* _textLabel;
+ QListViewItem* _itemToSelect;
+};
+
+
+ImageCollectionSelector::ImageCollectionSelector(QWidget* parent, Interface* interface, const char* name)
+ : QWidget(parent, name)
+{
+ d=new Private;
+ d->_interface=interface;
+ d->_itemToSelect = 0;
+
+ d->_list=new KListView(this);
+ d->_list->setResizeMode( QListView::LastColumn );
+ d->_list->addColumn("");
+ d->_list->header()->hide();
+
+ connect(d->_list, SIGNAL(selectionChanged(QListViewItem*)),
+ SLOT(slotSelectionChanged(QListViewItem*)));
+
+ QHBoxLayout* mainLayout=new QHBoxLayout(this, 0, KDialog::spacingHint());
+ mainLayout->addWidget(d->_list);
+
+ QVBoxLayout* rightLayout = new QVBoxLayout(mainLayout, 0);
+
+ KButtonBox* box=new KButtonBox(this, Vertical);
+ rightLayout->addWidget(box);
+ QPushButton* selectAll=box->addButton(i18n("Select All"));
+ QPushButton* invertSelection=box->addButton(i18n("Invert Selection"));
+ QPushButton* selectNone=box->addButton(i18n("Select None"));
+ box->layout();
+
+ connect(selectAll, SIGNAL(clicked()),
+ this, SLOT(slotSelectAll()) );
+ connect(invertSelection, SIGNAL(clicked()),
+ this, SLOT(slotInvertSelection()) );
+ connect(selectNone, SIGNAL(clicked()),
+ this, SLOT(slotSelectNone()) );
+
+ rightLayout->addItem(new QSpacerItem(10,20,QSizePolicy::Fixed,
+ QSizePolicy::Expanding));
+
+ QVGroupBox* rightBox = new QVGroupBox(this);
+ rightBox->setInsideMargin(KDialog::marginHint());
+ rightBox->setInsideSpacing(KDialog::spacingHint());
+ rightLayout->addWidget(rightBox);
+
+ if (interface->hasFeature(AlbumsUseFirstImagePreview))
+ {
+ d->_thumbLabel = new QLabel(rightBox);
+ d->_thumbLabel->setFixedSize(QSize(128,128));
+ d->_thumbLabel->setAlignment(AlignHCenter | AlignVCenter);
+ }
+ else
+ {
+ d->_thumbLabel = 0;
+ }
+ d->_textLabel = new QLabel(rightBox);
+
+ fillList();
+ QTimer::singleShot(0, this, SLOT(slotInitialShow()));
+}
+
+
+ImageCollectionSelector::~ImageCollectionSelector() {
+ delete d;
+}
+
+
+void ImageCollectionSelector::fillList() {
+ QValueList<ImageCollection> collections = d->_interface->allAlbums();
+ d->_list->clear();
+ ImageCollection current = d->_interface->currentAlbum();
+ bool currentWasInList = false;
+
+ /* note: the extensive use of blocksignals is to prevent bombarding
+ the plugin with too many selection changed signals. do not remove
+ them */
+
+ blockSignals(true);
+ for( QValueList<ImageCollection>::Iterator it = collections.begin() ;
+ it != collections.end() ; ++it )
+ {
+ ImageCollectionItem* item = new ImageCollectionItem( this, d->_list, *it);
+ if (!currentWasInList && *it == current) {
+ item->setOn(true);
+ currentWasInList = true;
+ if (!d->_itemToSelect)
+ d->_itemToSelect = item;
+ }
+ }
+
+ if (!currentWasInList) {
+ slotSelectAll();
+ d->_itemToSelect = d->_list->firstChild();
+ }
+ blockSignals(false);
+}
+
+void ImageCollectionSelector::emitSelectionChanged()
+{
+ emit selectionChanged();
+}
+
+QValueList<ImageCollection> ImageCollectionSelector::selectedImageCollections() const {
+ QValueList<ImageCollection> list;
+
+ QListViewItemIterator it( d->_list );
+
+ for (; it.current(); ++it) {
+ ImageCollectionItem *item = static_cast<ImageCollectionItem*>( it.current() );
+
+ if (item->isOn()) {
+ list << item->imageCollection();
+ }
+ }
+
+ return list;
+}
+
+void ImageCollectionSelector::slotSelectAll() {
+ QListViewItemIterator it( d->_list );
+
+ /* note: the extensive use of blocksignals is to prevent bombarding
+ the plugin with too many selection changed signals. do not remove
+ them */
+ blockSignals(true);
+ for (; it.current(); ++it) {
+ ImageCollectionItem *item = static_cast<ImageCollectionItem*>( it.current() );
+ item->setOn(true);
+ }
+ blockSignals(false);
+
+ emit selectionChanged();
+}
+
+
+void ImageCollectionSelector::slotInvertSelection() {
+ QListViewItemIterator it( d->_list );
+
+ /* note: the extensive use of blocksignals is to prevent bombarding
+ the plugin with too many selection changed signals. do not remove
+ them */
+ blockSignals(true);
+ for (; it.current(); ++it) {
+ ImageCollectionItem *item = static_cast<ImageCollectionItem*>( it.current() );
+ item->setOn(!item->isOn());
+ }
+ blockSignals(false);
+
+ emit selectionChanged();
+}
+
+
+void ImageCollectionSelector::slotSelectNone() {
+ QListViewItemIterator it( d->_list );
+
+ /* note: the extensive use of blocksignals is to prevent bombarding
+ the plugin with too many selection changed signals. do not remove
+ them */
+ blockSignals(true);
+ for (; it.current(); ++it) {
+ ImageCollectionItem *item = static_cast<ImageCollectionItem*>( it.current() );
+ item->setOn(false);
+ }
+ blockSignals(false);
+
+ emit selectionChanged();
+}
+
+void ImageCollectionSelector::slotSelectionChanged(QListViewItem* listItem)
+{
+ if (d->_thumbLabel)
+ d->_thumbLabel->clear();
+ d->_textLabel->clear();
+
+ if (!listItem)
+ return;
+
+ ImageCollectionItem* imcollItem =
+ static_cast<ImageCollectionItem*>(listItem);
+
+ if (d->_thumbLabel)
+ {
+ KURL::List images(imcollItem->imageCollection().images());
+ if (!images.isEmpty())
+ {
+ KIO::PreviewJob* thumbJob = KIO::filePreview(images.first(), 128);
+ connect( thumbJob, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)),
+ SLOT(slotGotPreview(const KFileItem* , const QPixmap&)));
+ }
+ }
+
+ // Layout the ImageCollection information nicely
+
+ QString cellBeg("<tr><td><nobr><font size=-1><i>");
+ QString cellMid("</i></font></nobr></td><td><font size=-1>");
+ QString cellEnd("</font></td></tr>");
+
+ QString text("<table cellspacing=0 cellpadding=0>");
+
+ // number of images
+ text += cellBeg + i18n("Images:") +
+ cellMid + QString::number(imcollItem->imageCollection().images().count()) +
+ cellEnd;
+
+ // Optional features -------------------------------------------------------
+
+ // Album Comments
+ if (d->_interface->hasFeature(AlbumsHaveComments))
+ {
+ // Limit the comments string to 20 char...
+ QString comments = imcollItem->imageCollection().comment();
+ if (!comments.isEmpty())
+ {
+ comments.truncate(20);
+ comments.append("...");
+ }
+
+ text += cellBeg + i18n("Comments:") +
+ cellMid + comments +
+ cellEnd;
+ }
+
+ // Album Category
+ if (d->_interface->hasFeature(AlbumsHaveCategory))
+ {
+ text += cellBeg + i18n("Category:") +
+ cellMid + imcollItem->imageCollection().category() +
+ cellEnd;
+ }
+
+ // Album Creation Date
+ if (d->_interface->hasFeature(AlbumsHaveCreationDate))
+ {
+ QDate date(imcollItem->imageCollection().date());
+ text += cellBeg + i18n("Date:") +
+ cellMid + KGlobal::locale()->formatDate(date) +
+ cellEnd;
+ }
+
+
+ text += "</table>";
+
+ d->_textLabel->setText(text);
+
+ emit selectionChanged();
+}
+
+void ImageCollectionSelector::slotGotPreview(const KFileItem*, const QPixmap& pix)
+{
+ d->_thumbLabel->setPixmap(pix);
+}
+
+void ImageCollectionSelector::slotInitialShow()
+{
+ if (d->_itemToSelect)
+ {
+ d->_list->setSelected(d->_itemToSelect, true);
+ d->_list->ensureItemVisible(d->_itemToSelect);
+ d->_itemToSelect = 0;
+ }
+ emit selectionChanged();
+}
+
+} // KIPI
+
+#include "imagecollectionselector.moc"