File indexing completed on 2024-03-24 17:25:15

0001 /***************************************************************************
0002                        krenamewindow.h  -  description
0003                              -------------------
0004     begin                : Sat Mar 24 2007
0005     copyright            : (C) 2007 by Dominik Seichter
0006     email                : domseichter@web.de
0007 ***************************************************************************/
0008 
0009 /***************************************************************************
0010  *                                                                         *
0011  *   This program is free software; you can redistribute it and/or modify  *
0012  *   it under the terms of the GNU General Public License as published by  *
0013  *   the Free Software Foundation; either version 2 of the License, or     *
0014  *   (at your option) any later version.                                   *
0015  *                                                                         *
0016  ***************************************************************************/
0017 
0018 #ifndef KRENAMEWINDOW_H
0019 #define KRENAMEWINDOW_H
0020 
0021 #include <kmainwindow.h>
0022 #include "batchrenamer.h"
0023 
0024 #include <QHash>
0025 #include <KTreeWidgetSearchLine>
0026 
0027 class KRenameModel;
0028 class KRenamePreviewModel;
0029 
0030 class QPushButton;
0031 class QAbstractItemView;
0032 class QComboBox;
0033 class QDialogButtonBox;
0034 class QLineEdit;
0035 class QModelIndex;
0036 class QStackedWidget;
0037 class QTabBar;
0038 class QTreeWidgetItem;
0039 
0040 class Plugin;
0041 class RichTextItemDelegate;
0042 
0043 namespace Ui
0044 {
0045 class KRenameFiles;
0046 class KRenameDestination;
0047 class KRenameSimple;
0048 class KRenamePlugins;
0049 class KRenameFilename;
0050 };
0051 
0052 /** KRenameWindow is the main window of KRename.
0053  *
0054  *  According to the window mode setting, a row of buttons
0055  *  is displayed at the bottom of the window.
0056  */
0057 class KRenameWindow : public KMainWindow
0058 {
0059     Q_OBJECT
0060 
0061     friend class KRenameImpl;
0062 
0063 public:
0064     explicit KRenameWindow(QWidget *parent = nullptr);
0065 
0066     ~KRenameWindow();
0067 
0068     /** The maximum number of pages in any gui mode.
0069      *  No gui mode can have more pages than this.
0070      */
0071     static const int MAX_PAGES = 4;
0072 
0073     /** This structure is used to describe a gui mode.
0074      *  It is required to map indexes to the right indexes
0075      *  of the widget stack and to retrieve the total number
0076      *  of pages per mode as well as the individual page titles.
0077      */
0078     typedef struct {
0079         const int   numPages;
0080         const char *pageTitles[KRenameWindow::MAX_PAGES];
0081         const int   mapIndex[KRenameWindow::MAX_PAGES];
0082         const char *pageIcons[KRenameWindow::MAX_PAGES];
0083     } TGuiMode;
0084 
0085     /**
0086      * Load UI configuration where necessary.
0087      */
0088     void loadConfig();
0089 
0090     /**
0091      * Save UI configuration where necessary.
0092      */
0093     void saveConfig();
0094 
0095     /** Set the count displayed on the files tab of KRename
0096      *  @param count typically the number of files in the list
0097      */
0098     void setCount(unsigned int count);
0099 
0100     /** Set the template for the filename.
0101      *
0102      *  @param templ the new template
0103      *  @param insert if true the template string will be inserted into the current
0104      *         template otherwise it will be replaced
0105      */
0106     void setFilenameTemplate(const QString &templ, bool insert = false);
0107 
0108     /** Set the template for the filename extension.
0109      *
0110      *  @param templ the new template
0111      *  @param insert if true the template string will be inserted into the current
0112      *         template otherwise it will be replaced
0113      */
0114     void setExtensionTemplate(const QString &templ, bool insert = false);
0115 
0116     /** Change the renmae mode
0117      *
0118      *  @param mode the renaming mode to use
0119      */
0120     void setRenameMode(ERenameMode mode);
0121 
0122     /** Set the destination url
0123      *
0124      * @param url destination url for eRenameMode_Copy,
0125      * eRenameMode_Move and eRenameMode_Link
0126      */
0127     void setDestinationUrl(const QUrl &url);
0128 
0129     /** Reset the display of the internal file list
0130      */
0131     void resetFileList();
0132 
0133     /** Set the KRename model
0134      *
0135      *  @param model a krename model
0136      */
0137     void setModel(KRenameModel *model);
0138 
0139     /** Set the preview model
0140      *
0141      * @param model a preview model
0142      */
0143     void setPreviewModel(KRenamePreviewModel *model);
0144 
0145     /**
0146      * @returns the destinationUrl selected by the user
0147      */
0148     const QUrl destinationUrl() const;
0149 
0150     /**
0151      * \returns a list of all file indexes that are selected
0152      *          in the filelist
0153      */
0154     QList<int> selectedFileItems() const;
0155 
0156     /**
0157      * \returns a list of all file indexes that are selected
0158      *          in the preview
0159      */
0160     QList<int> selectedFileItemsPreview() const;
0161 
0162     /**
0163      * \returns if file preview is enabled in the file tab
0164      */
0165     bool isPreviewEnabled() const;
0166 
0167     /**
0168      * \param bPreview enable/disable file preview in the file tab
0169      */
0170     void setPreviewEnabled(bool bPreview);
0171 
0172     /**
0173      * \returns if name display is enabled in the file tab
0174      */
0175     bool isPreviewNamesEnabled() const;
0176 
0177     /**
0178      * \param bPreview enable/disable file name display in the file tab
0179      */
0180     void setPreviewNamesEnabled(bool bPreview);
0181 
0182     /**
0183      * \returns the start index for numbers
0184      */
0185     int numberStartIndex() const;
0186 
0187     /**
0188      * \param index start index for numbers
0189      */
0190     void setNumberStartIndex(int index);
0191 
0192     /**
0193      * \returns the current sort mode in the file tab
0194      */
0195     int sortMode() const;
0196 
0197     /**
0198      * \param sortMode sets the current sort mode in the file tab
0199      * \param customToken custom sort token if sortMode == eSortMode_Token
0200      * \param customSortMode custom sort mode if sortMode == eSortMode_Token
0201      */
0202     void setSortMode(int sortMode, const QString &customToken, int customSortMode);
0203 
0204     /**
0205      * Specify the extension split mode.
0206      * \param splitMode split mode
0207      * \param dot dot t use for eSplitMode_CustomDot
0208      */
0209     void setExtensionSplitMode(ESplitMode splitMode, int dot);
0210 
0211     bool isAdvancedMode() const;
0212     void setAdvancedMode(bool bAdvanced);
0213 
0214     /**
0215      * Shows the filename tab
0216      * This might be useful, if the user
0217      * passed filenames via the commandline
0218      * and wants to immediately work with the
0219      * filename template.
0220      */
0221     void showFilenameTab();
0222 
0223 public Q_SLOTS:
0224     /** Resets the enabled/disabled state of all GUI elements correctly
0225      */
0226     void slotEnableControls();
0227 
0228 Q_SIGNALS:
0229     /** Called when the krenamewindow
0230      *  needs an update of the file cound
0231      *
0232      *  \see setCount
0233      */
0234     void updateCount();
0235 
0236     /** Called whenever the user changes the rename mode
0237      *
0238      *  @param mode the renaming mode selected by the user
0239      */
0240     void renameModeChanged(ERenameMode mode);
0241 
0242     /** Called whenever the user changes the option
0243      *  if existing files maybe overwritten
0244      *
0245      *  @param bool overwrite if true existing files maybe overwritten during renaming
0246      */
0247     void overwriteFilesChanged(bool overwrite);
0248 
0249     /** Called whenever the user has changed the template for the filename
0250      *
0251      *  @param filename the new template for the filename
0252      */
0253     void filenameTemplateChanged(const QString &filename);
0254 
0255     /** Called whenever the user has changed the template for the extension
0256      *
0257      *  @param filename the new template for the extension
0258      */
0259     void extensionTemplateChanged(const QString &extension);
0260 
0261     /** Called whenever the user change the splitmode between filename and extension
0262      *
0263      *  @param splitMode the mode which is used to split filename and extension
0264      *  @param dot the n-th dot to use for splitting if splitMode = eSplitMode_CustomDot
0265      */
0266     void extensionSplitModeChanged(ESplitMode splitMode, int dot);
0267 
0268     /** Called whenever the user changes the start index
0269      *
0270      *  @param index the new start index for numberings
0271      */
0272     void startIndexChanged(int index);
0273 
0274     /** Called whenever the user changes the file preview state
0275      *
0276      *  @param enable if true display previews
0277      *  @param filenames if true display filenames next to preview (if enable is false
0278      *                   this parameter has to be ignored.
0279      */
0280     void filePreviewChanged(bool enable, bool filenames);
0281 
0282     /** Called whenever the GUI wants an updated preview
0283      */
0284     void updatePreview();
0285 
0286     /** Called when the user requests the advanced numbering dialog
0287      */
0288     void showAdvancedNumberingDialog();
0289 
0290     /** Called when the user requests the insert part filename dialog
0291      */
0292     void showInsertPartFilenameDialog();
0293 
0294     /** Called when the user requests the find and repalce dialog
0295      */
0296     void showFindReplaceDialog();
0297 
0298     /** Called when the user wants to add more files
0299      */
0300     void addFiles();
0301 
0302     /** Called when the user wants to remove all files
0303      */
0304     void removeAllFiles();
0305 
0306     /** Called when the user wants to remove all selected files
0307      *
0308      *  \see selectedFileItems() to retrieve the selected files
0309      */
0310     void removeFiles();
0311 
0312     /** Show a token help dialog which inserts a token
0313      *  into a KLineEdit
0314      *
0315      *  \param edit the QLineEdit which is used to insert tokens selected by the user
0316      */
0317     void showTokenHelpDialog(QLineEdit *edit);
0318 
0319     /** Called when the user wants to rename with current settings
0320      */
0321     void accepted();
0322 
0323 private Q_SLOTS:
0324     void slotBack();
0325     void slotNext();
0326     void slotFinish();
0327 
0328     /** Changes the current page to the page with the given index
0329      *
0330      *  @param index the index of the page to show
0331      */
0332     void showPage(int index);
0333 
0334     /** Called when one of the checkboxes for
0335      *  rename, copy, more or link was clicked
0336      *  to change the rename mode.
0337      */
0338     void slotRenameModeChanged();
0339 
0340     /** Called whenever one of the template fields has changed
0341      */
0342     void slotTemplateChanged();
0343 
0344     /** Called whenever one of the template fields in wizard mode has changed
0345      */
0346     void slotSimpleTemplateChanged();
0347 
0348     /** Emits the showTokenHelpDialog signal with the appropriate
0349      *  KLineEdit
0350      */
0351     void slotTokenHelpRequested();
0352 
0353     /** Emits the showTokenHelpDialog signal with the appropriate
0354      *  KLineEdit
0355      */
0356     void slotTokenHelpRequestedWizard1();
0357 
0358     /** Emits the showTokenHelpDialog signal with the appropriate
0359      *  KLineEdit
0360      */
0361     void slotTokenHelpRequestedWizard2();
0362 
0363     /** Emits the showTokenHelpDialog signal with the appropriate
0364      *  KLineEdit
0365      */
0366     void slotTokenHelpRequestedWizard3();
0367 
0368     /** Emits the showTokenHelpDialog signal with the appropriate
0369      *  KLineEdit
0370      */
0371     void slotTokenHelpRequestedWizard4();
0372 
0373     /** Called when the user selects another extension split mode
0374      */
0375     void slotExtensionSplitModeChanged(int index);
0376 
0377     /** Called when one of the preview checkboxes is clicked.
0378      */
0379     void slotPreviewChanged();
0380 
0381     /** Called whenever the user changes the current sort mode
0382      *
0383      *  @param index currently selected sort index
0384      */
0385     void slotSortChanged(int index);
0386 
0387     /** Called whenever the possible maximum value of
0388      *  dots in a filename has changed.
0389      *
0390      *  @param dots the maximum number of dots in a filename
0391      *              that can be used to separate fileanem and extension
0392      */
0393     void slotMaxDotsChanged(int dots);
0394 
0395     /** Called whenever the user clicks a file
0396      *  in a listview to open it.
0397      *
0398      *  @param index the model index of the requested file in a model
0399      */
0400     void slotOpenFile(const QModelIndex &index);
0401 
0402     /** Called when the user wants to move files up
0403      *  in the file list box.
0404      */
0405     void slotMoveUp();
0406 
0407     /** Called when the user wants to move files down
0408      *  in the file list box.
0409      */
0410     void slotMoveDown();
0411 
0412     /** Called when the user wants to move files up
0413      *  in the preview.
0414      */
0415     void slotMoveUpPreview();
0416 
0417     /** Called when the user wants to move files down
0418      *  in the preview.
0419      */
0420     void slotMoveDownPreview();
0421 
0422     /** Called when the user selects a plugin in the plugins tab
0423      */
0424     void slotPluginChanged(QTreeWidgetItem *selected);
0425 
0426     /** Called when a plugin is enabled or disabled
0427      */
0428     void slotPluginEnabled();
0429 
0430     /** Called when the user changes the start index
0431      *  in the gui
0432      */
0433     void slotSimpleStartIndexChanged();
0434 
0435     /**
0436      * Called when the user clicked the enter templates
0437      * link in StartUpInfo.
0438      */
0439     void slotGotoTemplatesPage();
0440 
0441 private:
0442     /** Configures the GUI for the current GUI mode
0443      */
0444     void setupGui();
0445 
0446     /** Setup all signals and slots
0447      */
0448     void setupSlots();
0449 
0450     /** Load all plugins
0451      */
0452     void setupPlugins();
0453 
0454     /** Set standard KDE icons on UI elements
0455      *  as this cannot be done from within designer
0456      */
0457     void setupIcons();
0458 
0459     /** Get a template for the prefix or suffix in wizard mode
0460      *  from 2 combo boxes
0461      *
0462      *  @param combo the combobox used to select a default prefix/suffix (e.g. date)
0463      *  @param comboCustom additional user defined text
0464      *  @returns a template string
0465      */
0466     QString getPrefixSuffixSimple(QComboBox *combo, QComboBox *comboCustom);
0467 
0468     /** Get a template for the filename or extension in wizard mode
0469      *  from 2 combo boxes
0470      *
0471      *  @param combo the combobox used to select a default filename (e.g. lowercase)
0472      *  @param comboCustom additional user defined text
0473      *  @returns a template string
0474      */
0475     QString getFilenameSimple(QComboBox *combo, QComboBox *comboCustom);
0476 
0477     /** Set the GUI elements in the simple filename tab using a template
0478      *  that has specified in advanced mode
0479      *
0480      *  @param filename template of the filename
0481      *  @param extension template of the extension
0482      */
0483     void setSimpleTemplate(const QString &filename, const QString &extension);
0484 
0485     /** Emit signals that the template has been changed in some way by the user
0486      *
0487      *  @param filename template of the filename
0488      *  @param extension template of the extension
0489      */
0490     void templatesChanged(const QString &filename, const QString &extension);
0491 
0492     void setPrefixSuffixSimple(QComboBox *combo, QComboBox *comboCustom, const QString &templ);
0493 
0494     void moveUp(const QList<int> &selected, QAbstractItemView *view);
0495     void moveDown(const QList<int> &selected, QAbstractItemView *view);
0496 
0497     /**
0498      * \param index (0 or 1) index of the column
0499      * \returns the column width of column index
0500      */
0501     int previewColumnWidth(int index);
0502 
0503     /**
0504      * Set the width of the specified column
0505      * \param index (0 or 1) index of the column
0506      * \param width width in pixels
0507      */
0508     void setPreviewColumnWidth(int index, int width);
0509 
0510     void blockSignalsRecursive(QObject *obj, bool b);
0511 
0512 private:
0513     int               m_curPage;   /// The index of the current page in the current gui mode
0514     const TGuiMode   *m_guiMode;   /// The description structure of the current gui mode
0515     int               m_fileCount; /// Current number of files; used for enabled disabled state
0516 
0517     QStackedWidget   *m_stack;
0518     QDialogButtonBox *m_buttons;
0519 
0520     QTabBar          *m_tabBar;    /// The tabbar to switch pages in advanced mode
0521 
0522     QPushButton      *m_buttonClose;
0523     QPushButton      *m_buttonFinish;
0524 
0525     Ui::KRenameFiles       *m_pageFiles;
0526     Ui::KRenameDestination *m_pageDests;
0527     //Ui::KRenameSimple*      m_pageSimple;
0528     Ui::KRenamePlugins     *m_pagePlugins;
0529     Ui::KRenameFilename    *m_pageFilename;
0530 
0531     QHash<QString, QWidget *> m_pluginsWidgetHash;
0532     QHash<QString, Plugin *>  m_pluginsHash;
0533 
0534     RichTextItemDelegate   *m_delegate;
0535 };
0536 
0537 #endif // KRENAMEWINDOW_H