File indexing completed on 2024-04-28 17:06:19

0001 /*
0002     SPDX-FileCopyrightText: 2004 Shie Erlich <krusader@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2004 Rafi Yanai <krusader@users.sourceforge.net>
0004     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "krcalcspacedialog.h"
0010 
0011 // QtCore
0012 #include <QTimer>
0013 // QtWidgets
0014 #include <QApplication>
0015 #include <QLabel>
0016 #include <QPushButton>
0017 #include <QVBoxLayout>
0018 // QtGui
0019 #include <QKeyEvent>
0020 
0021 #include <KI18n/KLocalizedString>
0022 
0023 #include "../FileSystem/sizecalculator.h"
0024 #include "../krglobal.h"
0025 
0026 KrCalcSpaceDialog::KrCalcSpaceDialog(QWidget *parent, SizeCalculator *calculator)
0027     : QDialog(parent)
0028     , m_calculator(calculator)
0029 {
0030     setWindowTitle(i18n("Calculate Occupied Space"));
0031 
0032     auto *layout = new QVBoxLayout;
0033     setLayout(layout);
0034     layout->setSizeConstraint(QLayout::SetFixedSize);
0035 
0036     m_label = new QLabel(this);
0037     layout->addWidget(m_label);
0038     layout->addStretch(10);
0039 
0040     // buttons: Cancel is replaced with Ok when calculator is finished
0041     m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Cancel);
0042     layout->addWidget(m_buttonBox);
0043     connect(m_buttonBox, &QDialogButtonBox::rejected, this, &KrCalcSpaceDialog::slotCancel);
0044     connect(m_buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
0045 
0046     connect(m_calculator, &SizeCalculator::finished, this, &KrCalcSpaceDialog::slotCalculatorFinished);
0047 
0048     m_updateTimer = new QTimer(this);
0049     connect(m_updateTimer, &QTimer::timeout, this, &KrCalcSpaceDialog::updateResult);
0050     m_updateTimer->start(1000);
0051 
0052     updateResult();
0053 }
0054 
0055 void KrCalcSpaceDialog::closeEvent(QCloseEvent *event)
0056 {
0057     if (event) {
0058         if (m_updateTimer->isActive())
0059             slotCancel();
0060         else
0061             accept();
0062     }
0063 }
0064 
0065 void KrCalcSpaceDialog::keyPressEvent(QKeyEvent *e)
0066 {
0067     if (e->key() == Qt::Key_Escape) {
0068         if (m_updateTimer->isActive())
0069             slotCancel();
0070         else
0071             reject();
0072     }
0073 }
0074 
0075 void KrCalcSpaceDialog::showDialog(QWidget *parent, SizeCalculator *calculator)
0076 {
0077     auto *dialog = new KrCalcSpaceDialog(parent, calculator);
0078     dialog->show();
0079 }
0080 
0081 void KrCalcSpaceDialog::slotCancel()
0082 {
0083     m_updateTimer->stop();
0084     m_calculator->cancel();
0085 
0086     reject(); // close and delete this dialog
0087 }
0088 
0089 void KrCalcSpaceDialog::slotCalculatorFinished()
0090 {
0091     m_buttonBox->clear();
0092     QPushButton *okButton = m_buttonBox->addButton(QDialogButtonBox::Ok);
0093     okButton->setDefault(true);
0094     okButton->setFocus();
0095 
0096     m_updateTimer->stop();
0097     updateResult();
0098 }
0099 
0100 void KrCalcSpaceDialog::updateResult()
0101 {
0102     const KIO::filesize_t totalSize = m_calculator->totalSize();
0103     const unsigned long totalFiles = m_calculator->totalFiles();
0104     const unsigned long totalDirs = m_calculator->totalDirs();
0105 
0106     const QList<QUrl> urls = m_calculator->urls();
0107     const QString fileName = urls.count() == 1 ? i18n("Name: %1\n", urls.first().fileName()) : QString("");
0108 
0109     QString msg = fileName + i18n("Total occupied space: %1", KIO::convertSize(totalSize));
0110     if (totalSize >= 1024)
0111         msg += i18np(" (%2 byte)", " (%2 bytes)", totalSize, QLocale().toString(totalSize));
0112     msg += '\n';
0113     msg += i18np("in %1 folder", "in %1 folders", totalDirs);
0114     msg += ' ';
0115     msg += i18np("and %1 file", "and %1 files", totalFiles);
0116     m_label->setText(msg);
0117 }