1 /***************************************************************************
2 * Copyright (C) 2005-09 by the Quassel Project *
3 * devel@quassel-irc.org *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) version 3. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
24 #include "toolbaractionprovider.h"
26 #include "iconloader.h"
28 ToolBarActionProvider::ToolBarActionProvider(QObject *parent)
29 : NetworkModelController(parent)
31 registerAction(NetworkConnectAll, MainBarIcon("network-connect"), tr("Connect"))->setToolTip(tr("Connect to IRC"));
32 registerAction(NetworkDisconnectAll, MainBarIcon("network-disconnect"), tr("Disconnect"))->setToolTip(tr("Disconnect from IRC"));
34 registerAction(BufferPart, MainBarIcon("irc-close-channel"), tr("Part"))->setToolTip(tr("Leave currently selected channel"));
35 registerAction(JoinChannel, MainBarIcon("irc-join-channel"), tr("Join"))->setToolTip(tr("Join a channel"));
37 registerAction(NickQuery, MainBarIcon("mail-message-new"), tr("Query"))->setToolTip(tr("Start a private conversation")); // fix icon
38 registerAction(NickWhois, MainBarIcon("im-user"), tr("Whois"))->setToolTip(tr("Request user information")); // fix icon
40 registerAction(NickOp, MainBarIcon("irc-operator"), tr("Op"))->setToolTip(tr("Give operator privileges to user"));
41 registerAction(NickDeop, MainBarIcon("irc-remove-operator"), tr("Deop"))->setToolTip(tr("Take operator privileges from user"));
42 registerAction(NickVoice, MainBarIcon("irc-voice"), tr("Voice"))->setToolTip(tr("Give voice to user"));
43 registerAction(NickDevoice, MainBarIcon("irc-unvoice"), tr("Devoice"))->setToolTip(tr("Take voice from user"));
44 registerAction(NickKick, MainBarIcon("im-kick-user"), tr("Kick"))->setToolTip(tr("Remove user from channel"));
45 registerAction(NickBan, MainBarIcon("im-ban-user"), tr("Ban"))->setToolTip(tr("Ban user from channel"));
46 registerAction(NickKickBan, MainBarIcon("im-ban-kick-user"), tr("Kick/Ban"))->setToolTip(tr("Remove and ban user from channel"));
48 //registerAction(ShowChannelList, SmallIcon("format-list-unordered"), tr("Show Channel List"));
49 //registerAction(ShowIgnoreList, tr("Show Ignore List"));
51 _networksConnectMenu = new QMenu();
52 _networksConnectMenu->setSeparatorsCollapsible(false);
53 _networksConnectMenu->addSeparator();
54 _networksConnectMenu->addAction(tr("Connect to all"));
55 action(NetworkConnectAll)->setMenu(_networksConnectMenu);
56 action(NetworkConnectAll)->setEnabled(false);
58 _networksDisconnectMenu = new QMenu();
59 _networksDisconnectMenu->setSeparatorsCollapsible(false);
60 _networksDisconnectMenu->addSeparator();
61 _networksDisconnectMenu->addAction(tr("Disconnect from all"));
62 action(NetworkDisconnectAll)->setMenu(_networksDisconnectMenu);
63 action(NetworkDisconnectAll)->setEnabled(false);
65 connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(networkCreated(NetworkId)));
66 connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(networkRemoved(NetworkId)));
71 ToolBarActionProvider::~ToolBarActionProvider() {
75 void ToolBarActionProvider::updateStates() {
76 action(BufferPart)->setEnabled(_currentBuffer.isValid()
77 && _currentBuffer.data(NetworkModel::BufferTypeRole) == BufferInfo::ChannelBuffer
78 && _currentBuffer.data(NetworkModel::ItemActiveRole).toBool());
82 void ToolBarActionProvider::addActions(QToolBar *bar, ToolBarType type) {
85 bar->addAction(action(NetworkConnectAll));
86 bar->addAction(action(NetworkDisconnectAll));
87 bar->addAction(action(JoinChannel));
88 bar->addAction(action(BufferPart));
91 bar->addAction(action(NickQuery));
92 bar->addAction(action(NickWhois));
94 bar->addAction(action(NickOp));
95 bar->addAction(action(NickDeop));
96 bar->addAction(action(NickVoice));
97 bar->addAction(action(NickDevoice));
98 bar->addAction(action(NickKick));
99 bar->addAction(action(NickBan));
100 bar->addAction(action(NickKickBan));
107 void ToolBarActionProvider::currentBufferChanged(const QModelIndex &index) {
108 _currentBuffer = index;
112 void ToolBarActionProvider::nickSelectionChanged(const QModelIndexList &indexList) {
113 _selectedNicks = indexList;
117 // override those to set indexes right
118 void ToolBarActionProvider::handleNetworkAction(ActionType type, QAction *action) {
119 setIndexList(_currentBuffer);
120 NetworkModelController::handleNetworkAction(type, action);
123 void ToolBarActionProvider::handleBufferAction(ActionType type, QAction *action) {
124 setIndexList(_currentBuffer);
125 NetworkModelController::handleBufferAction(type, action);
128 void ToolBarActionProvider::handleNickAction(ActionType type, QAction *action) {
129 setIndexList(_selectedNicks);
130 NetworkModelController::handleNickAction(type, action);
133 void ToolBarActionProvider::handleGeneralAction(ActionType type, QAction *action) {
134 setIndexList(_currentBuffer);
135 NetworkModelController::handleGeneralAction(type, action);
138 void ToolBarActionProvider::networkCreated(NetworkId id) {
139 const Network *net = Client::network(id);
140 Action *act = new Action(net->networkName(), this);
141 _networkActions[id] = act;
142 act->setObjectName(QString("NetworkAction-%1").arg(id.toInt()));
143 act->setData(QVariant::fromValue<NetworkId>(id));
144 connect(net, SIGNAL(updatedRemotely()), SLOT(networkUpdated()));
145 connect(act, SIGNAL(triggered()), SLOT(connectOrDisconnectNet()));
149 void ToolBarActionProvider::networkRemoved(NetworkId id) {
150 Action *act = _networkActions.take(id);
155 void ToolBarActionProvider::networkUpdated(const Network *net) {
157 net = qobject_cast<const Network *>(sender());
160 Action *act = _networkActions.value(net->networkId());
164 _networksConnectMenu->removeAction(act);
165 _networksDisconnectMenu->removeAction(act);
167 QMenu *newMenu = net->connectionState() != Network::Disconnected ? _networksDisconnectMenu : _networksConnectMenu;
168 act->setText(net->networkName());
170 const int lastidx = newMenu->actions().count() - 2;
171 QAction *beforeAction = newMenu->actions().at(lastidx);
172 for(int i = 0; i < newMenu->actions().count() - 2; i++) {
173 QAction *action = newMenu->actions().at(i);
174 if(net->networkName().localeAwareCompare(action->text()) < 0) {
175 beforeAction = action;
179 newMenu->insertAction(beforeAction, act);
181 action(NetworkConnectAll)->setEnabled(_networksConnectMenu->actions().count() > 2);
182 action(NetworkDisconnectAll)->setEnabled(_networksDisconnectMenu->actions().count() > 2);
183 action(JoinChannel)->setEnabled(_networksDisconnectMenu->actions().count() > 2);
186 void ToolBarActionProvider::connectOrDisconnectNet() {
187 QAction *act = qobject_cast<QAction *>(sender());
190 const Network *net = Client::network(act->data().value<NetworkId>());
194 if(net->connectionState() == Network::Disconnected) net->requestConnect();
195 else net->requestDisconnect();
198 //void ToolBarActionProvider::