- }
-}
-
-void NetworksSettingsPage::clientIdentityUpdated() {
- const Identity *identity = qobject_cast<const Identity *>(sender());
- if(!identity) {
- qWarning() << "NetworksSettingsPage: Invalid identity to update!";
- return;
- }
- int row = ui.identityList->findData(identity->id().toInt());
- if(row < 0) {
- qWarning() << "NetworksSettingsPage: Invalid identity to update!";
- return;
- }
- if(ui.identityList->itemText(row) != identity->identityName()) {
- ui.identityList->setItemText(row, identity->identityName());
- }
-}
-
-void NetworksSettingsPage::clientIdentityRemoved(IdentityId id) {
- ui.identityList->removeItem(ui.identityList->findData(id.toInt()));
- foreach(NetworkInfo info, networkInfos.values()) {
- if(info.identity == id) info.identity = 1; // set to default
- }
- widgetHasChanged();
-}
-
-
-void NetworksSettingsPage::clientNetworkAdded(NetworkId id) {
- insertNetwork(id);
- connect(Client::network(id), SIGNAL(updatedRemotely()), this, SLOT(clientNetworkUpdated()));
-}
-
-void NetworksSettingsPage::clientNetworkUpdated() {
- const Network *net = qobject_cast<const Network *>(sender());
- if(!net) {
- qWarning() << "Update request for unknown network received!";
- return;
- }
- QListWidgetItem *item = networkItem(net->networkId());
- if(!item) return;
- item->setText(net->networkName());
- if(net->isConnected()) {
- item->setIcon(connectedIcon);
- } else {
- item->setIcon(disconnectedIcon);
- }
-}
-
-
-void NetworksSettingsPage::insertNetwork(NetworkId id) {
- NetworkInfo info = Client::network(id)->networkInfo();
- networkInfos[id] = info;
- QListWidgetItem *item = new QListWidgetItem(disconnectedIcon, info.networkName);
- item->setData(Qt::UserRole, QVariant::fromValue<NetworkId>(id));
- ui.networkList->addItem(item);
- if(Client::network(id)->isConnected()) {
- item->setIcon(connectedIcon);
- } else {
- item->setIcon(disconnectedIcon);
- }
- widgetHasChanged();
-}
-
-void NetworksSettingsPage::displayNetwork(NetworkId id, bool dontsave) {
- NetworkInfo info = networkInfos[id];
- ui.serverList->clear();
- foreach(QVariantMap v, info.serverList) {
- ui.serverList->addItem(QString("%1:%2").arg(v["Address"].toString()).arg(v["Port"].toUInt()));
- }
+}
+
+void NetworksSettingsPage::clientIdentityUpdated()
+{
+ const auto* identity = qobject_cast<const Identity*>(sender());
+ if (!identity) {
+ qWarning() << "NetworksSettingsPage: Invalid identity to update!";
+ return;
+ }
+ int row = ui.identityList->findData(identity->id().toInt());
+ if (row < 0) {
+ qWarning() << "NetworksSettingsPage: Invalid identity to update!";
+ return;
+ }
+ if (ui.identityList->itemText(row) != identity->identityName()) {
+ ui.identityList->setItemText(row, identity->identityName());
+ }
+}
+
+void NetworksSettingsPage::clientIdentityRemoved(IdentityId id)
+{
+ IdentityId defaultId = defaultIdentity();
+ if (currentId != 0)
+ saveToNetworkInfo(networkInfos[currentId]);
+ foreach (NetworkInfo info, networkInfos.values()) {
+ if (info.identity == id) {
+ if (info.networkId == currentId)
+ ui.identityList->setCurrentIndex(0);
+ info.identity = defaultId;
+ networkInfos[info.networkId] = info;
+ if (info.networkId > 0)
+ Client::updateNetwork(info);
+ }
+ }
+ ui.identityList->removeItem(ui.identityList->findData(id.toInt()));
+ widgetHasChanged();
+}
+
+QListWidgetItem* NetworksSettingsPage::networkItem(NetworkId id) const
+{
+ for (int i = 0; i < ui.networkList->count(); i++) {
+ QListWidgetItem* item = ui.networkList->item(i);
+ if (item->data(Qt::UserRole).value<NetworkId>() == id)
+ return item;
+ }
+ return nullptr;
+}
+
+void NetworksSettingsPage::clientNetworkAdded(NetworkId id)
+{
+ insertNetwork(id);
+ // connect(Client::network(id), &Network::updatedRemotely, this, &NetworksSettingsPage::clientNetworkUpdated);
+ connect(Client::network(id), &Network::configChanged, this, &NetworksSettingsPage::clientNetworkUpdated);
+
+ connect(Client::network(id), &Network::connectionStateSet, this, &NetworksSettingsPage::networkConnectionStateChanged);
+ connect(Client::network(id), &Network::connectionError, this, &NetworksSettingsPage::networkConnectionError);
+
+ // Handle capability changes in case a server dis/connects with the settings window open.
+ connect(Client::network(id), &Network::capAdded, this, &NetworksSettingsPage::clientNetworkCapsUpdated);
+ connect(Client::network(id), &Network::capRemoved, this, &NetworksSettingsPage::clientNetworkCapsUpdated);
+}
+
+void NetworksSettingsPage::clientNetworkUpdated()
+{
+ const auto* net = qobject_cast<const Network*>(sender());
+ if (!net) {
+ qWarning() << "Update request for unknown network received!";
+ return;
+ }
+ networkInfos[net->networkId()] = net->networkInfo();
+ setItemState(net->networkId());
+ if (net->networkId() == currentId)
+ displayNetwork(net->networkId());
+ setWidgetStates();
+ widgetHasChanged();
+}
+
+void NetworksSettingsPage::clientNetworkRemoved(NetworkId id)
+{
+ if (!networkInfos.contains(id))
+ return;
+ if (id == currentId)
+ displayNetwork(0);
+ NetworkInfo info = networkInfos.take(id);
+ QList<QListWidgetItem*> items = ui.networkList->findItems(info.networkName, Qt::MatchExactly);
+ foreach (QListWidgetItem* item, items) {
+ if (item->data(Qt::UserRole).value<NetworkId>() == id)
+ delete ui.networkList->takeItem(ui.networkList->row(item));
+ }
+ setWidgetStates();
+ widgetHasChanged();
+}
+
+void NetworksSettingsPage::networkConnectionStateChanged(Network::ConnectionState state)
+{
+ Q_UNUSED(state);
+ const auto* net = qobject_cast<const Network*>(sender());
+ if (!net)
+ return;
+ /*
+ if(net->networkId() == currentId) {
+ ui.connectNow->setEnabled(state == Network::Initialized || state == Network::Disconnected);
+ }
+ */
+ setItemState(net->networkId());
+ if (net->networkId() == currentId) {
+ // Network is currently shown. Update the capability-dependent UI in case capabilities have
+ // changed.
+ setNetworkCapStates(currentId);
+ }
+ setWidgetStates();
+}
+
+void NetworksSettingsPage::networkConnectionError(const QString&) {}
+
+QListWidgetItem* NetworksSettingsPage::insertNetwork(NetworkId id)
+{
+ NetworkInfo info = Client::network(id)->networkInfo();
+ networkInfos[id] = info;
+ return insertNetwork(info);
+}
+
+QListWidgetItem* NetworksSettingsPage::insertNetwork(const NetworkInfo& info)
+{
+ QListWidgetItem* item = nullptr;
+ QList<QListWidgetItem*> items = ui.networkList->findItems(info.networkName, Qt::MatchExactly);
+ if (!items.count())
+ item = new QListWidgetItem(disconnectedIcon, info.networkName, ui.networkList);
+ else {
+ // we overwrite an existing net if it a) has the same name and b) has a negative ID meaning we created it locally before
+ // -> then we can be sure that this is the core-side replacement for the net we created
+ foreach (QListWidgetItem* i, items) {
+ NetworkId id = i->data(Qt::UserRole).value<NetworkId>();
+ if (id < 0) {
+ item = i;
+ break;
+ }
+ }
+ if (!item)
+ item = new QListWidgetItem(disconnectedIcon, info.networkName, ui.networkList);
+ }
+ item->setData(Qt::UserRole, QVariant::fromValue(info.networkId));
+ setItemState(info.networkId, item);
+ widgetHasChanged();
+ return item;
+}
+
+// Called when selecting 'Configure' from the buffer list
+void NetworksSettingsPage::bufferList_Open(NetworkId netId)
+{
+ QListWidgetItem* item = networkItem(netId);
+ ui.networkList->setCurrentItem(item, QItemSelectionModel::SelectCurrent);
+}
+
+void NetworksSettingsPage::displayNetwork(NetworkId id)
+{
+ _ignoreWidgetChanges = true;
+ if (id != 0) {
+ NetworkInfo info = networkInfos[id];
+
+ // this is only needed when the core supports SASL EXTERNAL
+ if (Client::isCoreFeatureEnabled(Quassel::Feature::SaslExternal)) {
+ if (_cid) {
+ // Clean up existing CertIdentity
+ disconnect(_cid, &CertIdentity::sslSettingsUpdated, this, &NetworksSettingsPage::sslUpdated);
+ delete _cid;
+ _cid = nullptr;
+ }
+ auto *identity = Client::identity(info.identity);
+ if (identity) {
+ // Connect new CertIdentity
+ _cid = new CertIdentity(*identity, this);
+ _cid->enableEditSsl(true);
+ connect(_cid, &CertIdentity::sslSettingsUpdated, this, &NetworksSettingsPage::sslUpdated);
+ }
+ else {
+ qWarning() << "NetworksSettingsPage::displayNetwork can't find Identity for IdentityId:" << info.identity;
+ }
+ }
+
+ ui.identityList->setCurrentIndex(ui.identityList->findData(info.identity.toInt()));
+ ui.serverList->clear();
+ foreach (Network::Server server, info.serverList) {
+ QListWidgetItem* item = new QListWidgetItem(QString("%1:%2").arg(server.host).arg(server.port));
+ if (server.useSsl)
+ item->setIcon(icon::get("document-encrypt"));
+ ui.serverList->addItem(item);
+ }
+ // setItemState(id);
+ // ui.randomServer->setChecked(info.useRandomServer);
+ // Update the capability-dependent UI in case capabilities have changed.
+ setNetworkCapStates(id);
+ ui.performEdit->setPlainText(info.perform.join("\n"));
+ ui.autoIdentify->setChecked(info.useAutoIdentify);
+ ui.autoIdentifyService->setText(info.autoIdentifyService);
+ ui.autoIdentifyPassword->setText(info.autoIdentifyPassword);
+ ui.sasl->setChecked(info.useSasl);
+ ui.saslAccount->setText(info.saslAccount);
+ ui.saslPassword->setText(info.saslPassword);
+ if (info.codecForEncoding.isEmpty()) {
+ ui.sendEncoding->setCurrentIndex(ui.sendEncoding->findText(Network::defaultCodecForEncoding()));
+ ui.recvEncoding->setCurrentIndex(ui.recvEncoding->findText(Network::defaultCodecForDecoding()));
+ ui.serverEncoding->setCurrentIndex(ui.serverEncoding->findText(Network::defaultCodecForServer()));
+ ui.useCustomEncodings->setChecked(false);
+ }
+ else {
+ ui.sendEncoding->setCurrentIndex(ui.sendEncoding->findText(info.codecForEncoding));
+ ui.recvEncoding->setCurrentIndex(ui.recvEncoding->findText(info.codecForDecoding));
+ ui.serverEncoding->setCurrentIndex(ui.serverEncoding->findText(info.codecForServer));
+ ui.useCustomEncodings->setChecked(true);
+ }
+ ui.autoReconnect->setChecked(info.useAutoReconnect);
+ ui.reconnectInterval->setValue(info.autoReconnectInterval);
+ ui.reconnectRetries->setValue(info.autoReconnectRetries);
+ ui.unlimitedRetries->setChecked(info.unlimitedReconnectRetries);
+ ui.rejoinOnReconnect->setChecked(info.rejoinChannels);
+ // Custom rate limiting
+ ui.unlimitedMessageRate->setChecked(info.unlimitedMessageRate);
+ // Set 'ui.useCustomMessageRate' after 'ui.unlimitedMessageRate' so if the latter is
+ // disabled, 'ui.messageRateDelayFrame' will remain disabled.
+ ui.useCustomMessageRate->setChecked(info.useCustomMessageRate);
+ ui.messageRateBurstSize->setValue(info.messageRateBurstSize);
+ // Convert milliseconds (integer) into seconds (double)
+ ui.messageRateDelay->setValue(info.messageRateDelay / 1000.0f);
+ // Skipped IRCv3 capabilities
+ ui.enableCapServerTime->setChecked(!info.skipCaps.contains(IrcCap::SERVER_TIME));
+ }
+ else {
+ // just clear widgets
+ if (_cid) {
+ disconnect(_cid, &CertIdentity::sslSettingsUpdated, this, &NetworksSettingsPage::sslUpdated);
+ delete _cid;
+ }
+ ui.identityList->setCurrentIndex(-1);
+ ui.serverList->clear();
+ ui.performEdit->clear();
+ ui.autoIdentifyService->clear();
+ ui.autoIdentifyPassword->clear();
+ ui.saslAccount->clear();
+ ui.saslPassword->clear();
+ setWidgetStates();
+ }
+ _ignoreWidgetChanges = false;
+ currentId = id;
+}
+
+void NetworksSettingsPage::saveToNetworkInfo(NetworkInfo& info)
+{
+ info.identity = ui.identityList->itemData(ui.identityList->currentIndex()).toInt();
+ // info.useRandomServer = ui.randomServer->isChecked();
+ info.perform = ui.performEdit->toPlainText().split("\n");
+ info.useAutoIdentify = ui.autoIdentify->isChecked();
+ info.autoIdentifyService = ui.autoIdentifyService->text();
+ info.autoIdentifyPassword = ui.autoIdentifyPassword->text();
+ info.useSasl = ui.sasl->isChecked();
+ info.saslAccount = ui.saslAccount->text();
+ info.saslPassword = ui.saslPassword->text();
+ if (!ui.useCustomEncodings->isChecked()) {
+ info.codecForEncoding.clear();
+ info.codecForDecoding.clear();
+ info.codecForServer.clear();
+ }
+ else {
+ info.codecForEncoding = ui.sendEncoding->currentText().toLatin1();
+ info.codecForDecoding = ui.recvEncoding->currentText().toLatin1();
+ info.codecForServer = ui.serverEncoding->currentText().toLatin1();
+ }
+ info.useAutoReconnect = ui.autoReconnect->isChecked();
+ info.autoReconnectInterval = ui.reconnectInterval->value();
+ info.autoReconnectRetries = ui.reconnectRetries->value();
+ info.unlimitedReconnectRetries = ui.unlimitedRetries->isChecked();
+ info.rejoinChannels = ui.rejoinOnReconnect->isChecked();
+ // Custom rate limiting
+ info.useCustomMessageRate = ui.useCustomMessageRate->isChecked();
+ info.messageRateBurstSize = ui.messageRateBurstSize->value();
+ // Convert seconds (double) into milliseconds (integer)
+ info.messageRateDelay = static_cast<quint32>((ui.messageRateDelay->value() * 1000));
+ info.unlimitedMessageRate = ui.unlimitedMessageRate->isChecked();
+ // Skipped IRCv3 capabilities
+ if (ui.enableCapServerTime->isChecked()) {
+ // Capability enabled, remove it from the skip list
+ info.skipCaps.removeAll(IrcCap::SERVER_TIME);
+ } else if (!info.skipCaps.contains(IrcCap::SERVER_TIME)) {
+ // Capability disabled and not in the skip list, add it
+ info.skipCaps.append(IrcCap::SERVER_TIME);
+ }
+}
+
+void NetworksSettingsPage::clientNetworkCapsUpdated()
+{
+ // Grab the updated network
+ const auto* net = qobject_cast<const Network*>(sender());
+ if (!net) {
+ qWarning() << "Update request for unknown network received!";
+ return;
+ }
+ if (net->networkId() == currentId) {
+ // Network is currently shown. Update the capability-dependent UI in case capabilities have
+ // changed.
+ setNetworkCapStates(currentId);
+ }
+}