/indra/newview/llpanelpeoplemenus.cpp
C++ | 197 lines | 118 code | 32 blank | 47 comment | 30 complexity | 1cb575ee32121c11d3f956f28b1ba81c MD5 | raw file
Possible License(s): LGPL-2.1
- /**
- * @file llpanelpeoplemenus.h
- * @brief Menus used by the side tray "People" panel
- *
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
- #include "llviewerprecompiledheaders.h"
- // libs
- #include "llmenugl.h"
- #include "lluictrlfactory.h"
- #include "llpanelpeoplemenus.h"
- // newview
- #include "llagent.h"
- #include "llagentdata.h" // for gAgentID
- #include "llavataractions.h"
- #include "llcallingcard.h" // for LLAvatarTracker
- #include "llviewermenu.h" // for gMenuHolder
- namespace LLPanelPeopleMenus
- {
- NearbyMenu gNearbyMenu;
- //== NearbyMenu ===============================================================
- LLContextMenu* NearbyMenu::createMenu()
- {
- // set up the callbacks for all of the avatar menu items
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
- if ( mUUIDs.size() == 1 )
- {
- // Set up for one person selected menu
- const LLUUID& id = mUUIDs.front();
- registrar.add("Avatar.Profile", boost::bind(&LLAvatarActions::showProfile, id));
- registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, id));
- registrar.add("Avatar.RemoveFriend", boost::bind(&LLAvatarActions::removeFriendDialog, id));
- registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, id));
- registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id));
- registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
- registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::showOnMap, id));
- registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, id));
- registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, id));
- registrar.add("Avatar.BlockUnblock", boost::bind(&LLAvatarActions::toggleBlock, id));
- enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2));
- enable_registrar.add("Avatar.CheckItem", boost::bind(&NearbyMenu::checkContextMenuItem, this, _2));
- // create the context menu from the XUI
- return createFromFile("menu_people_nearby.xml");
- }
- else
- {
- // Set up for multi-selected People
- // registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented
- registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs));
- registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs));
- registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
- registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs));
- // registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, mUUIDs)); // *TODO: unimplemented
- // registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs)); // *TODO: unimplemented
- enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2));
- // create the context menu from the XUI
- return createFromFile("menu_people_nearby_multiselect.xml");
- }
- }
- bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
- {
- std::string item = userdata.asString();
- // Note: can_block and can_delete is used only for one person selected menu
- // so we don't need to go over all uuids.
- if (item == std::string("can_block"))
- {
- const LLUUID& id = mUUIDs.front();
- return LLAvatarActions::canBlock(id);
- }
- else if (item == std::string("can_add"))
- {
- // We can add friends if:
- // - there are selected people
- // - and there are no friends among selection yet.
- //EXT-7389 - disable for more than 1
- if(mUUIDs.size() > 1)
- {
- return false;
- }
- bool result = (mUUIDs.size() > 0);
- uuid_vec_t::const_iterator
- id = mUUIDs.begin(),
- uuids_end = mUUIDs.end();
- for (;id != uuids_end; ++id)
- {
- if ( LLAvatarActions::isFriend(*id) )
- {
- result = false;
- break;
- }
- }
- return result;
- }
- else if (item == std::string("can_delete"))
- {
- // We can remove friends if:
- // - there are selected people
- // - and there are only friends among selection.
- bool result = (mUUIDs.size() > 0);
- uuid_vec_t::const_iterator
- id = mUUIDs.begin(),
- uuids_end = mUUIDs.end();
- for (;id != uuids_end; ++id)
- {
- if ( !LLAvatarActions::isFriend(*id) )
- {
- result = false;
- break;
- }
- }
- return result;
- }
- else if (item == std::string("can_call"))
- {
- return LLAvatarActions::canCall();
- }
- else if (item == std::string("can_show_on_map"))
- {
- const LLUUID& id = mUUIDs.front();
- return (LLAvatarTracker::instance().isBuddyOnline(id) && is_agent_mappable(id))
- || gAgent.isGodlike();
- }
- else if(item == std::string("can_offer_teleport"))
- {
- return LLAvatarActions::canOfferTeleport(mUUIDs);
- }
- return false;
- }
- bool NearbyMenu::checkContextMenuItem(const LLSD& userdata)
- {
- std::string item = userdata.asString();
- const LLUUID& id = mUUIDs.front();
- if (item == std::string("is_blocked"))
- {
- return LLAvatarActions::isBlocked(id);
- }
- return false;
- }
- void NearbyMenu::offerTeleport()
- {
- // boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(),
- // so we have to use a wrapper.
- LLAvatarActions::offerTeleport(mUUIDs);
- }
- } // namespace LLPanelPeopleMenus