File indexing completed on 2024-04-28 05:02:08

0001 /*
0002  *  Synchronization dialog
0003  *
0004  *  SPDX-FileCopyrightText: 2023 Alexander Reinholdt <alexander.reinholdt@kdemail.net>
0005  *  SPDX-License-Identifier: GPL-2.0-or-later
0006  */
0007 
0008 // application specific includes
0009 #include "smb4ksynchronizationdialog.h"
0010 #include "core/smb4ksettings.h"
0011 #include "core/smb4ksynchronizer.h"
0012 
0013 // Qt includes
0014 #include <QDialogButtonBox>
0015 #include <QHBoxLayout>
0016 #include <QVBoxLayout>
0017 #include <QWindow>
0018 
0019 // KDE includes
0020 #include <KIconLoader>
0021 #include <KLineEdit>
0022 #include <KLocalizedString>
0023 #include <KUrlCompletion>
0024 #include <KWindowConfig>
0025 
0026 Smb4KSynchronizationDialog::Smb4KSynchronizationDialog(QWidget *parent)
0027     : QDialog(parent)
0028 {
0029     setWindowTitle(i18n("Synchronization"));
0030     setAttribute(Qt::WA_DeleteOnClose);
0031 
0032     QVBoxLayout *layout = new QVBoxLayout(this);
0033 
0034     QWidget *descriptionWidget = new QWidget(this);
0035 
0036     QHBoxLayout *descriptionLayout = new QHBoxLayout(descriptionWidget);
0037     descriptionLayout->setContentsMargins(0, 0, 0, 0);
0038 
0039     QLabel *descriptionPixmap = new QLabel(descriptionWidget);
0040     descriptionPixmap->setPixmap(KDE::icon(QStringLiteral("folder-sync")).pixmap(KIconLoader::SizeHuge));
0041     descriptionPixmap->setAlignment(Qt::AlignBottom);
0042     descriptionPixmap->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
0043 
0044     descriptionLayout->addWidget(descriptionPixmap);
0045 
0046     m_descriptionText = new QLabel(descriptionWidget);
0047     m_descriptionText->setText(i18n("Synchronization"));
0048     m_descriptionText->setWordWrap(true);
0049     m_descriptionText->setAlignment(Qt::AlignBottom);
0050     m_descriptionText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
0051 
0052     descriptionLayout->addWidget(m_descriptionText);
0053 
0054     layout->addWidget(descriptionWidget);
0055     layout->addSpacing(layout->spacing());
0056 
0057     QWidget *inputWidget = new QWidget(this);
0058 
0059     QGridLayout *inputWidgetLayout = new QGridLayout(inputWidget);
0060     inputWidgetLayout->setContentsMargins(0, 0, 0, 0);
0061 
0062     QLabel *sourceLabel = new QLabel(i18n("Source:"));
0063 
0064     m_sourceInput = new KUrlRequester(this);
0065     m_sourceInput->setMode(KFile::Directory | KFile::LocalOnly);
0066     m_sourceInput->lineEdit()->setSqueezedTextEnabled(true);
0067     m_sourceInput->completionObject()->setCompletionMode(KCompletion::CompletionPopupAuto);
0068     m_sourceInput->completionObject()->setMode(KUrlCompletion::FileCompletion);
0069 
0070     connect(m_sourceInput, &KUrlRequester::textChanged, this, &Smb4KSynchronizationDialog::slotSourcePathChanged);
0071 
0072     QLabel *destinationLabel = new QLabel(i18n("Destination:"));
0073 
0074     m_destinationInput = new KUrlRequester(this);
0075     m_destinationInput->setMode(KFile::Directory | KFile::LocalOnly);
0076     m_destinationInput->lineEdit()->setSqueezedTextEnabled(true);
0077     m_destinationInput->completionObject()->setCompletionMode(KCompletion::CompletionPopupAuto);
0078     m_destinationInput->completionObject()->setMode(KUrlCompletion::FileCompletion);
0079 
0080     connect(m_destinationInput, &KUrlRequester::textChanged, this, &Smb4KSynchronizationDialog::slotDestinationPathChanged);
0081 
0082     inputWidgetLayout->addWidget(sourceLabel, 0, 0);
0083     inputWidgetLayout->addWidget(m_sourceInput, 0, 1);
0084     inputWidgetLayout->addWidget(destinationLabel, 1, 0);
0085     inputWidgetLayout->addWidget(m_destinationInput, 1, 1);
0086 
0087     layout->addWidget(inputWidget);
0088 
0089     QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
0090     m_swapButton = buttonBox->addButton(i18n("Swap Paths"), QDialogButtonBox::ActionRole);
0091     m_swapButton->setEnabled(false);
0092     m_synchronizeButton = buttonBox->addButton(i18n("Synchronize"), QDialogButtonBox::ActionRole);
0093     m_synchronizeButton->setEnabled(false);
0094     m_cancelButton = buttonBox->addButton(QDialogButtonBox::Cancel);
0095     m_cancelButton->setShortcut(QKeySequence::Cancel);
0096 
0097     connect(m_swapButton, &QPushButton::clicked, this, &Smb4KSynchronizationDialog::slotSwapPaths);
0098     connect(m_synchronizeButton, &QPushButton::clicked, this, &Smb4KSynchronizationDialog::slotSynchronize);
0099     connect(m_cancelButton, &QPushButton::clicked, this, &Smb4KSynchronizationDialog::reject);
0100 
0101     layout->addWidget(buttonBox);
0102 
0103     setMinimumWidth(sizeHint().width() > 350 ? sizeHint().width() : 350);
0104 
0105     create();
0106 
0107     KConfigGroup dialogGroup(Smb4KSettings::self()->config(), QStringLiteral("SynchronizationDialog"));
0108     QSize dialogSize;
0109 
0110     if (dialogGroup.exists()) {
0111         KWindowConfig::restoreWindowSize(windowHandle(), dialogGroup);
0112         dialogSize = windowHandle()->size();
0113     } else {
0114         dialogSize = sizeHint();
0115     }
0116 
0117     resize(dialogSize); // workaround for QTBUG-40584
0118 }
0119 
0120 Smb4KSynchronizationDialog::~Smb4KSynchronizationDialog()
0121 {
0122 }
0123 
0124 bool Smb4KSynchronizationDialog::setShare(const SharePtr &share)
0125 {
0126     if (share->isPrinter() && share->isInaccessible()) {
0127         return false;
0128     }
0129 
0130     m_descriptionText->setText(i18n("Please provide the source and destination directory for the synchronization of <b>%1</b>.", share->displayString()));
0131 
0132     m_sourceInput->setUrl(QUrl::fromLocalFile(share->path()));
0133     m_destinationInput->setUrl(
0134         QUrl::fromLocalFile(Smb4KSettings::rsyncPrefix().path() + QDir::separator() + share->hostName() + QDir::separator() + share->shareName())
0135             .adjusted(QUrl::NormalizePathSegments));
0136 
0137     m_synchronizeButton->setDefault(true);
0138 
0139     return true;
0140 }
0141 
0142 void Smb4KSynchronizationDialog::slotSourcePathChanged(const QString &path)
0143 {
0144     Q_UNUSED(path);
0145 
0146     bool enable =
0147         !m_sourceInput->url().isEmpty() && m_sourceInput->url().isValid() && !m_destinationInput->url().isEmpty() && m_destinationInput->url().isValid();
0148 
0149     m_swapButton->setEnabled(enable);
0150     m_synchronizeButton->setEnabled(enable);
0151 }
0152 
0153 void Smb4KSynchronizationDialog::slotDestinationPathChanged(const QString &path)
0154 {
0155     Q_UNUSED(path);
0156 
0157     bool enable =
0158         !m_sourceInput->url().isEmpty() && m_sourceInput->url().isValid() && !m_destinationInput->url().isEmpty() && m_destinationInput->url().isValid();
0159 
0160     m_swapButton->setEnabled(enable);
0161     m_synchronizeButton->setEnabled(enable);
0162 }
0163 
0164 void Smb4KSynchronizationDialog::slotSwapPaths()
0165 {
0166     QUrl sourceUrl = m_sourceInput->url();
0167     QUrl destinationUrl = m_destinationInput->url();
0168 
0169     m_sourceInput->setUrl(destinationUrl);
0170     m_destinationInput->setUrl(sourceUrl);
0171 }
0172 
0173 void Smb4KSynchronizationDialog::slotSynchronize()
0174 {
0175     Smb4KSynchronizer::self()->synchronize(m_sourceInput->url(), m_destinationInput->url());
0176 
0177     KConfigGroup dialogGroup(Smb4KSettings::self()->config(), QStringLiteral("SynchronizationDialog"));
0178     KWindowConfig::saveWindowSize(windowHandle(), dialogGroup);
0179 
0180     accept();
0181 }