diff options
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/gui/widgets/tabs/socialfriendstab.h | 149 | ||||
-rw-r--r-- | src/gui/windows/socialwindow.cpp | 118 |
4 files changed, 152 insertions, 117 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fdeaf0115..fcda4ce46 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -261,6 +261,7 @@ SET(SRCS gui/widgets/tabs/shortcuttab.h gui/widgets/tabs/skilltab.h gui/widgets/tabs/socialattacktab.h + gui/widgets/tabs/socialfriendstab.h gui/widgets/tabs/socialguildtab.h gui/widgets/tabs/socialguildtab2.h gui/widgets/tabs/socialnavigationtab.h diff --git a/src/Makefile.am b/src/Makefile.am index d8429b968..fe412fc0a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -359,6 +359,7 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \ gui/widgets/tabs/shortcuttab.h \ gui/widgets/tabs/skilltab.h \ gui/widgets/tabs/socialattacktab.h \ + gui/widgets/tabs/socialfriendstab.h \ gui/widgets/tabs/socialguildtab.h \ gui/widgets/tabs/socialguildtab2.h \ gui/widgets/tabs/socialnavigationtab.h \ 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 diff --git a/src/gui/windows/socialwindow.cpp b/src/gui/windows/socialwindow.cpp index 4c19a18f5..9b828aac0 100644 --- a/src/gui/windows/socialwindow.cpp +++ b/src/gui/windows/socialwindow.cpp @@ -56,6 +56,7 @@ #include "gui/widgets/tabs/chattab.h" #include "gui/widgets/tabs/socialattacktab.h" +#include "gui/widgets/tabs/socialfriendstab.h" #include "gui/widgets/tabs/socialguildtab.h" #include "gui/widgets/tabs/socialguildtab2.h" #include "gui/widgets/tabs/socialnavigationtab.h" @@ -74,123 +75,6 @@ extern unsigned int tmwServerVersion; -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; -}; - - class CreatePopup final : public Popup, public LinkHandler { public: |