mirror of
https://github.com/d47081/qBittorrent.git
synced 2025-02-08 21:04:26 +00:00
Fix wrong GUI behavior in "Optional IP address to bind to" setting
Previously the address field got erroneously reset to "All addresses" when the network interface is down.
This commit is contained in:
parent
114c6d36d1
commit
4ce98d57dd
@ -249,23 +249,14 @@ void AdvancedSettings::saveAdvancedSettings() const
|
|||||||
pref->resolvePeerCountries(m_checkBoxResolveCountries.isChecked());
|
pref->resolvePeerCountries(m_checkBoxResolveCountries.isChecked());
|
||||||
pref->resolvePeerHostNames(m_checkBoxResolveHosts.isChecked());
|
pref->resolvePeerHostNames(m_checkBoxResolveHosts.isChecked());
|
||||||
// Network interface
|
// Network interface
|
||||||
if (m_comboBoxInterface.currentIndex() == 0)
|
session->setNetworkInterface(m_comboBoxInterface.currentData().toString());
|
||||||
{
|
session->setNetworkInterfaceName((m_comboBoxInterface.currentIndex() == 0)
|
||||||
// All interfaces (default)
|
? QString()
|
||||||
session->setNetworkInterface(QString());
|
: m_comboBoxInterface.currentText());
|
||||||
session->setNetworkInterfaceName(QString());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
session->setNetworkInterface(m_comboBoxInterface.itemData(m_comboBoxInterface.currentIndex()).toString());
|
|
||||||
session->setNetworkInterfaceName(m_comboBoxInterface.currentText());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Interface address
|
// Interface address
|
||||||
// Construct a QHostAddress to filter malformed strings
|
// Construct a QHostAddress to filter malformed strings
|
||||||
const QHostAddress ifaceAddr(m_comboBoxInterfaceAddress.currentData().toString().trimmed());
|
const QHostAddress ifaceAddr {m_comboBoxInterfaceAddress.currentData().toString()};
|
||||||
session->setNetworkInterfaceAddress(ifaceAddr.toString());
|
session->setNetworkInterfaceAddress(ifaceAddr.toString());
|
||||||
|
|
||||||
// Announce IP
|
// Announce IP
|
||||||
// Construct a QHostAddress to filter malformed strings
|
// Construct a QHostAddress to filter malformed strings
|
||||||
const QHostAddress addr(m_lineEditAnnounceIP.text().trimmed());
|
const QHostAddress addr(m_lineEditAnnounceIP.text().trimmed());
|
||||||
@ -335,45 +326,57 @@ void AdvancedSettings::updateSaveResumeDataIntervalSuffix(const int value)
|
|||||||
|
|
||||||
void AdvancedSettings::updateInterfaceAddressCombo()
|
void AdvancedSettings::updateInterfaceAddressCombo()
|
||||||
{
|
{
|
||||||
// Try to get the currently selected interface name
|
const auto toString = [](const QHostAddress &address) -> QString
|
||||||
const QString ifaceName = m_comboBoxInterface.itemData(m_comboBoxInterface.currentIndex()).toString(); // Empty string for the first element
|
|
||||||
const QString currentAddress = BitTorrent::Session::instance()->networkInterfaceAddress();
|
|
||||||
|
|
||||||
// Clear all items and reinsert them, default to all
|
|
||||||
m_comboBoxInterfaceAddress.clear();
|
|
||||||
m_comboBoxInterfaceAddress.addItem(tr("All addresses"), {});
|
|
||||||
m_comboBoxInterfaceAddress.addItem(tr("All IPv4 addresses"), u"0.0.0.0"_qs);
|
|
||||||
m_comboBoxInterfaceAddress.addItem(tr("All IPv6 addresses"), u"::"_qs);
|
|
||||||
|
|
||||||
const auto populateCombo = [this](const QHostAddress &addr)
|
|
||||||
{
|
{
|
||||||
if (addr.protocol() == QAbstractSocket::IPv4Protocol)
|
switch (address.protocol()) {
|
||||||
{
|
case QAbstractSocket::IPv4Protocol:
|
||||||
const QString str = addr.toString();
|
return address.toString();
|
||||||
m_comboBoxInterfaceAddress.addItem(str, str);
|
case QAbstractSocket::IPv6Protocol:
|
||||||
}
|
return Utils::Net::canonicalIPv6Addr(address).toString();
|
||||||
else if (addr.protocol() == QAbstractSocket::IPv6Protocol)
|
default:
|
||||||
{
|
Q_ASSERT(false);
|
||||||
const QString str = Utils::Net::canonicalIPv6Addr(addr).toString();
|
break;
|
||||||
m_comboBoxInterfaceAddress.addItem(str, str);
|
|
||||||
}
|
}
|
||||||
|
return {};
|
||||||
};
|
};
|
||||||
|
|
||||||
if (ifaceName.isEmpty())
|
// Clear all items and reinsert them
|
||||||
|
m_comboBoxInterfaceAddress.clear();
|
||||||
|
m_comboBoxInterfaceAddress.addItem(tr("All addresses"), QString());
|
||||||
|
m_comboBoxInterfaceAddress.addItem(tr("All IPv4 addresses"), QHostAddress(QHostAddress::AnyIPv4).toString());
|
||||||
|
m_comboBoxInterfaceAddress.addItem(tr("All IPv6 addresses"), QHostAddress(QHostAddress::AnyIPv6).toString());
|
||||||
|
|
||||||
|
const QString currentIface = m_comboBoxInterface.currentData().toString();
|
||||||
|
if (currentIface.isEmpty()) // `any` interface
|
||||||
{
|
{
|
||||||
for (const QHostAddress &addr : asConst(QNetworkInterface::allAddresses()))
|
for (const QHostAddress &address : asConst(QNetworkInterface::allAddresses()))
|
||||||
populateCombo(addr);
|
{
|
||||||
|
const QString addressString = toString(address);
|
||||||
|
m_comboBoxInterfaceAddress.addItem(addressString, addressString);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const QNetworkInterface iface = QNetworkInterface::interfaceFromName(ifaceName);
|
const QList<QNetworkAddressEntry> addresses = QNetworkInterface::interfaceFromName(currentIface).addressEntries();
|
||||||
const QList<QNetworkAddressEntry> addresses = iface.addressEntries();
|
|
||||||
for (const QNetworkAddressEntry &entry : addresses)
|
for (const QNetworkAddressEntry &entry : addresses)
|
||||||
populateCombo(entry.ip());
|
{
|
||||||
|
const QString addressString = toString(entry.ip());
|
||||||
|
m_comboBoxInterfaceAddress.addItem(addressString, addressString);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QString currentAddress = BitTorrent::Session::instance()->networkInterfaceAddress();
|
||||||
const int index = m_comboBoxInterfaceAddress.findData(currentAddress);
|
const int index = m_comboBoxInterfaceAddress.findData(currentAddress);
|
||||||
m_comboBoxInterfaceAddress.setCurrentIndex(std::max(index, 0));
|
if (index > -1)
|
||||||
|
{
|
||||||
|
m_comboBoxInterfaceAddress.setCurrentIndex(index);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// not found, for the sake of UI consistency, add such entry
|
||||||
|
m_comboBoxInterfaceAddress.addItem(currentAddress, currentAddress);
|
||||||
|
m_comboBoxInterfaceAddress.setCurrentIndex(m_comboBoxInterfaceAddress.count() - 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdvancedSettings::loadAdvancedSettings()
|
void AdvancedSettings::loadAdvancedSettings()
|
||||||
@ -627,26 +630,23 @@ void AdvancedSettings::loadAdvancedSettings()
|
|||||||
m_checkBoxResolveHosts.setChecked(pref->resolvePeerHostNames());
|
m_checkBoxResolveHosts.setChecked(pref->resolvePeerHostNames());
|
||||||
addRow(RESOLVE_HOSTS, tr("Resolve peer host names"), &m_checkBoxResolveHosts);
|
addRow(RESOLVE_HOSTS, tr("Resolve peer host names"), &m_checkBoxResolveHosts);
|
||||||
// Network interface
|
// Network interface
|
||||||
m_comboBoxInterface.addItem(tr("Any interface", "i.e. Any network interface"));
|
m_comboBoxInterface.addItem(tr("Any interface", "i.e. Any network interface"), QString());
|
||||||
const QString currentInterface = session->networkInterface();
|
|
||||||
bool interfaceExists = currentInterface.isEmpty();
|
|
||||||
int i = 1;
|
|
||||||
for (const QNetworkInterface &iface : asConst(QNetworkInterface::allInterfaces()))
|
for (const QNetworkInterface &iface : asConst(QNetworkInterface::allInterfaces()))
|
||||||
{
|
|
||||||
m_comboBoxInterface.addItem(iface.humanReadableName(), iface.name());
|
m_comboBoxInterface.addItem(iface.humanReadableName(), iface.name());
|
||||||
if (!currentInterface.isEmpty() && (iface.name() == currentInterface))
|
|
||||||
{
|
const QString currentInterface = session->networkInterface();
|
||||||
m_comboBoxInterface.setCurrentIndex(i);
|
const int ifaceIndex = m_comboBoxInterface.findData(currentInterface);
|
||||||
interfaceExists = true;
|
if (ifaceIndex > -1)
|
||||||
}
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
// Saved interface does not exist, show it anyway
|
|
||||||
if (!interfaceExists)
|
|
||||||
{
|
{
|
||||||
m_comboBoxInterface.addItem(session->networkInterfaceName(), currentInterface);
|
m_comboBoxInterface.setCurrentIndex(ifaceIndex);
|
||||||
m_comboBoxInterface.setCurrentIndex(i);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Saved interface does not exist, show it
|
||||||
|
m_comboBoxInterface.addItem(session->networkInterfaceName(), currentInterface);
|
||||||
|
m_comboBoxInterface.setCurrentIndex(m_comboBoxInterface.count() - 1);
|
||||||
|
}
|
||||||
|
|
||||||
connect(&m_comboBoxInterface, qOverload<int>(&QComboBox::currentIndexChanged)
|
connect(&m_comboBoxInterface, qOverload<int>(&QComboBox::currentIndexChanged)
|
||||||
, this, &AdvancedSettings::updateInterfaceAddressCombo);
|
, this, &AdvancedSettings::updateInterfaceAddressCombo);
|
||||||
addRow(NETWORK_IFACE, tr("Network interface"), &m_comboBoxInterface);
|
addRow(NETWORK_IFACE, tr("Network interface"), &m_comboBoxInterface);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user