Embed Minimap into the Nearby list of the People Sidebar

master
Twisted Laws 2011-01-26 19:22:42 -05:00
parent 3eba59e963
commit 0d5b0cad14
8 changed files with 205 additions and 13 deletions

View File

@ -387,6 +387,7 @@ Jonathan Yap
VWR-17801
VWR-24347
STORM-844
STORM-643
Kage Pixel
VWR-11
Ken March
@ -769,6 +770,7 @@ Twisted Laws
STORM-466
STORM-467
STORM-844
STORM-643
Vadim Bigbear
VWR-2681
Vector Hastings

View File

@ -83,7 +83,8 @@ LLFloaterMap::~LLFloaterMap()
BOOL LLFloaterMap::postBuild()
{
mMap = getChild<LLNetMap>("Net Map");
mMap->setToolTipMsg(getString("ToolTipMsg"));
mMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
getString("AltToolTipMsg") : getString("ToolTipMsg"));
sendChildToBack(mMap);
mTextBoxNorth = getChild<LLTextBox> ("floater_map_north");

View File

@ -47,6 +47,7 @@
#include "llagentcamera.h"
#include "llappviewer.h" // for gDisconnected
#include "llcallingcard.h" // LLAvatarTracker
#include "llfloaterworldmap.h"
#include "lltracker.h"
#include "llsurface.h"
#include "llviewercamera.h"
@ -91,7 +92,8 @@ LLNetMap::LLNetMap (const Params & p)
mObjectImagep(),
mClosestAgentToCursor(),
mClosestAgentAtLastRightClick(),
mToolTipMsg()
mToolTipMsg(),
mPopupMenu(NULL)
{
mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS);
setScale(gSavedSettings.getF32("MiniMapScale"));
@ -102,6 +104,21 @@ LLNetMap::~LLNetMap()
gSavedSettings.setF32("MiniMapScale", mScale);
}
BOOL LLNetMap::postBuild()
{
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
registrar.add("Minimap.Zoom", boost::bind(&LLNetMap::handleZoom, this, _2));
registrar.add("Minimap.Tracker", boost::bind(&LLNetMap::handleStopTracking, this, _2));
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if (mPopupMenu && !LLTracker::isTracking(0))
{
mPopupMenu->setItemEnabled ("Stop Tracking", false);
}
return TRUE;
}
void LLNetMap::setScale( F32 scale )
{
scale = llclamp(scale, MAP_SCALE_MIN, MAP_SCALE_MAX);
@ -354,16 +371,49 @@ void LLNetMap::draw()
pos_map = globalPosToView(pos_global);
LLUUID uuid(NULL);
BOOL show_as_friend = FALSE;
if( i < regionp->mMapAvatarIDs.count())
{
show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(regionp->mMapAvatarIDs.get(i)) != NULL);
uuid = regionp->mMapAvatarIDs.get(i);
show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL);
}
LLColor4 color = show_as_friend ? map_avatar_friend_color : map_avatar_color;
LLWorldMapView::drawAvatar(
pos_map.mV[VX], pos_map.mV[VY],
show_as_friend ? map_avatar_friend_color : map_avatar_color,
color,
pos_map.mV[VZ], mDotRadius);
if(uuid.notNull())
{
bool selected = false;
uuid_vec_t::iterator sel_iter = gmSelected.begin();
for (; sel_iter != gmSelected.end(); sel_iter++)
{
if(*sel_iter == uuid)
{
selected = true;
break;
}
}
if(selected)
{
if( (pos_map.mV[VX] < 0) ||
(pos_map.mV[VY] < 0) ||
(pos_map.mV[VX] >= getRect().getWidth()) ||
(pos_map.mV[VY] >= getRect().getHeight()) )
{
S32 x = llround( pos_map.mV[VX] );
S32 y = llround( pos_map.mV[VY] );
LLWorldMapView::drawTrackingCircle( getRect(), x, y, color, 1, 10);
} else
{
LLWorldMapView::drawTrackingDot(pos_map.mV[VX],pos_map.mV[VY],color,0.f);
}
}
}
F32 dist_to_cursor = dist_vec(LLVector2(pos_map.mV[VX], pos_map.mV[VY]),
LLVector2(local_mouse_x,local_mouse_y));
if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist)
@ -460,6 +510,13 @@ void LLNetMap::draw()
gGL.popUIMatrix();
LLUICtrl::draw();
if (LLTracker::isTracking(0))
{
mPopupMenu->setItemEnabled ("Stop Tracking", true);
}
}
void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
@ -600,7 +657,6 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask )
args["[REGION]"] = region_name;
std::string msg = mToolTipMsg;
LLStringUtil::format(msg, args);
LLToolTipMgr::instance().show(LLToolTip::Params()
.message(msg)
.sticky_rect(sticky_rect));
@ -793,6 +849,9 @@ BOOL LLNetMap::handleMouseDown( S32 x, S32 y, MASK mask )
BOOL LLNetMap::handleMouseUp( S32 x, S32 y, MASK mask )
{
if(abs(mMouseDown.mX-x)<3 && abs(mMouseDown.mY-y)<3)
handleClick(x,y,mask);
if (hasMouseCapture())
{
if (mPanning)
@ -821,6 +880,53 @@ BOOL LLNetMap::handleMouseUp( S32 x, S32 y, MASK mask )
return FALSE;
}
BOOL LLNetMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
if (mPopupMenu)
{
mPopupMenu->buildDrawLabels();
mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
LLMenuGL::showPopup(this, mPopupMenu, x, y);
}
return TRUE;
}
BOOL LLNetMap::handleClick(S32 x, S32 y, MASK mask)
{
// TODO: allow clicking an avatar on minimap to select avatar in the nearby avatar list
// if(mClosestAgentToCursor.notNull())
// mNearbyList->selectUser(mClosestAgentToCursor);
// Needs a registered observer i guess to accomplish this without using
// globals to tell the mNearbyList in llpeoplepanel to select the user
return TRUE;
}
BOOL LLNetMap::handleDoubleClick(S32 x, S32 y, MASK mask)
{
LLVector3d pos_global = viewPosToGlobal(x, y);
// If we're not tracking a beacon already, double-click will set one
if (!LLTracker::isTracking(NULL))
{
LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
if (world_map)
{
world_map->trackLocation(pos_global);
}
}
if (gSavedSettings.getBOOL("DoubleClickTeleport"))
{
// If DoubleClickTeleport is on, double clicking the minimap will teleport there
gAgent.teleportViaLocationLookAt(pos_global);
}
else
{
LLFloaterReg::showInstance("world_map");
}
return TRUE;
}
// static
bool LLNetMap::outsideSlop( S32 x, S32 y, S32 start_x, S32 start_y, S32 slop )
{
@ -871,3 +977,38 @@ BOOL LLNetMap::handleHover( S32 x, S32 y, MASK mask )
return TRUE;
}
void LLNetMap::handleZoom(const LLSD& userdata)
{
std::string level = userdata.asString();
F32 scale = 0.0f;
if (level == std::string("default"))
{
LLControlVariable *pvar = gSavedSettings.getControl("MiniMapScale");
if(pvar)
{
pvar->resetToDefault();
scale = gSavedSettings.getF32("MiniMapScale");
}
}
else if (level == std::string("close"))
scale = LLNetMap::MAP_SCALE_MAX;
else if (level == std::string("medium"))
scale = LLNetMap::MAP_SCALE_MID;
else if (level == std::string("far"))
scale = LLNetMap::MAP_SCALE_MIN;
if (scale != 0.0f)
{
setScale(scale);
}
}
void LLNetMap::handleStopTracking (const LLSD& userdata)
{
if (mPopupMenu)
{
mPopupMenu->setItemEnabled ("Stop Tracking", false);
LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
}
}

View File

@ -39,6 +39,7 @@ class LLCoordGL;
class LLImageRaw;
class LLViewerTexture;
class LLFloaterMap;
class LLMenuGL;
class LLNetMap : public LLUICtrl
{
@ -72,7 +73,12 @@ public:
/*virtual*/ BOOL handleHover( S32 x, S32 y, MASK mask );
/*virtual*/ BOOL handleToolTip( S32 x, S32 y, MASK mask);
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ BOOL postBuild();
/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
/*virtual*/ BOOL handleClick(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleDoubleClick( S32 x, S32 y, MASK mask );
void setScale( F32 scale );
void setToolTipMsg(const std::string& msg) { mToolTipMsg = msg; }
void renderScaledPointGlobal( const LLVector3d& pos, const LLColor4U &color, F32 radius );
@ -120,6 +126,16 @@ private:
LLUUID mClosestAgentAtLastRightClick;
std::string mToolTipMsg;
public:
void setSelected(uuid_vec_t uuids) { gmSelected=uuids; };
private:
void handleZoom(const LLSD& userdata);
void handleStopTracking (const LLSD& userdata);
LLMenuGL* mPopupMenu;
uuid_vec_t gmSelected;
};

View File

@ -54,6 +54,7 @@
#include "llgroupactions.h"
#include "llgrouplist.h"
#include "llinventoryobserver.h"
#include "llnetmap.h"
#include "llpanelpeoplemenus.h"
#include "llsidetray.h"
#include "llsidetraypanelcontainer.h"
@ -494,7 +495,8 @@ LLPanelPeople::LLPanelPeople()
mNearbyGearButton(NULL),
mFriendsGearButton(NULL),
mGroupsGearButton(NULL),
mRecentGearButton(NULL)
mRecentGearButton(NULL),
mMiniMap(NULL)
{
mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList, this));
mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList, this));
@ -567,6 +569,9 @@ BOOL LLPanelPeople::postBuild()
mNearbyList->setNoItemsMsg(getString("no_one_near"));
mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near"));
mNearbyList->setShowIcons("NearbyListShowIcons");
mMiniMap = (LLNetMap*)getChildView("Net Map",true);
mMiniMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
getString("AltMiniMapToolTipMsg") : getString("MiniMapToolTipMsg"));
mRecentList = getChild<LLPanel>(RECENT_TAB_NAME)->getChild<LLAvatarList>("avatar_list");
mRecentList->setNoItemsCommentText(getString("no_recent_people"));
@ -1088,6 +1093,12 @@ void LLPanelPeople::onAvatarListDoubleClicked(LLUICtrl* ctrl)
void LLPanelPeople::onAvatarListCommitted(LLAvatarList* list)
{
if (getActiveTabName() == NEARBY_TAB_NAME)
{
uuid_vec_t selected_uuids;
getCurrentItemIDs(selected_uuids);
mMiniMap->setSelected(selected_uuids);
} else
// Make sure only one of the friends lists (online/all) has selection.
if (getActiveTabName() == FRIENDS_TAB_NAME)
{

View File

@ -142,6 +142,7 @@ private:
LLAvatarList* mNearbyList;
LLAvatarList* mRecentList;
LLGroupList* mGroupList;
LLNetMap* mMiniMap;
LLHandle<LLView> mGroupPlusMenuHandle;
LLHandle<LLView> mNearbyViewSortMenuHandle;

View File

@ -22,7 +22,11 @@
name="ToolTipMsg">
[REGION](Double-click to open Map, shift-drag to pan)
</floater.string>
<floater.string name="mini_map_caption">
<floater.string
name="AltToolTipMsg">
[REGION](Double-click to teleport, shift-drag to pan)
</floater.string>
<floater.string name="mini_map_caption">
MINIMAP
</floater.string>
<net_map

View File

@ -54,7 +54,13 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
<string
name="no_groups_msg"
value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
<filter_editor
<string
name="MiniMapToolTipMsg"
value="[REGION](Double-click to open Map, shift-drag to pan)"/>
<string
name="AltMiniMapToolTipMsg"
value="[REGION](Double-click to teleport, shift-drag to pan)"/>
<filter_editor
follows="left|top|right"
height="23"
layout="topleft"
@ -93,16 +99,26 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
name="nearby_panel"
top="0"
width="313">
<avatar_list
<net_map
bg_color="NetMapBackgroundColor"
follows="top|left|right"
layout="topleft"
left="3"
mouse_opaque="false"
name="Net Map"
width="307"
height="140"
top="0"/>
<avatar_list
allow_select="true"
follows="all"
height="356"
follows="top|left|bottom|right"
height="216"
ignore_online_status="true"
layout="topleft"
left="3"
multi_select="true"
name="avatar_list"
top="0"
top="145"
width="307" />
<panel
background_visible="true"