00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "advancedrenamedialog.moc"
00025
00026
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
00038
00039 #include <kapplication.h>
00040 #include <klocale.h>
00041
00042
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
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 }