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