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