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