Project

General

Profile

awayButtons.diff

Patch to add Away/Back toolbar buttons - HappySmileMan, 03/02/2009 03:33 AM

View differences:

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