modernize: Replace most remaining old-style connects by PMF ones
[quassel.git] / src / uisupport / toolbaractionprovider.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2018 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
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.                                           *
9  *                                                                         *
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.                          *
14  *                                                                         *
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  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
19  ***************************************************************************/
20
21 #include "toolbaractionprovider.h"
22
23 #include <QMenu>
24 #include <QToolBar>
25
26 #include "icon.h"
27
28 ToolBarActionProvider::ToolBarActionProvider(QObject *parent)
29     : NetworkModelController(parent)
30 {
31     registerAction(NetworkConnectAllWithDropdown, icon::get("network-connect"), tr("Connect"))->setToolTip(tr("Connect to IRC"));
32     registerAction(NetworkDisconnectAllWithDropdown, icon::get("network-disconnect"), tr("Disconnect"))->setToolTip(tr("Disconnect from IRC"));
33     registerAction(NetworkConnectAll, tr("Connect to all"));
34     registerAction(NetworkDisconnectAll, tr("Disconnect from all"));
35
36     registerAction(BufferPart, icon::get("irc-close-channel"), tr("Part"))->setToolTip(tr("Leave currently selected channel"));
37     registerAction(JoinChannel, icon::get("irc-join-channel"), tr("Join"))->setToolTip(tr("Join a channel"));
38
39     registerAction(NickQuery, icon::get("mail-message-new"), tr("Query"))->setToolTip(tr("Start a private conversation")); // fix icon
40     registerAction(NickWhois, icon::get("im-user"), tr("Whois"))->setToolTip(tr("Request user information")); // fix icon
41
42     registerAction(NickOp, icon::get("irc-operator"), tr("Op"))->setToolTip(tr("Give operator privileges to user"));
43     registerAction(NickDeop, icon::get("irc-remove-operator"), tr("Deop"))->setToolTip(tr("Take operator privileges from user"));
44     registerAction(NickVoice, icon::get("irc-voice"), tr("Voice"))->setToolTip(tr("Give voice to user"));
45     registerAction(NickDevoice, icon::get("irc-unvoice"), tr("Devoice"))->setToolTip(tr("Take voice from user"));
46     registerAction(NickKick, icon::get("im-kick-user"), tr("Kick"))->setToolTip(tr("Remove user from channel"));
47     registerAction(NickBan, icon::get("im-ban-user"), tr("Ban"))->setToolTip(tr("Ban user from channel"));
48     registerAction(NickKickBan, icon::get("im-ban-kick-user"), tr("Kick/Ban"))->setToolTip(tr("Remove and ban user from channel"));
49
50     _networksConnectMenu = new QMenu();
51     _networksConnectMenu->setSeparatorsCollapsible(false);
52     _networksConnectMenu->addSeparator();
53     _networksConnectMenu->addAction(action(NetworkConnectAll));
54     action(NetworkConnectAllWithDropdown)->setMenu(_networksConnectMenu);
55     action(NetworkConnectAllWithDropdown)->setEnabled(false);
56
57     _networksDisconnectMenu = new QMenu();
58     _networksDisconnectMenu->setSeparatorsCollapsible(false);
59     _networksDisconnectMenu->addSeparator();
60     _networksDisconnectMenu->addAction(action(NetworkDisconnectAll));
61     action(NetworkDisconnectAllWithDropdown)->setMenu(_networksDisconnectMenu);
62     action(NetworkDisconnectAllWithDropdown)->setEnabled(false);
63
64     connect(Client::instance(), &Client::networkCreated, this, &ToolBarActionProvider::networkCreated);
65     connect(Client::instance(), &Client::networkRemoved, this, &ToolBarActionProvider::networkRemoved);
66
67     updateStates();
68 }
69
70
71 void ToolBarActionProvider::disconnectedFromCore()
72 {
73     _currentBuffer = QModelIndex();
74     updateStates();
75     NetworkModelController::disconnectedFromCore();
76 }
77
78
79 void ToolBarActionProvider::updateStates()
80 {
81     action(BufferPart)->setEnabled(_currentBuffer.isValid()
82         && _currentBuffer.data(NetworkModel::BufferTypeRole) == BufferInfo::ChannelBuffer
83         && _currentBuffer.data(NetworkModel::ItemActiveRole).toBool());
84 }
85
86
87 void ToolBarActionProvider::addActions(QToolBar *bar, ToolBarType type)
88 {
89     switch (type) {
90     case MainToolBar:
91         bar->addAction(action(NetworkConnectAllWithDropdown));
92         bar->addAction(action(NetworkDisconnectAllWithDropdown));
93         bar->addAction(action(JoinChannel));
94         bar->addAction(action(BufferPart));
95         break;
96     case NickToolBar:
97         bar->addAction(action(NickQuery));
98         bar->addAction(action(NickWhois));
99         bar->addSeparator();
100         bar->addAction(action(NickOp));
101         bar->addAction(action(NickDeop));
102         bar->addAction(action(NickVoice));
103         bar->addAction(action(NickDevoice));
104         bar->addAction(action(NickKick));
105         bar->addAction(action(NickBan));
106         bar->addAction(action(NickKickBan));
107         break;
108     default:
109         return;
110     }
111 }
112
113
114 void ToolBarActionProvider::onCurrentBufferChanged(const QModelIndex &index)
115 {
116     _currentBuffer = index;
117     updateStates();
118 }
119
120
121 void ToolBarActionProvider::onNickSelectionChanged(const QModelIndexList &indexList)
122 {
123     _selectedNicks = indexList;
124     updateStates();
125 }
126
127
128 // override those to set indexes right
129 void ToolBarActionProvider::handleNetworkAction(ActionType type, QAction *action)
130 {
131     setIndexList(_currentBuffer);
132     NetworkModelController::handleNetworkAction(type, action);
133 }
134
135
136 void ToolBarActionProvider::handleBufferAction(ActionType type, QAction *action)
137 {
138     setIndexList(_currentBuffer);
139     NetworkModelController::handleBufferAction(type, action);
140 }
141
142
143 void ToolBarActionProvider::handleNickAction(ActionType type, QAction *action)
144 {
145     setIndexList(_selectedNicks);
146     NetworkModelController::handleNickAction(type, action);
147 }
148
149
150 void ToolBarActionProvider::handleGeneralAction(ActionType type, QAction *action)
151 {
152     setIndexList(_currentBuffer);
153     NetworkModelController::handleGeneralAction(type, action);
154 }
155
156
157 void ToolBarActionProvider::networkCreated(NetworkId id)
158 {
159     const Network *net = Client::network(id);
160     Action *act = new Action(net->networkName(), this);
161     _networkActions[id] = act;
162     act->setObjectName(QString("NetworkAction-%1").arg(id.toInt()));
163     act->setData(QVariant::fromValue<NetworkId>(id));
164     connect(net, &Network::updatedRemotely, this, [this]() { networkUpdated(); });
165     connect(act, &QAction::triggered, this, &ToolBarActionProvider::connectOrDisconnectNet);
166     networkUpdated(net);
167 }
168
169
170 void ToolBarActionProvider::networkRemoved(NetworkId id)
171 {
172     Action *act = _networkActions.take(id);
173     if (act)
174         act->deleteLater();
175 }
176
177
178 void ToolBarActionProvider::networkUpdated(const Network *net)
179 {
180     if (!net)
181         net = qobject_cast<const Network *>(sender());
182     if (!net)
183         return;
184     Action *act = _networkActions.value(net->networkId());
185     if (!act)
186         return;
187
188     _networksConnectMenu->removeAction(act);
189     _networksDisconnectMenu->removeAction(act);
190
191     QMenu *newMenu = net->connectionState() != Network::Disconnected ? _networksDisconnectMenu : _networksConnectMenu;
192     act->setText(net->networkName());
193
194     const int lastidx = newMenu->actions().count() - 2;
195     QAction *beforeAction = newMenu->actions().at(lastidx);
196     for (int i = 0; i < newMenu->actions().count() - 2; i++) {
197         QAction *action = newMenu->actions().at(i);
198         if (net->networkName().localeAwareCompare(action->text()) < 0) {
199             beforeAction = action;
200             break;
201         }
202     }
203     newMenu->insertAction(beforeAction, act);
204
205     action(NetworkConnectAllWithDropdown)->setEnabled(_networksConnectMenu->actions().count() > 2);
206     action(NetworkDisconnectAllWithDropdown)->setEnabled(_networksDisconnectMenu->actions().count() > 2);
207     action(JoinChannel)->setEnabled(_networksDisconnectMenu->actions().count() > 2);
208 }
209
210
211 void ToolBarActionProvider::connectOrDisconnectNet()
212 {
213     auto *act = qobject_cast<QAction *>(sender());
214     if (!act)
215         return;
216     const Network *net = Client::network(act->data().value<NetworkId>());
217     if (!net)
218         return;
219
220     if (net->connectionState() == Network::Disconnected) net->requestConnect();
221     else net->requestDisconnect();
222 }
223
224
225 //void ToolBarActionProvider::