Project

General

Profile

away.diff

Update of previous patch - HappySmileMan, 03/04/2009 07:56 PM

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
  //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