1 /***************************************************************************
2                         progressdialog.cpp  -  description
3                              -------------------
4     begin                : Sun Jul 1 2007
5     copyright            : (C) 2007 by Dominik Seichter
6     email                : domseichter@web.de
7 ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #include "progressdialog.h"
19 
20 #include "batchrenamer.h"
21 #include "krenameimpl.h"
22 
23 #include <QMenu>
24 
25 #include <kiconloader.h>
26 #include <krun.h>
27 
ProgressDialog(ESplitMode eSplitMode,unsigned int dot,QWidget * parent)28 ProgressDialog::ProgressDialog(ESplitMode eSplitMode, unsigned int dot, QWidget *parent)
29     : QDialog(parent), m_canceled(false), m_renamer(nullptr), m_eSplitMode(eSplitMode), m_dot(dot)
30 {
31     m_widget.setupUi(this);
32 
33     m_buttonMore  = m_widget.buttonBox->addButton(i18n("&Rename more..."), QDialogButtonBox::ActionRole);
34     m_buttonUndo  = m_widget.buttonBox->addButton(i18n("&Undo"), QDialogButtonBox::ActionRole);
35     m_buttonDest  = m_widget.buttonBox->addButton(i18n("&Open Destination"), QDialogButtonBox::ActionRole);
36     m_buttonClose = m_widget.buttonBox->button(QDialogButtonBox::Close);
37 
38     m_buttonUndo->setEnabled(false);
39     m_buttonMore->setEnabled(false);
40     m_buttonClose->setEnabled(false);
41 
42     connect(m_widget.buttonCancel, &QPushButton::clicked,
43             this, &ProgressDialog::slotCancelled);
44     connect(m_buttonDest, &QPushButton::clicked,
45             this, &ProgressDialog::slotOpenDestination);
46     connect(m_buttonUndo, &QPushButton::clicked,
47             this, &ProgressDialog::slotUndo);
48     connect(m_buttonClose, &QPushButton::clicked,
49             qApp, &QApplication::quit, Qt::QueuedConnection);
50 
51     QMenu *menu = new QMenu(this);
52     menu->addAction(i18n("Restart &KRename..."), this, &ProgressDialog::slotRestartKRename);
53     menu->addSeparator();
54     m_actProcessed = menu->addAction(i18n("Rename Processed Files &Again..."), this, &ProgressDialog::slotRenameProcessedAgain);
55     m_actUnprocessed = menu->addAction(i18n("Rename &Unprocessed Files Again..."), this, &ProgressDialog::slotRenameUnprocessedAgain);
56     menu->addAction(i18n("&Rename All Files Again..."), this, &ProgressDialog::slotRenameAllAgain);
57 
58     m_buttonMore->setMenu(menu);
59 }
60 
slotCancelled()61 void ProgressDialog::slotCancelled()
62 {
63     m_canceled = true;
64 }
65 
slotOpenDestination()66 void ProgressDialog::slotOpenDestination()
67 {
68     new KRun(m_dest, this);
69 }
70 
slotRestartKRename()71 void ProgressDialog::slotRestartKRename()
72 {
73     (void *)KRenameImpl::launch(QRect(0, 0, 0, 0), KRenameFile::List());
74     QDialog::done(0);
75 }
76 
slotRenameProcessedAgain()77 void ProgressDialog::slotRenameProcessedAgain()
78 {
79     KRenameFile::List list;
80     KRenameFile::List::const_iterator it = m_renamer->files()->begin();
81 
82     list.reserve(m_renamer->files()->count());
83     while (it != m_renamer->files()->end()) {
84         if (!(*it).hasError()) {
85             KRenameFile file(m_renamer->buildDestinationUrl(*it), (*it).isDirectory(), m_eSplitMode, m_dot);
86             file.setIcon(file.icon());
87             list.append(file);
88         }
89 
90         ++it;
91     }
92 
93     (void *)KRenameImpl::launch(QRect(0, 0, 0, 0), list);
94     QDialog::done(0);
95 }
96 
slotRenameUnprocessedAgain()97 void ProgressDialog::slotRenameUnprocessedAgain()
98 {
99     KRenameFile::List list;
100     KRenameFile::List::const_iterator it = m_renamer->files()->begin();
101 
102     list.reserve(m_renamer->files()->count());
103     while (it != m_renamer->files()->end()) {
104         if ((*it).hasError()) {
105             KRenameFile file(*it);
106             file.setManualChanges(QString(), eManualChangeMode_None);   // reset manual changes!!
107             list.append(file);
108         }
109 
110         ++it;
111     }
112 
113     (void *)KRenameImpl::launch(QRect(0, 0, 0, 0), list);
114     QDialog::done(0);
115 }
116 
slotRenameAllAgain()117 void ProgressDialog::slotRenameAllAgain()
118 {
119     KRenameFile::List list;
120     KRenameFile::List::const_iterator it = m_renamer->files()->begin();
121 
122     list.reserve(m_renamer->files()->count());
123     while (it != m_renamer->files()->end()) {
124         KRenameFile file(m_renamer->buildDestinationUrl(*it), (*it).isDirectory(), m_eSplitMode, m_dot);
125         file.setIcon(file.icon());
126         list.append(file);
127         ++it;
128     }
129 
130     (void *)KRenameImpl::launch(QRect(0, 0, 0, 0), list);
131     QDialog::done(0);
132 }
133 
slotUndo()134 void ProgressDialog::slotUndo()
135 {
136     if (m_renamer) {
137         m_widget.buttonCancel->setEnabled(true);
138 
139         m_buttonUndo->setEnabled(false);
140         m_buttonMore->setEnabled(false);
141 
142         m_renamer->undoFiles(this);
143     }
144 }
145 
renamingDone(bool enableMore,bool enableUndo,BatchRenamer * renamer,int errors)146 void ProgressDialog::renamingDone(bool enableMore, bool enableUndo, BatchRenamer *renamer, int errors)
147 {
148     m_widget.buttonCancel->setEnabled(false);
149 
150     m_buttonUndo->setEnabled(enableUndo);
151     m_buttonMore->setEnabled(enableMore);   // Do allow renaming processed files after undo
152     m_buttonClose->setEnabled(true);
153     m_buttonClose->setShortcut(QKeySequence(QKeySequence::Quit));
154 
155     m_actProcessed->setEnabled(renamer->files()->count() != errors);
156     m_actUnprocessed->setEnabled(0 != errors);
157 
158     m_renamer = renamer;
159 }
160 
closeEvent(QCloseEvent * event)161 void ProgressDialog::closeEvent(QCloseEvent *event)
162 {
163     // KRenameWindow is still around but hidden. When we close this dialog we
164     // want to quit the app completely if there isn't some operation still
165     // running.
166     if (m_buttonClose->isEnabled()) {
167         qApp->quit();
168         QWidget::closeEvent(event);
169     }
170 }
171 
print(const QString & text,const QString & pixmap)172 void ProgressDialog::print(const QString &text, const QString &pixmap)
173 {
174     QPixmap icon = SmallIcon(pixmap);
175 
176     new QListWidgetItem(icon, text, m_widget.display);
177 }
178 
error(const QString & text)179 void ProgressDialog::error(const QString &text)
180 {
181     this->print(text, "cancel");
182 }
183 
warning(const QString & text)184 void ProgressDialog::warning(const QString &text)
185 {
186     this->print(text, "help-hint");
187 }
188