awayButtons.diff
src/common/network.cpp | ||
---|---|---|
41 | 41 |
_networkName(QString("<not initialized>")), |
42 | 42 |
_currentServer(QString()), |
43 | 43 |
_connected(false), |
44 |
_away(false), |
|
44 | 45 |
_connectionState(Disconnected), |
45 | 46 |
_prefixes(QString()), |
46 | 47 |
_prefixModes(QString()), |
... | ... | |
499 | 500 |
if(!_myNick.isEmpty() && !ircUser(myNick())) { |
500 | 501 |
newIrcUser(myNick()); |
501 | 502 |
} |
503 |
//Avoid duplicating connection if nick is changed |
|
504 |
disconnect(me(), SIGNAL(awaySet(bool)), this, 0); |
|
505 |
connect(me(), SIGNAL(awaySet(bool)), this, SLOT(setAway(bool))); |
|
502 | 506 |
emit myNickSet(nickname); |
503 | 507 |
} |
504 | 508 | |
... | ... | |
514 | 518 |
emit identitySet(id); |
515 | 519 |
} |
516 | 520 | |
521 |
void Network::setAway(const bool &away) { |
|
522 |
if(away != _away) { |
|
523 |
_away = away; |
|
524 |
emit awaySet(away); |
|
525 |
} |
|
526 |
} |
|
527 | ||
517 | 528 |
void Network::setServerList(const QVariantList &serverList) { |
518 | 529 |
_serverList = fromVariantList<Server>(serverList); |
519 | 530 |
emit serverListSet(serverList); |
src/common/network.h | ||
---|---|---|
56 | 56 |
Q_PROPERTY(QByteArray codecForDecoding READ codecForDecoding WRITE setCodecForDecoding STORED false) |
57 | 57 |
Q_PROPERTY(IdentityId identityId READ identity WRITE setIdentity STORED false) |
58 | 58 |
Q_PROPERTY(bool isConnected READ isConnected WRITE setConnected STORED false) |
59 |
Q_PROPERTY(bool away READ isAway WRITE setAway STORED false) |
|
59 | 60 |
//Q_PROPERTY(Network::ConnectionState connectionState READ connectionState WRITE setConnectionState STORED false) |
60 | 61 |
Q_PROPERTY(int connectionState READ connectionState WRITE setConnectionState STORED false) |
61 | 62 |
Q_PROPERTY(bool useRandomServer READ useRandomServer WRITE setUseRandomServer STORED false) |
... | ... | |
143 | 144 |
inline const QString &myNick() const { return _myNick; } |
144 | 145 |
inline int latency() const { return _latency; } |
145 | 146 |
inline IrcUser *me() const { return ircUser(myNick()); } |
147 |
inline bool isAway() const { return _away; } |
|
146 | 148 |
inline IdentityId identity() const { return _identity; } |
147 | 149 |
QStringList nicks() const; |
148 | 150 |
inline QStringList channels() const { return _ircChannels.keys(); } |
... | ... | |
215 | 217 |
virtual void setMyNick(const QString &mynick); |
216 | 218 |
void setLatency(int latency); |
217 | 219 |
void setIdentity(IdentityId); |
220 |
void setAway(const bool &away); |
|
218 | 221 | |
219 | 222 |
void setServerList(const QVariantList &serverList); |
220 | 223 |
void setUseRandomServer(bool); |
... | ... | |
276 | 279 |
void myNickSet(const QString &mynick); |
277 | 280 |
void latencySet(int latency); |
278 | 281 |
void identitySet(IdentityId); |
282 |
void awaySet(bool away); |
|
279 | 283 | |
280 | 284 |
void serverListSet(QVariantList serverList); |
281 | 285 |
void useRandomServerSet(bool); |
... | ... | |
319 | 323 |
QString _networkName; |
320 | 324 |
QString _currentServer; |
321 | 325 |
bool _connected; |
326 |
bool _away; |
|
322 | 327 |
ConnectionState _connectionState; |
323 | 328 | |
324 | 329 |
QString _prefixes; |
src/uisupport/networkmodelcontroller.cpp | ||
---|---|---|
196 | 196 |
} |
197 | 197 | |
198 | 198 |
void NetworkModelController::handleNetworkAction(ActionType type, QAction *) { |
199 |
if(type == NetworkConnectAll || type == NetworkDisconnectAll) { |
|
199 |
if(type == NetworkConnectAll || type == NetworkDisconnectAll || type == NetworkAwayAll || type == NetworkBackAll) {
|
|
200 | 200 |
foreach(NetworkId id, Client::networkIds()) { |
201 | 201 |
const Network *net = Client::network(id); |
202 | 202 |
if(type == NetworkConnectAll && net->connectionState() == Network::Disconnected) |
203 | 203 |
net->requestConnect(); |
204 |
if(type == NetworkDisconnectAll && net->connectionState() != Network::Disconnected) |
|
204 |
else if(type == NetworkDisconnectAll && net->connectionState() != Network::Disconnected)
|
|
205 | 205 |
net->requestDisconnect(); |
206 |
else if(type == NetworkBackAll && net->connectionState() != Network::Disconnected && net->isAway()) |
|
207 |
Client::userInput(BufferInfo::fakeStatusBuffer(id), QString("/AWAY")); |
|
208 |
else if(type == NetworkAwayAll && net->connectionState() != Network::Disconnected && !net->isAway()) |
|
209 |
Client::userInput(BufferInfo::fakeStatusBuffer(id), QString("/AWAY %1").arg(Client::identity(net->identity())->awayReason())); |
|
206 | 210 |
} |
207 | 211 |
return; |
208 | 212 |
} |
209 | 213 | |
210 | 214 |
if(!indexList().count()) |
211 | 215 |
return; |
212 | ||
216 |
|
|
213 | 217 |
const Network *network = Client::network(indexList().at(0).data(NetworkModel::NetworkIdRole).value<NetworkId>()); |
214 | 218 |
Q_CHECK_PTR(network); |
215 | 219 |
if(!network) |
... | ... | |
222 | 226 |
case NetworkDisconnect: |
223 | 227 |
network->requestDisconnect(); |
224 | 228 |
break; |
229 |
case NetworkBack: |
|
230 |
Client::userInput(BufferInfo::fakeStatusBuffer(network->networkId()), QString("/AWAY")); |
|
231 |
break; |
|
232 |
case NetworkAway: |
|
233 |
Client::userInput(BufferInfo::fakeStatusBuffer(network->networkId()), |
|
234 |
QString("/AWAY %1").arg(Client::identity(network->identity())->awayReason())); |
|
225 | 235 |
default: |
226 | 236 |
break; |
227 | 237 |
} |
src/uisupport/networkmodelcontroller.h | ||
---|---|---|
46 | 46 |
NetworkDisconnect = 0x02, |
47 | 47 |
NetworkConnectAll = 0x03, |
48 | 48 |
NetworkDisconnectAll = 0x04, |
49 |
NetworkAway = 0x05, |
|
50 |
NetworkBack = 0x06, |
|
51 |
NetworkAwayAll = 0x07, |
|
52 |
NetworkBackAll = 0x08, |
|
49 | 53 | |
50 | 54 |
// Buffer actions |
51 | 55 |
BufferMask = 0xf0, |
src/uisupport/toolbaractionprovider.cpp | ||
---|---|---|
24 | 24 |
#include "toolbaractionprovider.h" |
25 | 25 | |
26 | 26 |
#include "iconloader.h" |
27 |
#include "identity.h" |
|
27 | 28 | |
28 | 29 |
ToolBarActionProvider::ToolBarActionProvider(QObject *parent) |
29 | 30 |
: NetworkModelController(parent) |
30 | 31 |
{ |
31 | 32 |
registerAction(NetworkConnectAll, MainBarIcon("network-connect"), tr("Connect"))->setToolTip(tr("Connect to IRC")); |
32 | 33 |
registerAction(NetworkDisconnectAll, MainBarIcon("network-disconnect"), tr("Disconnect"))->setToolTip(tr("Disconnect from IRC")); |
34 |
registerAction(NetworkBackAll, MainBarIcon("im-user"), tr("Back"))->setToolTip(tr("Set as back")); |
|
35 |
registerAction(NetworkAwayAll, MainBarIcon("im-user-away"), tr("Away"))->setToolTip(tr("Set as away")); |
|
33 | 36 | |
34 | 37 |
registerAction(BufferPart, MainBarIcon("irc-close-channel"), tr("Part"))->setToolTip(tr("Leave currently selected channel")); |
35 | 38 |
registerAction(JoinChannel, MainBarIcon("irc-join-channel"), tr("Join"))->setToolTip(tr("Join a channel")); |
... | ... | |
61 | 64 |
_networksDisconnectMenu->addAction(tr("Disconnect from all")); |
62 | 65 |
action(NetworkDisconnectAll)->setMenu(_networksDisconnectMenu); |
63 | 66 |
action(NetworkDisconnectAll)->setEnabled(false); |
67 |
|
|
68 |
_networksBackMenu = new QMenu(); |
|
69 |
_networksBackMenu->setSeparatorsCollapsible(false); |
|
70 |
_networksBackMenu->addSeparator(); |
|
71 |
_networksBackMenu->addAction(tr("Back to all")); |
|
72 |
action(NetworkBackAll)->setMenu(_networksBackMenu); |
|
73 |
action(NetworkBackAll)->setEnabled(false); |
|
74 |
|
|
75 |
_networksAwayMenu = new QMenu(); |
|
76 |
_networksAwayMenu->setSeparatorsCollapsible(false); |
|
77 |
_networksAwayMenu->addSeparator(); |
|
78 |
_networksAwayMenu->addAction(tr("Away from all")); |
|
79 |
action(NetworkAwayAll)->setMenu(_networksAwayMenu); |
|
80 |
action(NetworkAwayAll)->setEnabled(false); |
|
64 | 81 | |
65 | 82 |
connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(networkCreated(NetworkId))); |
66 | 83 |
connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(networkRemoved(NetworkId))); |
... | ... | |
84 | 101 |
case MainToolBar: |
85 | 102 |
bar->addAction(action(NetworkConnectAll)); |
86 | 103 |
bar->addAction(action(NetworkDisconnectAll)); |
104 |
bar->addAction(action(NetworkBackAll)); |
|
105 |
bar->addAction(action(NetworkAwayAll)); |
|
87 | 106 |
bar->addAction(action(JoinChannel)); |
88 | 107 |
bar->addAction(action(BufferPart)); |
89 | 108 |
break; |
... | ... | |
137 | 156 | |
138 | 157 |
void ToolBarActionProvider::networkCreated(NetworkId id) { |
139 | 158 |
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)); |
|
159 |
Action *connectAct = new Action(net->networkName(), this); |
|
160 |
_connectActions[id] = connectAct; |
|
161 |
connectAct->setObjectName(QString("ConnectAction-%1").arg(id.toInt())); |
|
162 |
connectAct->setData(QVariant::fromValue<NetworkId>(id)); |
|
163 |
|
|
164 |
Action *awayAct = new Action(net->networkName(), this); |
|
165 |
_awayActions[id] = awayAct; |
|
166 |
awayAct->setObjectName(QString("AwayAction-%1").arg(id.toInt())); |
|
167 |
awayAct->setData(QVariant::fromValue<NetworkId>(id)); |
|
168 |
|
|
144 | 169 |
connect(net, SIGNAL(updatedRemotely()), SLOT(networkUpdated())); |
145 |
connect(act, SIGNAL(triggered()), SLOT(connectOrDisconnectNet())); |
|
170 |
connect(net, SIGNAL(awaySet(bool)), SLOT(awayUpdated())); |
|
171 |
connect(connectAct, SIGNAL(triggered()), SLOT(connectOrDisconnectNet())); |
|
172 |
connect(awayAct, SIGNAL(triggered()), SLOT(awayOrBackNet())); |
|
146 | 173 |
networkUpdated(net); |
147 | 174 |
} |
148 | 175 | |
149 | 176 |
void ToolBarActionProvider::networkRemoved(NetworkId id) { |
150 |
Action *act = _networkActions.take(id); |
|
151 |
if(act) |
|
152 |
act->deleteLater(); |
|
177 |
Action *awayAct = _awayActions.take(id); |
|
178 |
if(awayAct) |
|
179 |
awayAct->deleteLater(); |
|
180 |
Action *connectAct = _connectActions.take(id); |
|
181 |
if(connectAct) |
|
182 |
connectAct->deleteLater(); |
|
153 | 183 |
} |
154 | 184 | |
155 | 185 |
void ToolBarActionProvider::networkUpdated(const Network *net) { |
... | ... | |
157 | 187 |
net = qobject_cast<const Network *>(sender()); |
158 | 188 |
if(!net) |
159 | 189 |
return; |
160 |
Action *act = _networkActions.value(net->networkId()); |
|
161 |
if(!act) |
|
190 |
Action *connectAct = _connectActions.value(net->networkId()); |
|
191 |
Action *awayAct = _awayActions.value(net->networkId()); |
|
192 |
if(!connectAct || !awayAct) |
|
162 | 193 |
return; |
163 | 194 | |
164 |
_networksConnectMenu->removeAction(act); |
|
165 |
_networksDisconnectMenu->removeAction(act); |
|
195 |
_networksConnectMenu->removeAction(connectAct); |
|
196 |
_networksDisconnectMenu->removeAction(connectAct); |
|
197 |
_networksBackMenu->removeAction(awayAct); |
|
198 |
_networksAwayMenu->removeAction(awayAct); |
|
199 |
|
|
200 |
connectAct->setText(net->networkName()); |
|
201 |
awayAct->setText(net->networkName()); |
|
202 |
if (net->connectionState() == Network::Disconnected) { |
|
203 |
addActionToMenu(connectAct, _networksConnectMenu); |
|
204 |
} else { |
|
205 |
addActionToMenu(connectAct, _networksDisconnectMenu); |
|
206 |
if (net->isAway()) |
|
207 |
addActionToMenu(awayAct, _networksBackMenu); |
|
208 |
else |
|
209 |
addActionToMenu(awayAct, _networksAwayMenu); |
|
210 |
} |
|
211 |
|
|
212 |
action(NetworkConnectAll)->setEnabled(_networksConnectMenu->actions().count() > 2); |
|
213 |
action(NetworkDisconnectAll)->setEnabled(_networksDisconnectMenu->actions().count() > 2); |
|
214 |
action(NetworkBackAll)->setEnabled(_networksBackMenu->actions().count() > 2); |
|
215 |
action(NetworkAwayAll)->setEnabled(_networksAwayMenu->actions().count() > 2); |
|
216 |
action(JoinChannel)->setEnabled(_networksDisconnectMenu->actions().count() > 2); |
|
217 |
} |
|
166 | 218 | |
167 |
QMenu *newMenu = net->connectionState() != Network::Disconnected ? _networksDisconnectMenu : _networksConnectMenu; |
|
168 |
act->setText(net->networkName()); |
|
219 |
void ToolBarActionProvider::awayUpdated(const Network *net) { |
|
220 |
if(!net) |
|
221 |
net = qobject_cast<const Network *>(sender()); |
|
222 |
if(!net || net->connectionState() == Network::Disconnected) |
|
223 |
return; |
|
224 |
Action *awayAct = _awayActions.value(net->networkId()); |
|
225 |
if (!awayAct) |
|
226 |
return; |
|
227 |
|
|
228 |
_networksBackMenu->removeAction(awayAct); |
|
229 |
_networksAwayMenu->removeAction(awayAct); |
|
230 |
if (net->isAway()) |
|
231 |
addActionToMenu(awayAct, _networksBackMenu); |
|
232 |
else |
|
233 |
addActionToMenu(awayAct, _networksAwayMenu); |
|
234 |
|
|
235 |
action(NetworkBackAll)->setEnabled(_networksBackMenu->actions().count() > 2); |
|
236 |
action(NetworkAwayAll)->setEnabled(_networksAwayMenu->actions().count() > 2); |
|
237 |
} |
|
169 | 238 | |
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) { |
|
239 |
void ToolBarActionProvider::addActionToMenu(Action *act, QMenu *menu) { |
|
240 |
const int lastidx = menu->actions().count() - 2; |
|
241 |
QAction *beforeAction = menu->actions().at(lastidx); |
|
242 |
for(int i = 0; i < menu->actions().count() - 2; i++) { |
|
243 |
QAction *action = menu->actions().at(i); |
|
244 |
if(act->text().localeAwareCompare(action->text()) < 0) { |
|
175 | 245 |
beforeAction = action; |
176 | 246 |
break; |
177 | 247 |
} |
178 | 248 |
} |
179 |
newMenu->insertAction(beforeAction, act); |
|
180 | ||
181 |
action(NetworkConnectAll)->setEnabled(_networksConnectMenu->actions().count() > 2); |
|
182 |
action(NetworkDisconnectAll)->setEnabled(_networksDisconnectMenu->actions().count() > 2); |
|
183 |
action(JoinChannel)->setEnabled(_networksDisconnectMenu->actions().count() > 2); |
|
249 |
menu->insertAction(beforeAction, act); |
|
184 | 250 |
} |
185 | 251 | |
186 | 252 |
void ToolBarActionProvider::connectOrDisconnectNet() { |
... | ... | |
191 | 257 |
if(!net) |
192 | 258 |
return; |
193 | 259 | |
194 |
if(net->connectionState() == Network::Disconnected) net->requestConnect(); |
|
195 |
else net->requestDisconnect(); |
|
260 |
if(net->connectionState() == Network::Disconnected) |
|
261 |
net->requestConnect(); |
|
262 |
else |
|
263 |
net->requestDisconnect(); |
|
264 |
} |
|
265 | ||
266 |
void ToolBarActionProvider::awayOrBackNet() { |
|
267 |
QAction *act = qobject_cast<QAction *>(sender()); |
|
268 |
if(!act) |
|
269 |
return; |
|
270 |
const Network *net = Client::network(act->data().value<NetworkId>()); |
|
271 |
if(!net) |
|
272 |
return; |
|
273 | ||
274 |
BufferInfo bufferInfo = BufferInfo::fakeStatusBuffer(net->networkId()); |
|
275 |
if(net->isAway()) |
|
276 |
Client::userInput(bufferInfo, QString("/AWAY")); |
|
277 |
else |
|
278 |
Client::userInput(bufferInfo, QString("/AWAY %1").arg(Client::identity(net->identity())->awayReason())); |
|
196 | 279 |
} |
197 | 280 | |
198 | 281 |
//void ToolBarActionProvider:: |
src/uisupport/toolbaractionprovider.h | ||
---|---|---|
50 | 50 |
void networkCreated(NetworkId id); |
51 | 51 |
void networkRemoved(NetworkId id); |
52 | 52 |
void networkUpdated(const Network *net = 0); |
53 |
void awayUpdated(const Network *net = 0); |
|
53 | 54 |
void connectOrDisconnectNet(); |
55 |
void awayOrBackNet(); |
|
54 | 56 | |
55 | 57 |
void currentBufferChanged(const QModelIndex &); |
56 | 58 |
void nickSelectionChanged(const QModelIndexList &); |
... | ... | |
58 | 60 |
void updateStates(); |
59 | 61 | |
60 | 62 |
private: |
61 |
QMenu *_networksConnectMenu, *_networksDisconnectMenu; |
|
62 |
QHash<NetworkId, Action *> _networkActions;
|
|
63 |
QMenu *_networksConnectMenu, *_networksDisconnectMenu, *_networksBackMenu, *_networksAwayMenu;
|
|
64 |
QHash<NetworkId, Action *> _connectActions, _awayActions;
|
|
63 | 65 |
QModelIndex _currentBuffer; |
64 | 66 |
QModelIndexList _selectedNicks; |
67 |
|
|
68 |
void addActionToMenu(Action *action, QMenu *menu); |
|
65 | 69 |
}; |
66 | 70 | |
67 | 71 |
#endif |