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 }