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.
338 lines
12 KiB
338 lines
12 KiB
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// FINDDUPPLICATEDIALOG.CPP
|
|
//
|
|
// Copyright (C) 2004 Gilles Caulier <caulier dot gilles at gmail dot com>
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation; either version 2 of the License, 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 General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Cambridge, MA 02110-1301, USA.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Include files for TQt
|
|
|
|
#include <tqlabel.h>
|
|
#include <tqvbox.h>
|
|
#include <tqgroupbox.h>
|
|
#include <tqlayout.h>
|
|
#include <tqcombobox.h>
|
|
#include <tqwhatsthis.h>
|
|
#include <tqcheckbox.h>
|
|
#include <tqlineedit.h>
|
|
#include <tqspinbox.h>
|
|
#include <tqlistview.h>
|
|
#include <tqheader.h>
|
|
#include <tqpushbutton.h>
|
|
#include <tqfileinfo.h>
|
|
|
|
// Include files for KDE
|
|
|
|
#include <tdelocale.h>
|
|
#include <tdefontdialog.h>
|
|
#include <kiconloader.h>
|
|
#include <kdebug.h>
|
|
#include <kurlrequester.h>
|
|
#include <kurl.h>
|
|
#include <kdirsize.h>
|
|
#include <klineedit.h>
|
|
#include <knuminput.h>
|
|
#include <kcolorbutton.h>
|
|
#include <tdeglobalsettings.h>
|
|
#include <tdemessagebox.h>
|
|
#include <kbuttonbox.h>
|
|
#include <tdeapplication.h>
|
|
#include <ksqueezedtextlabel.h>
|
|
#include <tdeio/global.h>
|
|
#include <tdelistview.h>
|
|
#include <khelpmenu.h>
|
|
#include <tdepopupmenu.h>
|
|
|
|
// Include files for KIPI
|
|
|
|
#include <libkipi/imagecollection.h>
|
|
#include <libkipi/imagecollectionselector.h>
|
|
|
|
// Local include files
|
|
|
|
#include "kpaboutdata.h"
|
|
#include "pluginsversion.h"
|
|
#include "finddupplicatedialog.h"
|
|
#include "finddupplicatedialog.moc"
|
|
|
|
namespace KIPIFindDupplicateImagesPlugin
|
|
{
|
|
|
|
FindDuplicateDialog::FindDuplicateDialog( KIPI::Interface* interface, TQWidget *parent)
|
|
: KDialogBase( IconList, i18n("Configure"), Help|Ok|Cancel,
|
|
Ok, parent, "FindDuplicateDialog", true, false ),
|
|
m_interface( interface )
|
|
{
|
|
setCaption(i18n("Find Duplicate Images"));
|
|
setupSelection();
|
|
setupPageMethod();
|
|
page_setupSelection->setFocus();
|
|
resize( 650, 500 );
|
|
|
|
// About data and help button.
|
|
|
|
m_about = new KIPIPlugins::KPAboutData(I18N_NOOP("Find Duplicate Images"),
|
|
0,
|
|
TDEAboutData::License_GPL,
|
|
I18N_NOOP("A Kipi plugin to find duplicate images\n"
|
|
"This plugin is based on ShowImg implementation algorithm"),
|
|
"(c) 2003-2004, Gilles Caulier");
|
|
|
|
m_about->addAuthor("Jesper K. Pedersen", I18N_NOOP("Maintainer"),
|
|
"blackie at kde dot org");
|
|
|
|
m_about->addAuthor("Gilles Caulier", I18N_NOOP("Original author"),
|
|
"caulier dot gilles at gmail dot com");
|
|
|
|
m_about->addAuthor("Richard Groult", I18N_NOOP("Find duplicate images algorithm"),
|
|
"rgroult at jalix.org");
|
|
|
|
m_helpButton = actionButton( Help );
|
|
KHelpMenu* helpMenu = new KHelpMenu(this, m_about, false);
|
|
helpMenu->menu()->removeItemAt(0);
|
|
helpMenu->menu()->insertItem(i18n("Plugin Handbook"), this, TQT_SLOT(slotHelp()), 0, -1, 0);
|
|
m_helpButton->setPopup( helpMenu->menu() );
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
FindDuplicateDialog::~FindDuplicateDialog()
|
|
{
|
|
delete m_about;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FindDuplicateDialog::setupSelection(void)
|
|
{
|
|
page_setupSelection = addPage(i18n("Selection"),
|
|
i18n("Album's Selection"),
|
|
BarIcon("folder_image", TDEIcon::SizeMedium));
|
|
|
|
TQVBoxLayout *layout = new TQVBoxLayout(page_setupSelection, 0, spacingHint() );
|
|
m_imageCollectionSelector = new KIPI::ImageCollectionSelector(page_setupSelection, m_interface);
|
|
layout->addWidget(m_imageCollectionSelector);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FindDuplicateDialog::setupPageMethod(void)
|
|
{
|
|
TQString whatsThis;
|
|
page_setupMethod = addPage( i18n("Method & Cache"), i18n("Find-Duplicates Method & Cache Configuration"),
|
|
BarIcon("system-run", TDEIcon::SizeMedium ) );
|
|
|
|
TQVBoxLayout *vlay = new TQVBoxLayout( page_setupMethod, 0, spacingHint() );
|
|
|
|
//---------------------------------------------
|
|
|
|
TQGroupBox * groupBox1 = new TQGroupBox( 2, TQt::Horizontal, i18n("Method"), page_setupMethod );
|
|
groupBox1->layout()->setSpacing( 6 );
|
|
groupBox1->layout()->setMargin( 11 );
|
|
|
|
TQLabel *m_labelsearchMethod = new TQLabel( i18n("Search method:"), groupBox1 );
|
|
m_findMethod = new TQComboBox(false, groupBox1);
|
|
m_findMethod->insertItem(i18n("Almost"), MethodAlmost);
|
|
m_findMethod->insertItem(i18n("Fast"), MethodFast);
|
|
m_findMethod->setCurrentItem ( MethodAlmost );
|
|
TQWhatsThis::add( m_findMethod, i18n("<p>Select here the search method used to find duplicate "
|
|
"images in the Albums database.<p>"
|
|
"<b>Almost</b>: the algorithm calculates an approximate difference between images. "
|
|
"This method is slower but robust. You can affine the thresholding using the "
|
|
"\"Approximate Threshold\" parameter.<p>"
|
|
"<b>Fast</b>: the algorithm compares bit-by-bit the files for fast image parsing. "
|
|
"This method is faster but is not as robust."));
|
|
m_labelsearchMethod->setBuddy( m_findMethod );
|
|
|
|
(void) new TQLabel (i18n("Approximate threshold:"), groupBox1);
|
|
|
|
m_approximateThreshold = new KIntNumInput(88, groupBox1);
|
|
m_approximateThreshold->setRange(60, 100, 1, true );
|
|
TQWhatsThis::add( m_approximateThreshold, i18n("<p>Select here the approximate threshold "
|
|
"value, as a percentage, for the 'Almost' find-duplicates method. "
|
|
"This value is used by the algorithm to distinguish two "
|
|
"similar images. The default value is 88.") );
|
|
vlay->addWidget( groupBox1 );
|
|
|
|
//---------------------------------------------
|
|
|
|
TQGroupBox * groupBox2 = new TQGroupBox( 1, TQt::Horizontal, i18n("Cache Maintenance"), page_setupMethod );
|
|
new TQLabel(i18n("The find-duplicate-images process uses a cache folder for images' fingerprints\n"
|
|
"to speed up the analysis of items from Albums."), groupBox2);
|
|
|
|
TQPushButton* updateCache = new TQPushButton( groupBox2, "UpdateCache" );
|
|
updateCache->setText(i18n( "&Update Cache" ));
|
|
TQWhatsThis::add( updateCache, i18n("<p>Update the cache data for the selected Albums.") );
|
|
TQPushButton* purgeCache = new TQPushButton( groupBox2, "PurgeCacheAlbumsSelected" );
|
|
purgeCache->setText(i18n( "&Purge Cache (Albums Selected)" ));
|
|
TQWhatsThis::add( purgeCache, i18n("<p>Purge the cache data for the selected Albums.") );
|
|
TQPushButton* purgeAllCache = new TQPushButton( groupBox2, "PurgeAllCache" );
|
|
purgeAllCache->setText(i18n( "&Purge All Caches" ));
|
|
TQWhatsThis::add( purgeAllCache, i18n("<p>Purge the cache data for all Albums.") );
|
|
vlay->addWidget( groupBox2 );
|
|
|
|
vlay->addStretch(1);
|
|
|
|
//---------------------------------------------
|
|
|
|
connect(m_findMethod, TQT_SIGNAL(activated(int)),
|
|
this, TQT_SLOT(slotfindMethodChanged(int)));
|
|
|
|
connect(updateCache, TQT_SIGNAL(clicked()),
|
|
this, TQT_SLOT(slotUpdateCache()));
|
|
|
|
connect(purgeCache, TQT_SIGNAL(clicked()),
|
|
this, TQT_SLOT(slotPurgeCache()));
|
|
|
|
connect(purgeAllCache, TQT_SIGNAL(clicked()),
|
|
this, TQT_SLOT(slotPurgeAllCache()));
|
|
|
|
slotfindMethodChanged(m_findMethod->currentItem());
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FindDuplicateDialog::slotHelp()
|
|
{
|
|
TDEApplication::kApplication()->invokeHelp("findduplicateimages",
|
|
"kipi-plugins");
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FindDuplicateDialog::slotfindMethodChanged(int index)
|
|
{
|
|
if ( index == MethodAlmost )
|
|
m_approximateThreshold->setEnabled(true);
|
|
else
|
|
m_approximateThreshold->setEnabled(false);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FindDuplicateDialog::slotUpdateCache(void)
|
|
{
|
|
TQValueList<KIPI::ImageCollection> albumsList = getSelectedAlbums();
|
|
TQStringList albumsListPath;
|
|
|
|
for( TQValueList<KIPI::ImageCollection>::ConstIterator album = albumsList.begin() ;
|
|
album != albumsList.end() ; ++album )
|
|
{
|
|
if ( !albumsListPath.contains( (*album).path().path() ) )
|
|
albumsListPath.append( (*album).path().path() );
|
|
}
|
|
|
|
if ( albumsListPath.isEmpty() == true )
|
|
KMessageBox::sorry(this, i18n("You must select at least one Album for the update cache process."));
|
|
else
|
|
emit updateCache(albumsListPath);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FindDuplicateDialog::slotPurgeCache(void)
|
|
{
|
|
TQValueList<KIPI::ImageCollection> albumsList = getSelectedAlbums();
|
|
|
|
TQStringList albumsListPath;
|
|
|
|
for( TQValueList<KIPI::ImageCollection>::ConstIterator album = albumsList.begin() ;
|
|
album != albumsList.end() ; ++album )
|
|
{
|
|
if ( !albumsListPath.contains( (*album).path().path() ) )
|
|
albumsListPath.append( (*album).path().path() );
|
|
}
|
|
|
|
if ( albumsListPath.isEmpty() == true )
|
|
KMessageBox::sorry(this, i18n("You must select at least one Album for the purge cache process."));
|
|
else
|
|
emit clearCache(albumsListPath);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FindDuplicateDialog::slotPurgeAllCache(void)
|
|
{
|
|
emit clearAllCache();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FindDuplicateDialog::slotOk()
|
|
{
|
|
if (getSelectedAlbums().isEmpty() == true)
|
|
{
|
|
KMessageBox::sorry(this, i18n("You must select at least one Album for which to find duplicate images."));
|
|
return;
|
|
}
|
|
|
|
accept();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
TQValueList<KIPI::ImageCollection> FindDuplicateDialog::getSelectedAlbums() const
|
|
{
|
|
return m_imageCollectionSelector->selectedImageCollections();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
int FindDuplicateDialog::getFindMethod() const
|
|
{
|
|
return m_findMethod->currentItem();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FindDuplicateDialog::setFindMethod(int method)
|
|
{
|
|
return m_findMethod->setCurrentItem( method );
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
const int FindDuplicateDialog::getApproximateThreeshold() const
|
|
{
|
|
return m_approximateThreshold->value();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FindDuplicateDialog::setApproximateThreeshold(int Value)
|
|
{
|
|
return m_approximateThreshold->setValue( Value );
|
|
}
|
|
|
|
} // NameSpace KIPIFindDupplicateImagesPlugin
|
|
|