X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fnetworkssettingspage.cpp;h=230263028130d90d32e582dab81f3a39c279bb9d;hp=0857a4e378416934e5c0baf08ba274e535c86538;hb=c7ce9cd32c8fbbdd2d93c20da78a98f32e5b938d;hpb=5c6804f291a63f978e328aeddcc8448e3443b45e diff --git a/src/qtui/settingspages/networkssettingspage.cpp b/src/qtui/settingspages/networkssettingspage.cpp index 0857a4e3..23026302 100644 --- a/src/qtui/settingspages/networkssettingspage.cpp +++ b/src/qtui/settingspages/networkssettingspage.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel IRC Team * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -25,17 +25,33 @@ #include "networkssettingspage.h" #include "client.h" +#include "iconloader.h" #include "identity.h" #include "network.h" +#include "settingspagedlg.h" +#include "util.h" +#include "settingspages/identitiessettingspage.h" NetworksSettingsPage::NetworksSettingsPage(QWidget *parent) : SettingsPage(tr("General"), tr("Networks"), parent) { ui.setupUi(this); + + // set up icons + ui.renameNetwork->setIcon(SmallIcon("edit-rename")); + ui.addNetwork->setIcon(SmallIcon("list-add")); + ui.deleteNetwork->setIcon(SmallIcon("edit-delete")); + ui.addServer->setIcon(SmallIcon("list-add")); + ui.deleteServer->setIcon(SmallIcon("edit-delete")); + ui.editServer->setIcon(SmallIcon("configure")); + ui.upServer->setIcon(SmallIcon("go-up")); + ui.downServer->setIcon(SmallIcon("go-down")); + ui.editIdentities->setIcon(SmallIcon("configure")); + _ignoreWidgetChanges = false; - connectedIcon = QIcon(":/22x22/actions/network-connect"); - connectingIcon = QIcon(":/22x22/actions/gear"); - disconnectedIcon = QIcon(":/22x22/actions/network-disconnect"); + connectedIcon = SmallIcon("network-connect"); + connectingIcon = SmallIcon("network-wired"); // FIXME network-connecting + disconnectedIcon = SmallIcon("network-disconnect"); foreach(int mib, QTextCodec::availableMibs()) { QByteArray codec = QTextCodec::codecForMib(mib)->name(); @@ -56,12 +72,12 @@ NetworksSettingsPage::NetworksSettingsPage(QWidget *parent) : SettingsPage(tr("G connect(Client::instance(), SIGNAL(identityRemoved(IdentityId)), this, SLOT(clientIdentityRemoved(IdentityId))); connect(ui.identityList, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged())); - connect(ui.randomServer, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); + //connect(ui.randomServer, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); connect(ui.performEdit, SIGNAL(textChanged()), this, SLOT(widgetHasChanged())); connect(ui.autoIdentify, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); connect(ui.autoIdentifyService, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); connect(ui.autoIdentifyPassword, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.useDefaultEncodings, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); + connect(ui.useCustomEncodings, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); connect(ui.sendEncoding, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged())); connect(ui.recvEncoding, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged())); connect(ui.serverEncoding, SIGNAL(currentIndexChanged(int)), this, SLOT(widgetHasChanged())); @@ -174,6 +190,7 @@ void NetworksSettingsPage::setWidgetStates() { ui.detailsBox->setEnabled(true); ui.renameNetwork->setEnabled(true); ui.deleteNetwork->setEnabled(true); + /* button disabled for now ui.connectNow->setEnabled(net); // && (Client::network(id)->connectionState() == Network::Initialized // || Client::network(id)->connectionState() == Network::Disconnected)); @@ -188,11 +205,11 @@ void NetworksSettingsPage::setWidgetStates() { } else { ui.connectNow->setIcon(QIcon()); ui.connectNow->setText(tr("Apply first!")); - } + } */ } else { ui.renameNetwork->setEnabled(false); ui.deleteNetwork->setEnabled(false); - ui.connectNow->setEnabled(false); + //ui.connectNow->setEnabled(false); ui.detailsBox->setEnabled(false); } // network details @@ -372,11 +389,14 @@ void NetworksSettingsPage::clientNetworkRemoved(NetworkId id) { } void NetworksSettingsPage::networkConnectionStateChanged(Network::ConnectionState state) { + Q_UNUSED(state); const Network *net = qobject_cast(sender()); if(!net) return; + /* if(net->networkId() == currentId) { ui.connectNow->setEnabled(state == Network::Initialized || state == Network::Disconnected); } + */ setItemState(net->networkId()); setWidgetStates(); } @@ -416,11 +436,14 @@ void NetworksSettingsPage::displayNetwork(NetworkId id) { NetworkInfo info = networkInfos[id]; ui.identityList->setCurrentIndex(ui.identityList->findData(info.identity.toInt())); ui.serverList->clear(); - foreach(QVariant v, info.serverList) { - ui.serverList->addItem(QString("%1:%2").arg(v.toMap()["Host"].toString()).arg(v.toMap()["Port"].toUInt())); + foreach(Network::Server server, info.serverList) { + QListWidgetItem *item = new QListWidgetItem(QString("%1:%2").arg(server.host).arg(server.port)); + if(server.useSsl) + item->setIcon(SmallIcon("document-encrypt")); + ui.serverList->addItem(item); } //setItemState(id); - ui.randomServer->setChecked(info.useRandomServer); + //ui.randomServer->setChecked(info.useRandomServer); ui.performEdit->setPlainText(info.perform.join("\n")); ui.autoIdentify->setChecked(info.useAutoIdentify); ui.autoIdentifyService->setText(info.autoIdentifyService); @@ -429,12 +452,12 @@ void NetworksSettingsPage::displayNetwork(NetworkId id) { 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.useDefaultEncodings->setChecked(true); + 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.useDefaultEncodings->setChecked(false); + ui.useCustomEncodings->setChecked(true); } ui.autoReconnect->setChecked(info.useAutoReconnect); ui.reconnectInterval->setValue(info.autoReconnectInterval); @@ -456,12 +479,12 @@ void NetworksSettingsPage::displayNetwork(NetworkId id) { void NetworksSettingsPage::saveToNetworkInfo(NetworkInfo &info) { info.identity = ui.identityList->itemData(ui.identityList->currentIndex()).toInt(); - info.useRandomServer = ui.randomServer->isChecked(); + //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(); - if(ui.useDefaultEncodings->isChecked()) { + if(!ui.useCustomEncodings->isChecked()) { info.codecForEncoding.clear(); info.codecForDecoding.clear(); info.codecForServer.clear(); @@ -496,7 +519,7 @@ void NetworksSettingsPage::on_networkList_itemSelectionChanged() { void NetworksSettingsPage::on_addNetwork_clicked() { QStringList existing; for(int i = 0; i < ui.networkList->count(); i++) existing << ui.networkList->item(i)->text(); - NetworkEditDlg dlg(QString(), existing, this); + NetworkAddDlg dlg(existing, this); if(dlg.exec() == QDialog::Accepted) { NetworkId id; for(id = 1; id <= networkInfos.count(); id++) { @@ -504,9 +527,11 @@ void NetworksSettingsPage::on_addNetwork_clicked() { if(!networkInfos.keys().contains(-id.toInt())) break; } id = -id.toInt(); - NetworkInfo info; + + NetworkInfo info = dlg.networkInfo(); + if(info.networkName.isEmpty()) + return; // sanity check info.networkId = id; - info.networkName = dlg.networkName(); info.identity = 1; // defaults @@ -557,6 +582,7 @@ void NetworksSettingsPage::on_renameNetwork_clicked() { } } +/* void NetworksSettingsPage::on_connectNow_clicked() { if(!ui.networkList->selectedItems().count()) return; NetworkId id = ui.networkList->selectedItems()[0]->data(Qt::UserRole).value(); @@ -565,6 +591,7 @@ void NetworksSettingsPage::on_connectNow_clicked() { if(net->connectionState() == Network::Disconnected) net->requestConnect(); else net->requestDisconnect(); } +*/ /*** Server list ***/ @@ -574,14 +601,13 @@ void NetworksSettingsPage::on_serverList_itemSelectionChanged() { void NetworksSettingsPage::on_addServer_clicked() { if(currentId == 0) return; - ServerEditDlg dlg(QVariantMap(), this); + ServerEditDlg dlg(Network::Server(), this); if(dlg.exec() == QDialog::Accepted) { networkInfos[currentId].serverList.append(dlg.serverData()); displayNetwork(currentId); ui.serverList->setCurrentRow(ui.serverList->count()-1); widgetHasChanged(); } - } void NetworksSettingsPage::on_editServer_clicked() { @@ -607,8 +633,8 @@ void NetworksSettingsPage::on_deleteServer_clicked() { void NetworksSettingsPage::on_upServer_clicked() { int cur = ui.serverList->currentRow(); - QVariant foo = networkInfos[currentId].serverList.takeAt(cur); - networkInfos[currentId].serverList.insert(cur-1, foo); + Network::Server server = networkInfos[currentId].serverList.takeAt(cur); + networkInfos[currentId].serverList.insert(cur-1, server); displayNetwork(currentId); ui.serverList->setCurrentRow(cur-1); widgetHasChanged(); @@ -616,13 +642,91 @@ void NetworksSettingsPage::on_upServer_clicked() { void NetworksSettingsPage::on_downServer_clicked() { int cur = ui.serverList->currentRow(); - QVariant foo = networkInfos[currentId].serverList.takeAt(cur); - networkInfos[currentId].serverList.insert(cur+1, foo); + Network::Server server = networkInfos[currentId].serverList.takeAt(cur); + networkInfos[currentId].serverList.insert(cur+1, server); displayNetwork(currentId); ui.serverList->setCurrentRow(cur+1); widgetHasChanged(); } +void NetworksSettingsPage::on_editIdentities_clicked() { + SettingsPageDlg dlg(new IdentitiesSettingsPage(this), this); + dlg.exec(); +} + +/************************************************************************** +* NetworkAddDlg +*************************************************************************/ + +NetworkAddDlg::NetworkAddDlg(const QStringList &exist, QWidget *parent) : QDialog(parent), existing(exist) { + ui.setupUi(this); + ui.useSSL->setIcon(SmallIcon("document-encrypt")); + + // read preset networks + networksFilePath = findDataFilePath("networks.ini"); + if(!networksFilePath.isEmpty()) { + QSettings s(networksFilePath, QSettings::IniFormat); + QStringList networks = s.childGroups(); + foreach(QString s, existing) + networks.removeAll(s); + if(!networks.isEmpty()) { + QMap sorted; + foreach(QString net, networks) + sorted[net.toLower()] = net; + ui.presetList->addItems(sorted.values()); + } + } + if(!ui.presetList->count()) { + ui.useManual->setChecked(true); + ui.usePreset->setEnabled(false); + } + connect(ui.networkName, SIGNAL(textChanged(const QString &)), SLOT(setButtonStates())); + connect(ui.serverAddress, SIGNAL(textChanged(const QString &)), SLOT(setButtonStates())); + setButtonStates(); +} + +NetworkInfo NetworkAddDlg::networkInfo() const { + NetworkInfo info; + + if(ui.useManual->isChecked()) { + info.networkName = ui.networkName->text().trimmed(); + info.serverList << Network::Server(ui.serverAddress->text().trimmed(), ui.port->value(), ui.serverPassword->text(), ui.useSSL->isChecked()); + } else { + info.networkName = ui.presetList->currentText(); + QSettings s(networksFilePath, QSettings::IniFormat); + s.beginGroup(info.networkName); + foreach(QString server, s.value("Servers").toStringList()) { + bool ssl = false; + QStringList splitserver = server.split(':', QString::SkipEmptyParts); + if(splitserver.count() != 2) { + qWarning() << "Invalid server entry in networks.conf:" << server; + continue; + } + if(splitserver[1].at(0) == '+') + ssl = true; + uint port = splitserver[1].toUInt(); + if(!port) { + qWarning() << "Invalid port entry in networks.conf:" << server; + continue; + } + info.serverList << Network::Server(splitserver[0].trimmed(), port, QString(), ssl); + } + } + + return info; +} + +void NetworkAddDlg::setButtonStates() { + bool ok = false; + if(ui.usePreset->isChecked() && ui.presetList->count()) + ok = true; + else if(ui.useManual->isChecked()) { + ok = !ui.networkName->text().trimmed().isEmpty() && !existing.contains(ui.networkName->text().trimmed()) + && !ui.serverAddress->text().isEmpty(); + } + ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok); +} + /************************************************************************** * NetworkEditDlg *************************************************************************/ @@ -638,40 +742,44 @@ NetworkEditDlg::NetworkEditDlg(const QString &old, const QStringList &exist, QWi } QString NetworkEditDlg::networkName() const { - return ui.networkEdit->text(); + return ui.networkEdit->text().trimmed(); } void NetworkEditDlg::on_networkEdit_textChanged(const QString &text) { - ui.buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty() || existing.contains(text)); + ui.buttonBox->button(QDialogButtonBox::Ok)->setDisabled(text.isEmpty() || existing.contains(text.trimmed())); } - /************************************************************************** * ServerEditDlg *************************************************************************/ - -ServerEditDlg::ServerEditDlg(const QVariant &_serverData, QWidget *parent) : QDialog(parent) { +ServerEditDlg::ServerEditDlg(const Network::Server &server, QWidget *parent) : QDialog(parent) { ui.setupUi(this); - QVariantMap serverData = _serverData.toMap(); - if(serverData.count()) { - ui.host->setText(serverData["Host"].toString()); - ui.port->setValue(serverData["Port"].toUInt()); - ui.password->setText(serverData["Password"].toString()); - ui.useSSL->setChecked(serverData["UseSSL"].toBool()); - } else { - ui.port->setValue(6667); - } + ui.useSSL->setIcon(SmallIcon("document-encrypt")); + ui.host->setText(server.host); + ui.port->setValue(server.port); + ui.password->setText(server.password); + ui.useSSL->setChecked(server.useSsl); + ui.sslVersion->setCurrentIndex(server.sslVersion); + ui.useProxy->setChecked(server.useProxy); + ui.proxyType->setCurrentIndex(server.proxyType == QNetworkProxy::Socks5Proxy ? 0 : 1); + ui.proxyHost->setText(server.proxyHost); + ui.proxyPort->setValue(server.proxyPort); + ui.proxyUsername->setText(server.proxyUser); + ui.proxyPassword->setText(server.proxyPass); on_host_textChanged(); } -QVariant ServerEditDlg::serverData() const { - QVariantMap _serverData; - _serverData["Host"] = ui.host->text().trimmed(); - _serverData["Port"] = ui.port->value(); - _serverData["Password"] = ui.password->text(); - _serverData["UseSSL"] = ui.useSSL->isChecked(); - return _serverData; +Network::Server ServerEditDlg::serverData() const { + Network::Server server(ui.host->text().trimmed(), ui.port->value(), ui.password->text(), ui.useSSL->isChecked()); + server.sslVersion = ui.sslVersion->currentIndex(); + server.useProxy = ui.useProxy->isChecked(); + server.proxyType = ui.proxyType->currentIndex() == 0 ? QNetworkProxy::Socks5Proxy : QNetworkProxy::HttpProxy; + server.proxyHost = ui.proxyHost->text(); + server.proxyPort = ui.proxyPort->value(); + server.proxyUser = ui.proxyUsername->text(); + server.proxyPass = ui.proxyPassword->text(); + return server; } void ServerEditDlg::on_host_textChanged() {