diff options
author | Andrei Karas <akaras@inbox.ru> | 2014-05-17 17:20:37 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2014-05-17 17:20:37 +0300 |
commit | 6d432c0b73e21e0ef72df1010d1353ce9d5b3645 (patch) | |
tree | ccb8fcc4ef342c69532125507ae4dfb5a3d23b3e /src/gui/widgets/tabs/socialfriendstab.h | |
parent | 4f1f8531f01f918761b01999b603f4d210375258 (diff) | |
download | manaverse-6d432c0b73e21e0ef72df1010d1353ce9d5b3645.tar.gz manaverse-6d432c0b73e21e0ef72df1010d1353ce9d5b3645.tar.bz2 manaverse-6d432c0b73e21e0ef72df1010d1353ce9d5b3645.tar.xz manaverse-6d432c0b73e21e0ef72df1010d1353ce9d5b3645.zip |
Move socialfriendstab into separate file.
Diffstat (limited to 'src/gui/widgets/tabs/socialfriendstab.h')
-rw-r--r-- | src/gui/widgets/tabs/socialfriendstab.h | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/gui/widgets/tabs/socialfriendstab.h b/src/gui/widgets/tabs/socialfriendstab.h new file mode 100644 index 000000000..776fd6f4b --- /dev/null +++ b/src/gui/widgets/tabs/socialfriendstab.h @@ -0,0 +1,149 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2014 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef GUI_WIDGETS_TABS_SOCIALFRIENDSTAB_H +#define GUI_WIDGETS_TABS_SOCIALFRIENDSTAB_H + +#include "gui/widgets/tabs/socialtab.h" + +#include "utils/delete2.h" +#include "utils/gettext.h" + +#include "localconsts.h" + +namespace +{ + static class SortFriendsFunctor final + { + public: + bool operator() (const Avatar *const m1, + const Avatar *const m2) const + { + if (!m1 || !m2) + return false; + + if (m1->getOnline() != m2->getOnline()) + return m1->getOnline() > m2->getOnline(); + + if (m1->getName() != m2->getName()) + { + std::string s1 = m1->getName(); + std::string s2 = m2->getName(); + toLower(s1); + toLower(s2); + return s1 < s2; + } + return false; + } + } friendSorter; +} // namespace + +class SocialFriendsTab final : public SocialTab +{ + public: + SocialFriendsTab(const Widget2 *const widget, + std::string name, + const bool showBackground) : + SocialTab(widget), + mBeings(new BeingsListModel) + { + mList = new AvatarListBox(this, mBeings); + mList->postInit(); + mScroll = new ScrollArea(this, mList, showBackground, + "social_background.xml"); + + mScroll->setHorizontalScrollPolicy(ScrollArea::SHOW_AUTO); + mScroll->setVerticalScrollPolicy(ScrollArea::SHOW_ALWAYS); + + getPlayersAvatars(); + setCaption(name); + } + + A_DELETE_COPY(SocialFriendsTab) + + ~SocialFriendsTab() + { + delete2(mList) + delete2(mScroll) + delete2(mBeings) + } + + void updateList() override final + { + getPlayersAvatars(); + } + + void getPlayersAvatars() + { + if (!actorManager) + return; + + std::vector<Avatar*> *const avatars = mBeings->getMembers(); + if (!avatars) + return; + + std::vector<Avatar*>::iterator ia = avatars->begin(); + while (ia != avatars->end()) + { + delete *ia; + ++ ia; + } + avatars->clear(); + + const StringVect *const players + = player_relations.getPlayersByRelation( + PlayerRelation::FRIEND); + + const std::set<std::string> &players2 + = whoIsOnline->getOnlineNicks(); + + if (!players) + return; + + int online = 0; + int total = 0; + + FOR_EACHP (StringVectCIter, it, players) + { + Avatar *const ava = new Avatar(*it); + if (actorManager->findBeingByName(*it, ActorType::PLAYER) + || players2.find(*it) != players2.end()) + { + ava->setOnline(true); + online ++; + } + total ++; + avatars->push_back(ava); + } + std::sort(avatars->begin(), avatars->end(), friendSorter); + delete players; + + // TRANSLATORS: social window label + mCounterString = strprintf(_("Friends: %u/%u"), + static_cast<uint32_t>(online), + static_cast<uint32_t>(total)); + updateCounter(); + } + + private: + BeingsListModel *mBeings; +}; + +#endif // GUI_WIDGETS_TABS_SOCIALFRIENDSTAB_H |