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/imagedialog.cpp

328 lines
9.6 KiB

/* ============================================================
* File : imagedialog.cpp
* Authors: KIPI team developers (see AUTHORS files for details)
*
* Date : 2004-05
* Description : an image files selector dialog.
*
* 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 <tqguardedptr.h>
#include <tqlabel.h>
#include <tqsplitter.h>
#include <tqlayout.h>
#include <tqframe.h>
#include <tqpushbutton.h>
#include <tqtimer.h>
// KDE includes.
#include <kdebug.h>
#include <klistview.h>
#include <klocale.h>
#include <kstandarddirs.h>
#include <tdeio/previewjob.h>
#include <kapplication.h>
#include <kaboutdata.h>
#include <khelpmenu.h>
#include <kiconloader.h>
#include <kpopupmenu.h>
// Include files for libKipi.
#include "libkipi/version.h"
// Local includes.
#include "imagedialog.h"
const int PREVIEW_SIZE = 128;
namespace KIPI
{
struct AlbumLVI : public TDEListViewItem {
AlbumLVI(TDEListView* parent, const KIPI::ImageCollection& album)
: TDEListViewItem(parent, album.name())
, _album(album) {}
const KIPI::ImageCollection& _album;
};
struct ImageLVI : public TDEListViewItem {
ImageLVI(TDEListView* parent, const KURL& url)
: TDEListViewItem(parent, url.fileName()), _url(url) {}
KURL _url;
};
struct ImageDialog::Private {
KURL _url;
KURL::List _urls;
KIPI::Interface* _interface;
TDEListView* _albumList;
TDEListView* _imageList;
TQLabel* _preview;
TQValueList<ImageCollection> _albums;
bool _singleSelection;
};
ImageDialog::ImageDialog(TQWidget* parent, KIPI::Interface* interface,
bool singleSelection)
: KDialogBase(KDialogBase::Plain, i18n("Select Image From Album"), Help|Ok|Cancel,
Ok, parent, "album-dialog", true, true)
{
d = new Private;
d->_interface=interface;
d->_singleSelection = singleSelection;
TQWidget* box = plainPage();
TQVBoxLayout *dvlay = new TQVBoxLayout( box, 6 );
//---------------------------------------------
TQFrame *headerFrame = new TQFrame( box );
headerFrame->setFrameStyle(TQFrame::Panel|TQFrame::Sunken);
TQHBoxLayout* layout = new TQHBoxLayout( headerFrame );
layout->setMargin( 2 ); // to make sure the frame gets displayed
layout->setSpacing( 0 );
TQLabel *pixmapLabelLeft = new TQLabel( headerFrame, "pixmapLabelLeft" );
pixmapLabelLeft->setScaledContents( false );
layout->addWidget( pixmapLabelLeft );
TQLabel *labelTitle = new TQLabel( i18n("Select Image From Album"), headerFrame, "labelTitle" );
layout->addWidget( labelTitle );
layout->setStretchFactor( labelTitle, 1 );
dvlay->addWidget( headerFrame );
TQString directory;
TDEGlobal::dirs()->addResourceType("kipi_banner_left", TDEGlobal::dirs()->kde_default("data") + "kipi/data");
directory = TDEGlobal::dirs()->findResourceDir("kipi_banner_left", "banner_left.png");
pixmapLabelLeft->setPaletteBackgroundColor( TQColor(201, 208, 255) );
pixmapLabelLeft->setPixmap( TQPixmap( directory + "banner_left.png" ) );
labelTitle->setPaletteBackgroundColor( TQColor(201, 208, 255) );
//---------------------------------------------
// About data and help button.
TDEAboutData* about = new TDEAboutData("kipiplugins",
I18N_NOOP("Image selector dialog"),
kipi_version,
I18N_NOOP("A Kipi dialog for image selection"),
TDEAboutData::License_GPL,
"(c) 2004,2005, Kipi development team",
0,
"http://extragear.kde.org/apps/kipi");
TQPushButton *helpButton = actionButton( Help );
KHelpMenu* helpMenu = new KHelpMenu(this, about, false);
helpMenu->menu()->removeItemAt(0);
helpMenu->menu()->insertItem(i18n("Kipi Plugins Handbooks"), this, TQT_SLOT(slotHelp()), 0, -1, 0);
helpButton->setPopup( helpMenu->menu() );
//---------------------------------------------
TQSplitter* splitter = new TQSplitter(box);
d->_albumList=new TDEListView(splitter);
d->_albumList->addColumn(i18n("Album Name"));
d->_albumList->setMinimumWidth(200);
d->_albumList->setResizeMode(TQListView::LastColumn);
d->_imageList=new TDEListView(splitter);
d->_imageList->addColumn(i18n("Image Name"));
d->_imageList->setMinimumWidth(200);
d->_imageList->setSelectionMode(singleSelection ? TQListView::Single :
TQListView::Extended);
d->_imageList->setResizeMode(TQListView::LastColumn);
d->_preview=new TQLabel(splitter);
d->_preview->setAlignment(AlignHCenter | AlignVCenter | WordBreak);
d->_preview->setFixedWidth(PREVIEW_SIZE);
d->_preview->setText(i18n("No image selected"));
dvlay->addWidget( splitter );
d->_albums=d->_interface->allAlbums();
TQValueList<ImageCollection>::ConstIterator it=d->_albums.begin();
for(; it!=d->_albums.end(); ++it) {
new AlbumLVI(d->_albumList, *it);
}
TQTimer::singleShot(0, this, TQT_SLOT(slotInitialShow()));
connect(d->_albumList, TQT_SIGNAL(selectionChanged(TQListViewItem*)),
this, TQT_SLOT(fillImageList(TQListViewItem*)) );
if (singleSelection)
connect(d->_imageList, TQT_SIGNAL(selectionChanged(TQListViewItem*)),
this, TQT_SLOT(slotImageSelected(TQListViewItem*)) );
else
connect(d->_imageList, TQT_SIGNAL(selectionChanged()),
this, TQT_SLOT(slotImagesSelected()));
enableButtonOK(false);
}
ImageDialog::~ImageDialog() {
delete d;
}
KURL ImageDialog::url() const {
return d->_url;
}
KURL::List ImageDialog::urls() const
{
return d->_urls;
}
KURL ImageDialog::getImageURL(TQWidget* parent, KIPI::Interface* interface) {
ImageDialog dlg(parent, interface, true);
if (dlg.exec() == TQDialog::Accepted) {
return dlg.url();
} else {
return KURL();
}
}
KURL::List ImageDialog::getImageURLs(TQWidget* parent, Interface* interface)
{
ImageDialog dlg(parent, interface, false);
if (dlg.exec() == TQDialog::Accepted)
return dlg.urls();
else
{
KURL::List urls;
return urls;
}
}
void ImageDialog::fillImageList(TQListViewItem* item) {
d->_imageList->clear();
if (!item) return;
const KIPI::ImageCollection& album=static_cast<AlbumLVI*>(item)->_album;
KURL::List images=album.images();
KURL::List::ConstIterator it=images.begin();
for (;it!=images.end(); ++it) {
new ImageLVI(d->_imageList, *it);
}
}
void ImageDialog::slotImageSelected(TQListViewItem* item) {
if (!item) {
enableButtonOK(false);
d->_preview->setText(i18n("No image selected"));
d->_url=KURL();
return;
}
enableButtonOK(true);
d->_url=static_cast<ImageLVI*>(item)->_url;
d->_preview->clear();
TDEIO::PreviewJob* thumbJob = TDEIO::filePreview(d->_url, PREVIEW_SIZE);
connect( thumbJob, TQT_SIGNAL(gotPreview(const KFileItem*, const TQPixmap&)),
TQT_SLOT(slotGotPreview(const KFileItem* , const TQPixmap&)));
}
void ImageDialog::slotImagesSelected()
{
d->_url = KURL();
d->_urls.clear();
d->_preview->clear();
TQListViewItem* selectedItem = 0;
TQListViewItem* listItem = d->_imageList->firstChild();
while (listItem)
{
if (listItem->isSelected())
{
selectedItem = listItem;
d->_urls.append(static_cast<ImageLVI*>(listItem)->_url);
}
listItem = listItem->nextSibling();
}
if (!selectedItem)
{
enableButtonOK(false);
d->_preview->setText(i18n("No images selected"));
d->_url=KURL();
d->_urls.clear();
return;
}
enableButtonOK(true);
if (d->_urls.count() == 1)
{
d->_url = d->_urls.first();
TDEIO::PreviewJob* thumbJob = TDEIO::filePreview(d->_url, PREVIEW_SIZE);
connect( thumbJob, TQT_SIGNAL(gotPreview(const KFileItem*, const TQPixmap&)),
TQT_SLOT(slotGotPreview(const KFileItem* , const TQPixmap&)));
}
else
{
d->_url = d->_urls.first();
d->_preview->setText(i18n("1 image selected", "%n images selected", d->_urls.count()));
}
}
void ImageDialog::slotGotPreview(const KFileItem*, const TQPixmap& pix) {
d->_preview->setPixmap(pix);
}
void ImageDialog::slotHelp( void )
{
TDEApplication::kApplication()->invokeHelp("", "kipi-plugins");
}
void ImageDialog::slotInitialShow()
{
ImageCollection current = d->_interface->currentAlbum();
TQListViewItemIterator it( d->_albumList );
while ( it.current() )
{
AlbumLVI* lvi = static_cast<AlbumLVI*>( it.current() );
if ( lvi->_album == current )
{
d->_albumList->ensureItemVisible( lvi );
d->_albumList->setSelected( lvi, true );
break;
}
++it;
}
}
} // namespace KIPI
#include "imagedialog.moc"