1 /* This file is part of the KDE project
2 
3    Copyright (C) 2008 Lukas Appelhans <l.appelhans@gmx.de>
4    Copyright (C) 2009 Matthias Fuchs <mat69@gmx.net>
5 
6    This program is free software; you can redistribute it and/or
7    modify it under the terms of the GNU General Public
8    License as published by the Free Software Foundation; either
9    version 2 of the License, or (at your option) any later version.
10 */
11 #include "transfersettingsdialog.h"
12 #include "mirror/mirrorsettings.h"
13 #include "renamefile.h"
14 #include "signaturedlg.h"
15 #include "verificationdialog.h"
16 #include "settings.h"
17 
18 #include "core/transferhandler.h"
19 #include "core/filemodel.h"
20 #include "core/verifier.h"
21 
22 #include <KMessageBox>
23 #include <KLocalizedString>
24 
25 #include <QLineEdit>
26 #include <QSortFilterProxyModel>
27 
TransferSettingsDialog(QWidget * parent,TransferHandler * transfer)28 TransferSettingsDialog::TransferSettingsDialog(QWidget *parent, TransferHandler *transfer)
29   : KGetSaveSizeDialog("TransferSettingsDialog", parent),
30     m_transfer(transfer),
31     m_model(m_transfer->fileModel())
32 {
33     setWindowTitle(i18n("Transfer Settings for %1", m_transfer->source().fileName()));
34 
35     ui.setupUi(this);
36 
37     ui.ktitlewidget->setPixmap(QIcon::fromTheme("preferences-other").pixmap(16));
38     ui.downloadSpin->setValue(m_transfer->downloadLimit(Transfer::VisibleSpeedLimit));
39     ui.uploadSpin->setValue(m_transfer->uploadLimit(Transfer::VisibleSpeedLimit));
40     ui.ratioSpin->setValue(m_transfer->maximumShareRatio());
41     ui.destination->setUrl(m_transfer->directory());
42     ui.destination->lineEdit()->setReadOnly(true);
43     ui.rename->setIcon(QIcon::fromTheme("edit-rename"));
44     ui.mirrors->setIcon(QIcon::fromTheme("download"));
45     ui.signature->setIcon(QIcon::fromTheme("application-pgp-signature"));
46     ui.verification->setIcon(QIcon::fromTheme("document-decrypt"));
47 
48     if (m_model)
49     {
50         m_model->watchCheckState();
51         m_proxy = new QSortFilterProxyModel(this);
52         m_proxy->setSourceModel(m_model);
53         ui.treeView->setModel(m_proxy);
54         ui.treeView->sortByColumn(0, Qt::AscendingOrder);
55 
56         QByteArray loadedState = QByteArray::fromBase64(Settings::transferSettingsHeaderState().toLatin1());
57         if (!loadedState.isEmpty()) {
58             ui.treeView->header()->restoreState(loadedState);
59         } else {
60             ui.treeView->header()->resizeSection(0, ui.treeView->header()->defaultSectionSize() * 3);
61         }
62     }
63 
64     updateCapabilities();
65 
66     connect(m_transfer, &TransferHandler::capabilitiesChanged, this, &TransferSettingsDialog::updateCapabilities);
67     connect(this, &TransferSettingsDialog::accepted, this, &TransferSettingsDialog::save);
68     connect(this, &TransferSettingsDialog::finished, this, &TransferSettingsDialog::slotFinished);
69     connect(ui.treeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &TransferSettingsDialog::slotSelectionChanged);
70     connect(ui.rename, &QPushButton::clicked, this, &TransferSettingsDialog::slotRename);
71     connect(ui.mirrors, &QPushButton::clicked, this, &TransferSettingsDialog::slotMirrors);
72     connect(ui.verification, &QPushButton::clicked, this, &TransferSettingsDialog::slotVerification);
73     connect(ui.signature, &QPushButton::clicked, this, &TransferSettingsDialog::slotSignature);
74 
75     connect(ui.buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
76     connect(ui.buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
77 }
78 
~TransferSettingsDialog()79 TransferSettingsDialog::~TransferSettingsDialog()
80 {
81     if (m_model) {
82         Settings::setTransferSettingsHeaderState(ui.treeView->header()->saveState().toBase64());
83     }
84 }
85 
sizeHint() const86 QSize TransferSettingsDialog::sizeHint() const
87 {
88     QSize sh = QDialog::sizeHint();
89     sh.setWidth(sh.width() * 1.7);
90     return sh;
91 }
92 
updateCapabilities()93 void TransferSettingsDialog::updateCapabilities()
94 {
95     const int capabilities = m_transfer->capabilities();
96 
97     const bool supportsSpeedLimit = capabilities & Transfer::Cap_SpeedLimit;
98     ui.labelDownload->setVisible(supportsSpeedLimit);
99     ui.downloadSpin->setVisible(supportsSpeedLimit);
100     ui.labelUpload->setVisible(supportsSpeedLimit);
101     ui.uploadSpin->setVisible(supportsSpeedLimit);
102     ui.labelShareRatio->setVisible(supportsSpeedLimit);
103     ui.ratioSpin->setVisible(supportsSpeedLimit);
104 
105     ui.destination->setEnabled(capabilities & Transfer::Cap_Moving);
106     ui.mirrors->setVisible(capabilities & Transfer::Cap_MultipleMirrors);
107     ui.rename->setVisible(capabilities & Transfer::Cap_Renaming);
108 }
109 
slotMirrors()110 void TransferSettingsDialog::slotMirrors()
111 {
112     const QModelIndex index = m_proxy->mapToSource(ui.treeView->selectionModel()->selectedIndexes().first());
113     QDialog *mirrors = new MirrorSettings(this, m_transfer, m_model->getUrl(index));
114     mirrors->setAttribute(Qt::WA_DeleteOnClose);
115     mirrors->show();
116 }
117 
slotRename()118 void TransferSettingsDialog::slotRename()
119 {
120     const QModelIndex index = m_proxy->mapToSource(ui.treeView->selectionModel()->selectedIndexes().first());
121     auto *renameDlg = new RenameFile(m_model, index, this);
122     renameDlg->setAttribute(Qt::WA_DeleteOnClose);
123     renameDlg->show();
124 }
125 
slotVerification()126 void TransferSettingsDialog::slotVerification()
127 {
128     const QModelIndex index = m_proxy->mapToSource(ui.treeView->selectionModel()->selectedIndexes().first());
129     QDialog *verification = new VerificationDialog(this, m_transfer, m_model->getUrl(index));
130     verification->setAttribute(Qt::WA_DeleteOnClose);
131     verification->show();
132 }
133 
slotSignature()134 void TransferSettingsDialog::slotSignature()
135 {
136     const QModelIndex index = m_proxy->mapToSource(ui.treeView->selectionModel()->selectedIndexes().first());
137 
138     auto *signature = new SignatureDlg(m_transfer, m_model->getUrl(index), this);
139     signature->setAttribute(Qt::WA_DeleteOnClose);
140     signature->show();
141 }
142 
slotSelectionChanged()143 void TransferSettingsDialog::slotSelectionChanged()
144 {
145     bool enabled = false;
146     //only enable rename when one item is selected and when this item is a file
147     if (ui.treeView->selectionModel()->selectedRows().count() == 1)
148     {
149         const QModelIndex index = m_proxy->mapToSource(ui.treeView->selectionModel()->selectedIndexes().first());
150         if (index.isValid() && !(static_cast<FileItem*>(index.internalPointer()))->childCount())
151         {
152             enabled = true;
153         }
154     }
155     ui.mirrors->setEnabled(enabled);
156     ui.rename->setEnabled(enabled);
157     ui.verification->setEnabled(enabled);
158     ui.signature->setEnabled(enabled);
159 }
160 
save()161 void TransferSettingsDialog::save()
162 {//TODO: Set to -1 when no limit
163     QUrl oldDirectory = m_transfer->directory();
164     QUrl newDirectory = ui.destination->url();
165     if ((oldDirectory != newDirectory) && !m_transfer->setDirectory(newDirectory))
166     {
167         KMessageBox::error(this, i18n("Changing the destination did not work, the destination stays unmodified."), i18n("Destination unmodified"));
168     }
169 
170     m_transfer->setDownloadLimit(ui.downloadSpin->value(), Transfer::VisibleSpeedLimit);
171     m_transfer->setUploadLimit(ui.uploadSpin->value(), Transfer::VisibleSpeedLimit);
172     m_transfer->setMaximumShareRatio(ui.ratioSpin->value());
173 }
174 
slotFinished()175 void TransferSettingsDialog::slotFinished()
176 {
177     if (m_model)
178     {
179         m_model->stopWatchCheckState();
180     }
181 }
182 
183 
184