/* ============================================================ * 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. * * ============================================================ */ // TQt includes. #include #include #include #include #include #include // KDE includes. #include #include #include #include #include #include // KIPI includes. #include "libkipi/interface.h" // Local includes. #include "imagecollectionselector.h" namespace KIPI { class ImageCollectionItem : public TQCheckListItem { public: ImageCollectionItem(ImageCollectionSelector* selector, TQListView * parent, ImageCollection collection) : TQCheckListItem( parent, collection.name(), TQCheckListItem::CheckBox), _imageCollection(collection), _selector(selector) {} ImageCollection imageCollection() const { return _imageCollection; } protected: virtual void stateChange(bool val) { TQCheckListItem::stateChange(val); _selector->emitSelectionChanged(); } private: ImageCollection _imageCollection; ImageCollectionSelector* _selector; }; struct ImageCollectionSelector::Private { Interface* _interface; TDEListView* _list; TQLabel* _thumbLabel; TQLabel* _textLabel; TQListViewItem* _itemToSelect; }; ImageCollectionSelector::ImageCollectionSelector(TQWidget* parent, Interface* interface, const char* name) : TQWidget(parent, name) { d=new Private; d->_interface=interface; d->_itemToSelect = 0; d->_list=new TDEListView(this); d->_list->setResizeMode( TQListView::LastColumn ); d->_list->addColumn(""); d->_list->header()->hide(); connect(d->_list, TQT_SIGNAL(selectionChanged(TQListViewItem*)), TQT_SLOT(slotSelectionChanged(TQListViewItem*))); TQHBoxLayout* mainLayout=new TQHBoxLayout(this, 0, KDialog::spacingHint()); mainLayout->addWidget(d->_list); TQVBoxLayout* rightLayout = new TQVBoxLayout(mainLayout, 0); KButtonBox* box=new KButtonBox(this,Qt::Vertical); rightLayout->addWidget(box); TQPushButton* selectAll=box->addButton(i18n("Select All")); TQPushButton* invertSelection=box->addButton(i18n("Invert Selection")); TQPushButton* selectNone=box->addButton(i18n("Select None")); box->layout(); connect(selectAll, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotSelectAll()) ); connect(invertSelection, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotInvertSelection()) ); connect(selectNone, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotSelectNone()) ); rightLayout->addItem(new TQSpacerItem(10,20,TQSizePolicy::Fixed, TQSizePolicy::Expanding)); TQVGroupBox* rightBox = new TQVGroupBox(this); rightBox->setInsideMargin(KDialog::marginHint()); rightBox->setInsideSpacing(KDialog::spacingHint()); rightLayout->addWidget(rightBox); if (interface->hasFeature(AlbumsUseFirstImagePreview)) { d->_thumbLabel = new TQLabel(rightBox); d->_thumbLabel->setFixedSize(TQSize(128,128)); d->_thumbLabel->setAlignment(AlignHCenter | AlignVCenter); } else { d->_thumbLabel = 0; } d->_textLabel = new TQLabel(rightBox); fillList(); TQTimer::singleShot(0, this, TQT_SLOT(slotInitialShow())); } ImageCollectionSelector::~ImageCollectionSelector() { delete d; } void ImageCollectionSelector::fillList() { TQValueList 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( TQValueList::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(); } TQValueList ImageCollectionSelector::selectedImageCollections() const { TQValueList list; TQListViewItemIterator it( d->_list ); for (; it.current(); ++it) { ImageCollectionItem *item = static_cast( it.current() ); if (item->isOn()) { list << item->imageCollection(); } } return list; } void ImageCollectionSelector::slotSelectAll() { TQListViewItemIterator 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( it.current() ); item->setOn(true); } blockSignals(false); emit selectionChanged(); } void ImageCollectionSelector::slotInvertSelection() { TQListViewItemIterator 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( it.current() ); item->setOn(!item->isOn()); } blockSignals(false); emit selectionChanged(); } void ImageCollectionSelector::slotSelectNone() { TQListViewItemIterator 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( it.current() ); item->setOn(false); } blockSignals(false); emit selectionChanged(); } void ImageCollectionSelector::slotSelectionChanged(TQListViewItem* listItem) { if (d->_thumbLabel) d->_thumbLabel->clear(); d->_textLabel->clear(); if (!listItem) return; ImageCollectionItem* imcollItem = static_cast(listItem); if (d->_thumbLabel) { KURL::List images(imcollItem->imageCollection().images()); if (!images.isEmpty()) { TDEIO::PreviewJob* thumbJob = TDEIO::filePreview(images.first(), 128); connect( thumbJob, TQT_SIGNAL(gotPreview(const KFileItem*, const TQPixmap&)), TQT_SLOT(slotGotPreview(const KFileItem* , const TQPixmap&))); } } // Layout the ImageCollection information nicely TQString cellBeg(""); TQString cellMid(""); TQString cellEnd(""); TQString text(""); // number of images text += cellBeg + i18n("Images:") + cellMid + TQString::number(imcollItem->imageCollection().images().count()) + cellEnd; // Optional features ------------------------------------------------------- // Album Comments if (d->_interface->hasFeature(AlbumsHaveComments)) { // Limit the comments string to 20 char... TQString 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)) { TQDate date(imcollItem->imageCollection().date()); text += cellBeg + i18n("Date:") + cellMid + TDEGlobal::locale()->formatDate(date) + cellEnd; } text += "
"; d->_textLabel->setText(text); emit selectionChanged(); } void ImageCollectionSelector::slotGotPreview(const KFileItem*, const TQPixmap& 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"