File indexing completed on 2024-04-28 13:44:23

0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 // SPDX-FileCopyrightText: 2003 Dominik Seichter <domseichter@web.de>
0003 
0004 #ifndef KRENAMEIMPL_H
0005 #define KRENAMEIMPL_H
0006 
0007 #include <QObject>
0008 
0009 #include <QUrl>
0010 
0011 #include <KSharedConfig>
0012 
0013 #include "batchrenamer.h"
0014 #include "krenamefile.h"
0015 
0016 class KRenameModel;
0017 class KRenamePreviewModel;
0018 class KRenameWindow;
0019 class ThreadedLister;
0020 class PluginLoader;
0021 class QLineEdit;
0022 class QCommandLineParser;
0023 
0024 class KRenameImpl : public QObject
0025 {
0026     Q_OBJECT
0027 
0028 public:
0029     ~KRenameImpl() override;
0030 
0031     static QWidget *launch(const QRect &rect, const KRenameFile::List &list, QCommandLineParser *commandLine = nullptr);
0032 
0033 public Q_SLOTS:
0034     /** Updates the preview of the filenames after renaming
0035      */
0036     void slotUpdatePreview();
0037 
0038 private:
0039     KRenameImpl(KRenameWindow *window, const KRenameFile::List &list , QCommandLineParser *commandLine = nullptr);
0040 
0041     /** Connect all gui components with their slots
0042      */
0043     void setupSlots();
0044 
0045     /** Adds a single url to the list of files which will
0046      *  be renamed.
0047      *
0048      *  If you have a QList<QUrl> use addFilesOrDirs which is
0049      *  faster.
0050      *
0051      *  \param url must be an existing file or directory.
0052      *
0053      *  \see addFilesOrDirs
0054      */
0055     void addFileOrDir(const QUrl &url);
0056 
0057     /** Adds a list of urls to the list of files which will
0058      *  be renamed.
0059      *
0060      *  Adding a whole list is much faster than adding single
0061      *  files.
0062      *
0063      *  \param list of existing files or directories
0064      *  \param filter only add files or directories matching this filter
0065      *  \param recursively if true all directories will be added recursively
0066      *  \param dirsWithFiles add directory names along with their contents
0067      *  \param dirsOnly add only directories and no files
0068      *  \param hidden add also hidden files and directories
0069      *
0070      *  \see addFileOrDir
0071      */
0072     void addFilesOrDirs(const QList<QUrl> &list, const QString &filter = "*",
0073                         bool recursively = false, bool dirsWithFiles = false,
0074                         bool dirsOnly = false, bool hidden = false);
0075 
0076     /** Parses commandline options
0077      */
0078     void parseCmdLineOptions(QCommandLineParser *parser);
0079 
0080     /** Load configuration
0081      */
0082     void loadConfig();
0083 
0084 private Q_SLOTS:
0085     /** Save configuration
0086      */
0087     void saveConfig();
0088 
0089     /** Start KRename's selftest:
0090      *  I.e several unit tests.
0091      */
0092     void selfTest();
0093 
0094     /** Called when the user clicks the "Add..." button.
0095      *  open a dialog to select files for adding to KRename.
0096      */
0097     void slotAddFiles();
0098 
0099     /** Called when the user clicks the "Remove" buttons.
0100      *  Remove selected files from the list.
0101      */
0102     void slotRemoveFiles();
0103 
0104     /** Called when the user clicks the "Remove All..." buttons.
0105      *  Remove all files from the list.
0106      */
0107     void slotRemoveAllFiles();
0108 
0109     /** Updates the count of files
0110      *  in the file list of KRename
0111      */
0112     void slotUpdateCount();
0113 
0114     /** This slot shows a dialog with advanced numbering settings
0115      *  - start index
0116      *  - stepping
0117      *  - reset counter on each new directory
0118      *  - skip numbers list
0119      *
0120      */
0121     void slotAdvancedNumberingDlg();
0122 
0123     /** This slots shows a dialog which allows the user
0124      *  to confortably insert a part of an oldfilename into the
0125      *  new filename (part is to be understood as "substring")
0126      */
0127     void slotInsertPartFilenameDlg();
0128 
0129     /** This slot shows a dialog which allows the user to configure find and replace
0130      */
0131     void slotFindReplaceDlg();
0132 
0133     /** Start the actual renaming
0134      *  with the current settings
0135      */
0136     void slotStart();
0137 
0138     /** Clean's up and deletes the lister after he has done
0139      *  all his work.
0140      *
0141      *  \param lister a ThreadedLister which has done his work
0142      */
0143     void slotListerDone(ThreadedLister *lister);
0144 
0145     /** Show a TokenHelpDialog that works on a QLineEdit
0146      *
0147      *  \param edit insert user selected tokens into this linedit
0148      */
0149     void slotTokenHelpDialog(QLineEdit *edit);
0150 
0151     /** Called when the user selects another extension split mode
0152      *
0153      *  @param splitMode the mode which is used to split filename and extension
0154      *  @param dot the n-th dot to use for splitting if splitMode = eSplitMode_CustomDot
0155      */
0156     void slotExtensionSplitModeChanged(ESplitMode splitMode, int dot);
0157 
0158 private:
0159     KRenameWindow        *m_window;
0160     KRenameModel         *m_model;
0161     KRenamePreviewModel  *m_previewModel;
0162 
0163     KRenameFile::List     m_vector;
0164 
0165     BatchRenamer          m_renamer;
0166 
0167     ESplitMode            m_lastSplitMode; ///< The last used split mode
0168     int                   m_lastDot;       ///< The last used dot value for splitmode
0169 
0170     PluginLoader         *m_pluginLoader;  ///< Global plugin loader instance
0171 
0172     int                   m_runningThreadedListersCount; ///< Count of running threaded listers
0173 };
0174 
0175 #if 0
0176 // Own includes
0177 /*
0178 #include "batchrenamer.h"
0179 #include "krenamedcop.h"
0180 */
0181 class HelpDialog;
0182 class HelpDialogData;
0183 class KAction;
0184 class KComboBox;
0185 class KJanusWidget;
0186 class KMyHistoryCombo;
0187 class KMyListBox;
0188 class KMyListView;
0189 class KMenuBar;
0190 class KPopupMenu;
0191 class QPushButton;
0192 class KURL;
0193 class KURLRequester;
0194 class KIntNumInput;
0195 class MyHelpCombo;
0196 class Plugin;
0197 class PluginLoader;
0198 class QButtonGroup;
0199 class QCheckBox;
0200 class QGroupBox;
0201 class QFileInfo;
0202 class QHBoxLayout;
0203 class QLabel;
0204 class QLineEdit;
0205 class QPushButton;
0206 class QRect;
0207 class QWidgetStack;
0208 class QRadioButton;
0209 class QVBoxLayout;
0210 class QVGroupBox;
0211 class QWidget;
0212 
0213 #include <kguiitem.h>
0214 QPushButton *createButton(KGuiItem item, QWidget *parent);
0215 
0216 class KRenameImpl : public QObject, public KRenameDCOP
0217 {
0218     Q_OBJECT
0219 
0220     friend class ProfileManager;
0221     friend class ProfileDlg;
0222     friend class tabs;
0223 
0224 public:
0225     KRenameImpl(QWidget *p, KMenuBar *m, QPushButton *finish);
0226     ~KRenameImpl();
0227 
0228     void setWizardMode(bool mode);
0229 
0230     /*
0231      * public because both get called from KRenameImpl::launch()
0232      */
0233     void updatePre();
0234     void addFileOrDir(const KURL &name);
0235 
0236     void setup(bool wizardmode);
0237     void changeParent(QWidget *p, KMenuBar *m, QPushButton *finish, QRect r);
0238     static QWidget *launch(QRect rect, const KURL::List &list, KRenameImpl *impl = 0, bool loadprofile = true);
0239 
0240     /** DCOP functions we have to implement
0241       */
0242     void addFileOrDir(const QString &name);
0243     const QString fileNameTemplate() const;
0244     inline int counterStart() const;
0245 
0246     void setExtensionTemplate(const QString &t);
0247     const QString extensionTemplate() const;
0248 
0249     void setUseExtension(bool b);
0250     bool useExtension() const;
0251 
0252     QStringList tokens() const;
0253 
0254     QString parseString(const QString &token, const QString &string);
0255     void addDir(const QString &name, const QString &filter, bool recursive, bool hidden, bool dirnames);
0256 
0257     const QString title(int index) const;
0258 
0259     /** @returns true if the user has specified a profile on the commandline
0260      *           other wise false is returned
0261      */
0262     inline bool hasCommandlineProfile() const;
0263 
0264 public Q_SLOTS:
0265     void setFileNameTemplate(const QString &t);
0266     void setCounterStart(int index);
0267 
0268 Q_SIGNALS:
0269     void pageDone(QWidget *page, const QString &title);
0270     void showPage(int page);
0271     void enableFinish(bool b);
0272 
0273 private Q_SLOTS:
0274     void about();
0275     void addFile();
0276     bool checkErrors();
0277     void clearList();
0278     void enableControls();
0279     void toggleImagePreview();
0280     void moveUp();
0281     void moveDown();
0282     void help();
0283     void removeFile();
0284     void removeFile(int index);
0285     void preferences();
0286     void replace();
0287     void saveConfig();
0288     void start();
0289     void updateCount();
0290     void undo();
0291     void changeUndoScriptName();
0292     void pluginHelpChanged();
0293     void getCoordinates();
0294     void changeNumbers();
0295     void updateDots();
0296     void updatePreview();
0297     void showTokenHelp();
0298     void toggleName();
0299     void changed();
0300     void loadFilePlugins();
0301     void reloadFilePluginData();
0302     void manageProfiles();
0303     QString easyOptions(KComboBox *combo, KMyHistoryCombo *custom);
0304     void slotEasy1();
0305     void slotEasy2();
0306     void slotEasy3();
0307     void slotEasy4();
0308 
0309     /** Update the preview only if the passed
0310      *  plugin is enabled for use.
0311      */
0312     void updatePluginPreview(Plugin *p);
0313 
0314 private:
0315     static int numRealTimePreview;
0316 
0317     /** Change the GUI mode according to the current setting of m_wizard
0318       */
0319     void changeGUIMode();
0320 
0321     /** Returns COPY if optionCopy is checked, RENAME if optionRename is checked
0322       * ...
0323       */
0324     int currentRenameMode();
0325 
0326     void loadConfig();
0327     void fillStructures(BatchRenamer *b, bool preview);
0328     bool setupBatchRenamer(BatchRenamer *b, bool preview);
0329     void splitFilename(QFileInfo *fi, QString *base, QString *extension);
0330 
0331     void setupPage1();
0332     void setupPage2();
0333     void setupPage3();
0334     void setupPage4();
0335     void setupTab1();
0336     void setupFileTab1();
0337     void setupFileTab2();
0338     void setupPages();
0339     void updateHist();
0340     void parseCommandline();
0341     void addTitle(QWidget *p, QVBoxLayout *layout, QString title);
0342 
0343     QValueList<manualchanges> changes;
0344     void refreshColumnMode();
0345     void parseWizardMode();
0346     void getHelpDialogString(QLineEdit *edit);
0347 
0348 protected:
0349     QWidget *parent;
0350     KMenuBar *menuBar;
0351     KPopupMenu *mnuSort;
0352     KAction *loadPlugins;
0353 
0354     QPushButton *finishButton;
0355 
0356     PluginLoader *plugin;
0357 
0358     QWidgetStack *fileTab;
0359 
0360     QWidget *page_1;
0361     QWidget *page_2;
0362     KJanusWidget *page_3;
0363     QWidget *page_4;
0364 
0365     bool m_wizard;
0366     bool m_loadplugins;
0367     bool m_switching;
0368     bool m_autosize;
0369     int m_hist;
0370     int m_index;
0371     int m_step;
0372     bool m_reset;
0373 
0374     bool m_hasCommandlineProfile;
0375 
0376     QPushButton *buttonUp;
0377     QPushButton *buttonDown;
0378     QPushButton *buttonUp2;
0379     QPushButton *buttonDown2;
0380     QPushButton *buttonAdd;
0381     QPushButton *buttonRemove;
0382     QPushButton *buttonRemoveAll;
0383     QPushButton *buttonReplace;
0384     QPushButton *buttonEasyReplace;
0385     QPushButton *buttonHelp;
0386     QPushButton *buttonMove;
0387     QPushButton *buttonCoord;
0388     QPushButton *buttonNumber;
0389 
0390     QPushButton *buttonEasy1;
0391     QPushButton *buttonEasy2;
0392     QPushButton *buttonEasy3;
0393     QPushButton *buttonEasy4;
0394     KComboBox *comboSort;
0395 
0396     QLabel *description;
0397     QLabel *description2;
0398     QLabel *description3;
0399     QLabel *description4;
0400 
0401     QLabel *labelTemplate;
0402     QLabel *labelHelp;
0403     QLabel *labelCount;
0404     QLabel *labelPoint;
0405 
0406     KMyListBox *fileList;
0407     KMyListView *preview;
0408     QButtonGroup *groupOptions;
0409 
0410     QRadioButton *optionCopy;
0411     QRadioButton *optionMove;
0412     QRadioButton *optionRename;
0413     QRadioButton *optionLink;
0414 
0415     QGroupBox *groupExtension;
0416     QVGroupBox *groupUndo;
0417 
0418     KMyHistoryCombo *dirname;
0419     KURLRequester *urlrequester;
0420     KURLRequester *undorequester;
0421     KMyHistoryCombo *filename;
0422     KMyHistoryCombo *extemplate;
0423 
0424     QCheckBox *checkName;
0425     QCheckBox *checkExtension;
0426     QCheckBox *checkOverwrite;
0427     QCheckBox *checkPreview;
0428     QCheckBox *checkUndoScript;
0429 
0430     KComboBox *comboExtension;
0431 
0432     MyHelpCombo *comboHelp;
0433     HelpDialog *helpDialog;
0434     HelpDialogData *helpDialogData;
0435 
0436     BatchRenamer *b;
0437     QValueList<int> skip;
0438     QValueList<replacestrings> rep;
0439 
0440     // ==========
0441     // Easy mode:
0442     // ==========
0443 
0444     KComboBox *comboKRenamePrefix;
0445     KComboBox *comboKRenameSuffix;
0446     KComboBox *comboKRenameFilename;
0447     KComboBox *comboKRenameExtension;
0448 
0449     KMyHistoryCombo *comboPrefix;
0450     KMyHistoryCombo *comboSuffix;
0451     KMyHistoryCombo *comboCustom;
0452     KMyHistoryCombo *comboCustomExtension;
0453 
0454     KIntNumInput *spinStart;
0455     KIntNumInput *spinNull;
0456 
0457     // ===========
0458     // Layout:
0459     // ===========
0460 
0461     QHBoxLayout *pageLayout;
0462     QVBoxLayout *pageLayout_2;
0463     QVBoxLayout *pageLayout_3;
0464     QVBoxLayout *pageLayout_4;
0465 
0466     QHBoxLayout *tabLayout_0;
0467     QHBoxLayout *tabLayout_1;
0468     QHBoxLayout *tabLayout_2;
0469     QVBoxLayout *tabLayout_3;
0470     QVBoxLayout *groupAdvancedExtensionLayout;
0471     QVBoxLayout *groupOptionsLayout;
0472     QHBoxLayout *groupDirLayout;
0473     QVBoxLayout *groupNumberLayout;
0474     QHBoxLayout *groupExtensionLayout;
0475 
0476     // page1
0477     QHBoxLayout *Layout2;
0478     QVBoxLayout *Layout3;
0479     QHBoxLayout *Layout4;
0480     QVBoxLayout *Layout5;
0481 
0482     // page4
0483     QVBoxLayout *Layout10;
0484     QHBoxLayout *Layout15;
0485     QVBoxLayout *Layout16;
0486     QHBoxLayout *Layout22;
0487     QVBoxLayout *Layout23;
0488 
0489     // tab
0490     QHBoxLayout *Layout100;
0491     QHBoxLayout *Layout101;
0492 };
0493 
0494 int KRenameImpl::counterStart() const
0495 {
0496     return m_index;
0497 }
0498 
0499 bool KRenameImpl::hasCommandlineProfile() const
0500 {
0501     return m_hasCommandlineProfile;
0502 }
0503 #endif // 0
0504 #endif