File indexing completed on 2024-04-21 05:51:43

0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 // SPDX-FileCopyrightText: 2003 Dominik Seichter <domseichter@web.de>
0003 
0004 #include "krenameimpl.h"
0005 #include "filedialogextwidget.h"
0006 #include "krenamemodel.h"
0007 #include "krenametest.h"
0008 #include "krenamewindow.h"
0009 #include "krenamefile.h"
0010 
0011 #include "numberdialog.h"
0012 #include "insertpartfilenamedlg.h"
0013 #include "plugin.h"
0014 #include "pluginloader.h"
0015 #include "progressdialog.h"
0016 #include "replacedialog.h"
0017 #include "threadedlister.h"
0018 #include "tokenhelpdialog.h"
0019 
0020 #include "modeltest.h"
0021 
0022 #include <kconfig.h>
0023 #include <KFileWidget>
0024 #include <kmessagebox.h>
0025 #include <kstandardaction.h>
0026 #include <KJobWidgets>
0027 #include <KIO/MkdirJob>
0028 #include <KIO/StatJob>
0029 #include <kio_version.h>
0030 
0031 #include <KHelpMenu>
0032 
0033 #include <QTimer>
0034 #include <QCommandLineParser>
0035 #include <QDebug>
0036 #include <QMenuBar>
0037 #include <QPointer>
0038 
0039 KRenameImpl::KRenameImpl(KRenameWindow *window, const KRenameFile::List &list, QCommandLineParser *commandLine)
0040     : QObject((QObject *)window), m_window(window),
0041       m_lastSplitMode(eSplitMode_LastDot), m_lastDot(0),
0042       m_runningThreadedListersCount(0)
0043 {
0044     setupSlots();
0045 
0046     m_model = new KRenameModel(&m_vector);
0047     m_window->setModel(m_model);
0048 
0049     connect(m_model, &KRenameModel::filesDropped,
0050             this, &KRenameImpl::slotUpdateCount);
0051 
0052     m_previewModel = new KRenamePreviewModel(&m_vector);
0053     m_window->setPreviewModel(m_previewModel);
0054 
0055     m_renamer.setFiles(&m_vector);
0056     m_model->setRenamer(&m_renamer);
0057     m_model->addFiles(list);
0058 
0059     m_pluginLoader = PluginLoader::Instance();
0060     m_pluginLoader->registerForUpdates(this);
0061 
0062     loadConfig();
0063 
0064     if (commandLine) {
0065         parseCmdLineOptions(commandLine);
0066     }
0067 
0068     slotUpdateCount();
0069 
0070     connect(qApp, &QApplication::aboutToQuit, this, &KRenameImpl::saveConfig);
0071 }
0072 
0073 KRenameImpl::~KRenameImpl()
0074 {
0075     m_pluginLoader->deregisterForUpdates(this);
0076     delete m_model;
0077 }
0078 
0079 QWidget *KRenameImpl::launch(const QRect &rect, const KRenameFile::List &list, QCommandLineParser *commandLine)
0080 {
0081     KSharedConfigPtr config = KSharedConfig::openConfig();
0082 
0083     KConfigGroup groupGui = config->group(QString("GUISettings"));
0084     bool firststart  = groupGui.readEntry("firststart4", QVariant(true)).toBool();
0085 
0086     if (firststart) {
0087         // WELCOME TO KRENAME
0088     }
0089 
0090     KRenameWindow *w  = new KRenameWindow(nullptr);
0091     //KRenameImpl* impl = new KRenameImpl( w, list );
0092     new KRenameImpl(w, list, commandLine);
0093     // Windows shows KRename otherwise outside of the visible
0094     // screen area
0095     if (!rect.isNull()) {
0096         w->setGeometry(rect);
0097     }
0098 
0099     /*
0100     // it is time to load a default profile now (if the user has specified one)
0101     if( loadprofile && !k->hasCommandlineProfile() && ProfileManager::hasDefaultProfile() )
0102     ProfileManager::loadDefaultProfile( k );
0103     else if ( !k->hasCommandlineProfile() )
0104         w->show();
0105     */
0106 
0107     w->show();
0108 
0109     return w;
0110 }
0111 
0112 void KRenameImpl::setupSlots()
0113 {
0114     connect(m_window, &KRenameWindow::addFiles,
0115             this, &KRenameImpl::slotAddFiles);
0116     connect(m_window, &KRenameWindow::removeFiles,
0117             this, &KRenameImpl::slotRemoveFiles);
0118     connect(m_window, &KRenameWindow::removeAllFiles,
0119             this, &KRenameImpl::slotRemoveAllFiles);
0120 
0121     connect(m_window, &KRenameWindow::updatePreview,
0122             this, &KRenameImpl::slotUpdatePreview);
0123     connect(m_window, &KRenameWindow::updateCount,
0124             this, &KRenameImpl::slotUpdateCount);
0125 
0126     connect(m_window, &KRenameWindow::accepted,
0127             this, &KRenameImpl::slotStart);
0128 
0129     QObject::connect(m_window, &KRenameWindow::renameModeChanged,
0130                      &m_renamer, &BatchRenamer::setRenameMode);
0131     QObject::connect(m_window, &KRenameWindow::filenameTemplateChanged,
0132                      &m_renamer, &BatchRenamer::setFilenameTemplate);
0133     QObject::connect(m_window, &KRenameWindow::extensionTemplateChanged,
0134                      &m_renamer, &BatchRenamer::setExtensionTemplate);
0135     QObject::connect(m_window, &KRenameWindow::overwriteFilesChanged,
0136                      &m_renamer, &BatchRenamer::setOverwriteExistingFiles);
0137 
0138     QObject::connect(m_window, &KRenameWindow::startIndexChanged,
0139                      &m_renamer, &BatchRenamer::setNumberStartIndex);
0140 
0141     connect(m_window, &KRenameWindow::extensionSplitModeChanged,
0142             this, &KRenameImpl::slotExtensionSplitModeChanged);
0143 
0144     connect(m_window, &KRenameWindow::showAdvancedNumberingDialog,
0145             this, &KRenameImpl::slotAdvancedNumberingDlg);
0146     connect(m_window, &KRenameWindow::showInsertPartFilenameDialog,
0147             this, &KRenameImpl::slotInsertPartFilenameDlg);
0148     connect(m_window, &KRenameWindow::showFindReplaceDialog,
0149             this, &KRenameImpl::slotFindReplaceDlg);
0150     connect(m_window, &KRenameWindow::showTokenHelpDialog,
0151             this, &KRenameImpl::slotTokenHelpDialog);
0152 }
0153 
0154 void KRenameImpl::addFileOrDir(const QUrl &url)
0155 {
0156     KRenameFile       item(url, m_lastSplitMode, m_lastDot);
0157     KRenameFile::List list;
0158 
0159     list.append(item);
0160 
0161     m_model->addFiles(list);
0162 
0163     this->slotUpdateCount();
0164 }
0165 
0166 void KRenameImpl::addFilesOrDirs(const QList<QUrl> &list, const QString &filter,
0167                                  bool recursively, bool dirsWithFiles, bool dirsOnly, bool hidden)
0168 {
0169     QList<QUrl>::ConstIterator it   = list.begin();
0170 
0171     while (it != list.end()) {
0172         KRenameFile item(*it, m_lastSplitMode, m_lastDot);
0173         if (item.isDirectory()) {
0174             QApplication::setOverrideCursor(Qt::BusyCursor);
0175 
0176             ThreadedLister *thl = new ThreadedLister(*it, m_window, m_model);
0177             connect(thl, &ThreadedLister::listerDone,
0178                     this, &KRenameImpl::slotListerDone);
0179 
0180             thl->setFilter(filter);
0181             thl->setListDirnamesOnly(dirsOnly);
0182             thl->setListHidden(hidden);
0183             thl->setListRecursively(recursively);
0184             thl->setListDirnames(dirsWithFiles);
0185 
0186             m_runningThreadedListersCount++;
0187             thl->start();
0188         } else {
0189             if (!dirsOnly) {
0190                 KRenameFile::List list;
0191                 list.append(item);
0192 
0193                 m_model->addFiles(list);
0194             }
0195         }
0196 
0197         ++it;
0198     }
0199 
0200     this->slotUpdateCount();
0201 }
0202 
0203 void KRenameImpl::parseCmdLineOptions(QCommandLineParser *parser)
0204 {
0205     bool gotFilenames = false;
0206 
0207     if (parser->isSet("test")) {
0208         QTimer::singleShot(0, this, SLOT(selfTest()));
0209     }
0210 
0211     // Add all recursive directoris
0212     QList<QUrl> recursiveList;
0213     QStringList directories = parser->values("r");
0214     foreach (const QString &directory, directories) {
0215         QUrl url = QUrl::fromUserInput(directory, QDir::currentPath());
0216 
0217         qDebug() << "Adding recursive:" << directory;
0218         recursiveList.append(url);
0219     }
0220 
0221     if (!recursiveList.isEmpty()) {
0222         gotFilenames = true;
0223         // Add all directories recursive, but no hiden files
0224         this->addFilesOrDirs(recursiveList, "*", true, false, false, false);
0225     }
0226 
0227     // Add all files from the commandline options
0228     QList<QUrl> list;
0229     foreach (const QString &url, parser->positionalArguments()) {
0230         list.append(QUrl::fromUserInput(url, QDir::currentPath()));
0231     }
0232 
0233     if (!list.isEmpty()) {
0234         gotFilenames = true;
0235     }
0236 
0237     this->addFilesOrDirs(list);
0238 
0239     /*
0240     // load the profile first, so that we do not overwrite other
0241     // commandline settings
0242     QCString templ = parser.value( "profile" );
0243     if( !templ.isEmpty() )
0244     {
0245         m_hasCommandlineProfile = true;
0246         ProfileManager::loadProfile( QString( templ ), this );
0247     }
0248     */
0249 
0250     QString templ = parser->value("template");
0251     if (!templ.isEmpty()) {
0252         m_window->setFilenameTemplate(templ, false);
0253     }
0254 
0255     QString extension = parser->value("extension");
0256     if (!extension.isEmpty()) {
0257         m_window->setExtensionTemplate(extension, false);
0258     }
0259 
0260     QString copyDir = parser->value("copy");
0261     if (!copyDir.isEmpty()) {
0262         m_window->setRenameMode(eRenameMode_Copy);
0263         m_window->setDestinationUrl(QUrl(copyDir));
0264     }
0265 
0266     QString moveDir = parser->value("move");
0267     if (!moveDir.isEmpty()) {
0268         m_window->setRenameMode(eRenameMode_Move);
0269         m_window->setDestinationUrl(QUrl(moveDir));
0270     }
0271 
0272     QString linkDir = parser->value("link");
0273     if (!linkDir.isEmpty()) {
0274         m_window->setRenameMode(eRenameMode_Link);
0275         m_window->setDestinationUrl(QUrl(linkDir));
0276     }
0277 
0278     /*
0279         QCStringList uselist = parser.values ( "use-plugin" );
0280         if( !uselist.isEmpty() )
0281         {
0282             for(unsigned int i = 0; i < uselist.count(); i++ )
0283                 uselist[i] = uselist[i].lower();
0284 
0285             QPtrListIterator<PluginLoader::PluginLibrary> it( plugin->libs );
0286             while ( it.current() )
0287             {
0288                 if( uselist.contains( (*it)->plugin->getName().lower().utf8() ) )
0289                     (*it)->check->setChecked( true );
0290 
0291                 ++it;
0292             }
0293 
0294             pluginHelpChanged();
0295         }
0296 
0297     */
0298     bool startnow = parser->isSet("start");
0299 
0300     // Free some memory
0301 
0302     if (gotFilenames) {
0303         // we got already filenames over the commandline, so show directly the last
0304         // page of the wizard
0305         m_window->showFilenameTab();
0306     }
0307 
0308     if (startnow) {
0309         qDebug("Waiting for listenters: %i\n", m_runningThreadedListersCount);
0310         // As file adding runs in a another trhread,
0311         // there might be adding in progress but not yet
0312         // all files in the list.
0313         // so let's wait for file adding to finish first
0314         // before starting.
0315         while (m_runningThreadedListersCount > 0) {
0316             qApp->processEvents();
0317         }
0318 
0319         if (m_vector.count() > 0)
0320             // start renaming
0321         {
0322             QTimer::singleShot(200, this, SLOT(slotStart()));
0323         }
0324     }
0325 }
0326 
0327 void KRenameImpl::slotAddFiles()
0328 {
0329     QPointer<FileDialogExtWidget> dialog = new FileDialogExtWidget(m_window);
0330 
0331     if (dialog->exec() == QDialog::Accepted) {
0332         this->addFilesOrDirs(dialog->selectedUrls(), dialog->currentFilter(),
0333                              dialog->addRecursively(), dialog->addDirsWithFiles(),
0334                              dialog->addDirsOnly(), dialog->addHidden());
0335     } else {
0336         qWarning() << "Dialog not accepted";
0337     }
0338 
0339     delete dialog;
0340 }
0341 
0342 void KRenameImpl::slotRemoveFiles()
0343 {
0344     if (m_window->selectedFileItems().count()) {
0345         m_model->removeFiles(m_window->selectedFileItems());
0346         this->slotUpdateCount();
0347     }
0348 }
0349 
0350 void KRenameImpl::slotRemoveAllFiles()
0351 {
0352     // TODO: Show message box: Do you really want to remove all files.
0353     if (KMessageBox::questionYesNo(m_window, i18n("Do you really want to remove all files from the list?"),
0354                                    i18n("KRename"), KStandardGuiItem::remove(), KStandardGuiItem::cancel(),
0355                                    "KRenameRemoveAllFromFileList") == KMessageBox::Yes) {
0356         m_vector.clear();
0357         m_window->resetFileList();
0358 
0359         this->slotUpdateCount();
0360     }
0361 }
0362 
0363 void KRenameImpl::selfTest()
0364 {
0365     KRenameTest *test = new KRenameTest();
0366     test->startTest();
0367 
0368     new ModelTest(m_model);
0369     //new ModelTest( m_previewModel );
0370 
0371     // Make _really_ sure it comes to front
0372     test->show();
0373     test->raise();
0374     test->activateWindow();
0375 }
0376 
0377 void KRenameImpl::slotUpdateCount()
0378 {
0379     m_window->setCount(m_vector.size());
0380     m_window->slotEnableControls();
0381 
0382     this->slotUpdatePreview();
0383 }
0384 
0385 void KRenameImpl::slotUpdatePreview()
0386 {
0387     QApplication::setOverrideCursor(Qt::WaitCursor);
0388     m_renamer.processFilenames();
0389     QApplication::restoreOverrideCursor();
0390 
0391     m_previewModel->refresh();
0392     //m_window->m_pageSimple->listPreview->reset();
0393 }
0394 
0395 void KRenameImpl::slotAdvancedNumberingDlg()
0396 {
0397     QPointer<NumberDialog> dialog = new NumberDialog(
0398         m_renamer.numberStartIndex(), m_renamer.numberStepping(),
0399         m_renamer.numberReset(), m_renamer.numberSkipList(), m_window);
0400 
0401     if (dialog->exec() == QDialog::Accepted) {
0402         m_renamer.setNumberStartIndex(dialog->startIndex());
0403         m_renamer.setNumberStepping(dialog->numberStepping());
0404         m_renamer.setNumberReset(dialog->resetCounter());
0405         m_renamer.setNumberSkipList(dialog->skipNumbers());
0406 
0407         m_window->setNumberStartIndex(dialog->startIndex());
0408 
0409         slotUpdatePreview();
0410     }
0411 
0412     delete dialog;
0413 }
0414 
0415 void KRenameImpl::slotInsertPartFilenameDlg()
0416 {
0417     QPointer<InsertPartFilenameDlg> dialog = new InsertPartFilenameDlg(m_vector.first().srcFilename());
0418 
0419     if (dialog->exec() == QDialog::Accepted) {
0420         m_window->setFilenameTemplate(dialog->command(), true);
0421 
0422         // Update preview will called from KRenameWindow because of the changed template
0423         // slotUpdatePreview();s
0424     }
0425 
0426     delete dialog;
0427 }
0428 
0429 void KRenameImpl::slotFindReplaceDlg()
0430 {
0431     QPointer<ReplaceDialog> dialog = new ReplaceDialog(m_renamer.replaceList(), m_window);
0432 
0433     if (dialog->exec() == QDialog::Accepted) {
0434         m_renamer.setReplaceList(dialog->replaceList());
0435         slotUpdatePreview();
0436     }
0437 
0438     delete dialog;
0439 }
0440 
0441 void KRenameImpl::slotListerDone(ThreadedLister *lister)
0442 {
0443     // Delete the listener
0444     delete lister;
0445 
0446     // restore cursor
0447     QApplication::restoreOverrideCursor();
0448 
0449     // update preview
0450     slotUpdateCount();
0451     slotUpdatePreview();
0452 
0453     qDebug("Listener Done ListenersCount: %i", m_runningThreadedListersCount);
0454 
0455     m_runningThreadedListersCount--;
0456 
0457     if (m_runningThreadedListersCount < 0) {
0458         // To be safe
0459         qDebug("m_runningThreadedListersCount=%i", m_runningThreadedListersCount);
0460         m_runningThreadedListersCount = 0;
0461     }
0462 }
0463 
0464 void KRenameImpl::slotTokenHelpDialog(QLineEdit *edit)
0465 {
0466     TokenHelpDialog dialog(m_model, &m_renamer, edit, m_window);
0467 
0468     // add built-in tokens
0469     QStringList help;
0470     help.append('$' + TokenHelpDialog::getTokenSeparator() + i18n("old filename"));
0471     help.append('%' + TokenHelpDialog::getTokenSeparator() + i18n("old filename converted to lower case"));
0472     help.append('&' + TokenHelpDialog::getTokenSeparator() + i18n("old filename converted to upper case"));
0473     help.append('*' + TokenHelpDialog::getTokenSeparator() + i18n("first letter of every word upper case"));
0474     help.append("[&1][%2-]" + TokenHelpDialog::getTokenSeparator() + i18n("first letter of filename upper case"));
0475     help.append('#' + TokenHelpDialog::getTokenSeparator() + i18n("number (try also ##, ###, ... for leading zeros)"));
0476     help.append("#{0;1}" + TokenHelpDialog::getTokenSeparator() + i18n("counter with custom start value 0 and custom stepping 1"));
0477     help.append('/' + TokenHelpDialog::getTokenSeparator() + i18n("create a subfolder"));
0478     help.append("[$x-y]" + TokenHelpDialog::getTokenSeparator() + i18n("character x to y of old filename"));
0479     help.append("[$x;y]" + TokenHelpDialog::getTokenSeparator() + i18n("y characters of old filename starting at x"));
0480     help.append("[$dirname]" + TokenHelpDialog::getTokenSeparator() + i18n("insert name of folder"));
0481     help.append("[$dirname.]" + TokenHelpDialog::getTokenSeparator() + i18n("insert name of parent folder"));
0482     help.append("[dirsep]" + TokenHelpDialog::getTokenSeparator() + i18n("insert a '/' to create a new subfolder (useful from within regular expressions)"));
0483     help.append("[#length-0]" + TokenHelpDialog::getTokenSeparator() + i18n("insert the length of the input filename"));
0484     help.append("[trimmed]" + TokenHelpDialog::getTokenSeparator() + i18n("strip whitespaces leading and trailing"));
0485     help.append("[trimmed;.*]" + TokenHelpDialog::getTokenSeparator() + i18n("strip whitespaces leading and trailing of an arbitrary string"));
0486     dialog.add(i18n("Built-in Functions"), help, QIcon::fromTheme("krename"), true);
0487 
0488     help.clear();
0489     help.append("\\$" + TokenHelpDialog::getTokenSeparator() + i18n("Insert '$'"));
0490     help.append("\\%" + TokenHelpDialog::getTokenSeparator() + i18n("Insert '%'"));
0491     help.append("\\&" + TokenHelpDialog::getTokenSeparator() + i18n("Insert '&'"));
0492     help.append("\\*" + TokenHelpDialog::getTokenSeparator() + i18n("Insert '*'"));
0493     help.append("\\/" + TokenHelpDialog::getTokenSeparator() + i18n("Insert '/'"));
0494     help.append("\\\\" + TokenHelpDialog::getTokenSeparator() + i18n("Insert '\\\\'"));
0495     help.append("\\[" + TokenHelpDialog::getTokenSeparator() + i18n("Insert '['"));
0496     help.append("\\]" + TokenHelpDialog::getTokenSeparator() + i18n("Insert ']'"));
0497     help.append("\\#" + TokenHelpDialog::getTokenSeparator() + i18n("Insert '#'"));
0498     dialog.add(i18n("Special Characters"), help, QIcon::fromTheme("krename"));
0499 
0500     // add plugin tokens
0501     QList<Plugin *>::const_iterator it = m_pluginLoader->plugins().begin();
0502     while (it != m_pluginLoader->plugins().end()) {
0503         help.clear();
0504         help = (*it)->help();
0505         if (!help.isEmpty()) {
0506             dialog.add((*it)->name(), help, (*it)->icon());
0507         }
0508 
0509         ++it;
0510     }
0511 
0512     dialog.exec();
0513 }
0514 
0515 void KRenameImpl::slotExtensionSplitModeChanged(ESplitMode splitMode, int dot)
0516 {
0517     // only change the splitMode if it has really change since the last time
0518     if (splitMode != m_lastSplitMode ||
0519             dot != m_lastDot) {
0520         KRenameFile::List::iterator it = m_vector.begin();
0521 
0522         while (it != m_vector.end()) {
0523             (*it).setCurrentSplitMode(splitMode, dot);
0524             ++it;
0525         }
0526 
0527         slotUpdatePreview();
0528     }
0529 
0530     m_lastSplitMode = splitMode;
0531     m_lastDot       = dot;
0532 
0533     m_model->setExtensionSplitMode(m_lastSplitMode, m_lastDot);
0534 }
0535 
0536 void KRenameImpl::slotStart()
0537 {
0538     ProgressDialog *progress = new ProgressDialog(m_lastSplitMode, m_lastDot);
0539     progress->print(i18np("Starting conversion of %1 file.", "Starting conversion of %1 files.", m_vector.count()));
0540 
0541     // Get some properties from the gui and initialize BatchRenamer
0542     const QUrl &destination = m_window->destinationUrl();
0543     if (m_renamer.renameMode() != eRenameMode_Rename) {
0544 #if KIO_VERSION >= QT_VERSION_CHECK(5, 69, 0)
0545         KIO::StatJob *statJob = KIO::statDetails(destination, KIO::StatJob::DestinationSide, KIO::StatNoDetails);
0546 #else
0547         KIO::StatJob *statJob = KIO::stat(destination, KIO::StatJob::DestinationSide, 0);
0548 #endif
0549         statJob->exec();
0550         if (statJob->error() == KIO::ERR_DOES_NOT_EXIST) {
0551             int m = KMessageBox::warningContinueCancel(m_window, i18n("The folder %1 does not exist. "
0552                     "Do you want KRename to create it for you?",
0553                     destination.toDisplayString(QUrl::PreferLocalFile)));
0554             if (m == KMessageBox::Cancel) {
0555                 return;
0556             }
0557 
0558             KIO::MkdirJob *job = KIO::mkdir(destination);
0559             KJobWidgets::setWindow(job, m_window);
0560             if (!job->exec()) {
0561                 KMessageBox::error(m_window, i18n("The folder %1 could not be created.", destination.toDisplayString(QUrl::PreferLocalFile)));
0562                 return;
0563             }
0564         }
0565     }
0566 
0567     m_renamer.setDestinationDir(destination);
0568 
0569     // save the configuration
0570     // requires access to the window
0571     saveConfig();
0572 
0573     // Make sure the GUI will not delete our models
0574     m_window->setModel(nullptr);
0575     m_window->setPreviewModel(nullptr);
0576 
0577     // show the progress dialog
0578     progress->show();
0579     progress->raise();
0580     progress->activateWindow();
0581 
0582     // delete the GUI
0583     //delete m_window;
0584     //m_window = NULL;
0585     m_window->hide();
0586     m_window = nullptr;
0587 
0588     // Process files with additional properties which were not
0589     // necessary or available in the preview
0590     m_renamer.processFilenames();
0591 
0592     // Do the actual renaming
0593     m_renamer.processFiles(progress);
0594 
0595     // We are done - ProgressDialog will restart us if necessary
0596     //delete this;
0597 }
0598 
0599 void KRenameImpl::loadConfig()
0600 {
0601     KSharedConfigPtr config = KSharedConfig::openConfig();
0602 
0603     KConfigGroup groupGui = config->group(QString("GUISettings"));
0604     //groupGui.readEntry( "firststart4", QVariant(true) ).toBool();
0605     m_window->setPreviewEnabled(
0606         groupGui.readEntry("ImagePreview2", QVariant(true)).toBool());
0607 
0608     m_window->setPreviewNamesEnabled(
0609         groupGui.readEntry("ImagePreviewName2", QVariant(true)).toBool());
0610 
0611     KRenameFile::setIconSize(groupGui.readEntry("ImagePreviewSize", QVariant(64)).toInt());
0612 
0613     m_window->setAdvancedMode(
0614         groupGui.readEntry("Advanced", QVariant(false)).toBool());
0615 
0616     int index = groupGui.readEntry("StartIndex", QVariant(1)).toInt();
0617     int step  = groupGui.readEntry("Stepping", QVariant(1)).toInt();
0618 
0619     m_renamer.setNumberStepping(step);
0620     // Will call batch renamer
0621     m_window->setNumberStartIndex(index);
0622 
0623     int sortMode = groupGui.readEntry("FileListSorting", QVariant(0)).toInt();
0624     QString customToken = groupGui.readEntry("FileListSortingCustomToken",
0625                           m_model->getSortModeCustomToken());
0626     int customSortModel = groupGui.readEntry("FileListSortingCustomMode",
0627                           QVariant(static_cast<int>(m_model->getSortModeCustomMode()))).toInt();
0628 
0629     m_window->setSortMode(sortMode, customToken, customSortModel);
0630 
0631     ESplitMode lastSplitMode = static_cast<ESplitMode>(groupGui.readEntry("ExtensionSplitMode", static_cast<int>(m_lastSplitMode)));
0632     int lastDot = groupGui.readEntry("ExtensionSplitDot", m_lastDot);
0633     m_window->setExtensionSplitMode(lastSplitMode, lastDot);
0634     this->slotExtensionSplitModeChanged(lastSplitMode, lastDot);
0635 
0636     // load Plugin configuration
0637     KConfigGroup groupPlugins = config->group(QString("PluginSettings"));
0638     m_pluginLoader->loadConfig(groupPlugins);
0639 
0640     m_window->loadConfig();
0641 }
0642 
0643 void KRenameImpl::saveConfig()
0644 {
0645     // Me might get a saveConfig signal because of signals and slots
0646     // even if m_window was already delted. So ignore these events
0647     if (!m_window) {
0648         return;
0649     }
0650 
0651     m_window->saveConfig();
0652 
0653     KSharedConfigPtr config = KSharedConfig::openConfig();
0654 
0655     KConfigGroup groupGui = config->group(QString("GUISettings"));
0656     groupGui.writeEntry("firststart4", false);
0657     groupGui.writeEntry("ImagePreview2", m_window->isPreviewEnabled());
0658     groupGui.writeEntry("ImagePreviewName2", m_window->isPreviewNamesEnabled());
0659     groupGui.writeEntry("StartIndex", m_window->numberStartIndex());
0660     groupGui.writeEntry("Stepping", m_renamer.numberStepping());
0661     groupGui.writeEntry("FileListSorting", m_window->sortMode());
0662     groupGui.writeEntry("FileListSortingCustomToken", m_model->getSortModeCustomToken());
0663     groupGui.writeEntry("FileListSortingCustomMode", static_cast<int>(m_model->getSortModeCustomMode()));
0664     groupGui.writeEntry("Advanced", m_window->isAdvancedMode());
0665     groupGui.writeEntry("ExtensionSplitMode", static_cast<int>(m_lastSplitMode));
0666     groupGui.writeEntry("ExtensionSplitDot", m_lastDot);
0667 
0668     // save Plugin configuration
0669     KConfigGroup groupPlugins = config->group(QString("PluginSettings"));
0670     m_pluginLoader->saveConfig(groupPlugins);
0671 
0672     config->sync();
0673 }
0674 
0675 #include "moc_krenameimpl.cpp"