X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fnetworkssettingspage.cpp;h=2c182552c26d950384a95b6b00ece209628696ed;hp=205975f7529a340b8a5a4c71818b0dd97fa979a1;hb=c5cbe5eb77fce2ab954a98399a1450803108217b;hpb=23eed68958b7585552be04fab4e5871a781b7f38;ds=sidebyside diff --git a/src/qtui/settingspages/networkssettingspage.cpp b/src/qtui/settingspages/networkssettingspage.cpp index 205975f7..2c182552 100644 --- a/src/qtui/settingspages/networkssettingspage.cpp +++ b/src/qtui/settingspages/networkssettingspage.cpp @@ -18,11 +18,36 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include + #include "networkssettingspage.h" +#include "client.h" +#include "identity.h" +#include "network.h" + + NetworksSettingsPage::NetworksSettingsPage(QWidget *parent) : SettingsPage(tr("General"), tr("Networks"), parent) { ui.setupUi(this); + connectedIcon = QIcon(":/22x22/actions/network-connect"); + disconnectedIcon = QIcon(":/22x22/actions/network-disconnect"); + + currentId = 0; + setEnabled(false); // need a core connection! + setWidgetStates(); + connect(Client::instance(), SIGNAL(coreConnectionStateChanged(bool)), this, SLOT(coreConnectionStateChanged(bool))); + connect(Client::instance(), SIGNAL(networkAdded(NetworkId)), this, SLOT(clientNetworkAdded(NetworkId))); + connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), this, SLOT(clientNetworkRemoved(NetworkId))); + connect(Client::instance(), SIGNAL(identityCreated(IdentityId)), this, SLOT(clientIdentityAdded(IdentityId))); + connect(Client::instance(), SIGNAL(identityRemoved(IdentityId)), this, SLOT(clientIdentityRemoved(IdentityId))); + + //connect(ui.networkList, SIGNAL(itemSelectionChanged()), this, SLOT(setWidgetStates())); + //connect(ui.serverList, SIGNAL(itemSelectionChanged()), this, SLOT(setWidgetStates())); + + foreach(IdentityId id, Client::identityIds()) { + clientIdentityAdded(id); + } } void NetworksSettingsPage::save() { @@ -31,6 +56,199 @@ void NetworksSettingsPage::save() { } void NetworksSettingsPage::load() { + reset(); + foreach(NetworkId netid, Client::networkIds()) { + clientNetworkAdded(netid); + } + ui.networkList->setCurrentRow(0); + changeState(false); +} + +void NetworksSettingsPage::reset() { + currentId = 0; + ui.networkList->clear(); + networkInfos.clear(); + + /* + foreach(Identity *identity, identities.values()) { + identity->deleteLater(); + } + identities.clear(); + deletedIdentities.clear(); + changedIdentities.clear(); + ui.identityList->clear(); + */ +} + +void NetworksSettingsPage::widgetHasChanged() { + bool changed = testHasChanged(); + if(changed != hasChanged()) changeState(changed); +} +bool NetworksSettingsPage::testHasChanged() { + return false; } + +void NetworksSettingsPage::setWidgetStates() { + // network list + if(ui.networkList->selectedItems().count()) { + NetworkId id = ui.networkList->selectedItems()[0]->data(Qt::UserRole).value(); + ui.detailsBox->setEnabled(true); + ui.renameNetwork->setEnabled(true); + ui.deleteNetwork->setEnabled(true); + ui.connectNow->setEnabled(true); + if(Client::network(id)->isConnected()) { + ui.connectNow->setIcon(disconnectedIcon); + ui.connectNow->setText(tr("Disconnect")); + } else { + ui.connectNow->setIcon(connectedIcon); + ui.connectNow->setText(tr("Connect")); + } + } else { + ui.renameNetwork->setEnabled(false); + ui.deleteNetwork->setEnabled(false); + ui.connectNow->setEnabled(false); + ui.detailsBox->setEnabled(false); + } + // network details + if(ui.serverList->selectedItems().count()) { + ui.editServer->setEnabled(true); + ui.deleteServer->setEnabled(true); + ui.upServer->setEnabled(ui.serverList->currentRow() > 0); + ui.downServer->setEnabled(ui.serverList->currentRow() < ui.serverList->count() - 1); + } else { + ui.editServer->setEnabled(false); + ui.deleteServer->setEnabled(false); + ui.upServer->setEnabled(false); + ui.downServer->setEnabled(false); + } +} + +void NetworksSettingsPage::coreConnectionStateChanged(bool state) { + this->setEnabled(state); + if(state) { + load(); + } else { + // reset + //currentId = 0; + } +} + +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() == id) return item; + } + return 0; +} + +void NetworksSettingsPage::clientIdentityAdded(IdentityId id) { + const Identity * identity = Client::identity(id); + connect(identity, SIGNAL(updatedRemotely()), this, SLOT(clientIdentityUpdated())); + + if(id == 1) { + // default identity is always the first one! + ui.identityList->insertItem(0, identity->identityName(), id.toInt()); + } else { + QString name = identity->identityName(); + for(int j = 0; j < ui.identityList->count(); j++) { + if((j>0 || ui.identityList->itemData(0).toInt() != 1) && name.localeAwareCompare(ui.identityList->itemText(j)) < 0) { + ui.identityList->insertItem(j, name, id.toInt()); + widgetHasChanged(); + return; + } + } + // append + ui.identityList->insertItem(ui.identityList->count(), name, id.toInt()); + widgetHasChanged(); + } +} + +void NetworksSettingsPage::clientIdentityUpdated() { + const Identity *identity = qobject_cast(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(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(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())); + } + +} + +/*** Network list ***/ + +void NetworksSettingsPage::on_networkList_itemSelectionChanged() { + if(ui.networkList->selectedItems().count()) { + NetworkId id = ui.networkList->selectedItems()[0]->data(Qt::UserRole).value(); + displayNetwork(id); + } + setWidgetStates(); +} + + + + + + + +