File indexing completed on 2024-04-21 16:33:12

0001 /*
0002     SPDX-FileCopyrightText: 2003 Csaba Karai <krusader@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "synchronizedialog.h"
0009 #include "../FileSystem/krpermhandler.h"
0010 #include "../defaults.h"
0011 #include "../icon.h"
0012 #include "../krglobal.h"
0013 
0014 // QtWidgets
0015 #include <QLabel>
0016 #include <QLayout>
0017 #include <QVBoxLayout>
0018 
0019 #include <KConfigCore/KSharedConfig>
0020 #include <KI18n/KLocalizedString>
0021 
0022 SynchronizeDialog::SynchronizeDialog(QWidget *parent,
0023                                      Synchronizer *sync,
0024                                      int pleftCopyNr,
0025                                      KIO::filesize_t pleftCopySize,
0026                                      int prightCopyNr,
0027                                      KIO::filesize_t prightCopySize,
0028                                      int pdeleteNr,
0029                                      KIO::filesize_t pdeleteSize,
0030                                      int parThreads)
0031     : QDialog(parent)
0032     , synchronizer(sync)
0033     , leftCopyNr(pleftCopyNr)
0034     , leftCopySize(pleftCopySize)
0035     , rightCopyNr(prightCopyNr)
0036     , rightCopySize(prightCopySize)
0037     , deleteNr(pdeleteNr)
0038     , deleteSize(pdeleteSize)
0039     , parallelThreads(parThreads)
0040     , isPause(true)
0041     , syncStarted(false)
0042 {
0043     setWindowTitle(i18n("Krusader::Synchronize"));
0044     setModal(true);
0045 
0046     auto *layout = new QVBoxLayout(this);
0047     layout->setContentsMargins(11, 11, 11, 11);
0048     layout->setSpacing(6);
0049 
0050     cbRightToLeft = new QCheckBox(i18np("Right to left: Copy 1 file", "Right to left: Copy %1 files", leftCopyNr) + ' '
0051                                       + i18np("(1 byte)", "(%1 bytes)", KrPermHandler::parseSize(leftCopySize).trimmed().toInt()),
0052                                   this);
0053     cbRightToLeft->setChecked(leftCopyNr != 0);
0054     cbRightToLeft->setEnabled(leftCopyNr != 0);
0055     layout->addWidget(cbRightToLeft);
0056 
0057     lbRightToLeft =
0058         new QLabel(i18np("\tReady: %2/1 file, %3/%4", "\tReady: %2/%1 files, %3/%4", leftCopyNr, 0, 0, KrPermHandler::parseSize(leftCopySize).trimmed()), this);
0059     lbRightToLeft->setEnabled(leftCopyNr != 0);
0060     layout->addWidget(lbRightToLeft);
0061 
0062     cbLeftToRight = new QCheckBox(i18np("Left to right: Copy 1 file", "Left to right: Copy %1 files", rightCopyNr) + ' '
0063                                       + i18np("(1 byte)", "(%1 bytes)", KrPermHandler::parseSize(rightCopySize).trimmed().toInt()),
0064                                   this);
0065     cbLeftToRight->setChecked(rightCopyNr != 0);
0066     cbLeftToRight->setEnabled(rightCopyNr != 0);
0067     layout->addWidget(cbLeftToRight);
0068 
0069     lbLeftToRight =
0070         new QLabel(i18np("\tReady: %2/1 file, %3/%4", "\tReady: %2/%1 files, %3/%4", rightCopyNr, 0, 0, KrPermHandler::parseSize(rightCopySize).trimmed()),
0071                    this);
0072     lbLeftToRight->setEnabled(rightCopyNr != 0);
0073     layout->addWidget(lbLeftToRight);
0074 
0075     cbDeletable = new QCheckBox(i18np("Left: Delete 1 file", "Left: Delete %1 files", deleteNr) + ' '
0076                                     + i18np("(1 byte)", "(%1 bytes)", KrPermHandler::parseSize(deleteSize).trimmed().toInt()),
0077                                 this);
0078     cbDeletable->setChecked(deleteNr != 0);
0079     cbDeletable->setEnabled(deleteNr != 0);
0080     layout->addWidget(cbDeletable);
0081 
0082     lbDeletable =
0083         new QLabel(i18np("\tReady: %2/1 file, %3/%4", "\tReady: %2/%1 files, %3/%4", deleteNr, 0, 0, KrPermHandler::parseSize(deleteSize).trimmed()), this);
0084     lbDeletable->setEnabled(deleteNr != 0);
0085     layout->addWidget(lbDeletable);
0086 
0087     progress = new QProgressBar(this);
0088     progress->setMaximum(1000);
0089     progress->setMinimum(0);
0090     progress->setValue(0);
0091     progress->setMinimumWidth(400);
0092     layout->addWidget(progress);
0093 
0094     QWidget *hboxWidget = new QWidget(this);
0095     auto *hbox = new QHBoxLayout(hboxWidget);
0096 
0097     hbox->setSpacing(6);
0098 
0099     cbOverwrite = new QCheckBox(i18n("Confirm overwrites"), this);
0100     KConfigGroup group(krConfig, "Synchronize");
0101     cbOverwrite->setChecked(group.readEntry("Confirm overwrites", _ConfirmOverWrites));
0102     layout->addWidget(cbOverwrite);
0103 
0104     auto *spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
0105     hbox->addItem(spacer);
0106 
0107     btnStart = new QPushButton(hboxWidget);
0108     btnStart->setText(i18n("&Start"));
0109     btnStart->setIcon(Icon("media-playback-start"));
0110     btnStart->setDefault(true);
0111     hbox->addWidget(btnStart);
0112 
0113     btnPause = new QPushButton(hboxWidget);
0114     btnPause->setEnabled(false);
0115     btnPause->setText(i18n("&Pause"));
0116     btnPause->setIcon(Icon("media-playback-pause"));
0117     hbox->addWidget(btnPause);
0118 
0119     auto *btnClose = new QPushButton(hboxWidget);
0120     btnClose->setText(i18n("&Close"));
0121     btnClose->setIcon(Icon("dialog-close"));
0122     hbox->addWidget(btnClose);
0123 
0124     layout->addWidget(hboxWidget);
0125 
0126     connect(btnStart, &QPushButton::clicked, this, [=]() {
0127         startSynchronization();
0128     });
0129     connect(btnPause, &QPushButton::clicked, this, [=]() {
0130         pauseOrResume();
0131     });
0132     connect(btnClose, &QPushButton::clicked, this, [=]() {
0133         reject();
0134     });
0135 
0136     exec();
0137 }
0138 
0139 SynchronizeDialog::~SynchronizeDialog()
0140 {
0141     KConfigGroup group(krConfig, "Synchronize");
0142     group.writeEntry("Confirm overwrites", cbOverwrite->isChecked());
0143 }
0144 
0145 void SynchronizeDialog::startSynchronization()
0146 {
0147     btnStart->setEnabled(false);
0148     btnPause->setEnabled(syncStarted = true);
0149     connect(synchronizer, SIGNAL(synchronizationFinished()), this, SLOT(synchronizationFinished()));
0150     connect(synchronizer,
0151             SIGNAL(processedSizes(int, KIO::filesize_t, int, KIO::filesize_t, int, KIO::filesize_t)),
0152             this,
0153             SLOT(processedSizes(int, KIO::filesize_t, int, KIO::filesize_t, int, KIO::filesize_t)));
0154     connect(synchronizer, SIGNAL(pauseAccepted()), this, SLOT(pauseAccepted()));
0155 
0156     if (!cbRightToLeft->isChecked())
0157         leftCopySize = 0;
0158     if (!cbLeftToRight->isChecked())
0159         rightCopySize = 0;
0160     if (!cbDeletable->isChecked())
0161         deleteSize = 0;
0162 
0163     synchronizer
0164         ->synchronize(this, cbRightToLeft->isChecked(), cbLeftToRight->isChecked(), cbDeletable->isChecked(), !cbOverwrite->isChecked(), parallelThreads);
0165 }
0166 
0167 void SynchronizeDialog::synchronizationFinished()
0168 {
0169     QDialog::reject();
0170 }
0171 
0172 void SynchronizeDialog::processedSizes(int leftNr, KIO::filesize_t leftSize, int rightNr, KIO::filesize_t rightSize, int delNr, KIO::filesize_t delSize)
0173 {
0174     lbRightToLeft->setText(i18np("\tReady: %2/1 file, %3/%4",
0175                                  "\tReady: %2/%1 files, %3/%4",
0176                                  leftCopyNr,
0177                                  leftNr,
0178                                  KrPermHandler::parseSize(leftSize).trimmed(),
0179                                  KrPermHandler::parseSize(leftCopySize).trimmed()));
0180     lbLeftToRight->setText(i18np("\tReady: %2/1 file, %3/%4",
0181                                  "\tReady: %2/%1 files, %3/%4",
0182                                  rightCopyNr,
0183                                  rightNr,
0184                                  KrPermHandler::parseSize(rightSize).trimmed(),
0185                                  KrPermHandler::parseSize(rightCopySize).trimmed()));
0186     lbDeletable->setText(i18np("\tReady: %2/1 file, %3/%4",
0187                                "\tReady: %2/%1 files, %3/%4",
0188                                deleteNr,
0189                                delNr,
0190                                KrPermHandler::parseSize(delSize).trimmed(),
0191                                KrPermHandler::parseSize(deleteSize).trimmed()));
0192 
0193     KIO::filesize_t totalSum = leftCopySize + rightCopySize + deleteSize;
0194     KIO::filesize_t processedSum = leftSize + rightSize + delSize;
0195 
0196     if (totalSum == 0)
0197         totalSum++;
0198 
0199     progress->setValue((int)(((double)processedSum / (double)totalSum) * 1000));
0200 }
0201 
0202 void SynchronizeDialog::pauseOrResume()
0203 {
0204     if (isPause) {
0205         btnPause->setEnabled(false);
0206         synchronizer->pause();
0207     } else {
0208         btnPause->setText(i18n("Pause"));
0209         synchronizer->resume();
0210         isPause = true;
0211     }
0212 }
0213 
0214 void SynchronizeDialog::pauseAccepted()
0215 {
0216     btnPause->setText(i18n("Resume"));
0217     btnPause->setEnabled(true);
0218     isPause = false;
0219 }