1 /*
2  * This file is part of Licq, an instant messaging client for UNIX.
3  * Copyright (C) 2007-2014 Licq developers <licq-dev@googlegroups.com>
4  *
5  * Licq 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) any later version.
9  *
10  * Licq 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 Licq; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19 
20 #include "usermenu.h"
21 
22 #include "config.h"
23 
24 #include <boost/foreach.hpp>
25 
26 #include <QActionGroup>
27 #include <QClipboard>
28 
29 #include <licq/contactlist/group.h>
30 #include <licq/contactlist/usermanager.h>
31 #include <licq/icq/icq.h>
32 #include <licq/daemon.h>
33 #include <licq/gpghelper.h>
34 #include <licq/plugin/pluginmanager.h>
35 #include <licq/pluginsignal.h>
36 
37 #include "config/iconmanager.h"
38 #include "config/shortcuts.h"
39 
40 #include "contactlist/contactlist.h"
41 
42 #include "dialogs/authdlg.h"
43 #include "dialogs/awaymsgdlg.h"
44 #include "dialogs/customautorespdlg.h"
45 #include "dialogs/gpgkeyselect.h"
46 #include "dialogs/historydlg.h"
47 #include "dialogs/keyrequestdlg.h"
48 #include "dialogs/showawaymsgdlg.h"
49 #include "userdlg/userdlg.h"
50 
51 #include "gui-defines.h"
52 #include "licqgui.h"
53 #include "messagebox.h"
54 #include "signalmanager.h"
55 
56 using Licq::User;
57 using namespace LicqQtGui;
58 /* TRANSLATOR LicqQtGui::UserMenu */
59 
60 UserMenu* LicqQtGui::gUserMenu = NULL;
61 
UserMenu(QWidget * parent)62 UserMenu::UserMenu(QWidget* parent)
63   : QMenu(parent)
64 {
65   assert(gUserMenu == NULL);
66   gUserMenu = this;
67 
68   QAction* a;
69 
70   // Sub menu Send
71   mySendMenu = new QMenu(tr("Send"), this);
72   connect(mySendMenu, SIGNAL(triggered(QAction*)), SLOT(send(QAction*)));
73 #define ADD_SEND(text, data) \
74     a = mySendMenu->addAction(text); \
75     mySendActions.insert(data, a); \
76     a->setData(data);
77   ADD_SEND(tr("Send &Message..."), SendMessage)
78   ADD_SEND(tr("Send &URL..."), SendUrl)
79   ADD_SEND(tr("Send &Chat Request..."), SendChat)
80   ADD_SEND(tr("Send &File Transfer..."), SendFile)
81   ADD_SEND(tr("Send Contact &List..."), SendContact)
82   ADD_SEND(tr("Send &Authorization..."), SendAuthorize)
83   ADD_SEND(tr("Send Authorization Re&quest..."), SendReqAuthorize)
84   mySendMenu->addSeparator();
85   ADD_SEND(tr("Update Info Plugin List"), RequestUpdateInfoPlugin)
86   ADD_SEND(tr("Update Status Plugin List"), RequestUpdateStatusPlugin)
87   ADD_SEND(tr("Update Phone \"Follow Me\" Status"), RequestPhoneFollowMeStatus)
88   ADD_SEND(tr("Update ICQphone Status"), RequestIcqphoneStatus)
89   ADD_SEND(tr("Update File Server Status"), RequestFileServerStatus)
90   mySendMenu->addSeparator();
91   ADD_SEND(QString::null, SendKey)
92 #undef ADD_SEND
93 
94   // Sub menu Misc Modes
95   myMiscModesMenu = new QMenu(tr("Misc Modes"), this);
96   connect(myMiscModesMenu, SIGNAL(triggered(QAction*)), SLOT(toggleMiscMode(QAction*)));
97 #define ADD_MISCMODE(text, data) \
98     a = myMiscModesMenu->addAction(text); \
99     myMiscModesActions.insert(data, a);\
100     a->setCheckable(true); \
101     a->setData(data);
102   ADD_MISCMODE(tr("Accept in Away"), ModeAcceptInAway)
103   ADD_MISCMODE(tr("Accept in Not Available"), ModeAcceptInNa)
104   ADD_MISCMODE(tr("Accept in Occupied"), ModeAcceptInOccupied)
105   ADD_MISCMODE(tr("Accept in Do Not Disturb"), ModeAcceptInDnd)
106   ADD_MISCMODE(tr("Auto Accept Files"), ModeAutoFileAccept)
107   ADD_MISCMODE(tr("Auto Accept Chats"), ModeAutoChatAccept)
108   ADD_MISCMODE(tr("Auto Request Secure"), ModeAutoSecure)
109   ADD_MISCMODE(tr("Use GPG Encryption"), ModeUseGpg)
110   if (!Licq::gGpgHelper.haveGpgSupport())
111     a->setVisible(false);
112   ADD_MISCMODE(tr("Use Real Ip (LAN)"), ModeUseRealIp)
113   myMiscModesMenu->addSeparator();
114   ADD_MISCMODE(tr("Online to User"), ModeStatusOnline)
115   ADD_MISCMODE(tr("Away to User"), ModeStatusAway)
116   ADD_MISCMODE(tr("Not Available to User"), ModeStatusNa)
117   ADD_MISCMODE(tr("Occupied to User"), ModeStatusOccupied)
118   ADD_MISCMODE(tr("Do Not Disturb to User"), ModeStatusDnd)
119 #undef ADD_MISCMODE
120 
121   // Sub menu User Group
122   myGroupsMenu = new QMenu(tr("Edit User Group"), this);
123   myUserGroupActions = new QActionGroup(this);
124   myUserGroupActions->setExclusive(false);
125   connect(myUserGroupActions, SIGNAL(triggered(QAction*)), SLOT(toggleUserGroup(QAction*)));
126   mySystemGroupActions = new QActionGroup(this);
127   mySystemGroupActions->setExclusive(false);
128   connect(mySystemGroupActions, SIGNAL(triggered(QAction*)), SLOT(toggleSystemGroup(QAction*)));
129   myServerGroupActions = new QActionGroup(this);
130   connect(myServerGroupActions, SIGNAL(triggered(QAction*)), SLOT(setServerGroup(QAction*)));
131 
132   // System groups
133 #define ADD_SYSTEMGROUP(gid, data) \
134     a = mySystemGroupActions->addAction(ContactListModel::systemGroupName(gid)); \
135     myMiscModesActions.insert(data, a);\
136     a->setCheckable(true); \
137     a->setData(gid);
138   ADD_SYSTEMGROUP(ContactListModel::OnlineNotifyGroupId, ModeOnlineNotify);
139   ADD_SYSTEMGROUP(ContactListModel::VisibleListGroupId, ModeVisibleList);
140   ADD_SYSTEMGROUP(ContactListModel::InvisibleListGroupId, ModeInvisibleList);
141   ADD_SYSTEMGROUP(ContactListModel::IgnoreListGroupId, ModeIgnoreList);
142   ADD_SYSTEMGROUP(ContactListModel::NewUsersGroupId, ModeNewUser);
143 #undef ADD_SYSTEMGROUP
144 
145   myServerGroupsMenu = new QMenu(tr("Server Group"), myGroupsMenu);
146   myGroupsMenu->addMenu(myServerGroupsMenu);
147   myGroupsMenu->addSeparator();
148   myGroupSeparator = myGroupsMenu->addSeparator();
149   myGroupsMenu->addActions(mySystemGroupActions->actions());
150 
151   // User menu
152   myViewEventAction = addAction(tr("&View Event..."), this, SLOT(viewEvent()));
153   addMenu(mySendMenu);
154   addMenu(myMiscModesMenu);
155   myCheckArAction = addAction(QString::null, this, SLOT(checkAutoResponse()));
156   myCustomArAction = addAction(tr("Custom Auto Response..."), this, SLOT(customAutoResponse()));
157   myCustomArAction->setCheckable(true);
158   addSeparator();
159   myMakePermanentAction = addAction(tr("Add to List"), this, SLOT(makePermanent()));
160   myToggleFloatyAction = addAction(tr("Toggle &Floaty"), this, SLOT(toggleFloaty()));
161   addMenu(myGroupsMenu);
162   myRemoveUserAction = addAction(tr("Remove From List"), this, SLOT(removeContact()));
163   addSeparator();
164   mySetKeyAction = addAction(tr("Set GPG Key..."), this, SLOT(selectKey()));
165   if (!Licq::gGpgHelper.haveGpgSupport())
166     mySetKeyAction->setVisible(false);
167   myCopyIdAction = addAction(tr("&Copy User ID"), this, SLOT(copyIdToClipboard()));
168   myViewHistoryAction = addAction(tr("View &History..."), this, SLOT(viewHistory()));
169   myViewGeneralAction = addAction(tr("&Info..."), this, SLOT(viewInfoGeneral()));
170 
171   connect(this, SIGNAL(aboutToShow()), SLOT(aboutToShowMenu()));
172 
173   updateIcons();
174   updateGroups();
175 
176   connect(IconManager::instance(), SIGNAL(iconsChanged()), SLOT(updateIcons()));
177 }
178 
~UserMenu()179 UserMenu::~UserMenu()
180 {
181   gUserMenu = NULL;
182 }
183 
updateIcons()184 void UserMenu::updateIcons()
185 {
186   IconManager* iconman = IconManager::instance();
187 
188   mySendActions[SendMessage]->setIcon(iconman->getIcon(IconManager::StandardMessageIcon));
189   mySendActions[SendUrl]->setIcon(iconman->getIcon(IconManager::UrlMessageIcon));
190   mySendActions[SendChat]->setIcon(iconman->getIcon(IconManager::ChatMessageIcon));
191   mySendActions[SendFile]->setIcon(iconman->getIcon(IconManager::FileMessageIcon));
192   mySendActions[SendContact]->setIcon(iconman->getIcon(IconManager::ContactMessageIcon));
193   mySendActions[SendAuthorize]->setIcon(iconman->getIcon(IconManager::AuthorizeMessageIcon));
194   mySendActions[SendReqAuthorize]->setIcon(iconman->getIcon(IconManager::ReqAuthorizeMessageIcon));
195 
196   myCustomArAction->setIcon(iconman->getIcon(IconManager::CustomArIcon));
197   myRemoveUserAction->setIcon(iconman->getIcon(IconManager::RemoveIcon));
198   mySetKeyAction->setIcon(iconman->getIcon(IconManager::GpgKeyIcon));
199   myViewHistoryAction->setIcon(iconman->getIcon(IconManager::HistoryIcon));
200   myViewGeneralAction->setIcon(iconman->getIcon(IconManager::InfoIcon));
201 }
202 
updateGroups()203 void UserMenu::updateGroups()
204 {
205   QAction* a;
206 
207   // Clear old groups but leave system groups as they never change
208   foreach (a, myUserGroupActions->actions())
209     delete a;
210   foreach (a, myServerGroupActions->actions())
211     delete a;
212 
213   Licq::GroupListGuard groupList;
214   BOOST_FOREACH(const Licq::Group* group, **groupList)
215   {
216     Licq::GroupReadGuard pGroup(group);
217 
218     QString name = QString::fromLocal8Bit(pGroup->name().c_str());
219     name.replace("&", "&&");
220 
221     a = myUserGroupActions->addAction(name);
222     a->setData(pGroup->id());
223     a->setCheckable(true);
224 
225     a = myServerGroupActions->addAction(name);
226     a->setData(pGroup->id());
227     a->setCheckable(true);
228   }
229 
230   // Add groups to menu
231   myGroupsMenu->insertActions(myGroupSeparator, myUserGroupActions->actions());
232   myServerGroupsMenu->addActions(myServerGroupActions->actions());
233 }
234 
aboutToShowMenu()235 void UserMenu::aboutToShowMenu()
236 {
237   Licq::UserReadGuard u(myUserId);
238 
239   unsigned status = (!u.isLocked() ? static_cast<unsigned>(User::OfflineStatus) : u->status());
240 
241   myCheckArAction->setEnabled(status != User::OfflineStatus);
242   myMakePermanentAction->setVisible(!u.isLocked() ? false : u->NotInList());
243 
244   if (status & User::MessageStatuses)
245     myCheckArAction->setText(tr("Check %1 Response...")
246         .arg(u->statusString(true, false).c_str()));
247   else
248     myCheckArAction->setText(tr("Check Auto Response..."));
249 
250   if (!u.isLocked())
251     return;
252 
253   myMiscModesActions[ModeAcceptInAway]->setChecked(u->AcceptInAway());
254   myMiscModesActions[ModeAcceptInNa]->setChecked(u->AcceptInNA());
255   myMiscModesActions[ModeAcceptInOccupied]->setChecked(u->AcceptInOccupied());
256   myMiscModesActions[ModeAcceptInDnd]->setChecked(u->AcceptInDND());
257   myMiscModesActions[ModeAutoFileAccept]->setChecked(u->AutoFileAccept());
258   myMiscModesActions[ModeAutoChatAccept]->setChecked(u->AutoChatAccept());
259   myMiscModesActions[ModeAutoSecure]->setChecked(u->AutoSecure());
260   myMiscModesActions[ModeAutoSecure]->setEnabled(Licq::gDaemon.haveCryptoSupport());
261   myMiscModesActions[ModeUseGpg]->setChecked(u->UseGPG());
262   myMiscModesActions[ModeUseRealIp]->setChecked(u->SendRealIp());
263   myMiscModesActions[ModeStatusOnline]->setChecked(u->statusToUser() == User::OnlineStatus);
264   myMiscModesActions[ModeStatusAway]->setChecked(u->statusToUser() & User::AwayStatus);
265   myMiscModesActions[ModeStatusNa]->setChecked(u->statusToUser() & User::NotAvailableStatus);
266   myMiscModesActions[ModeStatusOccupied]->setChecked(u->statusToUser() & User::OccupiedStatus);
267   myMiscModesActions[ModeStatusDnd]->setChecked(u->statusToUser() & User::DoNotDisturbStatus);
268 
269   myCustomArAction->setChecked(!u->customAutoResponse().empty());
270 
271   mySendActions[SendChat]->setEnabled(u->isOnline());
272   mySendActions[SendFile]->setEnabled(u->isOnline());
273   if (u->Secure())
274   {
275     mySendActions[SendKey]->setText(tr("Close &Secure Channel..."));
276     mySendActions[SendKey]->setIcon(IconManager::instance()->getIcon(IconManager::SecureOnIcon));
277   }
278   else
279   {
280     mySendActions[SendKey]->setText(tr("Request &Secure Channel..."));
281     mySendActions[SendKey]->setIcon(IconManager::instance()->getIcon(IconManager::SecureOffIcon));
282   }
283 
284   unsigned long sendFuncs = u->protocolCapabilities();
285   bool isIcq = myPpid == ICQ_PPID;
286 
287   mySendActions[SendMessage]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendMsg);
288   mySendActions[SendUrl]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendUrl);
289   mySendActions[SendChat]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendChat);
290   mySendActions[SendFile]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendFile);
291   mySendActions[SendContact]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendContact);
292   mySendActions[SendAuthorize]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendAuth);
293   mySendActions[SendReqAuthorize]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendAuthReq);
294   mySendActions[SendKey]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendSecure);
295   myMiscModesActions[ModeAutoFileAccept]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendFile);
296   myMiscModesActions[ModeAutoChatAccept]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendChat);
297   myMiscModesActions[ModeAutoSecure]->setVisible(sendFuncs & Licq::ProtocolPlugin::CanSendSecure);
298   myMiscModesActions[ModeOnlineNotify]->setChecked(u->OnlineNotify());
299   myMiscModesActions[ModeVisibleList]->setChecked(u->VisibleList());
300   myMiscModesActions[ModeInvisibleList]->setChecked(u->InvisibleList());
301   myMiscModesActions[ModeIgnoreList]->setChecked(u->IgnoreList());
302   myMiscModesActions[ModeNewUser]->setChecked(u->NewUser());
303 
304   // ICQ Protocol only
305   mySendActions[RequestUpdateInfoPlugin]->setVisible(isIcq);
306   mySendActions[RequestUpdateStatusPlugin]->setVisible(isIcq);
307   mySendActions[RequestPhoneFollowMeStatus]->setVisible(isIcq);
308   mySendActions[RequestIcqphoneStatus]->setVisible(isIcq);
309   mySendActions[RequestFileServerStatus]->setVisible(isIcq);
310   myCheckArAction->setVisible(isIcq);
311   myCustomArAction->setVisible(isIcq);
312   myMiscModesActions[ModeUseRealIp]->setVisible(isIcq);
313   myMiscModesActions[ModeStatusOnline]->setVisible(isIcq);
314   myMiscModesActions[ModeStatusAway]->setVisible(isIcq);
315   myMiscModesActions[ModeStatusNa]->setVisible(isIcq);
316   myMiscModesActions[ModeStatusOccupied]->setVisible(isIcq);
317   myMiscModesActions[ModeStatusDnd]->setVisible(isIcq);
318 
319   if (myShowShortcuts)
320   {
321     // Display shortcuts
322     // Note: These shortcuts are only for display, the actual shortcuts for
323     //       the main contact list are handled in mainwin.
324     Config::Shortcuts* shortcuts = Config::Shortcuts::instance();
325 
326     myCheckArAction->setShortcut(shortcuts->getShortcut(Config::Shortcuts::MainwinUserCheckAutoresponse));
327     mySendActions[SendChat]->setShortcut(shortcuts->getShortcut(Config::Shortcuts::MainwinUserSendChatRequest));
328     mySendActions[SendMessage]->setShortcut(shortcuts->getShortcut(Config::Shortcuts::MainwinUserSendMessage));
329     mySendActions[SendFile]->setShortcut(shortcuts->getShortcut(Config::Shortcuts::MainwinUserSendFile));
330     mySendActions[SendUrl]->setShortcut(shortcuts->getShortcut(Config::Shortcuts::MainwinUserSendUrl));
331     myViewHistoryAction->setShortcut(shortcuts->getShortcut(Config::Shortcuts::MainwinUserViewHistory));
332     myViewEventAction->setShortcut(shortcuts->getShortcut(Config::Shortcuts::MainwinUserViewMessage));
333   }
334   else
335   {
336     // Hide the shortcuts (e.g. menu is displayed from a dialog)
337     myCheckArAction->setShortcut(QKeySequence());
338     mySendActions[SendChat]->setShortcut(QKeySequence());
339     mySendActions[SendMessage]->setShortcut(QKeySequence());
340     mySendActions[SendFile]->setShortcut(QKeySequence());
341     mySendActions[SendUrl]->setShortcut(QKeySequence());
342     myViewHistoryAction->setShortcut(QKeySequence());
343     myViewEventAction->setShortcut(QKeySequence());
344   }
345 
346   int serverGroup = u->serverGroup();
347 
348   // Update group memberships
349   foreach (QAction* a, myUserGroupActions->actions())
350   {
351     int gid = a->data().toInt();
352     bool inGroup = u->isInGroup(gid);
353     a->setChecked(inGroup);
354 
355     // Don't allow leaving group if contact is member of the same group at the server side
356     a->setEnabled(!inGroup || gid != serverGroup);
357   }
358   myServerGroupsMenu->menuAction()->setVisible(serverGroup > -1);
359   foreach (QAction* a, myServerGroupActions->actions())
360     a->setChecked(a->data().toInt() == serverGroup);
361 }
362 
setUser(const Licq::UserId & userId,bool showShortcuts)363 void UserMenu::setUser(const Licq::UserId& userId, bool showShortcuts)
364 {
365   myUserId = userId;
366   myId = userId.accountId().c_str();
367   myPpid = userId.protocolId();
368   myShowShortcuts = showShortcuts;
369 }
370 
popup(QPoint pos,const Licq::UserId & userId,bool showShortcuts)371 void UserMenu::popup(QPoint pos, const Licq::UserId& userId, bool showShortcuts)
372 {
373   setUser(userId, showShortcuts);
374   QMenu::popup(pos);
375 }
376 
viewEvent()377 void UserMenu::viewEvent()
378 {
379   gLicqGui->showViewEventDialog(myUserId);
380 }
381 
checkAutoResponse()382 void UserMenu::checkAutoResponse()
383 {
384   new ShowAwayMsgDlg(myUserId, true);
385 }
386 
customAutoResponse()387 void UserMenu::customAutoResponse()
388 {
389   new CustomAutoRespDlg(myUserId);
390 }
391 
makePermanent()392 void UserMenu::makePermanent()
393 {
394   Licq::gUserManager.addUser(myUserId, true, true);
395 }
396 
toggleFloaty()397 void UserMenu::toggleFloaty()
398 {
399   gLicqGui->toggleFloaty(myUserId);
400 }
401 
removeContact()402 void UserMenu::removeContact()
403 {
404   gLicqGui->removeUserFromList(myUserId);
405 }
406 
selectKey()407 void UserMenu::selectKey()
408 {
409   new GPGKeySelect(myUserId);
410 }
411 
copyIdToClipboard()412 void UserMenu::copyIdToClipboard()
413 {
414   QClipboard* clip = qApp->clipboard();
415   QClipboard::Mode mode = QClipboard::Clipboard;
416 
417   if (clip->supportsSelection())
418     mode = QClipboard::Selection;
419 
420   clip->setText(myId, mode);
421 }
422 
viewHistory()423 void UserMenu::viewHistory()
424 {
425   new HistoryDlg(myUserId);
426 }
427 
viewInfoGeneral()428 void UserMenu::viewInfoGeneral()
429 {
430   UserDlg::showDialog(myUserId);
431 }
432 
send(QAction * action)433 void UserMenu::send(QAction* action)
434 {
435   int index = action->data().toInt();
436 
437   Licq::IcqProtocol::Ptr icq;
438   if (myPpid == ICQ_PPID)
439     icq = plugin_internal_cast<Licq::IcqProtocol>(
440         Licq::gPluginManager.getProtocolInstance(myUserId.ownerId()));
441 
442   switch (index)
443   {
444     case SendAuthorize:
445       new AuthDlg(AuthDlg::GrantAuth, myUserId);
446       break;
447 
448     case SendReqAuthorize:
449       new AuthDlg(AuthDlg::RequestAuth, myUserId);
450       break;
451 
452     case SendKey:
453       new KeyRequestDlg(myUserId);
454       break;
455 
456     case RequestUpdateInfoPlugin:
457       if (icq != NULL)
458         icq->icqRequestPluginInfo(myUserId, Licq::IcqProtocol::PluginInfoList, true);
459       break;
460 
461     case RequestUpdateStatusPlugin:
462       if (icq != NULL)
463         icq->icqRequestPluginInfo(myUserId, Licq::IcqProtocol::PluginStatusList, true);
464       break;
465 
466     case RequestPhoneFollowMeStatus:
467       if (icq != NULL)
468         icq->icqRequestPluginInfo(myUserId, Licq::IcqProtocol::PluginPhoneFollowMe, true);
469       break;
470 
471     case RequestIcqphoneStatus:
472       if (icq != NULL)
473         icq->icqRequestPluginInfo(myUserId, Licq::IcqProtocol::PluginIcqPhone, true);
474       break;
475 
476     case RequestFileServerStatus:
477       if (icq != NULL)
478         icq->icqRequestPluginInfo(myUserId, Licq::IcqProtocol::PluginSharedFiles, true);
479       break;
480 
481     default:
482       gLicqGui->showEventDialog(index, myUserId);
483   }
484 }
485 
toggleMiscMode(QAction * action)486 void UserMenu::toggleMiscMode(QAction* action)
487 {
488   int mode = action->data().toInt();
489   bool newState = action->isChecked();
490 
491   Licq::UserWriteGuard u(myUserId);
492   if (!u.isLocked())
493     return;
494 
495   switch (mode)
496   {
497     case ModeAcceptInAway:
498       u->SetAcceptInAway(newState);
499       break;
500 
501     case ModeAcceptInNa:
502       u->SetAcceptInNA(newState);
503       break;
504 
505     case ModeAcceptInOccupied:
506       u->SetAcceptInOccupied(newState);
507       break;
508 
509     case ModeAcceptInDnd:
510       u->SetAcceptInDND(newState);
511       break;
512 
513     case ModeAutoFileAccept:
514       u->SetAutoFileAccept(newState);
515       break;
516 
517     case ModeAutoChatAccept:
518       u->SetAutoChatAccept(newState);
519       break;
520 
521     case ModeAutoSecure:
522       u->SetAutoSecure(newState);
523       break;
524 
525     case ModeUseGpg:
526     {
527       if (!u->gpgKey().empty())
528       {
529         u->SetUseGPG(newState);
530         u.unlock();
531 
532         // Notify all plugins (including ourselves)
533         Licq::gUserManager.notifyUserUpdated(myUserId, Licq::PluginSignal::UserSecurity);
534       }
535       else
536       {
537         u.unlock();
538         new GPGKeySelect(myUserId);
539       }
540       return;
541     }
542 
543     case ModeUseRealIp:
544       u->SetSendRealIp(newState);
545       break;
546 
547     case ModeStatusOnline:
548       u->setStatusToUser(newState ? User::OnlineStatus : User::OfflineStatus);
549       break;
550 
551     case ModeStatusAway:
552       u->setStatusToUser(newState ? User::AwayStatus | User::OnlineStatus : User::OfflineStatus);
553       break;
554 
555     case ModeStatusNa:
556       u->setStatusToUser(newState ? User::NotAvailableStatus | User::OnlineStatus : User::OfflineStatus);
557       break;
558 
559     case ModeStatusOccupied:
560       u->setStatusToUser(newState ? User::OccupiedStatus | User::OnlineStatus : User::OfflineStatus);
561       break;
562 
563     case ModeStatusDnd:
564       u->setStatusToUser(newState ? User::DoNotDisturbStatus | User::OnlineStatus : User::OfflineStatus);
565       break;
566   }
567   u.unlock();
568 
569   // Notify all plugins (including ourselves)
570   Licq::gUserManager.notifyUserUpdated(myUserId, Licq::PluginSignal::UserSettings);
571 }
572 
toggleUserGroup(QAction * action)573 void UserMenu::toggleUserGroup(QAction* action)
574 {
575   int gid = action->data().toInt();
576   Licq::gUserManager.setUserInGroup(myUserId, gid, action->isChecked(), false);
577 }
578 
toggleSystemGroup(QAction * action)579 void UserMenu::toggleSystemGroup(QAction* action)
580 {
581   int gid = action->data().toInt();
582 
583   if (gid == ContactListModel::IgnoreListGroupId && action->isChecked())
584   {
585     QString alias;
586     {
587       Licq::UserReadGuard u(myUserId);
588       if (!u.isLocked())
589         return;
590       alias = QString::fromUtf8(u->getAlias().c_str());
591     }
592 
593     if(!QueryYesNo(this, tr("Do you really want to add\n%1 (%2)\nto your ignore list?")
594         .arg(alias).arg(myId)))
595       return;
596   }
597 
598   gLicqGui->setUserInGroup(myUserId, gid, action->isChecked(), true);
599 }
600 
setServerGroup(QAction * action)601 void UserMenu::setServerGroup(QAction* action)
602 {
603   int gid = action->data().toInt();
604   Licq::gUserManager.setUserInGroup(myUserId, gid, true, true);
605 }
606