You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libkipi/libkipi/libkipi/imagecollectionselector.cpp

349 lines
9.7 KiB

/* ============================================================
* 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 <tqheader.h>
#include <tqlayout.h>
#include <tqpushbutton.h>
#include <tqlabel.h>
#include <tqvgroupbox.h>
#include <tqtimer.h>
// KDE includes.
#include <kbuttonbox.h>
#include <kdialog.h>
#include <klistview.h>
#include <klocale.h>
#include <kglobal.h>
#include <tdeio/previewjob.h>
// 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<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( TQValueList<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();
}
TQValueList<ImageCollection> ImageCollectionSelector::selectedImageCollections() const {
TQValueList<ImageCollection> list;
TQListViewItemIterator 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() {
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<ImageCollectionItem*>( 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<ImageCollectionItem*>( 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<ImageCollectionItem*>( 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<ImageCollectionItem*>(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("<tr><td><nobr><font size=-1><i>");
TQString cellMid("</i></font></nobr></td><td><font size=-1>");
TQString cellEnd("</font></td></tr>");
TQString text("<table cellspacing=0 cellpadding=0>");
// 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 += "</table>";
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"