UserListView.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*
  2. * Copyright 2021, Jaidyn Levesque <jadedctrl@teknik.io>
  3. * All rights reserved. Distributed under the terms of the MIT license.
  4. */
  5. #include "UserListView.h"
  6. #include <Catalog.h>
  7. #include <PopUpMenu.h>
  8. #include <MenuItem.h>
  9. #include <Window.h>
  10. #include "AppMessages.h"
  11. #include "ChatProtocolMessages.h"
  12. #include "Conversation.h"
  13. #include "MainWindow.h"
  14. #include "ProtocolLooper.h"
  15. #include "Role.h"
  16. #include "Server.h"
  17. #include "TheApp.h"
  18. #include "User.h"
  19. #include "UserInfoWindow.h"
  20. #include "UserItem.h"
  21. #undef B_TRANSLATION_CONTEXT
  22. #define B_TRANSLATION_CONTEXT "UserListView"
  23. static int
  24. compare_by_name(const void* _item1, const void* _item2)
  25. {
  26. UserItem* item1 = *(UserItem**)_item1;
  27. UserItem* item2 = *(UserItem**)_item2;
  28. return item1->GetUser()->GetName().ICompare(item2->GetUser()->GetName());
  29. }
  30. UserListView::UserListView(const char* name)
  31. : BListView(name),
  32. fChat(NULL)
  33. {
  34. }
  35. void
  36. UserListView::MouseDown(BPoint where)
  37. {
  38. BListView::MouseDown(where);
  39. uint32 buttons = 0;
  40. Window()->CurrentMessage()->FindInt32("buttons", (int32*)&buttons);
  41. if (!(buttons & B_SECONDARY_MOUSE_BUTTON))
  42. return;
  43. if (CurrentSelection() >= 0)
  44. _UserPopUp()->Go(ConvertToScreen(where), true, false);
  45. else
  46. _BlankPopUp()->Go(ConvertToScreen(where), true, false);
  47. }
  48. void
  49. UserListView::Sort()
  50. {
  51. SortItems(compare_by_name);
  52. }
  53. bool
  54. UserListView::HasUser(User* user)
  55. {
  56. for (int i = 0; i < CountItems(); i++)
  57. if (user == ((UserItem*)ItemAt(i))->GetUser())
  58. return true;
  59. return false;
  60. }
  61. void
  62. UserListView::AddUser(User* user)
  63. {
  64. AddItem(new UserItem(user));
  65. }
  66. void
  67. UserListView::RemoveUser(User* user)
  68. {
  69. for (int i = 0; i < CountItems(); i++)
  70. if (user == ((UserItem*)ItemAt(i))->GetUser())
  71. RemoveItem(i);
  72. }
  73. BPopUpMenu*
  74. UserListView::_UserPopUp()
  75. {
  76. BPopUpMenu* menu = new BPopUpMenu("userPopUp");
  77. UserItem* item = (UserItem*)ItemAt(CurrentSelection());
  78. User* selected_user;
  79. if (item == NULL || (selected_user = item->GetUser()) == NULL)
  80. return _BlankPopUp();
  81. Role* own_role = fChat->GetRole(fChat->GetOwnContact()->GetId());
  82. Role* selected_role = fChat->GetRole(selected_user->GetId());
  83. Server* server = ((TheApp*)be_app)->GetMainWindow()->GetServer();
  84. BObjectList<BMessage> items = server->UserPopUpItems();
  85. BObjectList<BMessage> protoItems = fChat->GetProtocolLooper()->Protocol()->UserPopUpItems();
  86. items.AddList(&protoItems);
  87. for (int i = 0; i < items.CountItems(); i++) {
  88. BMessage* itemMsg = items.ItemAt(i);
  89. _ProcessItem(itemMsg, menu, own_role, selected_role, selected_user->GetId());
  90. }
  91. return menu;
  92. }
  93. BPopUpMenu*
  94. UserListView::_BlankPopUp()
  95. {
  96. BPopUpMenu* menu = new BPopUpMenu("blankPopUp");
  97. BMenuItem* invite = new BMenuItem(B_TRANSLATE("Invite user"
  98. B_UTF8_ELLIPSIS), new BMessage(APP_SEND_INVITE), 'I', B_COMMAND_KEY);
  99. if (fChat == NULL)
  100. invite->SetEnabled(false);
  101. menu->AddItem(invite);
  102. menu->SetTargetForItems(Window());
  103. return menu;
  104. }
  105. void
  106. UserListView::_ProcessItem(BMessage* itemMsg, BPopUpMenu* menu, Role* user,
  107. Role* target, BString target_id)
  108. {
  109. BMessage* msg = new BMessage(*itemMsg);
  110. bool priority = msg->GetBool("x_priority", false);
  111. int32 perms = msg->GetInt32("x_perms", 0);
  112. int32 target_perms = msg->GetInt32("x_target_perms", 0);
  113. int32 target_antiperms = msg->GetInt32("x_target_antiperms", 0);
  114. BMessage toSend;
  115. msg->FindMessage("_msg", &toSend);
  116. toSend.AddString("user_id", target_id);
  117. toSend.AddString("chat_id", fChat->GetId());
  118. toSend.AddInt64("instance", fChat->GetProtocolLooper()->GetInstance());
  119. msg->ReplaceMessage("_msg", &toSend);
  120. if ((perms == 0 || ((user != NULL) && (user->fPerms & perms)))
  121. && ((target == NULL) ||
  122. ((target_perms == 0 || (target->fPerms & target_perms))
  123. && (target_antiperms == 0 || (!(target->fPerms & target_antiperms)))
  124. && ((priority == false) || (user->fPriority > target->fPriority)))))
  125. {
  126. BMenuItem* item = new BMenuItem(msg);
  127. if (msg->GetBool("x_to_protocol", true) == true)
  128. item->SetTarget(fChat->GetProtocolLooper());
  129. else
  130. item->SetTarget(Window());
  131. menu->AddItem(item);
  132. }
  133. }