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