mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-03-13 05:41:17 +00:00
Merge pull request #13885 from thalieht/torrentOptionsDialog
Rework global speed limit dialog and introduce torrent options dialog
This commit is contained in:
commit
60d65d8137
@ -238,6 +238,9 @@ namespace BitTorrent
|
||||
virtual int downloadLimit() const = 0;
|
||||
virtual int uploadLimit() const = 0;
|
||||
virtual bool superSeeding() const = 0;
|
||||
virtual bool isDHTDisabled() const = 0;
|
||||
virtual bool isPEXDisabled() const = 0;
|
||||
virtual bool isLSDDisabled() const = 0;
|
||||
virtual QVector<PeerInfo> peers() const = 0;
|
||||
virtual QBitArray pieces() const = 0;
|
||||
virtual QBitArray downloadingPieces() const = 0;
|
||||
@ -277,6 +280,9 @@ namespace BitTorrent
|
||||
virtual void setUploadLimit(int limit) = 0;
|
||||
virtual void setDownloadLimit(int limit) = 0;
|
||||
virtual void setSuperSeeding(bool enable) = 0;
|
||||
virtual void setDHTDisabled(bool disable) = 0;
|
||||
virtual void setPEXDisabled(bool disable) = 0;
|
||||
virtual void setLSDDisabled(bool disable) = 0;
|
||||
virtual void flushCache() const = 0;
|
||||
virtual void addTrackers(const QVector<TrackerEntry> &trackers) = 0;
|
||||
virtual void replaceTrackers(const QVector<TrackerEntry> &trackers) = 0;
|
||||
|
@ -1016,6 +1016,21 @@ bool TorrentHandleImpl::superSeeding() const
|
||||
return static_cast<bool>(m_nativeStatus.flags & lt::torrent_flags::super_seeding);
|
||||
}
|
||||
|
||||
bool TorrentHandleImpl::isDHTDisabled() const
|
||||
{
|
||||
return static_cast<bool>(m_nativeStatus.flags & lt::torrent_flags::disable_dht);
|
||||
}
|
||||
|
||||
bool TorrentHandleImpl::isPEXDisabled() const
|
||||
{
|
||||
return static_cast<bool>(m_nativeStatus.flags & lt::torrent_flags::disable_pex);
|
||||
}
|
||||
|
||||
bool TorrentHandleImpl::isLSDDisabled() const
|
||||
{
|
||||
return static_cast<bool>(m_nativeStatus.flags & lt::torrent_flags::disable_lsd);
|
||||
}
|
||||
|
||||
QVector<PeerInfo> TorrentHandleImpl::peers() const
|
||||
{
|
||||
std::vector<lt::peer_info> nativePeers;
|
||||
@ -1935,20 +1950,68 @@ void TorrentHandleImpl::setSeedingTimeLimit(int limit)
|
||||
|
||||
void TorrentHandleImpl::setUploadLimit(const int limit)
|
||||
{
|
||||
if (limit == uploadLimit())
|
||||
return;
|
||||
|
||||
m_nativeHandle.set_upload_limit(limit);
|
||||
saveResumeData();
|
||||
}
|
||||
|
||||
void TorrentHandleImpl::setDownloadLimit(const int limit)
|
||||
{
|
||||
if (limit == downloadLimit())
|
||||
return;
|
||||
|
||||
m_nativeHandle.set_download_limit(limit);
|
||||
saveResumeData();
|
||||
}
|
||||
|
||||
void TorrentHandleImpl::setSuperSeeding(const bool enable)
|
||||
{
|
||||
if (enable == superSeeding())
|
||||
return;
|
||||
|
||||
if (enable)
|
||||
m_nativeHandle.set_flags(lt::torrent_flags::super_seeding);
|
||||
else
|
||||
m_nativeHandle.unset_flags(lt::torrent_flags::super_seeding);
|
||||
saveResumeData();
|
||||
}
|
||||
|
||||
void TorrentHandleImpl::setDHTDisabled(const bool disable)
|
||||
{
|
||||
if (disable == isDHTDisabled())
|
||||
return;
|
||||
|
||||
if (disable)
|
||||
m_nativeHandle.set_flags(lt::torrent_flags::disable_dht);
|
||||
else
|
||||
m_nativeHandle.unset_flags(lt::torrent_flags::disable_dht);
|
||||
saveResumeData();
|
||||
}
|
||||
|
||||
void TorrentHandleImpl::setPEXDisabled(const bool disable)
|
||||
{
|
||||
if (disable == isPEXDisabled())
|
||||
return;
|
||||
|
||||
if (disable)
|
||||
m_nativeHandle.set_flags(lt::torrent_flags::disable_pex);
|
||||
else
|
||||
m_nativeHandle.unset_flags(lt::torrent_flags::disable_pex);
|
||||
saveResumeData();
|
||||
}
|
||||
|
||||
void TorrentHandleImpl::setLSDDisabled(const bool disable)
|
||||
{
|
||||
if (disable == isLSDDisabled())
|
||||
return;
|
||||
|
||||
if (disable)
|
||||
m_nativeHandle.set_flags(lt::torrent_flags::disable_lsd);
|
||||
else
|
||||
m_nativeHandle.unset_flags(lt::torrent_flags::disable_lsd);
|
||||
saveResumeData();
|
||||
}
|
||||
|
||||
void TorrentHandleImpl::flushCache() const
|
||||
|
@ -191,6 +191,9 @@ namespace BitTorrent
|
||||
int downloadLimit() const override;
|
||||
int uploadLimit() const override;
|
||||
bool superSeeding() const override;
|
||||
bool isDHTDisabled() const override;
|
||||
bool isPEXDisabled() const override;
|
||||
bool isLSDDisabled() const override;
|
||||
QVector<PeerInfo> peers() const override;
|
||||
QBitArray pieces() const override;
|
||||
QBitArray downloadingPieces() const override;
|
||||
@ -224,6 +227,9 @@ namespace BitTorrent
|
||||
void setUploadLimit(int limit) override;
|
||||
void setDownloadLimit(int limit) override;
|
||||
void setSuperSeeding(bool enable) override;
|
||||
void setDHTDisabled(bool disable) override;
|
||||
void setPEXDisabled(bool disable) override;
|
||||
void setLSDDisabled(bool disable) override;
|
||||
void flushCache() const override;
|
||||
void addTrackers(const QVector<TrackerEntry> &trackers) override;
|
||||
void replaceTrackers(const QVector<TrackerEntry> &trackers) override;
|
||||
|
@ -38,6 +38,7 @@
|
||||
// See issue #3059 for more details (https://github.com/qbittorrent/qBittorrent/issues/3059).
|
||||
|
||||
const char C_COPYRIGHT[] = "©";
|
||||
const char C_INEQUALITY[] = "≠";
|
||||
const char C_INFINITY[] = "∞";
|
||||
const char C_NON_BREAKING_SPACE[] = " ";
|
||||
const char C_THIN_SPACE[] = " ";
|
||||
|
@ -67,6 +67,7 @@ add_library(qbt_gui STATIC
|
||||
torrentcontentmodelitem.h
|
||||
torrentcontenttreeview.h
|
||||
torrentcreatordialog.h
|
||||
torrentoptionsdialog.h
|
||||
trackerentriesdialog.h
|
||||
transferlistdelegate.h
|
||||
transferlistfilterswidget.h
|
||||
@ -76,7 +77,6 @@ add_library(qbt_gui STATIC
|
||||
tristateaction.h
|
||||
tristatewidget.h
|
||||
uithememanager.h
|
||||
updownratiodialog.h
|
||||
utils.h
|
||||
|
||||
# sources
|
||||
@ -147,6 +147,7 @@ add_library(qbt_gui STATIC
|
||||
torrentcontentmodelitem.cpp
|
||||
torrentcontenttreeview.cpp
|
||||
torrentcreatordialog.cpp
|
||||
torrentoptionsdialog.cpp
|
||||
trackerentriesdialog.cpp
|
||||
transferlistdelegate.cpp
|
||||
transferlistfilterswidget.cpp
|
||||
@ -156,7 +157,6 @@ add_library(qbt_gui STATIC
|
||||
tristateaction.cpp
|
||||
tristatewidget.cpp
|
||||
uithememanager.cpp
|
||||
updownratiodialog.cpp
|
||||
utils.cpp
|
||||
|
||||
# forms
|
||||
@ -186,8 +186,8 @@ add_library(qbt_gui STATIC
|
||||
statsdialog.ui
|
||||
torrentcategorydialog.ui
|
||||
torrentcreatordialog.ui
|
||||
torrentoptionsdialog.ui
|
||||
trackerentriesdialog.ui
|
||||
updownratiodialog.ui
|
||||
)
|
||||
|
||||
target_sources(qbt_gui INTERFACE about.qrc)
|
||||
|
@ -68,6 +68,7 @@ HEADERS += \
|
||||
$$PWD/torrentcontentmodelitem.h \
|
||||
$$PWD/torrentcontenttreeview.h \
|
||||
$$PWD/torrentcreatordialog.h \
|
||||
$$PWD/torrentoptionsdialog.h \
|
||||
$$PWD/trackerentriesdialog.h \
|
||||
$$PWD/transferlistdelegate.h \
|
||||
$$PWD/transferlistfilterswidget.h \
|
||||
@ -77,7 +78,6 @@ HEADERS += \
|
||||
$$PWD/tristateaction.h \
|
||||
$$PWD/tristatewidget.h \
|
||||
$$PWD/uithememanager.h \
|
||||
$$PWD/updownratiodialog.h \
|
||||
$$PWD/utils.h
|
||||
|
||||
SOURCES += \
|
||||
@ -148,6 +148,7 @@ SOURCES += \
|
||||
$$PWD/torrentcontentmodelitem.cpp \
|
||||
$$PWD/torrentcontenttreeview.cpp \
|
||||
$$PWD/torrentcreatordialog.cpp \
|
||||
$$PWD/torrentoptionsdialog.cpp \
|
||||
$$PWD/trackerentriesdialog.cpp \
|
||||
$$PWD/transferlistdelegate.cpp \
|
||||
$$PWD/transferlistfilterswidget.cpp \
|
||||
@ -157,7 +158,6 @@ SOURCES += \
|
||||
$$PWD/tristateaction.cpp \
|
||||
$$PWD/tristatewidget.cpp \
|
||||
$$PWD/uithememanager.cpp \
|
||||
$$PWD/updownratiodialog.cpp \
|
||||
$$PWD/utils.cpp
|
||||
|
||||
win32|macx {
|
||||
@ -207,7 +207,7 @@ FORMS += \
|
||||
$$PWD/statsdialog.ui \
|
||||
$$PWD/torrentcategorydialog.ui \
|
||||
$$PWD/torrentcreatordialog.ui \
|
||||
$$PWD/trackerentriesdialog.ui \
|
||||
$$PWD/updownratiodialog.ui
|
||||
$$PWD/torrentoptionsdialog.ui \
|
||||
$$PWD/trackerentriesdialog.ui
|
||||
|
||||
RESOURCES += $$PWD/about.qrc
|
||||
|
@ -172,10 +172,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
|
||||
m_ui->actionOpen->setIcon(UIThemeManager::instance()->getIcon("list-add"));
|
||||
m_ui->actionDownloadFromURL->setIcon(UIThemeManager::instance()->getIcon("insert-link"));
|
||||
m_ui->actionSetUploadLimit->setIcon(UIThemeManager::instance()->getIcon("kt-set-max-upload-speed"));
|
||||
m_ui->actionSetDownloadLimit->setIcon(UIThemeManager::instance()->getIcon("kt-set-max-download-speed"));
|
||||
m_ui->actionSetGlobalUploadLimit->setIcon(UIThemeManager::instance()->getIcon("kt-set-max-upload-speed"));
|
||||
m_ui->actionSetGlobalDownloadLimit->setIcon(UIThemeManager::instance()->getIcon("kt-set-max-download-speed"));
|
||||
m_ui->actionSetGlobalSpeedLimits->setIcon(UIThemeManager::instance()->getIcon("speedometer"));
|
||||
m_ui->actionCreateTorrent->setIcon(UIThemeManager::instance()->getIcon("document-edit"));
|
||||
m_ui->actionAbout->setIcon(UIThemeManager::instance()->getIcon("help-about"));
|
||||
m_ui->actionStatistics->setIcon(UIThemeManager::instance()->getIcon("view-statistics"));
|
||||
@ -1008,36 +1005,11 @@ void MainWindow::handleDownloadFromUrlFailure(const QString &url, const QString
|
||||
, tr("Couldn't download file at URL '%1', reason: %2.").arg(url, reason));
|
||||
}
|
||||
|
||||
void MainWindow::on_actionSetGlobalUploadLimit_triggered()
|
||||
void MainWindow::on_actionSetGlobalSpeedLimits_triggered()
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO;
|
||||
|
||||
BitTorrent::Session *const session = BitTorrent::Session::instance();
|
||||
bool ok = false;
|
||||
const long newLimit = SpeedLimitDialog::askSpeedLimit(
|
||||
this, &ok, tr("Global Upload Speed Limit"), session->uploadSpeedLimit());
|
||||
|
||||
if (ok)
|
||||
{
|
||||
qDebug("Setting global upload rate limit to %.1fKb/s", newLimit / 1024.);
|
||||
session->setUploadSpeedLimit(newLimit);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionSetGlobalDownloadLimit_triggered()
|
||||
{
|
||||
qDebug() << Q_FUNC_INFO;
|
||||
|
||||
BitTorrent::Session *const session = BitTorrent::Session::instance();
|
||||
bool ok = false;
|
||||
const long newLimit = SpeedLimitDialog::askSpeedLimit(
|
||||
this, &ok, tr("Global Download Speed Limit"), session->downloadSpeedLimit());
|
||||
|
||||
if (ok)
|
||||
{
|
||||
qDebug("Setting global download rate limit to %.1fKb/s", newLimit / 1024.);
|
||||
session->setDownloadSpeedLimit(newLimit);
|
||||
}
|
||||
auto dialog = new SpeedLimitDialog {this};
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
dialog->open();
|
||||
}
|
||||
|
||||
// Necessary if we want to close the window
|
||||
@ -1808,8 +1780,7 @@ QMenu *MainWindow::trayIconMenu()
|
||||
updateAltSpeedsBtn(isAltBWEnabled);
|
||||
m_ui->actionUseAlternativeSpeedLimits->setChecked(isAltBWEnabled);
|
||||
m_trayIconMenu->addAction(m_ui->actionUseAlternativeSpeedLimits);
|
||||
m_trayIconMenu->addAction(m_ui->actionSetGlobalDownloadLimit);
|
||||
m_trayIconMenu->addAction(m_ui->actionSetGlobalUploadLimit);
|
||||
m_trayIconMenu->addAction(m_ui->actionSetGlobalSpeedLimits);
|
||||
m_trayIconMenu->addSeparator();
|
||||
m_trayIconMenu->addAction(m_ui->actionStartAll);
|
||||
m_trayIconMenu->addAction(m_ui->actionPauseAll);
|
||||
|
@ -171,8 +171,7 @@ private slots:
|
||||
void on_actionStatistics_triggered();
|
||||
void on_actionCreateTorrent_triggered();
|
||||
void on_actionOptions_triggered();
|
||||
void on_actionSetGlobalUploadLimit_triggered();
|
||||
void on_actionSetGlobalDownloadLimit_triggered();
|
||||
void on_actionSetGlobalSpeedLimits_triggered();
|
||||
void on_actionDocumentation_triggered() const;
|
||||
void on_actionOpen_triggered();
|
||||
void on_actionDownloadFromURL_triggered();
|
||||
|
@ -223,29 +223,14 @@
|
||||
<string>Torrent &Creator</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSetUploadLimit">
|
||||
<property name="text">
|
||||
<string>Set Upload Limit...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSetDownloadLimit">
|
||||
<property name="text">
|
||||
<string>Set Download Limit...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionDocumentation">
|
||||
<property name="text">
|
||||
<string>&Documentation</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSetGlobalDownloadLimit">
|
||||
<action name="actionSetGlobalSpeedLimits">
|
||||
<property name="text">
|
||||
<string>Set Global Download Limit...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSetGlobalUploadLimit">
|
||||
<property name="text">
|
||||
<string>Set Global Upload Limit...</string>
|
||||
<string>Set Global Speed Limits...</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionBottomQueuePos">
|
||||
|
@ -1902,7 +1902,7 @@ Manual: Various torrent properties (e.g. save path) must be assigned manually</s
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1000000</number>
|
||||
<number>2000000</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>100</number>
|
||||
@ -1918,7 +1918,7 @@ Manual: Various torrent properties (e.g. save path) must be assigned manually</s
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1000000</number>
|
||||
<number>2000000</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>100</number>
|
||||
@ -1973,7 +1973,7 @@ Manual: Various torrent properties (e.g. save path) must be assigned manually</s
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1000000</number>
|
||||
<number>2000000</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>10</number>
|
||||
@ -2109,7 +2109,7 @@ Manual: Various torrent properties (e.g. save path) must be assigned manually</s
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1000000</number>
|
||||
<number>2000000</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>10</number>
|
||||
|
@ -283,26 +283,34 @@ void TrackerListWidget::clear()
|
||||
|
||||
void TrackerListWidget::loadStickyItems(const BitTorrent::TorrentHandle *torrent)
|
||||
{
|
||||
QString working = tr("Working");
|
||||
QString disabled = tr("Disabled");
|
||||
const QString working {tr("Working")};
|
||||
const QString disabled {tr("Disabled")};
|
||||
const QString torrentDisabled {tr("Disabled for this torrent")};
|
||||
const auto *session = BitTorrent::Session::instance();
|
||||
|
||||
// load DHT information
|
||||
if (BitTorrent::Session::instance()->isDHTEnabled() && !torrent->isPrivate())
|
||||
m_DHTItem->setText(COL_STATUS, working);
|
||||
else
|
||||
if (torrent->isPrivate() || torrent->isDHTDisabled())
|
||||
m_DHTItem->setText(COL_STATUS, torrentDisabled);
|
||||
else if (!session->isDHTEnabled())
|
||||
m_DHTItem->setText(COL_STATUS, disabled);
|
||||
else
|
||||
m_DHTItem->setText(COL_STATUS, working);
|
||||
|
||||
// Load PeX Information
|
||||
if (BitTorrent::Session::instance()->isPeXEnabled() && !torrent->isPrivate())
|
||||
m_PEXItem->setText(COL_STATUS, working);
|
||||
else
|
||||
if (torrent->isPrivate() || torrent->isPEXDisabled())
|
||||
m_PEXItem->setText(COL_STATUS, torrentDisabled);
|
||||
else if (!session->isPeXEnabled())
|
||||
m_PEXItem->setText(COL_STATUS, disabled);
|
||||
else
|
||||
m_PEXItem->setText(COL_STATUS, working);
|
||||
|
||||
// Load LSD Information
|
||||
if (BitTorrent::Session::instance()->isLSDEnabled() && !torrent->isPrivate())
|
||||
m_LSDItem->setText(COL_STATUS, working);
|
||||
else
|
||||
if (torrent->isPrivate() || torrent->isLSDDisabled())
|
||||
m_LSDItem->setText(COL_STATUS, torrentDisabled);
|
||||
else if (!session->isLSDEnabled())
|
||||
m_LSDItem->setText(COL_STATUS, disabled);
|
||||
else
|
||||
m_LSDItem->setText(COL_STATUS, working);
|
||||
|
||||
if (torrent->isPrivate())
|
||||
{
|
||||
|
@ -28,19 +28,80 @@
|
||||
|
||||
#include "speedlimitdialog.h"
|
||||
|
||||
#include <QStyle>
|
||||
|
||||
#include "base/bittorrent/session.h"
|
||||
#include "ui_speedlimitdialog.h"
|
||||
#include "uithememanager.h"
|
||||
#include "utils.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
void updateSliderValue(QSlider *slider, const int value)
|
||||
{
|
||||
if (value > slider->maximum())
|
||||
slider->setMaximum(value);
|
||||
slider->setValue(value);
|
||||
}
|
||||
}
|
||||
|
||||
SpeedLimitDialog::SpeedLimitDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_ui(new Ui::SpeedLimitDialog)
|
||||
: QDialog {parent}
|
||||
, m_ui {new Ui::SpeedLimitDialog}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
// Connect to slots
|
||||
connect(m_ui->bandwidthSlider, &QSlider::valueChanged, this, &SpeedLimitDialog::updateSpinValue);
|
||||
connect(m_ui->spinBandwidth, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, &SpeedLimitDialog::updateSliderValue);
|
||||
m_ui->labelGlobalSpeedIcon->setPixmap(Utils::Gui::scaledPixmap(UIThemeManager::instance()->getIcon(QLatin1String("slow_off"))
|
||||
, this, style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, this)));
|
||||
m_ui->labelAltGlobalSpeedIcon->setPixmap(Utils::Gui::scaledPixmap(UIThemeManager::instance()->getIcon(QLatin1String("slow"))
|
||||
, this, style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, this)));
|
||||
|
||||
const auto initSlider = [](QSlider *slider, const int value, const int maximum)
|
||||
{
|
||||
slider->setMaximum(maximum);
|
||||
slider->setValue(value);
|
||||
};
|
||||
const auto *session = BitTorrent::Session::instance();
|
||||
const int uploadVal = qMax(0, (session->globalUploadSpeedLimit() / 1024));
|
||||
const int downloadVal = qMax(0, (session->globalDownloadSpeedLimit() / 1024));
|
||||
const int maxUpload = qMax(10000, (session->globalUploadSpeedLimit() / 1024));
|
||||
const int maxDownload = qMax(10000, (session->globalDownloadSpeedLimit() / 1024));
|
||||
initSlider(m_ui->sliderUploadLimit, uploadVal, maxUpload);
|
||||
initSlider(m_ui->sliderDownloadLimit, downloadVal, maxDownload);
|
||||
|
||||
const int altUploadVal = qMax(0, (session->altGlobalUploadSpeedLimit() / 1024));
|
||||
const int altDownloadVal = qMax(0, (session->altGlobalDownloadSpeedLimit() / 1024));
|
||||
const int altMaxUpload = qMax(10000, (session->altGlobalUploadSpeedLimit() / 1024));
|
||||
const int altMaxDownload = qMax(10000, (session->altGlobalDownloadSpeedLimit() / 1024));
|
||||
initSlider(m_ui->sliderAltUploadLimit, altUploadVal, altMaxUpload);
|
||||
initSlider(m_ui->sliderAltDownloadLimit, altDownloadVal, altMaxDownload);
|
||||
|
||||
m_ui->spinUploadLimit->setValue(uploadVal);
|
||||
m_ui->spinDownloadLimit->setValue(downloadVal);
|
||||
m_ui->spinAltUploadLimit->setValue(altUploadVal);
|
||||
m_ui->spinAltDownloadLimit->setValue(altDownloadVal);
|
||||
|
||||
m_initialValues =
|
||||
{
|
||||
m_ui->spinUploadLimit->value(),
|
||||
m_ui->spinDownloadLimit->value(),
|
||||
m_ui->spinAltUploadLimit->value(),
|
||||
m_ui->spinAltDownloadLimit->value()
|
||||
};
|
||||
|
||||
// Sync up/down speed limit sliders with their corresponding spinboxes
|
||||
connect(m_ui->sliderUploadLimit, &QSlider::valueChanged, m_ui->spinUploadLimit, &QSpinBox::setValue);
|
||||
connect(m_ui->sliderDownloadLimit, &QSlider::valueChanged, m_ui->spinDownloadLimit, &QSpinBox::setValue);
|
||||
connect(m_ui->spinUploadLimit, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, [this](const int value) { updateSliderValue(m_ui->sliderUploadLimit, value); });
|
||||
connect(m_ui->spinDownloadLimit, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, [this](const int value) { updateSliderValue(m_ui->sliderDownloadLimit, value); });
|
||||
connect(m_ui->sliderAltUploadLimit, &QSlider::valueChanged, m_ui->spinAltUploadLimit, &QSpinBox::setValue);
|
||||
connect(m_ui->sliderAltDownloadLimit, &QSlider::valueChanged, m_ui->spinAltDownloadLimit, &QSpinBox::setValue);
|
||||
connect(m_ui->spinAltUploadLimit, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, [this](const int value) { updateSliderValue(m_ui->sliderAltUploadLimit, value); });
|
||||
connect(m_ui->spinAltDownloadLimit, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, [this](const int value) { updateSliderValue(m_ui->sliderAltDownloadLimit, value); });
|
||||
|
||||
Utils::Gui::resize(this);
|
||||
}
|
||||
@ -50,58 +111,24 @@ SpeedLimitDialog::~SpeedLimitDialog()
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
// -2: if cancel
|
||||
long SpeedLimitDialog::askSpeedLimit(QWidget *parent, bool *ok, const QString &title, const long defaultVal, const long maxVal)
|
||||
void SpeedLimitDialog::accept()
|
||||
{
|
||||
if (ok) *ok = false;
|
||||
auto *session = BitTorrent::Session::instance();
|
||||
const int uploadLimit = (m_ui->spinUploadLimit->value() * 1024);
|
||||
if (m_initialValues.uploadSpeedLimit != m_ui->spinUploadLimit->value())
|
||||
session->setGlobalUploadSpeedLimit(uploadLimit);
|
||||
|
||||
SpeedLimitDialog dlg(parent);
|
||||
dlg.setWindowTitle(title);
|
||||
dlg.setupDialog((maxVal / 1024.), (defaultVal / 1024.));
|
||||
const int downloadLimit = (m_ui->spinDownloadLimit->value() * 1024);
|
||||
if (m_initialValues.downloadSpeedLimit != m_ui->spinDownloadLimit->value())
|
||||
session->setGlobalDownloadSpeedLimit(downloadLimit);
|
||||
|
||||
if (dlg.exec() == QDialog::Accepted)
|
||||
{
|
||||
if (ok) *ok = true;
|
||||
const int altUploadLimit = (m_ui->spinAltUploadLimit->value() * 1024);
|
||||
if (m_initialValues.altUploadSpeedLimit != m_ui->spinAltUploadLimit->value())
|
||||
session->setAltGlobalUploadSpeedLimit(altUploadLimit);
|
||||
|
||||
const int val = dlg.getSpeedLimit();
|
||||
if (val < 0)
|
||||
return 0;
|
||||
return (val * 1024);
|
||||
}
|
||||
const int altDownloadLimit = (m_ui->spinAltDownloadLimit->value() * 1024);
|
||||
if (m_initialValues.altDownloadSpeedLimit != m_ui->spinAltDownloadLimit->value())
|
||||
session->setAltGlobalDownloadSpeedLimit(altDownloadLimit);
|
||||
|
||||
return -2;
|
||||
}
|
||||
|
||||
void SpeedLimitDialog::updateSpinValue(const int value)
|
||||
{
|
||||
m_ui->spinBandwidth->setValue(value);
|
||||
}
|
||||
|
||||
void SpeedLimitDialog::updateSliderValue(const int value)
|
||||
{
|
||||
if (value > m_ui->bandwidthSlider->maximum())
|
||||
m_ui->bandwidthSlider->setMaximum(value);
|
||||
m_ui->bandwidthSlider->setValue(value);
|
||||
}
|
||||
|
||||
int SpeedLimitDialog::getSpeedLimit() const
|
||||
{
|
||||
return m_ui->spinBandwidth->value();
|
||||
}
|
||||
|
||||
void SpeedLimitDialog::setupDialog(long maxSlider, long val)
|
||||
{
|
||||
val = qMax<long>(0, val);
|
||||
|
||||
if (maxSlider <= 0)
|
||||
maxSlider = 10000;
|
||||
|
||||
// This can happen for example if global rate limit is lower
|
||||
// than torrent rate limit.
|
||||
if (val > maxSlider)
|
||||
maxSlider = val;
|
||||
|
||||
m_ui->bandwidthSlider->setMaximum(maxSlider);
|
||||
m_ui->bandwidthSlider->setValue(val);
|
||||
updateSpinValue(val);
|
||||
QDialog::accept();
|
||||
}
|
||||
|
@ -35,22 +35,24 @@ namespace Ui
|
||||
class SpeedLimitDialog;
|
||||
}
|
||||
|
||||
class SpeedLimitDialog : public QDialog
|
||||
class SpeedLimitDialog final : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit SpeedLimitDialog(QWidget *parent);
|
||||
~SpeedLimitDialog();
|
||||
static long askSpeedLimit(QWidget *parent, bool *ok, const QString &title, long defaultVal, long maxVal = 10240000);
|
||||
~SpeedLimitDialog() override;
|
||||
|
||||
private slots:
|
||||
void updateSpinValue(int val);
|
||||
void updateSliderValue(int val);
|
||||
public slots:
|
||||
void accept() override;
|
||||
|
||||
private:
|
||||
void setupDialog(long maxSlider, long val);
|
||||
int getSpeedLimit() const;
|
||||
|
||||
Ui::SpeedLimitDialog *m_ui;
|
||||
struct
|
||||
{
|
||||
int uploadSpeedLimit;
|
||||
int downloadSpeedLimit;
|
||||
int altUploadSpeedLimit;
|
||||
int altDownloadSpeedLimit;
|
||||
} m_initialValues;
|
||||
};
|
||||
|
@ -6,34 +6,166 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>338</width>
|
||||
<height>83</height>
|
||||
<width>481</width>
|
||||
<height>272</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Global Speed Limits</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QSlider" name="bandwidthSlider">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="spinBandwidth">
|
||||
<property name="specialValueText">
|
||||
<string>∞</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>65535</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Speed limits</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0" rowspan="2">
|
||||
<widget class="QLabel" name="labelGlobalSpeedIcon">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Upload:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QSlider" name="sliderUploadLimit">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QSpinBox" name="spinUploadLimit">
|
||||
<property name="specialValueText">
|
||||
<string>∞</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>2000000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Download:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QSlider" name="sliderDownloadLimit">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QSpinBox" name="spinDownloadLimit">
|
||||
<property name="specialValueText">
|
||||
<string>∞</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>2000000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Alternative speed limits</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0" rowspan="2">
|
||||
<widget class="QLabel" name="labelAltGlobalSpeedIcon">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Upload:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QSlider" name="sliderAltUploadLimit">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QSpinBox" name="spinAltUploadLimit">
|
||||
<property name="specialValueText">
|
||||
<string>∞</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>2000000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Download:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QSlider" name="sliderAltDownloadLimit">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QSpinBox" name="spinAltDownloadLimit">
|
||||
<property name="specialValueText">
|
||||
<string>∞</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>2000000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
|
@ -71,7 +71,7 @@ StatusBar::StatusBar(QWidget *parent)
|
||||
|
||||
m_dlSpeedLbl = new QPushButton(this);
|
||||
m_dlSpeedLbl->setIcon(UIThemeManager::instance()->getIcon(QLatin1String("downloading_small")));
|
||||
connect(m_dlSpeedLbl, &QAbstractButton::clicked, this, &StatusBar::capDownloadSpeed);
|
||||
connect(m_dlSpeedLbl, &QAbstractButton::clicked, this, &StatusBar::capSpeed);
|
||||
m_dlSpeedLbl->setFlat(true);
|
||||
m_dlSpeedLbl->setFocusPolicy(Qt::NoFocus);
|
||||
m_dlSpeedLbl->setCursor(Qt::PointingHandCursor);
|
||||
@ -80,7 +80,7 @@ StatusBar::StatusBar(QWidget *parent)
|
||||
|
||||
m_upSpeedLbl = new QPushButton(this);
|
||||
m_upSpeedLbl->setIcon(UIThemeManager::instance()->getIcon(QLatin1String("seeding")));
|
||||
connect(m_upSpeedLbl, &QAbstractButton::clicked, this, &StatusBar::capUploadSpeed);
|
||||
connect(m_upSpeedLbl, &QAbstractButton::clicked, this, &StatusBar::capSpeed);
|
||||
m_upSpeedLbl->setFlat(true);
|
||||
m_upSpeedLbl->setFocusPolicy(Qt::NoFocus);
|
||||
m_upSpeedLbl->setCursor(Qt::PointingHandCursor);
|
||||
@ -251,32 +251,9 @@ void StatusBar::updateAltSpeedsBtn(bool alternative)
|
||||
refresh();
|
||||
}
|
||||
|
||||
void StatusBar::capDownloadSpeed()
|
||||
void StatusBar::capSpeed()
|
||||
{
|
||||
BitTorrent::Session *const session = BitTorrent::Session::instance();
|
||||
|
||||
bool ok = false;
|
||||
const long newLimit = SpeedLimitDialog::askSpeedLimit(
|
||||
parentWidget(), &ok, tr("Global Download Speed Limit"), session->downloadSpeedLimit());
|
||||
if (ok)
|
||||
{
|
||||
qDebug("Setting global download rate limit to %.1fKb/s", newLimit / 1024.);
|
||||
session->setDownloadSpeedLimit(newLimit);
|
||||
refresh();
|
||||
}
|
||||
}
|
||||
|
||||
void StatusBar::capUploadSpeed()
|
||||
{
|
||||
BitTorrent::Session *const session = BitTorrent::Session::instance();
|
||||
|
||||
bool ok = false;
|
||||
const long newLimit = SpeedLimitDialog::askSpeedLimit(
|
||||
parentWidget(), &ok, tr("Global Upload Speed Limit"), session->uploadSpeedLimit());
|
||||
if (ok)
|
||||
{
|
||||
qDebug("Setting global upload rate limit to %.1fKb/s", newLimit / 1024.);
|
||||
session->setUploadSpeedLimit(newLimit);
|
||||
refresh();
|
||||
}
|
||||
auto dialog = new SpeedLimitDialog {parentWidget()};
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
dialog->open();
|
||||
}
|
||||
|
@ -57,8 +57,7 @@ public slots:
|
||||
private slots:
|
||||
void refresh();
|
||||
void updateAltSpeedsBtn(bool alternative);
|
||||
void capDownloadSpeed();
|
||||
void capUploadSpeed();
|
||||
void capSpeed();
|
||||
|
||||
private:
|
||||
void updateConnectionStatus();
|
||||
|
368
src/gui/torrentoptionsdialog.cpp
Normal file
368
src/gui/torrentoptionsdialog.cpp
Normal file
@ -0,0 +1,368 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* In addition, as a special exception, the copyright holders give permission to
|
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||
* and distribute the linked executables. You must obey the GNU General Public
|
||||
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*/
|
||||
|
||||
#include "torrentoptionsdialog.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
#include <QString>
|
||||
|
||||
#include "base/bittorrent/infohash.h"
|
||||
#include "base/bittorrent/session.h"
|
||||
#include "base/bittorrent/torrenthandle.h"
|
||||
#include "base/global.h"
|
||||
#include "base/unicodestrings.h"
|
||||
#include "ui_torrentoptionsdialog.h"
|
||||
#include "utils.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
const int MIXED_SHARE_LIMITS = -9;
|
||||
|
||||
void updateSliderValue(QSlider *slider, const int value)
|
||||
{
|
||||
if (value > slider->maximum())
|
||||
slider->setMaximum(value);
|
||||
slider->setValue(value);
|
||||
}
|
||||
}
|
||||
|
||||
TorrentOptionsDialog::TorrentOptionsDialog(QWidget *parent, const QVector<BitTorrent::TorrentHandle *> &torrents)
|
||||
: QDialog {parent}
|
||||
, m_ui {new Ui::TorrentOptionsDialog}
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
Q_ASSERT(!torrents.empty());
|
||||
const auto *session = BitTorrent::Session::instance();
|
||||
bool allSameUpLimit = true, allSameDownLimit = true, allSameRatio = true, allSameSeedingTime = true
|
||||
, allTorrentsArePrivate = true, allSameDHT = true, allSamePEX = true, allSameLSD = true;
|
||||
|
||||
const int firstTorrentUpLimit = qMax(0, torrents[0]->uploadLimit());
|
||||
const int firstTorrentDownLimit = qMax(0, torrents[0]->downloadLimit());
|
||||
|
||||
const qreal firstTorrentRatio = torrents[0]->ratioLimit();
|
||||
const int firstTorrentSeedingTime = torrents[0]->seedingTimeLimit();
|
||||
|
||||
const bool isFirstTorrentDHTDisabled = torrents[0]->isDHTDisabled();
|
||||
const bool isFirstTorrentPEXDisabled = torrents[0]->isPEXDisabled();
|
||||
const bool isFirstTorrentLSDDisabled = torrents[0]->isLSDDisabled();
|
||||
|
||||
m_torrentHashes.reserve(torrents.size());
|
||||
for (const BitTorrent::TorrentHandle *torrent : torrents)
|
||||
{
|
||||
m_torrentHashes << torrent->hash();
|
||||
if (allSameUpLimit)
|
||||
{
|
||||
if (qMax(0, torrent->uploadLimit()) != firstTorrentUpLimit)
|
||||
allSameUpLimit = false;
|
||||
}
|
||||
if (allSameDownLimit)
|
||||
{
|
||||
if (qMax(0, torrent->downloadLimit()) != firstTorrentDownLimit)
|
||||
allSameDownLimit = false;
|
||||
}
|
||||
if (allSameRatio)
|
||||
{
|
||||
if (torrent->ratioLimit() != firstTorrentRatio)
|
||||
allSameRatio = false;
|
||||
}
|
||||
if (allSameSeedingTime)
|
||||
{
|
||||
if (torrent->seedingTimeLimit() != firstTorrentSeedingTime)
|
||||
allSameSeedingTime = false;
|
||||
}
|
||||
if (allTorrentsArePrivate)
|
||||
{
|
||||
if (!torrent->isPrivate())
|
||||
allTorrentsArePrivate = false;
|
||||
}
|
||||
if (allSameDHT)
|
||||
{
|
||||
if (torrent->isDHTDisabled() != isFirstTorrentDHTDisabled)
|
||||
{
|
||||
m_ui->checkDisableDHT->setCheckState(Qt::PartiallyChecked);
|
||||
allSameDHT = false;
|
||||
}
|
||||
}
|
||||
if (allSamePEX)
|
||||
{
|
||||
if (torrent->isPEXDisabled() != isFirstTorrentPEXDisabled)
|
||||
{
|
||||
m_ui->checkDisablePEX->setCheckState(Qt::PartiallyChecked);
|
||||
allSamePEX = false;
|
||||
}
|
||||
}
|
||||
if (allSameLSD)
|
||||
{
|
||||
if (torrent->isLSDDisabled() != isFirstTorrentLSDDisabled)
|
||||
{
|
||||
m_ui->checkDisableLSD->setCheckState(Qt::PartiallyChecked);
|
||||
allSameLSD = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const bool isAltLimitEnabled = session->isAltGlobalSpeedLimitEnabled();
|
||||
const int globalUploadLimit = isAltLimitEnabled
|
||||
? (session->altGlobalUploadSpeedLimit() / 1024)
|
||||
: (session->globalUploadSpeedLimit() / 1024);
|
||||
const int globalDownloadLimit = isAltLimitEnabled
|
||||
? (session->altGlobalDownloadSpeedLimit() / 1024)
|
||||
: (session->globalDownloadSpeedLimit() / 1024);
|
||||
|
||||
const int uploadVal = qMax(0, (firstTorrentUpLimit / 1024));
|
||||
const int downloadVal = qMax(0, (firstTorrentDownLimit / 1024));
|
||||
int maxUpload = (globalUploadLimit <= 0) ? 10000 : globalUploadLimit;
|
||||
int maxDownload = (globalDownloadLimit <= 0) ? 10000 : globalDownloadLimit;
|
||||
|
||||
// This can happen for example if global rate limit is lower than torrent rate limit.
|
||||
if (uploadVal > maxUpload)
|
||||
maxUpload = uploadVal;
|
||||
if (downloadVal > maxDownload)
|
||||
maxDownload = downloadVal;
|
||||
|
||||
m_ui->sliderUploadLimit->setMaximum(maxUpload);
|
||||
m_ui->sliderUploadLimit->setValue(allSameUpLimit ? uploadVal : (maxUpload / 2));
|
||||
if (allSameUpLimit)
|
||||
{
|
||||
m_ui->spinUploadLimit->setValue(uploadVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ui->spinUploadLimit->setSpecialValueText(QString::fromUtf8(C_INEQUALITY));
|
||||
m_ui->spinUploadLimit->setMinimum(-1);
|
||||
m_ui->spinUploadLimit->setValue(-1);
|
||||
connect(m_ui->spinUploadLimit, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, &TorrentOptionsDialog::handleUpSpeedLimitChanged);
|
||||
}
|
||||
|
||||
m_ui->sliderDownloadLimit->setMaximum(maxDownload);
|
||||
m_ui->sliderDownloadLimit->setValue(allSameDownLimit ? downloadVal : (maxDownload / 2));
|
||||
if (allSameDownLimit)
|
||||
{
|
||||
m_ui->spinDownloadLimit->setValue(downloadVal);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ui->spinDownloadLimit->setSpecialValueText(QString::fromUtf8(C_INEQUALITY));
|
||||
m_ui->spinDownloadLimit->setMinimum(-1);
|
||||
m_ui->spinDownloadLimit->setValue(-1);
|
||||
connect(m_ui->spinDownloadLimit, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, &TorrentOptionsDialog::handleDownSpeedLimitChanged);
|
||||
}
|
||||
|
||||
const bool useGlobalValue = allSameRatio && allSameSeedingTime
|
||||
&& (firstTorrentRatio == BitTorrent::TorrentHandle::USE_GLOBAL_RATIO)
|
||||
&& (firstTorrentSeedingTime == BitTorrent::TorrentHandle::USE_GLOBAL_SEEDING_TIME);
|
||||
|
||||
if (!allSameRatio || !allSameSeedingTime)
|
||||
{
|
||||
m_ui->radioUseGlobalShareLimits->setChecked(false);
|
||||
m_ui->radioNoLimit->setChecked(false);
|
||||
m_ui->radioTorrentLimit->setChecked(false);
|
||||
}
|
||||
else if (useGlobalValue)
|
||||
{
|
||||
m_ui->radioUseGlobalShareLimits->setChecked(true);
|
||||
}
|
||||
else if ((firstTorrentRatio == BitTorrent::TorrentHandle::NO_RATIO_LIMIT)
|
||||
&& (firstTorrentSeedingTime == BitTorrent::TorrentHandle::NO_SEEDING_TIME_LIMIT))
|
||||
{
|
||||
m_ui->radioNoLimit->setChecked(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ui->radioTorrentLimit->setChecked(true);
|
||||
if (firstTorrentRatio >= 0)
|
||||
m_ui->checkMaxRatio->setChecked(true);
|
||||
if (firstTorrentSeedingTime >= 0)
|
||||
m_ui->checkMaxTime->setChecked(true);
|
||||
}
|
||||
|
||||
const qreal maxRatio = (allSameRatio && (firstTorrentRatio >= 0))
|
||||
? firstTorrentRatio : session->globalMaxRatio();
|
||||
const int maxSeedingTime = (allSameSeedingTime && (firstTorrentSeedingTime >= 0))
|
||||
? firstTorrentSeedingTime : session->globalMaxSeedingMinutes();
|
||||
m_ui->spinRatioLimit->setValue(maxRatio);
|
||||
m_ui->spinTimeLimit->setValue(maxSeedingTime);
|
||||
handleRatioTypeChanged();
|
||||
|
||||
if (!allTorrentsArePrivate)
|
||||
{
|
||||
if (m_ui->checkDisableDHT->checkState() != Qt::PartiallyChecked)
|
||||
m_ui->checkDisableDHT->setChecked(isFirstTorrentDHTDisabled);
|
||||
if (m_ui->checkDisablePEX->checkState() != Qt::PartiallyChecked)
|
||||
m_ui->checkDisablePEX->setChecked(isFirstTorrentPEXDisabled);
|
||||
if (m_ui->checkDisableLSD->checkState() != Qt::PartiallyChecked)
|
||||
m_ui->checkDisableLSD->setChecked(isFirstTorrentLSDDisabled);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ui->checkDisableDHT->setChecked(true);
|
||||
m_ui->checkDisableDHT->setEnabled(false);
|
||||
m_ui->checkDisablePEX->setChecked(true);
|
||||
m_ui->checkDisablePEX->setEnabled(false);
|
||||
m_ui->checkDisableLSD->setChecked(true);
|
||||
m_ui->checkDisableLSD->setEnabled(false);
|
||||
}
|
||||
|
||||
const QString privateTorrentsTooltip = tr("Not applicable to private torrents");
|
||||
m_ui->checkDisableDHT->setToolTip(privateTorrentsTooltip);
|
||||
m_ui->checkDisablePEX->setToolTip(privateTorrentsTooltip);
|
||||
m_ui->checkDisableLSD->setToolTip(privateTorrentsTooltip);
|
||||
|
||||
m_initialValues =
|
||||
{
|
||||
getRatio(),
|
||||
getSeedingTime(),
|
||||
m_ui->spinUploadLimit->value(),
|
||||
m_ui->spinDownloadLimit->value(),
|
||||
m_ui->checkDisableDHT->checkState(),
|
||||
m_ui->checkDisablePEX->checkState(),
|
||||
m_ui->checkDisableLSD->checkState()
|
||||
};
|
||||
|
||||
// Sync up/down speed limit sliders with their corresponding spinboxes
|
||||
connect(m_ui->sliderUploadLimit, &QSlider::valueChanged, m_ui->spinUploadLimit, &QSpinBox::setValue);
|
||||
connect(m_ui->sliderDownloadLimit, &QSlider::valueChanged, m_ui->spinDownloadLimit, &QSpinBox::setValue);
|
||||
connect(m_ui->spinUploadLimit, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, [this](const int value) { updateSliderValue(m_ui->sliderUploadLimit, value); });
|
||||
connect(m_ui->spinDownloadLimit, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, [this](const int value) { updateSliderValue(m_ui->sliderDownloadLimit, value); });
|
||||
|
||||
connect(m_ui->checkMaxRatio, &QCheckBox::toggled, m_ui->spinRatioLimit, &QDoubleSpinBox::setEnabled);
|
||||
connect(m_ui->checkMaxTime, &QCheckBox::toggled, m_ui->spinTimeLimit, &QSpinBox::setEnabled);
|
||||
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
|
||||
connect(m_ui->buttonGroup, &QButtonGroup::idClicked, this, &TorrentOptionsDialog::handleRatioTypeChanged);
|
||||
#else
|
||||
connect(m_ui->buttonGroup, qOverload<int>(&QButtonGroup::buttonClicked)
|
||||
, this, &TorrentOptionsDialog::handleRatioTypeChanged);
|
||||
#endif
|
||||
|
||||
Utils::Gui::resize(this);
|
||||
}
|
||||
|
||||
TorrentOptionsDialog::~TorrentOptionsDialog()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
||||
|
||||
void TorrentOptionsDialog::accept()
|
||||
{
|
||||
if (m_ui->radioTorrentLimit->isChecked() && !m_ui->checkMaxRatio->isChecked() && !m_ui->checkMaxTime->isChecked())
|
||||
{
|
||||
QMessageBox::critical(this, tr("No share limit method selected"), tr("Please select a limit method first"));
|
||||
return;
|
||||
}
|
||||
|
||||
const auto *session = BitTorrent::Session::instance();
|
||||
for (const BitTorrent::InfoHash &hash : asConst(m_torrentHashes))
|
||||
{
|
||||
BitTorrent::TorrentHandle *torrent = session->findTorrent(hash);
|
||||
if (!torrent) continue;
|
||||
|
||||
if (m_initialValues.upSpeedLimit != m_ui->spinUploadLimit->value())
|
||||
torrent->setUploadLimit(m_ui->spinUploadLimit->value() * 1024);
|
||||
if (m_initialValues.downSpeedLimit != m_ui->spinDownloadLimit->value())
|
||||
torrent->setDownloadLimit(m_ui->spinDownloadLimit->value() * 1024);
|
||||
|
||||
const qreal ratioLimit = getRatio();
|
||||
if (m_initialValues.ratio != ratioLimit)
|
||||
torrent->setRatioLimit(ratioLimit);
|
||||
|
||||
const int seedingTimeLimit = getSeedingTime();
|
||||
if (m_initialValues.seedingTime != seedingTimeLimit)
|
||||
torrent->setSeedingTimeLimit(seedingTimeLimit);
|
||||
|
||||
if (!torrent->isPrivate())
|
||||
{
|
||||
if (m_initialValues.disableDHT != m_ui->checkDisableDHT->checkState())
|
||||
torrent->setDHTDisabled(m_ui->checkDisableDHT->isChecked());
|
||||
if (m_initialValues.disablePEX != m_ui->checkDisablePEX->checkState())
|
||||
torrent->setPEXDisabled(m_ui->checkDisablePEX->isChecked());
|
||||
if (m_initialValues.disableLSD != m_ui->checkDisableLSD->checkState())
|
||||
torrent->setLSDDisabled(m_ui->checkDisableLSD->isChecked());
|
||||
}
|
||||
}
|
||||
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
qreal TorrentOptionsDialog::getRatio() const
|
||||
{
|
||||
if (m_ui->buttonGroup->checkedId() == -1) // No radio button is selected
|
||||
return MIXED_SHARE_LIMITS;
|
||||
|
||||
if (m_ui->radioUseGlobalShareLimits->isChecked())
|
||||
return BitTorrent::TorrentHandle::USE_GLOBAL_RATIO;
|
||||
|
||||
if (m_ui->radioNoLimit->isChecked() || !m_ui->checkMaxRatio->isChecked())
|
||||
return BitTorrent::TorrentHandle::NO_RATIO_LIMIT;
|
||||
|
||||
return m_ui->spinRatioLimit->value();
|
||||
}
|
||||
|
||||
int TorrentOptionsDialog::getSeedingTime() const
|
||||
{
|
||||
if (m_ui->buttonGroup->checkedId() == -1) // No radio button is selected
|
||||
return MIXED_SHARE_LIMITS;
|
||||
|
||||
if (m_ui->radioUseGlobalShareLimits->isChecked())
|
||||
return BitTorrent::TorrentHandle::USE_GLOBAL_SEEDING_TIME;
|
||||
|
||||
if (m_ui->radioNoLimit->isChecked() || !m_ui->checkMaxTime->isChecked())
|
||||
return BitTorrent::TorrentHandle::NO_SEEDING_TIME_LIMIT;
|
||||
|
||||
return m_ui->spinTimeLimit->value();
|
||||
}
|
||||
|
||||
void TorrentOptionsDialog::handleRatioTypeChanged()
|
||||
{
|
||||
m_ui->checkMaxRatio->setEnabled(m_ui->radioTorrentLimit->isChecked());
|
||||
m_ui->checkMaxTime->setEnabled(m_ui->radioTorrentLimit->isChecked());
|
||||
|
||||
m_ui->spinRatioLimit->setEnabled(m_ui->radioTorrentLimit->isChecked() && m_ui->checkMaxRatio->isChecked());
|
||||
m_ui->spinTimeLimit->setEnabled(m_ui->radioTorrentLimit->isChecked() && m_ui->checkMaxTime->isChecked());
|
||||
}
|
||||
|
||||
void TorrentOptionsDialog::handleUpSpeedLimitChanged()
|
||||
{
|
||||
m_ui->spinUploadLimit->setMinimum(0);
|
||||
m_ui->spinUploadLimit->setSpecialValueText(QString::fromUtf8(C_INFINITY));
|
||||
disconnect(m_ui->spinUploadLimit, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, &TorrentOptionsDialog::handleUpSpeedLimitChanged);
|
||||
}
|
||||
|
||||
void TorrentOptionsDialog::handleDownSpeedLimitChanged()
|
||||
{
|
||||
m_ui->spinDownloadLimit->setMinimum(0);
|
||||
m_ui->spinDownloadLimit->setSpecialValueText(QString::fromUtf8(C_INFINITY));
|
||||
disconnect(m_ui->spinDownloadLimit, qOverload<int>(&QSpinBox::valueChanged)
|
||||
, this, &TorrentOptionsDialog::handleDownSpeedLimitChanged);
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2011 Christian Kandeler
|
||||
* Copyright (C) 2011 Christophe Dumez <chris@qbittorrent.org>
|
||||
* Copyright (C) 2006 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
@ -30,33 +30,48 @@
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
namespace Ui
|
||||
namespace BitTorrent
|
||||
{
|
||||
class UpDownRatioDialog;
|
||||
class InfoHash;
|
||||
class TorrentHandle;
|
||||
}
|
||||
|
||||
class UpDownRatioDialog final : public QDialog
|
||||
namespace Ui
|
||||
{
|
||||
class TorrentOptionsDialog;
|
||||
}
|
||||
|
||||
class TorrentOptionsDialog final : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
UpDownRatioDialog(bool useDefault, qreal initialValue, qreal maxValue,
|
||||
int initialTimeValue, int maxTimeValue,
|
||||
QWidget *parent = nullptr);
|
||||
~UpDownRatioDialog();
|
||||
|
||||
bool useDefault() const;
|
||||
qreal ratio() const;
|
||||
int seedingTime() const;
|
||||
explicit TorrentOptionsDialog(QWidget *parent, const QVector<BitTorrent::TorrentHandle *> &torrents);
|
||||
~TorrentOptionsDialog() override;
|
||||
|
||||
public slots:
|
||||
void accept() override;
|
||||
|
||||
private slots:
|
||||
void handleUpSpeedLimitChanged();
|
||||
void handleDownSpeedLimitChanged();
|
||||
|
||||
void handleRatioTypeChanged();
|
||||
void enableRatioSpin();
|
||||
void enableTimeSpin();
|
||||
|
||||
private:
|
||||
Ui::UpDownRatioDialog *m_ui;
|
||||
qreal getRatio() const;
|
||||
int getSeedingTime() const;
|
||||
|
||||
QVector<BitTorrent::InfoHash> m_torrentHashes;
|
||||
Ui::TorrentOptionsDialog *m_ui;
|
||||
struct
|
||||
{
|
||||
qreal ratio;
|
||||
int seedingTime;
|
||||
int upSpeedLimit;
|
||||
int downSpeedLimit;
|
||||
Qt::CheckState disableDHT;
|
||||
Qt::CheckState disablePEX;
|
||||
Qt::CheckState disableLSD;
|
||||
} m_initialValues;
|
||||
};
|
278
src/gui/torrentoptionsdialog.ui
Normal file
278
src/gui/torrentoptionsdialog.ui
Normal file
@ -0,0 +1,278 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>TorrentOptionsDialog</class>
|
||||
<widget class="QDialog" name="TorrentOptionsDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>390</width>
|
||||
<height>450</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Torrent Options</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Torrent speed limits</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Download:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QSpinBox" name="spinDownloadLimit">
|
||||
<property name="specialValueText">
|
||||
<string>∞</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>2000000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QSpinBox" name="spinUploadLimit">
|
||||
<property name="specialValueText">
|
||||
<string>∞</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> KiB/s</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>2000000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1" colspan="2">
|
||||
<widget class="QLabel" name="labelWarning">
|
||||
<property name="text">
|
||||
<string>These will not exceed the global limits</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Upload:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSlider" name="sliderUploadLimit">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QSlider" name="sliderDownloadLimit">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Torrent share limits</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioUseGlobalShareLimits">
|
||||
<property name="text">
|
||||
<string>Use global share limit</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radioNoLimit">
|
||||
<property name="text">
|
||||
<string>Set no share limit</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QRadioButton" name="radioTorrentLimit">
|
||||
<property name="text">
|
||||
<string>Set share limit to</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="checkMaxTime">
|
||||
<property name="text">
|
||||
<string>minutes</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QDoubleSpinBox" name="spinRatioLimit">
|
||||
<property name="maximum">
|
||||
<double>9999.000000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.050000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>1.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QSpinBox" name="spinTimeLimit">
|
||||
<property name="maximum">
|
||||
<number>525600</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1440</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="checkMaxRatio">
|
||||
<property name="text">
|
||||
<string>ratio</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="checkDisableDHT">
|
||||
<property name="text">
|
||||
<string>Disable DHT for this torrent</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="checkDisablePEX">
|
||||
<property name="text">
|
||||
<string>Disable PeX for this torrent</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="checkDisableLSD">
|
||||
<property name="text">
|
||||
<string>Disable LSD for this torrent</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>TorrentOptionsDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>221</x>
|
||||
<y>73</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>221</x>
|
||||
<y>82</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>TorrentOptionsDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>277</x>
|
||||
<y>59</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>343</x>
|
||||
<y>80</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
<buttongroups>
|
||||
<buttongroup name="buttonGroup"/>
|
||||
</buttongroups>
|
||||
</ui>
|
@ -62,13 +62,13 @@
|
||||
#include "previewselectdialog.h"
|
||||
#include "speedlimitdialog.h"
|
||||
#include "torrentcategorydialog.h"
|
||||
#include "torrentoptionsdialog.h"
|
||||
#include "trackerentriesdialog.h"
|
||||
#include "transferlistdelegate.h"
|
||||
#include "transferlistmodel.h"
|
||||
#include "transferlistsortmodel.h"
|
||||
#include "tristateaction.h"
|
||||
#include "uithememanager.h"
|
||||
#include "updownratiodialog.h"
|
||||
#include "utils.h"
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
@ -551,102 +551,13 @@ void TransferListWidget::previewSelectedTorrents()
|
||||
}
|
||||
}
|
||||
|
||||
void TransferListWidget::setDlLimitSelectedTorrents()
|
||||
void TransferListWidget::setTorrentOptions()
|
||||
{
|
||||
QVector<BitTorrent::TorrentHandle *> torrentsList;
|
||||
for (BitTorrent::TorrentHandle *const torrent : asConst(getSelectedTorrents()))
|
||||
{
|
||||
if (torrent->isSeed())
|
||||
continue;
|
||||
torrentsList += torrent;
|
||||
}
|
||||
if (torrentsList.empty()) return;
|
||||
const QVector<BitTorrent::TorrentHandle *> selectedTorrents = getSelectedTorrents();
|
||||
if (selectedTorrents.empty()) return;
|
||||
|
||||
int oldLimit = torrentsList.first()->downloadLimit();
|
||||
for (BitTorrent::TorrentHandle *const torrent : asConst(torrentsList))
|
||||
{
|
||||
if (torrent->downloadLimit() != oldLimit)
|
||||
{
|
||||
oldLimit = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool ok = false;
|
||||
const long newLimit = SpeedLimitDialog::askSpeedLimit(
|
||||
this, &ok, tr("Torrent Download Speed Limiting"), oldLimit
|
||||
, BitTorrent::Session::instance()->globalDownloadSpeedLimit());
|
||||
if (!ok) return;
|
||||
|
||||
for (BitTorrent::TorrentHandle *const torrent : asConst(torrentsList))
|
||||
{
|
||||
qDebug("Applying download speed limit of %ld Kb/s to torrent %s", (newLimit / 1024l), qUtf8Printable(torrent->hash()));
|
||||
torrent->setDownloadLimit(newLimit);
|
||||
}
|
||||
}
|
||||
|
||||
void TransferListWidget::setUpLimitSelectedTorrents()
|
||||
{
|
||||
QVector<BitTorrent::TorrentHandle *> torrentsList = getSelectedTorrents();
|
||||
if (torrentsList.empty()) return;
|
||||
|
||||
int oldLimit = torrentsList.first()->uploadLimit();
|
||||
for (BitTorrent::TorrentHandle *const torrent : asConst(torrentsList))
|
||||
{
|
||||
if (torrent->uploadLimit() != oldLimit)
|
||||
{
|
||||
oldLimit = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool ok = false;
|
||||
const long newLimit = SpeedLimitDialog::askSpeedLimit(
|
||||
this, &ok, tr("Torrent Upload Speed Limiting"), oldLimit
|
||||
, BitTorrent::Session::instance()->globalUploadSpeedLimit());
|
||||
if (!ok) return;
|
||||
|
||||
for (BitTorrent::TorrentHandle *const torrent : asConst(torrentsList))
|
||||
{
|
||||
qDebug("Applying upload speed limit of %ld Kb/s to torrent %s", (newLimit / 1024l), qUtf8Printable(torrent->hash()));
|
||||
torrent->setUploadLimit(newLimit);
|
||||
}
|
||||
}
|
||||
|
||||
void TransferListWidget::setMaxRatioSelectedTorrents()
|
||||
{
|
||||
const QVector<BitTorrent::TorrentHandle *> torrents = getSelectedTorrents();
|
||||
if (torrents.isEmpty()) return;
|
||||
|
||||
qreal currentMaxRatio = BitTorrent::Session::instance()->globalMaxRatio();
|
||||
if (torrents.count() == 1)
|
||||
currentMaxRatio = torrents[0]->maxRatio();
|
||||
|
||||
int currentMaxSeedingTime = BitTorrent::Session::instance()->globalMaxSeedingMinutes();
|
||||
if (torrents.count() == 1)
|
||||
currentMaxSeedingTime = torrents[0]->maxSeedingTime();
|
||||
|
||||
bool useGlobalValue = true;
|
||||
if (torrents.count() == 1)
|
||||
useGlobalValue = (torrents[0]->ratioLimit() == BitTorrent::TorrentHandle::USE_GLOBAL_RATIO)
|
||||
&& (torrents[0]->seedingTimeLimit() == BitTorrent::TorrentHandle::USE_GLOBAL_SEEDING_TIME);
|
||||
|
||||
auto dialog = new UpDownRatioDialog(useGlobalValue, currentMaxRatio, BitTorrent::TorrentHandle::MAX_RATIO,
|
||||
currentMaxSeedingTime, BitTorrent::TorrentHandle::MAX_SEEDING_TIME, this);
|
||||
auto dialog = new TorrentOptionsDialog {this, selectedTorrents};
|
||||
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||
connect(dialog, &QDialog::accepted, this, [dialog, torrents]()
|
||||
{
|
||||
for (BitTorrent::TorrentHandle *const torrent : torrents)
|
||||
{
|
||||
const qreal ratio = (dialog->useDefault()
|
||||
? BitTorrent::TorrentHandle::USE_GLOBAL_RATIO : dialog->ratio());
|
||||
torrent->setRatioLimit(ratio);
|
||||
|
||||
const int seedingTime = (dialog->useDefault()
|
||||
? BitTorrent::TorrentHandle::USE_GLOBAL_SEEDING_TIME : dialog->seedingTime());
|
||||
torrent->setSeedingTimeLimit(seedingTime);
|
||||
}
|
||||
});
|
||||
dialog->open();
|
||||
}
|
||||
|
||||
@ -897,12 +808,8 @@ void TransferListWidget::displayListMenu(const QPoint &)
|
||||
connect(actionDelete, &QAction::triggered, this, &TransferListWidget::softDeleteSelectedTorrents);
|
||||
auto *actionPreviewFile = new QAction(UIThemeManager::instance()->getIcon("view-preview"), tr("Preview file..."), listMenu);
|
||||
connect(actionPreviewFile, &QAction::triggered, this, &TransferListWidget::previewSelectedTorrents);
|
||||
auto *actionSetMaxRatio = new QAction(UIThemeManager::instance()->getIcon(QLatin1String("ratio")), tr("Limit share ratio..."), listMenu);
|
||||
connect(actionSetMaxRatio, &QAction::triggered, this, &TransferListWidget::setMaxRatioSelectedTorrents);
|
||||
auto *actionSetUploadLimit = new QAction(UIThemeManager::instance()->getIcon("kt-set-max-upload-speed"), tr("Limit upload rate..."), listMenu);
|
||||
connect(actionSetUploadLimit, &QAction::triggered, this, &TransferListWidget::setUpLimitSelectedTorrents);
|
||||
auto *actionSetDownloadLimit = new QAction(UIThemeManager::instance()->getIcon("kt-set-max-download-speed"), tr("Limit download rate..."), listMenu);
|
||||
connect(actionSetDownloadLimit, &QAction::triggered, this, &TransferListWidget::setDlLimitSelectedTorrents);
|
||||
auto *actionTorrentOptions = new QAction(UIThemeManager::instance()->getIcon("configure"), tr("Torrent options..."), listMenu);
|
||||
connect(actionTorrentOptions, &QAction::triggered, this, &TransferListWidget::setTorrentOptions);
|
||||
auto *actionOpenDestinationFolder = new QAction(UIThemeManager::instance()->getIcon("inode-directory"), tr("Open destination folder"), listMenu);
|
||||
connect(actionOpenDestinationFolder, &QAction::triggered, this, &TransferListWidget::openSelectedTorrentsFolder);
|
||||
auto *actionIncreaseQueuePos = new QAction(UIThemeManager::instance()->getIcon("go-up"), tr("Move up", "i.e. move up in the queue"), listMenu);
|
||||
@ -1132,10 +1039,7 @@ void TransferListWidget::displayListMenu(const QPoint &)
|
||||
listMenu->addAction(actionAutoTMM);
|
||||
|
||||
listMenu->addSeparator();
|
||||
if (oneNotSeed)
|
||||
listMenu->addAction(actionSetDownloadLimit);
|
||||
listMenu->addAction(actionSetUploadLimit);
|
||||
listMenu->addAction(actionSetMaxRatio);
|
||||
listMenu->addAction(actionTorrentOptions);
|
||||
if (!oneNotSeed && oneHasMetadata)
|
||||
{
|
||||
actionSuperSeedingMode->setCheckState(allSameSuperSeeding
|
||||
|
@ -79,9 +79,7 @@ public slots:
|
||||
void openSelectedTorrentsFolder() const;
|
||||
void recheckSelectedTorrents();
|
||||
void reannounceSelectedTorrents();
|
||||
void setDlLimitSelectedTorrents();
|
||||
void setUpLimitSelectedTorrents();
|
||||
void setMaxRatioSelectedTorrents();
|
||||
void setTorrentOptions();
|
||||
void previewSelectedTorrents();
|
||||
void hideQueuePosColumn(bool hide);
|
||||
void displayDLHoSMenu(const QPoint&);
|
||||
|
@ -1,137 +0,0 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2011 Christian Kandeler
|
||||
* Copyright (C) 2011 Christophe Dumez <chris@qbittorrent.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* In addition, as a special exception, the copyright holders give permission to
|
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||
* and distribute the linked executables. You must obey the GNU General Public
|
||||
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*/
|
||||
|
||||
#include "updownratiodialog.h"
|
||||
|
||||
#include <QMessageBox>
|
||||
|
||||
#include "base/bittorrent/session.h"
|
||||
#include "ui_updownratiodialog.h"
|
||||
#include "utils.h"
|
||||
|
||||
UpDownRatioDialog::UpDownRatioDialog(bool useDefault, qreal initialRatioValue,
|
||||
qreal maxRatioValue, int initialTimeValue,
|
||||
int maxTimeValue, QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_ui(new Ui::UpDownRatioDialog)
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
if (useDefault)
|
||||
{
|
||||
m_ui->useDefaultButton->setChecked(true);
|
||||
}
|
||||
else if ((initialRatioValue == -1.) && (initialTimeValue == -1))
|
||||
{
|
||||
m_ui->noLimitButton->setChecked(true);
|
||||
initialRatioValue = BitTorrent::Session::instance()->globalMaxRatio();
|
||||
initialTimeValue = BitTorrent::Session::instance()->globalMaxSeedingMinutes();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ui->torrentLimitButton->setChecked(true);
|
||||
|
||||
if (initialRatioValue >= 0)
|
||||
m_ui->checkMaxRatio->setChecked(true);
|
||||
|
||||
if (initialTimeValue >= 0)
|
||||
m_ui->checkMaxTime->setChecked(true);
|
||||
}
|
||||
|
||||
m_ui->ratioSpinBox->setMinimum(0);
|
||||
m_ui->ratioSpinBox->setMaximum(maxRatioValue);
|
||||
m_ui->ratioSpinBox->setValue(initialRatioValue);
|
||||
|
||||
m_ui->timeSpinBox->setMinimum(0);
|
||||
m_ui->timeSpinBox->setMaximum(maxTimeValue);
|
||||
m_ui->timeSpinBox->setValue(initialTimeValue);
|
||||
|
||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
|
||||
connect(m_ui->buttonGroup, &QButtonGroup::idClicked
|
||||
, this, &UpDownRatioDialog::handleRatioTypeChanged);
|
||||
#else
|
||||
connect(m_ui->buttonGroup, qOverload<int>(&QButtonGroup::buttonClicked)
|
||||
, this, &UpDownRatioDialog::handleRatioTypeChanged);
|
||||
#endif
|
||||
connect(m_ui->checkMaxRatio, &QCheckBox::toggled, this, &UpDownRatioDialog::enableRatioSpin);
|
||||
connect(m_ui->checkMaxTime, &QCheckBox::toggled, this, &UpDownRatioDialog::enableTimeSpin);
|
||||
|
||||
handleRatioTypeChanged();
|
||||
|
||||
Utils::Gui::resize(this);
|
||||
}
|
||||
|
||||
void UpDownRatioDialog::accept()
|
||||
{
|
||||
if (m_ui->torrentLimitButton->isChecked() && !m_ui->checkMaxRatio->isChecked() && !m_ui->checkMaxTime->isChecked())
|
||||
QMessageBox::critical(this, tr("No share limit method selected"),
|
||||
tr("Please select a limit method first"));
|
||||
else
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
bool UpDownRatioDialog::useDefault() const
|
||||
{
|
||||
return m_ui->useDefaultButton->isChecked();
|
||||
}
|
||||
|
||||
qreal UpDownRatioDialog::ratio() const
|
||||
{
|
||||
return (m_ui->noLimitButton->isChecked() || !m_ui->checkMaxRatio->isChecked()) ? -1. : m_ui->ratioSpinBox->value();
|
||||
}
|
||||
|
||||
int UpDownRatioDialog::seedingTime() const
|
||||
{
|
||||
return (m_ui->noLimitButton->isChecked() || !m_ui->checkMaxTime->isChecked()) ? -1 : m_ui->timeSpinBox->value();
|
||||
}
|
||||
|
||||
void UpDownRatioDialog::handleRatioTypeChanged()
|
||||
{
|
||||
// ui->ratioSpinBox->setEnabled(ui->torrentLimitButton->isChecked());
|
||||
m_ui->checkMaxRatio->setEnabled(m_ui->torrentLimitButton->isChecked());
|
||||
m_ui->checkMaxTime->setEnabled(m_ui->torrentLimitButton->isChecked());
|
||||
|
||||
m_ui->ratioSpinBox->setEnabled(m_ui->torrentLimitButton->isChecked() && m_ui->checkMaxRatio->isChecked());
|
||||
m_ui->timeSpinBox->setEnabled(m_ui->torrentLimitButton->isChecked() && m_ui->checkMaxTime->isChecked());
|
||||
}
|
||||
|
||||
void UpDownRatioDialog::enableRatioSpin()
|
||||
{
|
||||
m_ui->ratioSpinBox->setEnabled(m_ui->checkMaxRatio->isChecked());
|
||||
}
|
||||
|
||||
void UpDownRatioDialog::enableTimeSpin()
|
||||
{
|
||||
m_ui->timeSpinBox->setEnabled(m_ui->checkMaxTime->isChecked());
|
||||
}
|
||||
|
||||
UpDownRatioDialog::~UpDownRatioDialog()
|
||||
{
|
||||
delete m_ui;
|
||||
}
|
@ -1,177 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>UpDownRatioDialog</class>
|
||||
<widget class="QDialog" name="UpDownRatioDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>399</width>
|
||||
<height>195</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Torrent Upload/Download Ratio Limiting</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="useDefaultButton">
|
||||
<property name="text">
|
||||
<string>Use global share limit</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string>buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="noLimitButton">
|
||||
<property name="text">
|
||||
<string>Set no share limit</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string>buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QRadioButton" name="torrentLimitButton">
|
||||
<property name="text">
|
||||
<string>Set share limit to</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string>buttonGroup</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QDoubleSpinBox" name="ratioSpinBox">
|
||||
<property name="maximum">
|
||||
<double>9998.000000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.050000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>1.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QDoubleSpinBox" name="timeSpinBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>525600.000000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>1.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>1440.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="checkMaxRatio">
|
||||
<property name="text">
|
||||
<string>ratio</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QCheckBox" name="checkMaxTime">
|
||||
<property name="text">
|
||||
<string>minutes</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>UpDownRatioDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>UpDownRatioDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
<buttongroups>
|
||||
<buttongroup name="shareButtonGroup"/>
|
||||
<buttongroup name="buttonGroup"/>
|
||||
</buttongroups>
|
||||
</ui>
|
Loading…
x
Reference in New Issue
Block a user