away.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 |
//Sets this->_away and avoids duplicating connection if nick is changed, there's probably a better way of doing this? |
|
504 |
setAway(me()->isAway()); |
|
505 |
disconnect(me(), SIGNAL(awaySet(bool)), this, 0); |
|
506 |
connect(me(), SIGNAL(awaySet(bool)), this, SLOT(setAway(bool))); |
|
502 | 507 |
emit myNickSet(nickname); |
503 | 508 |
} |
504 | 509 | |
... | ... | |
514 | 519 |
emit identitySet(id); |
515 | 520 |
} |
516 | 521 | |
522 |
void Network::setAway(const bool &away) { |
|
523 |
if(away != _away) { |
|
524 |
_away = away; |
|
525 |
emit awaySet(away); |
|
526 |
} |
|
527 |
} |
|
528 | ||
517 | 529 |
void Network::setServerList(const QVariantList &serverList) { |
518 | 530 |
_serverList = fromVariantList<Server>(serverList); |
519 | 531 |
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/tabcompleter.cpp | ||
---|---|---|
62 | 62 |
return; |
63 | 63 | |
64 | 64 |
QString tabAbbrev = inputLine->text().left(inputLine->cursorPosition()).section(' ',-1,-1); |
65 |
QRegExp regex(QString("^[^a-zA-Z]*").append(QRegExp::escape(tabAbbrev)), Qt::CaseInsensitive); |
|
65 |
QRegExp regex(QString("^[^a-zA-Z#]*").append(QRegExp::escape(tabAbbrev)), Qt::CaseInsensitive);
|
|
66 | 66 | |
67 |
//Adds each channel on network to CompletionMap for all buffers. |
|
68 |
foreach(QString channel, _currentNetwork->channels()) { |
|
69 |
if(regex.indexIn(channel) > -1) |
|
70 |
completionMap[channel.toLower()] = channel; |
|
71 |
} |
|
67 | 72 |
switch(static_cast<BufferInfo::Type>(currentIndex.data(NetworkModel::BufferTypeRole).toInt())) { |
68 | 73 |
case BufferInfo::ChannelBuffer: |
69 | 74 |
{ // scope is needed for local var declaration |
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 |
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")); |
|
32 |
registerAction(NetworkConnectAll, MainBarIcon("network-connect"), tr("Connect"))->setToolTip(tr("Connect to all")); |
|
33 |
registerAction(NetworkDisconnectAll, MainBarIcon("network-disconnect"), tr("Disconnect"))->setToolTip(tr("Disconnect from all")); |
|
34 |
registerAction(NetworkBackAll, MainBarIcon("im-user"), tr("Back"))->setToolTip(tr("Back to all")); |
|
35 |
registerAction(NetworkAwayAll, MainBarIcon("im-user-away"), tr("Away"))->setToolTip(tr("Away from all")); |
|
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")); |
... | ... | |
47 | 50 | |
48 | 51 |
//registerAction(ShowChannelList, SmallIcon("format-list-unordered"), tr("Show Channel List")); |
49 | 52 |
//registerAction(ShowIgnoreList, tr("Show Ignore List")); |
50 | ||
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); |
|
57 | ||
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); |
|
53 |
|
|
54 |
//A cleaner way to do this, rather than basically copy-pasting code. Allows for easy adding of menus if needed. |
|
55 |
_actionMenus[NetworkConnectAll] = new QMenu(); |
|
56 |
_actionMenus[NetworkDisconnectAll] = new QMenu(); |
|
57 |
_actionMenus[NetworkBackAll] = new QMenu(); |
|
58 |
_actionMenus[NetworkAwayAll] = new QMenu(); |
|
59 | ||
60 |
foreach(ActionType type, _actionMenus.keys()) { |
|
61 |
_actionMenus[type] = new QMenu(); |
|
62 |
Action *act = action(type); |
|
63 |
QMenu *menu = _actionMenus[type]; |
|
64 |
|
|
65 |
menu->setSeparatorsCollapsible(false); |
|
66 |
menu->addSeparator(); |
|
67 |
menu->addAction(act->toolTip(), act, SLOT(trigger())); |
|
68 |
act->setMenu(menu); |
|
69 |
act->setEnabled(false); |
|
70 |
} |
|
64 | 71 | |
65 | 72 |
connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(networkCreated(NetworkId))); |
66 | 73 |
connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(networkRemoved(NetworkId))); |
... | ... | |
84 | 91 |
case MainToolBar: |
85 | 92 |
bar->addAction(action(NetworkConnectAll)); |
86 | 93 |
bar->addAction(action(NetworkDisconnectAll)); |
94 |
bar->addAction(action(NetworkBackAll)); |
|
95 |
bar->addAction(action(NetworkAwayAll)); |
|
87 | 96 |
bar->addAction(action(JoinChannel)); |
88 | 97 |
bar->addAction(action(BufferPart)); |
89 | 98 |
break; |
... | ... | |
137 | 146 | |
138 | 147 |
void ToolBarActionProvider::networkCreated(NetworkId id) { |
139 | 148 |
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)); |
|
149 |
Action *connectAct = new Action(net->networkName(), this); |
|
150 |
_connectActions[id] = connectAct; |
|
151 |
connectAct->setObjectName(QString("ConnectAction-%1").arg(id.toInt())); |
|
152 |
connectAct->setData(QVariant::fromValue<NetworkId>(id)); |
|
153 |
|
|
154 |
Action *awayAct = new Action(net->networkName(), this); |
|
155 |
_awayActions[id] = awayAct; |
|
156 |
awayAct->setObjectName(QString("AwayAction-%1").arg(id.toInt())); |
|
157 |
awayAct->setData(QVariant::fromValue<NetworkId>(id)); |
|
158 |
|
|
144 | 159 |
connect(net, SIGNAL(updatedRemotely()), SLOT(networkUpdated())); |
145 |
connect(act, SIGNAL(triggered()), SLOT(connectOrDisconnectNet())); |
|
160 |
connect(net, SIGNAL(awaySet(bool)), SLOT(awayUpdated())); |
|
161 |
connect(connectAct, SIGNAL(triggered()), SLOT(connectOrDisconnectNet())); |
|
162 |
connect(awayAct, SIGNAL(triggered()), SLOT(awayOrBackNet())); |
|
146 | 163 |
networkUpdated(net); |
147 | 164 |
} |
148 | 165 | |
149 | 166 |
void ToolBarActionProvider::networkRemoved(NetworkId id) { |
150 |
Action *act = _networkActions.take(id); |
|
151 |
if(act) |
|
152 |
act->deleteLater(); |
|
167 |
Action *awayAct = _awayActions.take(id); |
|
168 |
if(awayAct) |
|
169 |
awayAct->deleteLater(); |
|
170 |
Action *connectAct = _connectActions.take(id); |
|
171 |
if(connectAct) |
|
172 |
connectAct->deleteLater(); |
|
153 | 173 |
} |
154 | 174 | |
155 | 175 |
void ToolBarActionProvider::networkUpdated(const Network *net) { |
... | ... | |
157 | 177 |
net = qobject_cast<const Network *>(sender()); |
158 | 178 |
if(!net) |
159 | 179 |
return; |
160 |
Action *act = _networkActions.value(net->networkId()); |
|
161 |
if(!act) |
|
180 |
Action *connectAct = _connectActions.value(net->networkId()); |
|
181 |
Action *awayAct = _awayActions.value(net->networkId()); |
|
182 |
if(!connectAct || !awayAct) |
|
162 | 183 |
return; |
163 | 184 | |
164 |
_networksConnectMenu->removeAction(act); |
|
165 |
_networksDisconnectMenu->removeAction(act); |
|
185 |
foreach(QMenu *menu, _actionMenus) { |
|
186 |
menu->removeAction(connectAct); |
|
187 |
menu->removeAction(awayAct); |
|
188 |
} |
|
189 |
|
|
190 |
connectAct->setText(net->networkName()); |
|
191 |
awayAct->setText(net->networkName()); |
|
192 |
if (net->connectionState() == Network::Disconnected) { |
|
193 |
addActionToMenu(connectAct, menu(NetworkConnectAll)); |
|
194 |
} else { |
|
195 |
addActionToMenu(connectAct, menu(NetworkDisconnectAll)); |
|
196 |
if (net->isAway()) |
|
197 |
addActionToMenu(awayAct, menu(NetworkBackAll)); |
|
198 |
else |
|
199 |
addActionToMenu(awayAct, menu(NetworkAwayAll)); |
|
200 |
} |
|
201 |
|
|
202 |
foreach(ActionType type, _actionMenus.keys()) |
|
203 |
action(type)->setEnabled(menu(type)->actions().count() > 2); |
|
166 | 204 | |
167 |
QMenu *newMenu = net->connectionState() != Network::Disconnected ? _networksDisconnectMenu : _networksConnectMenu;
|
|
168 |
act->setText(net->networkName()); |
|
205 |
action(JoinChannel)->setEnabled(menu(NetworkDisconnectAll)->actions().count() > 2);
|
|
206 |
} |
|
169 | 207 | |
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) { |
|
208 |
void ToolBarActionProvider::awayUpdated(const Network *net) { |
|
209 |
if(!net) |
|
210 |
net = qobject_cast<const Network *>(sender()); |
|
211 |
if(!net || net->connectionState() == Network::Disconnected) |
|
212 |
return; |
|
213 |
Action *awayAct = _awayActions.value(net->networkId()); |
|
214 |
if (!awayAct) |
|
215 |
return; |
|
216 |
|
|
217 |
menu(NetworkBackAll)->removeAction(awayAct); |
|
218 |
menu(NetworkAwayAll)->removeAction(awayAct); |
|
219 |
if (net->isAway()) |
|
220 |
addActionToMenu(awayAct, menu(NetworkBackAll)); |
|
221 |
else |
|
222 |
addActionToMenu(awayAct, menu(NetworkAwayAll)); |
|
223 |
|
|
224 |
action(NetworkBackAll)->setEnabled(menu(NetworkBackAll)->actions().count() > 2); |
|
225 |
action(NetworkAwayAll)->setEnabled(menu(NetworkAwayAll)->actions().count() > 2); |
|
226 |
} |
|
227 | ||
228 |
void ToolBarActionProvider::addActionToMenu(Action *act, QMenu *menu) { |
|
229 |
const int lastidx = menu->actions().count() - 2; |
|
230 |
QAction *beforeAction = menu->actions().at(lastidx); |
|
231 |
for(int i = 0; i < menu->actions().count() - 2; i++) { |
|
232 |
QAction *action = menu->actions().at(i); |
|
233 |
if(act->text().localeAwareCompare(action->text()) < 0) { |
|
175 | 234 |
beforeAction = action; |
176 | 235 |
break; |
177 | 236 |
} |
178 | 237 |
} |
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); |
|
238 |
menu->insertAction(beforeAction, act); |
|
184 | 239 |
} |
185 | 240 | |
186 | 241 |
void ToolBarActionProvider::connectOrDisconnectNet() { |
... | ... | |
191 | 246 |
if(!net) |
192 | 247 |
return; |
193 | 248 | |
194 |
if(net->connectionState() == Network::Disconnected) net->requestConnect(); |
|
195 |
else net->requestDisconnect(); |
|
249 |
if(net->connectionState() == Network::Disconnected) |
|
250 |
net->requestConnect(); |
|
251 |
else |
|
252 |
net->requestDisconnect(); |
|
253 |
} |
|
254 | ||
255 |
void ToolBarActionProvider::awayOrBackNet() { |
|
256 |
QAction *act = qobject_cast<QAction *>(sender()); |
|
257 |
if(!act) |
|
258 |
return; |
|
259 |
const Network *net = Client::network(act->data().value<NetworkId>()); |
|
260 |
if(!net) |
|
261 |
return; |
|
262 | ||
263 |
BufferInfo bufferInfo = BufferInfo::fakeStatusBuffer(net->networkId()); |
|
264 |
if(net->isAway()) |
|
265 |
Client::userInput(bufferInfo, QString("/AWAY")); |
|
266 |
else |
|
267 |
Client::userInput(bufferInfo, QString("/AWAY %1").arg(Client::identity(net->identity())->awayReason())); |
|
196 | 268 |
} |
197 | 269 | |
198 | 270 |
//void ToolBarActionProvider:: |
src/uisupport/toolbaractionprovider.h | ||
---|---|---|
41 | 41 |
void addActions(QToolBar *, ToolBarType type); |
42 | 42 | |
43 | 43 |
protected: |
44 |
inline QMenu *menu(ActionType action) const; |
|
44 | 45 |
virtual void handleNetworkAction(ActionType, QAction *); |
45 | 46 |
virtual void handleBufferAction(ActionType, QAction *); |
46 | 47 |
virtual void handleNickAction(ActionType, QAction *); |
... | ... | |
50 | 51 |
void networkCreated(NetworkId id); |
51 | 52 |
void networkRemoved(NetworkId id); |
52 | 53 |
void networkUpdated(const Network *net = 0); |
54 |
void awayUpdated(const Network *net = 0); |
|
53 | 55 |
void connectOrDisconnectNet(); |
56 |
void awayOrBackNet(); |
|
54 | 57 | |
55 | 58 |
void currentBufferChanged(const QModelIndex &); |
56 | 59 |
void nickSelectionChanged(const QModelIndexList &); |
... | ... | |
58 | 61 |
void updateStates(); |
59 | 62 | |
60 | 63 |
private: |
61 |
QMenu *_networksConnectMenu, *_networksDisconnectMenu;
|
|
62 |
QHash<NetworkId, Action *> _networkActions;
|
|
64 |
QHash<ActionType, QMenu *> _actionMenus;
|
|
65 |
QHash<NetworkId, Action *> _connectActions, _awayActions;
|
|
63 | 66 |
QModelIndex _currentBuffer; |
64 | 67 |
QModelIndexList _selectedNicks; |
68 |
|
|
69 |
void addActionToMenu(Action *action, QMenu *menu); |
|
65 | 70 |
}; |
66 | 71 | |
72 |
QMenu *ToolBarActionProvider::menu(ActionType type) const { return _actionMenus.value(type); } |
|
73 | ||
67 | 74 |
#endif |