1 /* 2 * The ManaPlus Client 3 * Copyright (C) 2011-2019 The ManaPlus Developers 4 * Copyright (C) 2019-2021 Andrei Karas 5 * 6 * This file is part of The ManaPlus Client. 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program. If not, see <http://www.gnu.org/licenses/>. 20 */ 21 22 #ifndef GUI_WIDGETS_TABS_SOCIALFRIENDSTAB_H 23 #define GUI_WIDGETS_TABS_SOCIALFRIENDSTAB_H 24 25 #include "gui/widgets/tabs/socialtab.h" 26 27 #include "actormanager.h" 28 29 #include "being/playerrelations.h" 30 31 #include "gui/models/beingslistmodel.h" 32 33 #include "gui/windows/whoisonline.h" 34 35 #include "gui/widgets/tabs/socialfriendsfunctor.h" 36 37 #include "utils/delete2.h" 38 #include "utils/foreach.h" 39 #include "utils/gettext.h" 40 41 #include "localconsts.h" 42 43 class SocialFriendsTab final : public SocialTab 44 { 45 public: SocialFriendsTab(const Widget2 * const widget,const std::string & name,const Opaque showBackground)46 SocialFriendsTab(const Widget2 *const widget, 47 const std::string &name, 48 const Opaque showBackground) : 49 SocialTab(widget), 50 mBeings(new BeingsListModel), 51 mFriendSorter() 52 { 53 createControls(mBeings, showBackground); 54 55 getPlayersAvatars(); 56 setCaption(name); 57 mMenuAction = "friends"; 58 } 59 60 A_DELETE_COPY(SocialFriendsTab) 61 ~SocialFriendsTab()62 ~SocialFriendsTab() override final 63 { 64 delete2(mList) 65 delete2(mScroll) 66 delete2(mBeings) 67 } 68 updateList()69 void updateList() override final 70 { 71 getPlayersAvatars(); 72 } 73 getPlayersAvatars()74 void getPlayersAvatars() 75 { 76 if (actorManager == nullptr) 77 return; 78 79 STD_VECTOR<Avatar*> *const avatars = mBeings->getMembers(); 80 81 STD_VECTOR<Avatar*>::iterator ia = avatars->begin(); 82 while (ia != avatars->end()) 83 { 84 delete *ia; 85 ++ ia; 86 } 87 avatars->clear(); 88 89 const StringVect *const players 90 = playerRelations.getPlayersByRelation(Relation::FRIEND); 91 92 const std::set<std::string> &players2 93 = whoIsOnline->getOnlineNicks(); 94 95 if (players == nullptr) 96 return; 97 98 int online = 0; 99 int total = 0; 100 101 FOR_EACHP (StringVectCIter, it, players) 102 { 103 Avatar *const ava = new Avatar(*it); 104 if (actorManager->findBeingByName(*it, ActorType::Player) != 105 nullptr || players2.find(*it) != players2.end()) 106 { 107 ava->setOnline(true); 108 online ++; 109 } 110 total ++; 111 avatars->push_back(ava); 112 } 113 std::sort(avatars->begin(), avatars->end(), mFriendSorter); 114 delete players; 115 116 // TRANSLATORS: social window label 117 mCounterString = strprintf(_("Friends: %u/%u"), 118 CAST_U32(online), 119 CAST_U32(total)); 120 updateCounter(); 121 } 122 123 private: 124 BeingsListModel *mBeings; 125 SortFriendsFunctor mFriendSorter; 126 }; 127 128 #endif // GUI_WIDGETS_TABS_SOCIALFRIENDSTAB_H 129