From: Manuel Nickschas Date: Thu, 5 Feb 2009 18:26:50 +0000 (+0100) Subject: Add ToolBarActionProvider as another specialization of NetworkModelController X-Git-Tag: 0.4.0~126 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=429b13a0af3acc0599ceb560fef61feee93b068e Add ToolBarActionProvider as another specialization of NetworkModelController As toolbar actions need to be handled very differently from context menu actions, we use another provider for them. This is supposed to keep track of MainWin's state and enable actions as appropriate. In this first version, most actions are still not functional, as the whole state-keeping thing hasn't been implemented yet ;-) --- diff --git a/src/qtui/qtui.cpp b/src/qtui/qtui.cpp index d8d808f9..c1ed4aa0 100644 --- a/src/qtui/qtui.cpp +++ b/src/qtui/qtui.cpp @@ -28,6 +28,7 @@ #include "qtuimessageprocessor.h" #include "qtuisettings.h" #include "qtuistyle.h" +#include "toolbaractionprovider.h" #include "types.h" #include "util.h" @@ -46,6 +47,7 @@ QtUi::QtUi() : GraphicalUi() { _instance = this; setContextMenuActionProvider(new ContextMenuActionProvider(this)); + setToolBarActionProvider(new ToolBarActionProvider(this)); QtUiSettings uiSettings; Quassel::loadTranslation(uiSettings.value("Locale", QLocale::system()).value()); diff --git a/src/uisupport/CMakeLists.txt b/src/uisupport/CMakeLists.txt index 56abf4d2..d3da1e1f 100644 --- a/src/uisupport/CMakeLists.txt +++ b/src/uisupport/CMakeLists.txt @@ -24,7 +24,7 @@ set(SOURCES nickviewfilter.cpp settingspage.cpp tabcompleter.cpp - #toolbaractionprovider.cpp + toolbaractionprovider.cpp uisettings.cpp uistyle.cpp ) @@ -49,13 +49,14 @@ set(MOC_HDRS nickviewfilter.h settingspage.h tabcompleter.h - #toolbaractionprovider.h + toolbaractionprovider.h ) set(HEADERS icon.h uisettings.h - uistyle.h) + uistyle.h + ) if(HAVE_KDE) set(SOURCES ${SOURCES} kcmdlinewrapper.cpp) diff --git a/src/uisupport/graphicalui.cpp b/src/uisupport/graphicalui.cpp index db526869..796eb214 100644 --- a/src/uisupport/graphicalui.cpp +++ b/src/uisupport/graphicalui.cpp @@ -23,6 +23,7 @@ #include "contextmenuactionprovider.h" ContextMenuActionProvider *GraphicalUi::_contextMenuActionProvider = 0; +ToolBarActionProvider *GraphicalUi::_toolBarActionProvider = 0; GraphicalUi::GraphicalUi(QObject *parent) : AbstractUi(parent) { @@ -31,3 +32,7 @@ GraphicalUi::GraphicalUi(QObject *parent) : AbstractUi(parent) { void GraphicalUi::setContextMenuActionProvider(ContextMenuActionProvider *provider) { _contextMenuActionProvider = provider; } + +void GraphicalUi::setToolBarActionProvider(ToolBarActionProvider *provider) { + _toolBarActionProvider = provider; +} diff --git a/src/uisupport/graphicalui.h b/src/uisupport/graphicalui.h index 55dfd069..b4f8669f 100644 --- a/src/uisupport/graphicalui.h +++ b/src/uisupport/graphicalui.h @@ -24,6 +24,7 @@ #include "abstractui.h" class ContextMenuActionProvider; +class ToolBarActionProvider; class GraphicalUi : public AbstractUi { Q_OBJECT @@ -32,12 +33,15 @@ public: GraphicalUi(QObject *parent = 0); inline static ContextMenuActionProvider *contextMenuActionProvider(); + inline static ToolBarActionProvider *toolBarActionProvider(); protected: void setContextMenuActionProvider(ContextMenuActionProvider *); + void setToolBarActionProvider(ToolBarActionProvider *); private: static ContextMenuActionProvider *_contextMenuActionProvider; + static ToolBarActionProvider *_toolBarActionProvider; }; @@ -45,4 +49,8 @@ ContextMenuActionProvider *GraphicalUi::contextMenuActionProvider() { return _contextMenuActionProvider; } +ToolBarActionProvider *GraphicalUi::toolBarActionProvider() { + return _toolBarActionProvider; +} + #endif diff --git a/src/uisupport/toolbaractionprovider.cpp b/src/uisupport/toolbaractionprovider.cpp new file mode 100644 index 00000000..72d9e5e6 --- /dev/null +++ b/src/uisupport/toolbaractionprovider.cpp @@ -0,0 +1,158 @@ +/*************************************************************************** + * Copyright (C) 2005-09 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#include +#include + +#include "toolbaractionprovider.h" + +#include "iconloader.h" + +ToolBarActionProvider::ToolBarActionProvider(QObject *parent) +: NetworkModelController(parent) +{ + registerAction(NetworkConnectAll, MainBarIcon("network-connect"), tr("Connect"))->setToolTip(tr("Connect to IRC")); + registerAction(NetworkDisconnectAll, MainBarIcon("network-disconnect"), tr("Disconnect"))->setToolTip(tr("Disconnect from IRC")); + + registerAction(BufferPart, MainBarIcon("irc-close-channel"), tr("Part"))->setToolTip(tr("Leave currently selected channel")); + registerAction(JoinChannel, MainBarIcon("irc-join-channel"), tr("Join"))->setToolTip(tr("Join a channel")); + + registerAction(NickQuery, MainBarIcon("mail-message-new"), tr("Query"))->setToolTip(tr("Start a private conversation")); // fix icon + registerAction(NickWhois, MainBarIcon("im-user"), tr("Whois"))->setToolTip(tr("Request user information")); // fix icon + + registerAction(NickOp, MainBarIcon("irc-operator"), tr("Op"))->setToolTip(tr("Give operator privileges to user")); + registerAction(NickDeop, MainBarIcon("irc-remove-operator"), tr("Deop"))->setToolTip(tr("Take operator privileges from user")); + registerAction(NickVoice, MainBarIcon("irc-voice"), tr("Voice"))->setToolTip(tr("Give voice to user")); + registerAction(NickDevoice, MainBarIcon("irc-unvoice"), tr("Devoice"))->setToolTip(tr("Take voice from user")); + registerAction(NickKick, MainBarIcon("im-kick-user"), tr("Kick"))->setToolTip(tr("Remove user from channel")); + registerAction(NickBan, MainBarIcon("im-ban-user"), tr("Ban"))->setToolTip(tr("Ban user from channel")); + registerAction(NickKickBan, MainBarIcon("im-ban-kick-user"), tr("Kick/Ban"))->setToolTip(tr("Remove and ban user from channel")); + + //registerAction(ShowChannelList, SmallIcon("format-list-unordered"), tr("Show Channel List")); + //registerAction(ShowIgnoreList, tr("Show Ignore List")); + + _networksConnectMenu = new QMenu(); + _networksConnectMenu->setSeparatorsCollapsible(false); + _networksConnectMenu->addSeparator(); + _networksConnectMenu->addAction(tr("Connect to all")); + action(NetworkConnectAll)->setMenu(_networksConnectMenu); + action(NetworkConnectAll)->setEnabled(false); + + _networksDisconnectMenu = new QMenu(); + _networksDisconnectMenu->setSeparatorsCollapsible(false); + _networksDisconnectMenu->addSeparator(); + _networksDisconnectMenu->addAction(tr("Disconnect from all")); + action(NetworkDisconnectAll)->setMenu(_networksDisconnectMenu); + action(NetworkDisconnectAll)->setEnabled(false); + + connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(networkCreated(NetworkId))); + connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(networkRemoved(NetworkId))); +} + +ToolBarActionProvider::~ToolBarActionProvider() { + +} + +void ToolBarActionProvider::addActions(QToolBar *bar, ToolBarType type) { + switch(type) { + case NetworkToolBar: + bar->addAction(action(NetworkConnectAll)); + bar->addAction(action(NetworkDisconnectAll)); + bar->addAction(action(JoinChannel)); + bar->addAction(action(BufferPart)); + break; + case NickToolBar: + bar->addAction(action(NickQuery)); + bar->addAction(action(NickWhois)); + bar->addSeparator(); + bar->addAction(action(NickOp)); + bar->addAction(action(NickDeop)); + bar->addAction(action(NickVoice)); + bar->addAction(action(NickDevoice)); + bar->addAction(action(NickKick)); + bar->addAction(action(NickBan)); + bar->addAction(action(NickKickBan)); + break; + default: + return; + } +} + +void ToolBarActionProvider::networkCreated(NetworkId id) { + const Network *net = Client::network(id); + Action *act = new Action(net->networkName(), this); + _networkActions[id] = act; + act->setObjectName(QString("NetworkAction-%1").arg(id.toInt())); + act->setData(QVariant::fromValue(id)); + connect(net, SIGNAL(updatedRemotely()), SLOT(networkUpdated())); + connect(act, SIGNAL(triggered()), SLOT(connectOrDisconnectNet())); + networkUpdated(net); +} + +void ToolBarActionProvider::networkRemoved(NetworkId id) { + Action *act = _networkActions.take(id); + if(act) + act->deleteLater(); +} + +void ToolBarActionProvider::networkUpdated(const Network *net) { + if(!net) + net = qobject_cast(sender()); + if(!net) + return; + Action *act = _networkActions.value(net->networkId()); + if(!act) + return; + + _networksConnectMenu->removeAction(act); + _networksDisconnectMenu->removeAction(act); + + QMenu *newMenu = net->connectionState() != Network::Disconnected ? _networksDisconnectMenu : _networksConnectMenu; + act->setText(net->networkName()); + + const int lastidx = newMenu->actions().count() - 2; + QAction *beforeAction = newMenu->actions().at(lastidx); + for(int i = 0; i < newMenu->actions().count() - 2; i++) { + QAction *action = newMenu->actions().at(i); + if(net->networkName().localeAwareCompare(action->text()) < 0) { + beforeAction = action; + break; + } + } + newMenu->insertAction(beforeAction, act); + + action(NetworkConnectAll)->setEnabled(_networksConnectMenu->actions().count() > 2); + action(NetworkDisconnectAll)->setEnabled(_networksDisconnectMenu->actions().count() > 2); + action(JoinChannel)->setEnabled(_networksDisconnectMenu->actions().count() > 2); +} + +void ToolBarActionProvider::connectOrDisconnectNet() { + QAction *act = qobject_cast(sender()); + if(!act) + return; + const Network *net = Client::network(act->data().value()); + if(!net) + return; + + if(net->connectionState() == Network::Disconnected) net->requestConnect(); + else net->requestDisconnect(); +} + +//void ToolBarActionProvider:: diff --git a/src/uisupport/toolbaractionprovider.h b/src/uisupport/toolbaractionprovider.h new file mode 100644 index 00000000..59661d02 --- /dev/null +++ b/src/uisupport/toolbaractionprovider.h @@ -0,0 +1,57 @@ +/*************************************************************************** + * Copyright (C) 2005-09 by the Quassel Project * + * devel@quassel-irc.org * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) version 3. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ + +#ifndef TOOLBARACTIONPROVIDER_H_ +#define TOOLBARACTIONPROVIDER_H_ + +#include "networkmodelcontroller.h" + +class QToolBar; + +class ToolBarActionProvider : public NetworkModelController { + Q_OBJECT + +public: + ToolBarActionProvider(QObject *parent = 0); + virtual ~ToolBarActionProvider(); + + enum ToolBarType { + NetworkToolBar, + ChatViewToolBar, + NickToolBar + }; + + void addActions(QToolBar *, ToolBarType type); + +private slots: + void networkCreated(NetworkId id); + void networkRemoved(NetworkId id); + void networkUpdated(const Network *net = 0); + void connectOrDisconnectNet(); + + //void currentBufferChanged(BufferId id); + + +private: + QMenu *_networksConnectMenu, *_networksDisconnectMenu; + QHash _networkActions; +}; + +#endif