• Skip to content
  • Skip to link menu
KDE 4.4 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

digikam

advancedrenamedialog.cpp

Go to the documentation of this file.
00001 /* ============================================================
00002  *
00003  * This file is a part of digiKam project
00004  * http://www.digikam.org
00005  *
00006  * Date        : 2009-09-14
00007  * Description : a rename dialog for the AdvancedRename utility
00008  *
00009  * Copyright (C) 2009 by Andi Clemens <andi dot clemens at gmx dot net>
00010  *
00011  * This program is free software; you can redistribute it
00012  * and/or modify it under the terms of the GNU General
00013  * Public License as published by the Free Software Foundation;
00014  * either version 2, or (at your option)
00015  * any later version.
00016  *
00017  * This program is distributed in the hope that it will be useful,
00018  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00019  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020  * GNU General Public License for more details.
00021  *
00022  * ============================================================ */
00023 
00024 #include "advancedrenamedialog.moc"
00025 
00026 // Qt includes
00027 
00028 #include <QEvent>
00029 #include <QFileInfo>
00030 #include <QGridLayout>
00031 #include <QHeaderView>
00032 #include <QMoveEvent>
00033 #include <QSet>
00034 #include <QString>
00035 #include <QTreeWidget>
00036 
00037 // KDE includes
00038 
00039 #include <kapplication.h>
00040 #include <klocale.h>
00041 
00042 // Local includes
00043 
00044 #include "advancedrenamewidget.h"
00045 #include "parseinformation.h"
00046 
00047 namespace Digikam
00048 {
00049 
00050 class AdvancedRenameListItemPriv
00051 {
00052 public:
00053 
00054     AdvancedRenameListItemPriv()
00055     {
00056     }
00057 
00058     KUrl    imageUrl;
00059     QString completeFileName;
00060 };
00061 
00062 // --------------------------------------------------------
00063 
00064 AdvancedRenameListItem::AdvancedRenameListItem(QTreeWidget* view)
00065                       : QTreeWidgetItem(view), d(new AdvancedRenameListItemPriv)
00066 {
00067 }
00068 
00069 AdvancedRenameListItem::AdvancedRenameListItem(QTreeWidget* view, const KUrl& url)
00070                       : QTreeWidgetItem(view), d(new AdvancedRenameListItemPriv)
00071 {
00072     setImageUrl(url);
00073 }
00074 
00075 AdvancedRenameListItem:: ~AdvancedRenameListItem()
00076 {
00077     delete d;
00078 }
00079 
00080 void AdvancedRenameListItem::setImageUrl(const KUrl& url)
00081 {
00082     d->imageUrl = url;
00083 
00084     QFileInfo fi(d->imageUrl.toLocalFile());
00085     d->completeFileName  = fi.fileName();
00086 
00087     setName(d->completeFileName,    false);
00088     setNewName(d->completeFileName, false);
00089 }
00090 
00091 KUrl AdvancedRenameListItem::imageUrl() const
00092 {
00093     return d->imageUrl;
00094 }
00095 
00096 void AdvancedRenameListItem::setName(const QString& name, bool check)
00097 {
00098     setText(OldName, name);
00099     if (check)
00100     {
00101         markInvalid(isInvalid());
00102     }
00103 }
00104 
00105 QString AdvancedRenameListItem::name() const
00106 {
00107     return text(OldName);
00108 }
00109 
00110 void AdvancedRenameListItem::setNewName(const QString& name, bool check)
00111 {
00112     setText(NewName, name);
00113     if (check)
00114     {
00115         markInvalid(isInvalid());
00116     }
00117 }
00118 
00119 QString AdvancedRenameListItem::newName() const
00120 {
00121     return text(NewName);
00122 }
00123 
00124 void AdvancedRenameListItem::markInvalid(bool invalid)
00125 {
00126     QColor normalText = kapp->palette().text().color();
00127     setTextColor(OldName, invalid ? Qt::red : normalText);
00128     setTextColor(NewName, invalid ? Qt::red : normalText);
00129 }
00130 
00131 bool AdvancedRenameListItem::isInvalid()
00132 {
00133     return ( name() == newName() );
00134 }
00135 
00136 // --------------------------------------------------------
00137 
00138 class AdvancedRenameDialogPriv
00139 {
00140 public:
00141 
00142     AdvancedRenameDialogPriv() :
00143         configGroupName("AdvancedRename Dialog"),
00144         configLastUsedRenamePatternEntry("Last Used Rename Pattern"),
00145         configDialogSizeEntry("Dialog Size"),
00146 
00147         singleFileMode(false),
00148         minSizeDialog(450),
00149         listView(0),
00150         advancedRenameWidget(0)
00151     {}
00152 
00153     const QString         configGroupName;
00154     const QString         configLastUsedRenamePatternEntry;
00155     const QString         configDialogSizeEntry;
00156 
00157     QString               singleFileModeOldFilename;
00158 
00159     bool                  singleFileMode;
00160     int                   minSizeDialog;
00161 
00162     QTreeWidget*          listView;
00163     AdvancedRenameWidget* advancedRenameWidget;
00164     NewNamesList          newNamesList;
00165 };
00166 
00167 AdvancedRenameDialog::AdvancedRenameDialog(QWidget* parent)
00168                     : KDialog(parent), d(new AdvancedRenameDialogPriv)
00169 {
00170     d->advancedRenameWidget = new AdvancedRenameWidget(this);
00171     d->advancedRenameWidget->setTooltipAlignment(Qt::AlignCenter);
00172 
00173     // --------------------------------------------------------
00174 
00175     d->listView = new QTreeWidget(this);
00176     d->listView->setRootIsDecorated(false);
00177     d->listView->setSelectionMode(QAbstractItemView::NoSelection);
00178     d->listView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
00179     d->listView->setAllColumnsShowFocus(true);
00180     d->listView->setSortingEnabled(false);
00181     d->listView->setColumnCount(2);
00182     d->listView->setHeaderLabels(QStringList() << i18n("Current Name") << i18n("New Name"));
00183     d->listView->header()->setResizeMode(0, QHeaderView::Stretch);
00184     d->listView->header()->setResizeMode(1, QHeaderView::Stretch);
00185 
00186     // --------------------------------------------------------
00187 
00188     QWidget* mainWidget     = new QWidget(this);
00189     QGridLayout* mainLayout = new QGridLayout;
00190     mainLayout->addWidget(d->listView,             0, 0, 1, 1);
00191     mainLayout->addWidget(d->advancedRenameWidget, 1, 0, 1, 1);
00192     mainLayout->setRowStretch(0, 10);
00193     mainWidget->setLayout(mainLayout);
00194 
00195     setMainWidget(mainWidget);
00196 
00197     setMinimumWidth(d->advancedRenameWidget->minimumWidth());
00198 
00199     setButtons(Help|Cancel|Ok);
00200     enableButton(Ok, false);
00201     setHelp("advancedrename.anchor", "digikam");
00202 
00203     initDialog();
00204     readSettings();
00205 
00206     // --------------------------------------------------------
00207 
00208     connect(d->advancedRenameWidget, SIGNAL(signalTextChanged(const QString&)),
00209             this, SLOT(slotParseStringChanged(const QString&)));
00210 
00211     connect(d->advancedRenameWidget, SIGNAL(signalReturnPressed()),
00212             this, SLOT(slotReturnPressed()));
00213 
00214     connect(this, SIGNAL(signalWindowHasMoved()),
00215             d->advancedRenameWidget, SLOT(slotUpdateTrackerPos()));
00216 
00217     connect(this, SIGNAL(signalWindowLostFocus()),
00218             d->advancedRenameWidget, SLOT(slotHideToolTipTracker()));
00219 }
00220 
00221 AdvancedRenameDialog::~AdvancedRenameDialog()
00222 {
00223     writeSettings();
00224     delete d;
00225 }
00226 
00227 void AdvancedRenameDialog::slotReturnPressed()
00228 {
00229     if (isButtonEnabled(Ok))
00230     {
00231         accept();
00232     }
00233 }
00234 
00235 void AdvancedRenameDialog::slotParseStringChanged(const QString& parseString)
00236 {
00237     d->newNamesList.clear();
00238 
00239     int index = 1;
00240     QTreeWidgetItemIterator it(d->listView);
00241     while (*it)
00242     {
00243         AdvancedRenameListItem* item = dynamic_cast<AdvancedRenameListItem*>((*it));
00244         if (item)
00245         {
00246             ParseInformation parseInfo(ImageInfo(item->imageUrl()));
00247             parseInfo.index = index;
00248 
00249             QString newName = d->advancedRenameWidget->parse(parseInfo);
00250             item->setNewName(newName);
00251             d->newNamesList << NewNameInfo(item->imageUrl(), newName);
00252             ++index;
00253         }
00254         ++it;
00255     }
00256 
00257     bool enableBtn = !parseString.isEmpty() && checkNewNames();
00258     enableButton(Ok, enableBtn);
00259 
00260     d->listView->viewport()->update();
00261 }
00262 
00263 void AdvancedRenameDialog::slotAddImages(const KUrl::List& urls)
00264 {
00265     d->listView->clear();
00266     AdvancedRenameListItem* item = 0;
00267 
00268     int itemCount = 0;
00269     for (KUrl::List::const_iterator it = urls.constBegin(); it != urls.constEnd(); ++it)
00270     {
00271         item = new AdvancedRenameListItem(d->listView);
00272         item->setImageUrl(*it);
00273         ++itemCount;
00274     }
00275 
00276     // set current filename if only one image has been added
00277     if (itemCount == 1)
00278     {
00279         QFileInfo info(urls.first().toLocalFile());
00280         d->advancedRenameWidget->setText(info.baseName());
00281         d->advancedRenameWidget->focusLineEdit();
00282         d->singleFileModeOldFilename = info.fileName();
00283     }
00284     d->singleFileMode = (itemCount <= 1);
00285 
00286     enableButton(Ok, checkNewNames());
00287     initDialog(itemCount);
00288     slotParseStringChanged(d->advancedRenameWidget->text());
00289 }
00290 
00291 void AdvancedRenameDialog::initDialog(int count)
00292 {
00293     QString title = i18np("Rename", "Rename (%1 images)", count);
00294     setWindowTitle(title);
00295 }
00296 
00297 NewNamesList AdvancedRenameDialog::newNames()
00298 {
00299     return d->newNamesList;
00300 }
00301 
00302 void AdvancedRenameDialog::moveEvent(QMoveEvent* e)
00303 {
00304     Q_UNUSED(e)
00305     emit signalWindowHasMoved();
00306 }
00307 
00308 bool AdvancedRenameDialog::event(QEvent* e)
00309 {
00310     switch (e->type())
00311     {
00312         case QEvent::WindowDeactivate:
00313             emit signalWindowLostFocus();
00314             break;
00315         default:
00316             break;
00317     }
00318     return KDialog::event(e);
00319 }
00320 
00321 void AdvancedRenameDialog::readSettings()
00322 {
00323     KSharedConfig::Ptr config = KGlobal::config();
00324     KConfigGroup group        = config->group(d->configGroupName);
00325 
00326     QSize s = group.readEntry(d->configDialogSizeEntry, QSize(d->minSizeDialog, d->minSizeDialog));
00327     resize(s);
00328     d->advancedRenameWidget->setText(group.readEntry(d->configLastUsedRenamePatternEntry, QString()));
00329 }
00330 
00331 void AdvancedRenameDialog::writeSettings()
00332 {
00333     KSharedConfig::Ptr config = KGlobal::config();
00334     KConfigGroup group        = config->group(d->configGroupName);
00335 
00336     group.writeEntry(d->configDialogSizeEntry, size());
00337     if (d->singleFileMode)
00338     {
00339         d->advancedRenameWidget->clear();
00340     }
00341     else
00342     {
00343         group.writeEntry(d->configLastUsedRenamePatternEntry, d->advancedRenameWidget->text());
00344     }
00345 }
00346 
00347 bool AdvancedRenameDialog::checkNewNames()
00348 {
00349     QSet<QString> tmpNewNames;
00350     bool valid = true;
00351 
00352     QTreeWidgetItemIterator it(d->listView);
00353     while (*it)
00354     {
00355         AdvancedRenameListItem* item = dynamic_cast<AdvancedRenameListItem*>((*it));
00356         if (item)
00357         {
00358             valid = valid && (!item->isInvalid()) && ( !tmpNewNames.contains(item->newName()) );
00359             item->markInvalid(!valid);
00360             tmpNewNames << item->newName();
00361         }
00362         ++it;
00363     }
00364 
00365     return valid;
00366 }
00367 
00368 }  // namespace Digikam

digikam

Skip menu "digikam"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members

API Reference

Skip menu "API Reference"
  • digikam
Generated for API Reference by doxygen 1.5.9-20090814
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal