X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fmainwin.cpp;h=e134bc0bd1f2e85337acf9309a8d37566f344583;hp=9b49da10e13afc2246f8b4d66a3f57d5d41bfccb;hb=87fd2da996b379382b871eb2da0c40e5c46bbbef;hpb=278aef059d7652b2a4e1359d72bb4028524246d4 diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 9b49da10..e134bc0b 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -22,10 +22,13 @@ #include "aboutdlg.h" #include "chatwidget.h" #include "bufferview.h" -#include "chatline.h" -#include "chatline-old.h" +#include "bufferviewconfig.h" +#include "bufferviewfilter.h" +#include "bufferviewmanager.h" +#include "channellistdlg.h" #include "client.h" #include "clientbacklogmanager.h" +#include "coreinfodlg.h" #include "coreconnectdlg.h" #include "networkmodel.h" #include "buffermodel.h" @@ -35,16 +38,17 @@ #include "signalproxy.h" #include "topicwidget.h" #include "inputwidget.h" +#include "irclistmodel.h" #include "verticaldock.h" #include "uisettings.h" +#include "util.h" #include "qtuisettings.h" #include "jumpkeyhandler.h" -#include "uisettings.h" - #include "selectionmodelsynchronizer.h" #include "mappedselectionmodel.h" +#include "settingspages/aliasessettingspage.h" #include "settingspages/appearancesettingspage.h" #include "settingspages/bufferviewsettingspage.h" #include "settingspages/colorsettingspage.h" @@ -53,7 +57,7 @@ #include "settingspages/highlightsettingspage.h" #include "settingspages/identitiessettingspage.h" #include "settingspages/networkssettingspage.h" - +#include "settingspages/notificationssettingspage.h" #include "debugconsole.h" #include "global.h" @@ -62,28 +66,47 @@ MainWin::MainWin(QtUi *_gui, QWidget *parent) : QMainWindow(parent), gui(_gui), + coreLagLabel(new QLabel()), + sslLabel(new QLabel()), + _titleSetter(this), systray(new QSystemTrayIcon(this)), activeTrayIcon(":/icons/quassel-icon-active.png"), - inactiveTrayIcon(":/icons/quassel-icon.png"), + onlineTrayIcon(":/icons/quassel-icon.png"), + offlineTrayIcon(":/icons/quassel-icon-offline.png"), trayIconActive(false), timer(new QTimer(this)), + channelListDlg(new ChannelListDlg(this)), settingsDlg(new SettingsDlg(this)), debugConsole(new DebugConsole(this)) { + UiSettings uiSettings; + loadTranslation(uiSettings.value("Locale", QLocale::system()).value()); + + QString style = uiSettings.value("Style", QString("")).toString(); + if(style != "") { + QApplication::setStyle(style); + } + ui.setupUi(this); setWindowTitle("Quassel IRC"); - setWindowIcon(inactiveTrayIcon); + setWindowIcon(offlineTrayIcon); + qApp->setWindowIcon(offlineTrayIcon); + systray->setIcon(offlineTrayIcon); setWindowIconText("Quassel IRC"); statusBar()->showMessage(tr("Waiting for core...")); installEventFilter(new JumpKeyHandler(this)); - UiSettings uiSettings; - QString style = uiSettings.value("Style", QString("")).toString(); - if(style != "") { - QApplication::setStyle(style); - } +#ifdef HAVE_DBUS + desktopNotifications = new org::freedesktop::Notifications( + "org.freedesktop.Notifications", + "/org/freedesktop/Notifications", + QDBusConnection::sessionBus(), this); + notificationId = 0; + connect(desktopNotifications, SIGNAL(NotificationClosed(uint, uint)), this, SLOT(desktopNotificationClosed(uint, uint))); + connect(desktopNotifications, SIGNAL(ActionInvoked(uint, const QString&)), this, SLOT(desktopNotificationInvoked(uint, const QString&))); +#endif } void MainWin::init() { @@ -95,9 +118,10 @@ void MainWin::init() { Client::signalProxy()->attachSignal(this, SIGNAL(requestBacklog(BufferInfo, QVariant, QVariant))); + connect(QApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(saveLayout())); + connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), this, SLOT(clientNetworkCreated(NetworkId))); connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), this, SLOT(clientNetworkRemoved(NetworkId))); - //ui.bufferWidget->init(); show(); @@ -118,6 +142,7 @@ void MainWin::init() { setupTopicWidget(); setupChatMonitor(); setupInputWidget(); + setupStatusBar(); setupSystray(); setupSettingsDlg(); @@ -125,20 +150,19 @@ void MainWin::init() { // restore mainwin state restoreState(s.value("MainWinState").toByteArray()); - disconnectedFromCore(); // Disable menus and stuff + // restore locked state of docks + ui.actionLockDockPositions->setChecked(s.value("LockDocks", false).toBool()); + + + setDisconnectedState(); // Disable menus and stuff showCoreConnectionDlg(true); // autoconnect if appropriate // attach the BufferWidget to the BufferModel and the default selection ui.bufferWidget->setModel(Client::bufferModel()); ui.bufferWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); - - if(Global::SPUTDEV) { - //showSettingsDlg(); - //showAboutDlg(); - //showNetworkDlg(); - //exit(1); - } + _titleSetter.setModel(Client::bufferModel()); + _titleSetter.setSelectionModel(Client::bufferModel()->standardSelectionModel()); } MainWin::~MainWin() { @@ -151,49 +175,61 @@ MainWin::~MainWin() { void MainWin::setupMenus() { connect(ui.actionConnectCore, SIGNAL(triggered()), this, SLOT(showCoreConnectionDlg())); connect(ui.actionDisconnectCore, SIGNAL(triggered()), Client::instance(), SLOT(disconnectFromCore())); + connect(ui.actionCoreInfo, SIGNAL(triggered()), this, SLOT(showCoreInfoDlg())); connect(ui.actionQuit, SIGNAL(triggered()), QCoreApplication::instance(), SLOT(quit())); - //connect(ui.actionNetworkList, SIGNAL(triggered()), this, SLOT(showServerList())); connect(ui.actionSettingsDlg, SIGNAL(triggered()), this, SLOT(showSettingsDlg())); - connect(ui.actionDebug_Console, SIGNAL(triggered()), this, SLOT(showDebugConsole())); + // connect(ui.actionDebug_Console, SIGNAL(triggered()), this, SLOT(showDebugConsole())); connect(ui.actionAboutQuassel, SIGNAL(triggered()), this, SLOT(showAboutDlg())); connect(ui.actionAboutQt, SIGNAL(triggered()), QApplication::instance(), SLOT(aboutQt())); - - actionEditNetworks = new QAction(QIcon(":/22x22/actions/configure"), tr("Edit &Networks..."), this); - ui.menuNetworks->addAction(actionEditNetworks); - connect(actionEditNetworks, SIGNAL(triggered()), this, SLOT(showNetworkDlg())); } void MainWin::setupViews() { - BufferModel *model = Client::bufferModel(); - - addBufferView(tr("All Buffers"), model, BufferViewFilter::AllNets, QList()); - addBufferView(tr("All Channels"), model, BufferViewFilter::AllNets|BufferViewFilter::NoQueries|BufferViewFilter::NoServers, QList()); - addBufferView(tr("All Queries"), model, BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoServers, QList()); - addBufferView(tr("All Networks"), model, BufferViewFilter::AllNets|BufferViewFilter::NoChannels|BufferViewFilter::NoQueries, QList()); - addBufferView(tr("Full Custom"), model, BufferViewFilter::FullCustom, QList()); + addBufferView(); +} - ui.menuViews->addSeparator(); +void MainWin::addBufferView(int bufferViewConfigId) { + addBufferView(Client::bufferViewManager()->bufferViewConfig(bufferViewConfigId)); } -QDockWidget *MainWin::addBufferView(const QString &viewname, QAbstractItemModel *model, const BufferViewFilter::Modes &mode, const QList &nets) { - QDockWidget *dock = new QDockWidget(viewname, this); - dock->setObjectName(QString("ViewDock-" + viewname)); // should be unique for mainwindow state! - dock->setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea); +void MainWin::addBufferView(BufferViewConfig *config) { + BufferViewDock *dock; + if(config) + dock = new BufferViewDock(config, this); + else + dock = new BufferViewDock(this); //create the view and initialize it's filter BufferView *view = new BufferView(dock); + view->setFilteredModel(Client::bufferModel(), config); view->show(); - view->setFilteredModel(model, mode, nets); + + connect(&view->showChannelList, SIGNAL(triggered()), this, SLOT(showChannelList())); + Client::bufferModel()->synchronizeView(view); + dock->setWidget(view); dock->show(); addDockWidget(Qt::LeftDockWidgetArea, dock); + ui.menuBufferViews->addAction(dock->toggleViewAction()); - ui.menuViews->addAction(dock->toggleViewAction()); + _netViews.append(dock); +} + +void MainWin::removeBufferView(int bufferViewConfigId) { + QVariant actionData; + BufferViewDock *dock; + foreach(QAction *action, ui.menuBufferViews->actions()) { + actionData = action->data(); + if(!actionData.isValid()) + continue; - netViews.append(dock); - return dock; + dock = qobject_cast(action->parent()); + if(dock && actionData.toInt() == bufferViewConfigId) { + removeAction(action); + dock->deleteLater(); + } + } } void MainWin::setupSettingsDlg() { @@ -204,10 +240,30 @@ void MainWin::setupSettingsDlg() { //Category: Behaviour settingsDlg->registerSettingsPage(new GeneralSettingsPage(settingsDlg)); settingsDlg->registerSettingsPage(new HighlightSettingsPage(settingsDlg)); + settingsDlg->registerSettingsPage(new AliasesSettingsPage(settingsDlg)); + settingsDlg->registerSettingsPage(new NotificationsSettingsPage(settingsDlg)); //Category: General settingsDlg->registerSettingsPage(new IdentitiesSettingsPage(settingsDlg)); settingsDlg->registerSettingsPage(new NetworksSettingsPage(settingsDlg)); - // settingsDlg->registerSettingsPage(new BufferViewSettingsPage(settingsDlg)); + settingsDlg->registerSettingsPage(new BufferViewSettingsPage(settingsDlg)); +} + +void MainWin::on_actionEditNetworks_triggered() { + SettingsPageDlg dlg(new NetworksSettingsPage(this), this); + dlg.exec(); +} + +void MainWin::on_actionManageViews_triggered() { + SettingsPageDlg dlg(new BufferViewSettingsPage(this), this); + dlg.exec(); +} + +void MainWin::on_actionLockDockPositions_toggled(bool lock) { + QList docks = findChildren(); + foreach(VerticalDock *dock, docks) { + dock->showTitle(!lock); + } + QtUiSettings().setValue("LockDocks", lock); } void MainWin::setupNickWidget() { @@ -221,7 +277,8 @@ void MainWin::setupNickWidget() { addDockWidget(Qt::RightDockWidgetArea, nickDock); ui.menuViews->addAction(nickDock->toggleViewAction()); - connect(nickDock->toggleViewAction(), SIGNAL(triggered(bool)), nickListWidget, SLOT(showWidget(bool))); + // See NickListDock::NickListDock(); + // connect(nickDock->toggleViewAction(), SIGNAL(triggered(bool)), nickListWidget, SLOT(showWidget(bool))); // attach the NickListWidget to the BufferModel and the default selection nickListWidget->setModel(Client::bufferModel()); @@ -229,6 +286,7 @@ void MainWin::setupNickWidget() { } void MainWin::setupChatMonitor() { +#ifndef SPUTDEV VerticalDock *dock = new VerticalDock(tr("Chat Monitor"), this); dock->setObjectName("ChatMonitorDock"); @@ -247,6 +305,7 @@ void MainWin::setupChatMonitor() { addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical); ui.menuViews->addAction(dock->toggleViewAction()); +#endif /* SPUTDEV */ } void MainWin::setupInputWidget() { @@ -282,14 +341,40 @@ void MainWin::setupTopicWidget() { ui.menuViews->addAction(dock->toggleViewAction()); } +void MainWin::setupStatusBar() { + // Core Lag: + updateLagIndicator(0); + statusBar()->addPermanentWidget(coreLagLabel); + connect(Client::signalProxy(), SIGNAL(lagUpdated(int)), this, SLOT(updateLagIndicator(int))); + + // SSL indicator + connect(Client::instance(), SIGNAL(securedConnection()), this, SLOT(securedConnection())); + sslLabel->setPixmap(QPixmap()); + statusBar()->addPermanentWidget(sslLabel); + + ui.menuViews->addSeparator(); + QAction *showStatusbar = ui.menuViews->addAction(tr("Statusbar")); + showStatusbar->setCheckable(true); + + UiSettings uiSettings; + + bool enabled = uiSettings.value("ShowStatusBar", QVariant(true)).toBool(); + showStatusbar->setChecked(enabled); + enabled ? statusBar()->show() : statusBar()->hide(); + + connect(showStatusbar, SIGNAL(toggled(bool)), statusBar(), SLOT(setVisible(bool))); + connect(showStatusbar, SIGNAL(toggled(bool)), this, SLOT(saveStatusBarStatus(bool))); +} + +void MainWin::saveStatusBarStatus(bool enabled) { + UiSettings uiSettings; + uiSettings.setValue("ShowStatusBar", enabled); +} + void MainWin::setupSystray() { connect(timer, SIGNAL(timeout()), this, SLOT(makeTrayIconBlink())); connect(Client::instance(), SIGNAL(messageReceived(const Message &)), this, SLOT(receiveMessage(const Message &))); - systray->setIcon(inactiveTrayIcon); -// systray->setToolTip("left click to minimize the quassel client to tray"); -// systray->setToolTip(toolTip); - systrayMenu = new QMenu(this); systrayMenu->addAction(ui.actionAboutQuassel); systrayMenu->addSeparator(); @@ -333,33 +418,87 @@ void MainWin::changeTopic(const QString &topic) { } void MainWin::connectedToCore() { + Q_CHECK_PTR(Client::bufferViewManager()); + connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigAdded(int)), this, SLOT(addBufferView(int))); + connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigDeleted(int)), this, SLOT(removeBufferView(int))); + connect(Client::bufferViewManager(), SIGNAL(initDone()), this, SLOT(loadLayout())); + foreach(BufferInfo id, Client::allBufferInfos()) { Client::backlogManager()->requestBacklog(id.bufferId(), 500, -1); } + setConnectedState(); +} - ui.menuViews->setEnabled(true); +void MainWin::setConnectedState() { //ui.menuCore->setEnabled(true); ui.actionConnectCore->setEnabled(false); ui.actionDisconnectCore->setEnabled(true); - //ui.actionNetworkList->setEnabled(true); + ui.actionCoreInfo->setEnabled(true); + ui.menuViews->setEnabled(true); ui.bufferWidget->show(); statusBar()->showMessage(tr("Connected to core.")); + setWindowIcon(onlineTrayIcon); + qApp->setWindowIcon(onlineTrayIcon); + systray->setIcon(onlineTrayIcon); + if(sslLabel->width() == 0) + sslLabel->setPixmap(QPixmap::fromImage(QImage(":/16x16/status/no-ssl"))); +} + +void MainWin::loadLayout() { + QtUiSettings s; + int accountId = Client::currentCoreAccount().toInt(); + restoreState(s.value(QString("MainWinState-%1").arg(accountId)).toByteArray(), accountId); +} + +void MainWin::saveLayout() { + QtUiSettings s; + int accountId = Client::currentCoreAccount().toInt(); + if(accountId > 0) s.setValue(QString("MainWinState-%1").arg(accountId) , saveState(accountId)); +} + +void MainWin::updateLagIndicator(int lag) { + coreLagLabel->setText(QString("Core Lag: %1 msec").arg(lag)); +} + + +void MainWin::securedConnection() { + // todo: make status bar entry + sslLabel->setPixmap(QPixmap::fromImage(QImage(":/16x16/status/ssl"))); } void MainWin::disconnectedFromCore() { - ui.menuViews->setEnabled(false); + // save core specific layout and remove bufferviews; + saveLayout(); + QVariant actionData; + BufferViewDock *dock; + foreach(QAction *action, ui.menuBufferViews->actions()) { + actionData = action->data(); + if(!actionData.isValid()) + continue; + + dock = qobject_cast(action->parent()); + if(dock && actionData.toInt() != -1) { + removeAction(action); + dock->deleteLater(); + } + } + QtUiSettings s; + restoreState(s.value("MainWinState").toByteArray()); + setDisconnectedState(); +} + +void MainWin::setDisconnectedState() { //ui.menuCore->setEnabled(false); + ui.actionConnectCore->setEnabled(true); ui.actionDisconnectCore->setEnabled(false); - //ui.actionNetworkList->setEnabled(false); + ui.actionCoreInfo->setEnabled(false); + ui.menuViews->setEnabled(false); ui.bufferWidget->hide(); - ui.actionConnectCore->setEnabled(true); - // nickListWidget->reset(); statusBar()->showMessage(tr("Not connected to core.")); -} - -AbstractUiMsg *MainWin::layoutMsg(const Message &msg) { - if(Global::SPUTDEV) return new ChatLine(msg); - return new ChatLineOld(msg); + setWindowIcon(offlineTrayIcon); + qApp->setWindowIcon(offlineTrayIcon); + systray->setIcon(offlineTrayIcon); + sslLabel->setPixmap(QPixmap()); } void MainWin::showCoreConnectionDlg(bool autoConnect) { @@ -374,6 +513,21 @@ void MainWin::coreConnectionDlgFinished(int /*code*/) { //exit(1); } +void MainWin::showChannelList(NetworkId netId) { + if(!netId.isValid()) { + QAction *action = qobject_cast(sender()); + if(action) + netId = action->data().value(); + } + channelListDlg->setNetwork(netId); + channelListDlg->show(); +} + +void MainWin::showCoreInfoDlg() { + CoreInfoDlg dlg(this); + dlg.exec(); +} + void MainWin::showSettingsDlg() { settingsDlg->show(); } @@ -398,7 +552,7 @@ void MainWin::closeEvent(QCloseEvent *event) { } void MainWin::systrayActivated( QSystemTrayIcon::ActivationReason activationReason) { - if (activationReason == QSystemTrayIcon::Trigger) { + if(activationReason == QSystemTrayIcon::Trigger) { toggleVisibility(); } } @@ -406,11 +560,12 @@ void MainWin::systrayActivated( QSystemTrayIcon::ActivationReason activationReas void MainWin::toggleVisibility() { if(isHidden() /*|| !isActiveWindow()*/) { show(); - if(isMinimized()) - if (isMaximized()) + if(isMinimized()) { + if(isMaximized()) showMaximized(); else showNormal(); + } raise(); activateWindow(); @@ -445,12 +600,18 @@ void MainWin::receiveMessage(const Message &msg) { UiSettings uiSettings; - if(uiSettings.value("DisplayPopupMessages", QVariant(true)).toBool()) { +#ifndef SPUTDEV + bool displayBubble = uiSettings.value("NotificationBubble", QVariant(true)).toBool(); + bool displayDesktop = uiSettings.value("NotificationDesktop", QVariant(true)).toBool(); + if(displayBubble || displayDesktop) { // FIXME don't invoke style engine for this! - QString text = QtUi::style()->styleString(Message::mircToInternal(msg.text())).text; - displayTrayIconMessage(title, text); + QString text = QtUi::style()->styleString(Message::mircToInternal(msg.contents())).plainText; + if(displayBubble) displayTrayIconMessage(title, text); +# ifdef HAVE_DBUS + if(displayDesktop) sendDesktopNotification(title, text); +# endif } - +#endif if(uiSettings.value("AnimateTrayIcon", QVariant(true)).toBool()) { QApplication::alert(this); setTrayIconActivity(true); @@ -464,6 +625,60 @@ bool MainWin::event(QEvent *event) { return QMainWindow::event(event); } +#ifdef HAVE_DBUS + +/* +Using the notification-daemon from Freedesktop's Galago project +http://www.galago-project.org/specs/notification/0.9/x408.html#command-notify +*/ +void MainWin::sendDesktopNotification(const QString &title, const QString &message) { + QStringList actions; + QMap hints; + UiSettings uiSettings; + + hints["x"] = uiSettings.value("NotificationDesktopHintX", QVariant(0)).toInt(); // Standard hint: x location for the popup to show up + hints["y"] = uiSettings.value("NotificationDesktopHintY", QVariant(0)).toInt(); // Standard hint: y location for the popup to show up + + actions << "click" << "Click Me!"; + + QDBusReply reply = desktopNotifications->Notify( + "Quassel", // Application name + notificationId, // ID of previous notification to replace + "", // Icon to display + title, // Summary / Header of the message to display + QString("%1: %2:\n%3").arg(QTime::currentTime().toString()).arg(title).arg(message), // Body of the message to display + actions, // Actions from which the user may choose + hints, // Hints to the server displaying the message + uiSettings.value("NotificationDesktopTimeout", QVariant(5000)).toInt() // Timeout in milliseconds + ); + + if(!reply.isValid()) { + /* ERROR */ + // could also happen if no notification service runs, so... whatever :) + //qDebug() << "Error on sending notification..." << reply.error(); + return; + } + + notificationId = reply.value(); + + // qDebug() << "ID: " << notificationId << " Time: " << QTime::currentTime().toString(); +} + + +void MainWin::desktopNotificationClosed(uint id, uint reason) { + Q_UNUSED(id); Q_UNUSED(reason); + // qDebug() << "OID: " << notificationId << " ID: " << id << " Reason: " << reason << " Time: " << QTime::currentTime().toString(); + notificationId = 0; +} + + +void MainWin::desktopNotificationInvoked(uint id, const QString & action) { + Q_UNUSED(id); Q_UNUSED(action); + // qDebug() << "OID: " << notificationId << " ID: " << id << " Action: " << action << " Time: " << QTime::currentTime().toString(); +} + +#endif /* HAVE_DBUS */ + void MainWin::displayTrayIconMessage(const QString &title, const QString &message) { systray->showMessage(title, message); } @@ -474,13 +689,13 @@ void MainWin::setTrayIconActivity(bool active) { timer->start(500); } else { timer->stop(); - systray->setIcon(inactiveTrayIcon); + systray->setIcon(onlineTrayIcon); } } void MainWin::makeTrayIconBlink() { if(trayIconActive) { - systray->setIcon(inactiveTrayIcon); + systray->setIcon(onlineTrayIcon); trayIconActive = false; } else { systray->setIcon(activeTrayIcon); @@ -488,65 +703,58 @@ void MainWin::makeTrayIconBlink() { } } - -void MainWin::showNetworkDlg() { - SettingsPageDlg dlg(new NetworksSettingsPage(this), this); - dlg.exec(); -} - void MainWin::clientNetworkCreated(NetworkId id) { const Network *net = Client::network(id); QAction *act = new QAction(net->networkName(), this); + act->setObjectName(QString("NetworkAction-%1").arg(id.toInt())); act->setData(QVariant::fromValue(id)); connect(net, SIGNAL(updatedRemotely()), this, SLOT(clientNetworkUpdated())); connect(act, SIGNAL(triggered()), this, SLOT(connectOrDisconnectFromNet())); - bool inserted = false; - for(int i = 0; i < networkActions.count(); i++) { - if(net->networkName().localeAwareCompare(networkActions[i]->text()) < 0) { - networkActions.insert(i, act); - inserted = true; + + QAction *beforeAction = 0; + foreach(QAction *action, ui.menuNetworks->actions()) { + if(action->isSeparator()) { + beforeAction = action; + break; + } + if(net->networkName().localeAwareCompare(action->text()) < 0) { + beforeAction = action; break; } } - if(!inserted) networkActions.append(act); - ui.menuNetworks->clear(); // why the f*** isn't there a QMenu::insertAction()??? - foreach(QAction *a, networkActions) ui.menuNetworks->addAction(a); - ui.menuNetworks->addSeparator(); - ui.menuNetworks->addAction(actionEditNetworks); + Q_CHECK_PTR(beforeAction); + ui.menuNetworks->insertAction(beforeAction, act); } void MainWin::clientNetworkUpdated() { const Network *net = qobject_cast(sender()); - if(!net) return; - foreach(QAction *a, networkActions) { - if(a->data().value() == net->networkId()) { - a->setText(net->networkName()); - if(net->connectionState() == Network::Initialized) { - a->setIcon(QIcon(":/16x16/actions/network-connect")); - //a->setEnabled(true); - } else if(net->connectionState() == Network::Disconnected) { - a->setIcon(QIcon(":/16x16/actions/network-disconnect")); - //a->setEnabled(true); - } else { - a->setIcon(QIcon(":/16x16/actions/gear")); - //a->setEnabled(false); - } - return; - } + if(!net) + return; + + QAction *action = findChild(QString("NetworkAction-%1").arg(net->networkId().toInt())); + if(!action) + return; + + action->setText(net->networkName()); + + switch(net->connectionState()) { + case Network::Initialized: + action->setIcon(QIcon(":/16x16/actions/network-connect")); + break; + case Network::Disconnected: + action->setIcon(QIcon(":/16x16/actions/network-disconnect")); + break; + default: + action->setIcon(QIcon(":/16x16/actions/gear")); } } void MainWin::clientNetworkRemoved(NetworkId id) { - QList::iterator actionIter = networkActions.begin();; - QAction *action; - while(actionIter != networkActions.end()) { - action = *actionIter; - if(action->data().value() == id) { - action->deleteLater(); - actionIter = networkActions.erase(actionIter); - } else - actionIter++; - } + QAction *action = findChild(QString("NetworkAction-%1").arg(id.toInt())); + if(!action) + return; + + action->deleteLater(); } void MainWin::connectOrDisconnectFromNet() {