From 2eaa0e0d1a1045af65eabe75c7f72091e1a98ad2 Mon Sep 17 00:00:00 2001 From: McCabe Maxsted Date: Tue, 9 Jun 2009 21:45:12 -0700 Subject: Applied Aimee's minimap zoom patch --- linden/doc/contributions.txt | 1 + linden/indra/newview/app_settings/settings.xml | 2 +- linden/indra/newview/llnetmap.cpp | 36 ++++++++++++++-------- linden/indra/newview/llnetmap.h | 3 +- linden/indra/newview/llworldmapview.cpp | 31 +++++++++++-------- linden/indra/newview/llworldmapview.h | 6 ++-- .../newview/skins/default/textures/textures.xml | 1 - 7 files changed, 51 insertions(+), 29 deletions(-) (limited to 'linden') diff --git a/linden/doc/contributions.txt b/linden/doc/contributions.txt index 9886640..6da9879 100644 --- a/linden/doc/contributions.txt +++ b/linden/doc/contributions.txt @@ -21,6 +21,7 @@ Aimee Trescothick VWR-8341 VWR-8430 VWR-9255 + VWR-12748 Alejandro Rosenthal VWR-1184 Alissa Sabre diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml index cce09e2..2d64f03 100644 --- a/linden/indra/newview/app_settings/settings.xml +++ b/linden/indra/newview/app_settings/settings.xml @@ -4800,7 +4800,7 @@ MiniMapScale Comment - Miniature world map zoom levle (pixels per region) + Miniature world map zoom level (pixels per region) Persist 1 Type diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp index 71eb35b..5a54068 100644 --- a/linden/indra/newview/llnetmap.cpp +++ b/linden/indra/newview/llnetmap.cpp @@ -68,13 +68,14 @@ #include "llglheaders.h" const F32 MAP_SCALE_MIN = 32; -const F32 MAP_SCALE_MID = 172; -const F32 MAP_SCALE_MAX = 512; +const F32 MAP_SCALE_MID = 1024; +const F32 MAP_SCALE_MAX = 4096; const F32 MAP_SCALE_INCREMENT = 16; -const F32 MAP_MIN_PICK_DIST = 4; +const F32 MAP_SCALE_ZOOM_FACTOR = 1.04f; // Zoom in factor per click of the scroll wheel (4%) const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f; - -const S32 TRACKING_RADIUS = 3; +const F32 MIN_DOT_RADIUS = 3.5f; +const F32 DOT_SCALE = 0.75f; +const F32 MIN_PICK_SCALE = 2.f; LLNetMap::LLNetMap(const std::string& name) : LLPanel(name), @@ -89,6 +90,7 @@ LLNetMap::LLNetMap(const std::string& name) : { mScale = gSavedSettings.getF32("MiniMapScale"); mPixelsPerMeter = mScale / LLWorld::getInstance()->getRegionWidthInMeters(); + mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS); mObjectImageCenterGlobal = gAgent.getCameraPositionGlobal(); @@ -138,6 +140,7 @@ void LLNetMap::setScale( F32 scale ) } mPixelsPerMeter = mScale / LLWorld::getInstance()->getRegionWidthInMeters(); + mDotRadius = llmax(DOT_SCALE * mPixelsPerMeter, MIN_DOT_RADIUS); mUpdateNow = TRUE; } @@ -319,6 +322,7 @@ void LLNetMap::draw() LLUI::getCursorPositionLocal(this, &local_mouse_x, &local_mouse_y); mClosestAgentToCursor.setNull(); F32 closest_dist = F32_MAX; + F32 min_pick_dist = mDotRadius * MIN_PICK_SCALE; // Draw avatars LLColor4 avatar_color = gColors.getColor( "MapAvatar" ); @@ -335,10 +339,11 @@ void LLNetMap::draw() LLWorldMapView::drawAvatar( pos_map.mV[VX], pos_map.mV[VY], is_agent_friend(avatar_ids[i]) ? friend_color : avatar_color, - pos_map.mV[VZ]); + pos_map.mV[VZ], + mDotRadius); 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 < MAP_MIN_PICK_DIST && dist_to_cursor < closest_dist) + if(dist_to_cursor < min_pick_dist && dist_to_cursor < closest_dist) { closest_dist = dist_to_cursor; mClosestAgentToCursor = avatar_ids[i]; @@ -367,10 +372,13 @@ void LLNetMap::draw() // Draw dot for self avatar position pos_global = gAgent.getPositionGlobal(); pos_map = globalPosToView(pos_global, rotate_map); - LLUIImagePtr you = LLWorldMapView::sAvatarYouSmallImage; + LLUIImagePtr you = LLWorldMapView::sAvatarYouLargeImage; + S32 dot_width = llround(mDotRadius * 2.f); you->draw( - llround(pos_map.mV[VX]) - you->getWidth()/2, - llround(pos_map.mV[VY]) - you->getHeight()/2); + llround(pos_map.mV[VX] - mDotRadius), + llround(pos_map.mV[VY] - mDotRadius), + dot_width, + dot_width); // Draw frustum F32 meters_to_pixels = mScale/ LLWorld::getInstance()->getRegionWidthInMeters(); @@ -509,8 +517,12 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y, BOOL rotated ) BOOL LLNetMap::handleScrollWheel(S32 x, S32 y, S32 clicks) { - // note that clicks are reversed from what you'd think - setScale(llclamp(mScale - clicks*MAP_SCALE_INCREMENT, MAP_SCALE_MIN, MAP_SCALE_MAX)); + // note that clicks are reversed from what you'd think: i.e. > 0 means zoom out, < 0 means zoom in + F32 scale = mScale; + + scale *= pow(MAP_SCALE_ZOOM_FACTOR, -clicks); + setScale(llclamp(scale, MAP_SCALE_MIN, MAP_SCALE_MAX)); + return TRUE; } diff --git a/linden/indra/newview/llnetmap.h b/linden/indra/newview/llnetmap.h index be5593d..6a112ad 100644 --- a/linden/indra/newview/llnetmap.h +++ b/linden/indra/newview/llnetmap.h @@ -85,7 +85,8 @@ private: F32 mScale; // Size of a region in pixels F32 mPixelsPerMeter; // world meters to map pixels F32 mObjectMapTPM; // texels per meter on map - F32 mObjectMapPixels; // Width of object map in pixels; + F32 mObjectMapPixels; // Width of object map in pixels + F32 mDotRadius; // Size of avatar markers F32 mTargetPanX; F32 mTargetPanY; F32 mCurPanX; diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp index 73c2d8b..2ded35a 100644 --- a/linden/indra/newview/llworldmapview.cpp +++ b/linden/indra/newview/llworldmapview.cpp @@ -70,9 +70,10 @@ const S32 SCROLL_HINT_WIDTH = 65; const F32 BIG_DOT_RADIUS = 5.f; BOOL LLWorldMapView::sHandledLastClick = FALSE; -LLUIImagePtr LLWorldMapView::sAvatarYouSmallImage = NULL; LLUIImagePtr LLWorldMapView::sAvatarSmallImage = NULL; -LLUIImagePtr LLWorldMapView::sAvatarLargeImage = NULL; +LLUIImagePtr LLWorldMapView::sAvatarYouImage = NULL; +LLUIImagePtr LLWorldMapView::sAvatarYouLargeImage = NULL; +LLUIImagePtr LLWorldMapView::sAvatarLevelImage = NULL; LLUIImagePtr LLWorldMapView::sAvatarAboveImage = NULL; LLUIImagePtr LLWorldMapView::sAvatarBelowImage = NULL; @@ -112,11 +113,12 @@ std::map LLWorldMapView::sStringsMap; void LLWorldMapView::initClass() { - sAvatarYouSmallImage = LLUI::getUIImage("map_avatar_you_8.tga"); sAvatarSmallImage = LLUI::getUIImage("map_avatar_8.tga"); - sAvatarLargeImage = LLUI::getUIImage("map_avatar_16.tga"); - sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_8.tga"); - sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_8.tga"); + sAvatarYouImage = LLUI::getUIImage("map_avatar_16.tga"); + sAvatarYouLargeImage = LLUI::getUIImage("map_avatar_you_32.tga"); + sAvatarLevelImage = LLUI::getUIImage("map_avatar_32.tga"); + sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_32.tga"); + sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_32.tga"); sHomeImage = LLUI::getUIImage("map_home.tga"); sTelehubImage = LLUI::getUIImage("map_telehub.tga"); @@ -136,9 +138,10 @@ void LLWorldMapView::initClass() // static void LLWorldMapView::cleanupClass() { - sAvatarYouSmallImage = NULL; sAvatarSmallImage = NULL; - sAvatarLargeImage = NULL; + sAvatarYouImage = NULL; + sAvatarYouLargeImage = NULL; + sAvatarLevelImage = NULL; sAvatarAboveImage = NULL; sAvatarBelowImage = NULL; @@ -724,7 +727,7 @@ void LLWorldMapView::draw() // Now draw your avatar after all that other stuff. LLVector3d pos_global = gAgent.getPositionGlobal(); - drawImage(pos_global, sAvatarLargeImage); + drawImage(pos_global, sAvatarYouImage); LLVector3 pos_map = globalPosToView(pos_global); if (!pointInView(llround(pos_map.mV[VX]), llround(pos_map.mV[VY]))) @@ -1210,7 +1213,7 @@ void LLWorldMapView::drawAvatar(F32 x_pixels, F32 dot_radius) { const F32 HEIGHT_THRESHOLD = 7.f; - LLUIImagePtr dot_image = sAvatarSmallImage; + LLUIImagePtr dot_image = sAvatarLevelImage; if(relative_z < -HEIGHT_THRESHOLD) { dot_image = sAvatarBelowImage; @@ -1219,9 +1222,13 @@ void LLWorldMapView::drawAvatar(F32 x_pixels, { dot_image = sAvatarAboveImage; } + + S32 dot_width = llround(dot_radius * 2.f); dot_image->draw( - llround(x_pixels) - dot_image->getWidth()/2, - llround(y_pixels) - dot_image->getHeight()/2, + llround(x_pixels - dot_radius), + llround(y_pixels - dot_radius), + dot_width, + dot_width, color); } diff --git a/linden/indra/newview/llworldmapview.h b/linden/indra/newview/llworldmapview.h index 7e94e19..6dbaa8d 100644 --- a/linden/indra/newview/llworldmapview.h +++ b/linden/indra/newview/llworldmapview.h @@ -136,11 +136,13 @@ protected: public: LLColor4 mBackgroundColor; - static LLUIImagePtr sAvatarYouSmallImage; static LLUIImagePtr sAvatarSmallImage; - static LLUIImagePtr sAvatarLargeImage; + static LLUIImagePtr sAvatarYouImage; + static LLUIImagePtr sAvatarYouLargeImage; + static LLUIImagePtr sAvatarLevelImage; static LLUIImagePtr sAvatarAboveImage; static LLUIImagePtr sAvatarBelowImage; + static LLUIImagePtr sTelehubImage; static LLUIImagePtr sInfohubImage; static LLUIImagePtr sHomeImage; diff --git a/linden/indra/newview/skins/default/textures/textures.xml b/linden/indra/newview/skins/default/textures/textures.xml index 9e1d9b5..89399ef 100644 --- a/linden/indra/newview/skins/default/textures/textures.xml +++ b/linden/indra/newview/skins/default/textures/textures.xml @@ -150,7 +150,6 @@ - -- cgit v1.1 From 96741727e0d1dbb743fe9dcfff68d52b12617136 Mon Sep 17 00:00:00 2001 From: McCabe Maxsted Date: Mon, 15 Jun 2009 03:00:48 -0700 Subject: Applied Dale Glass' patch for VWR-12655: Add support for displaying the title of the song --- linden/indra/llaudio/audioengine.h | 2 + linden/indra/llmedia/llmediaimplgstreamer.cpp | 46 ++++++++++++++------ linden/indra/llmedia/llmediaimplgstreamer.h | 1 + linden/indra/llmedia/llmediaobserver.h | 1 + linden/indra/newview/app_settings/settings.xml | 11 +++++ linden/indra/newview/lloverlaybar.cpp | 49 ++++++++++++++++++++++ .../default/xui/en-us/panel_preferences_audio.xml | 6 ++- 7 files changed, 102 insertions(+), 14 deletions(-) (limited to 'linden') diff --git a/linden/indra/llaudio/audioengine.h b/linden/indra/llaudio/audioengine.h index d289ba5..579f58f 100644 --- a/linden/indra/llaudio/audioengine.h +++ b/linden/indra/llaudio/audioengine.h @@ -182,6 +182,8 @@ public: static void assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type, void *user_data, S32 result_code, LLExtStat ext_status); friend class LLPipeline; // For debugging + + LLMediaBase * getStreamMedia() { return mInternetStreamMedia; } public: F32 mMaxWindGain; // Hack. Public to set before fade in? diff --git a/linden/indra/llmedia/llmediaimplgstreamer.cpp b/linden/indra/llmedia/llmediaimplgstreamer.cpp index d1bab29..c0c2070 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer.cpp +++ b/linden/indra/llmedia/llmediaimplgstreamer.cpp @@ -89,6 +89,7 @@ LLMediaImplGStreamer () : mPump ( NULL ), mPlaybin ( NULL ), mVideoSink ( NULL ), + mLastTitle ( "" ), mState( GST_STATE_NULL ), mPlayThread ( NULL ) { @@ -470,6 +471,8 @@ gboolean LLMediaImplGStreamer::bus_callback(GstBus *bus, GstMessage *message, gp case GST_STATE_PAUSED: break; case GST_STATE_PLAYING: + impl->mLastTitle = ""; + LLMediaEvent event( impl, 100 ); impl->getEventEmitter().update( &LLMediaObserver::onUpdateProgress, event ); // emit an event to say that a media source was loaded @@ -521,18 +524,35 @@ gboolean LLMediaImplGStreamer::bus_callback(GstBus *bus, GstMessage *message, gp } case GST_MESSAGE_TAG: { - GstTagList *tag_list; - gchar *title; - gchar *artist; - gst_message_parse_tag(message, &tag_list); - gboolean hazTitle = gst_tag_list_get_string(tag_list, - GST_TAG_TITLE, &title); - gboolean hazArtist = gst_tag_list_get_string(tag_list, - GST_TAG_ARTIST, &artist); - if(hazTitle) - LL_INFOS("MediaInfo") << "Title: " << title << LL_ENDL; - if(hazArtist) - LL_INFOS("MediaInfo") << "Artist: " << artist << LL_ENDL; + GstTagList *new_tags; + + gst_message_parse_tag( message, &new_tags ); + + gchar *title; + gchar *artist; + + if ( gst_tag_list_get_string(new_tags, GST_TAG_TITLE, &title) ) + { + LL_INFOS("MediaInfo") << "Title: " << title << LL_ENDL; + std::string newtitle(title); + + if ( newtitle != impl->mLastTitle && newtitle != "" ) + { + impl->mLastTitle = newtitle; + LLMediaEvent event( impl, impl->mLastTitle ); + impl->getEventEmitter().update( &LLMediaObserver::onMediaTitleChange, event ); + } + + g_free(title); + } + + if (gst_tag_list_get_string(new_tags, GST_TAG_ARTIST, &artist)) + { + LL_INFOS("MediaInfo") << "Artist: " << artist << LL_ENDL; + g_free(artist); + } + + gst_tag_list_free(new_tags); break; } case GST_MESSAGE_EOS: @@ -551,10 +571,10 @@ gboolean LLMediaImplGStreamer::bus_callback(GstBus *bus, GstMessage *message, gp impl->addCommand(LLMediaBase::COMMAND_STOP); } break; + } default: /* unhandled message */ break; - } } /* we want to be notified again the next time there is a message * on the bus, so return true (false means we want to stop watching diff --git a/linden/indra/llmedia/llmediaimplgstreamer.h b/linden/indra/llmedia/llmediaimplgstreamer.h index baefdaf..51a8c37 100644 --- a/linden/indra/llmedia/llmediaimplgstreamer.h +++ b/linden/indra/llmedia/llmediaimplgstreamer.h @@ -127,6 +127,7 @@ class LLMediaImplGStreamer: GMainLoop *mPump; // event pump for this media GstElement *mPlaybin; GstSLVideo *mVideoSink; + std::string mLastTitle; GstState mState; GstState getState() const { return mState; } diff --git a/linden/indra/llmedia/llmediaobserver.h b/linden/indra/llmedia/llmediaobserver.h index e6da4f6..97fed5f 100644 --- a/linden/indra/llmedia/llmediaobserver.h +++ b/linden/indra/llmedia/llmediaobserver.h @@ -102,6 +102,7 @@ class LLMediaObserver virtual void onMediaSizeChange( const EventType& event_in ) { } virtual void onMediaContentsChange( const EventType& event_in ) { } virtual void onMediaStatusTextChange( const EventType& event_in ) { } + virtual void onMediaTitleChange( const EventType &event_in ) { } virtual void onNavigateBegin( const EventType& event_in ) { } virtual void onNavigateComplete( const EventType& event_in ) { } virtual void onUpdateProgress( const EventType& event_in ) { } diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml index 5c76185..7ab215a 100644 --- a/linden/indra/newview/app_settings/settings.xml +++ b/linden/indra/newview/app_settings/settings.xml @@ -7337,6 +7337,17 @@ Value 0 + ShowStreamTitle + + Comment + Show the title of the song playing on the parcel's stream + Persist + 1 + Type + Boolean + Value + 1 + ShowTangentBasis Comment diff --git a/linden/indra/newview/lloverlaybar.cpp b/linden/indra/newview/lloverlaybar.cpp index 91a7375..e1aeeca 100644 --- a/linden/indra/newview/lloverlaybar.cpp +++ b/linden/indra/newview/lloverlaybar.cpp @@ -41,6 +41,7 @@ #include "llagent.h" #include "llbutton.h" #include "llchatbar.h" +#include "llfloaterchat.h" #include "llfocusmgr.h" #include "llimview.h" #include "llmediaremotectrl.h" @@ -72,6 +73,53 @@ LLOverlayBar *gOverlayBar = NULL; extern S32 MENU_BAR_HEIGHT; + +class LLTitleObserver + : public LLMediaObserver +{ +public: + void init(std::string url); + /*virtual*/ void onMediaTitleChange(const EventType& event_in); +private: + LLMediaBase* mMediaSource; +}; + +static LLTitleObserver sTitleObserver; + +static LLRegisterWidget r("media_remote"); + +void LLTitleObserver::init(std::string url) +{ + + if (!gAudiop) + { + return; + } + + mMediaSource = gAudiop->getStreamMedia(); // LLViewerMedia::getSource(); + + if ( mMediaSource ) + { + mMediaSource->addObserver(this); + } +} + +//virtual +void LLTitleObserver::onMediaTitleChange(const EventType& event_in) +{ + if ( !gSavedSettings.getBOOL("ShowStreamTitle") ) + { + return; + } + + LLChat chat; + //TODO: set this in XUI + std::string playing_msg = "Playing: " + event_in.getStringValue(); + chat.mText = playing_msg; + LLFloaterChat::addChat(chat, FALSE, FALSE); +} + + // // Functions // @@ -406,6 +454,7 @@ void LLOverlayBar::toggleMusicPlay(void*) // if ( gAudiop->isInternetStreamPlaying() == 0 ) { gAudiop->startInternetStream(parcel->getMusicURL()); + sTitleObserver.init(parcel->getMusicURL()); } } } diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_audio.xml b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_audio.xml index 92978ab..c960d36 100644 --- a/linden/indra/newview/skins/default/xui/en-us/panel_preferences_audio.xml +++ b/linden/indra/newview/skins/default/xui/en-us/panel_preferences_audio.xml @@ -15,7 +15,7 @@ Streaming Preferences: Audio Preferences: @@ -28,6 +28,10 @@ label="Play Streaming Music When Available (uses more bandwidth)" left="142" mouse_opaque="true" name="streaming_music" radio_style="false" width="339" /> + mLastTitle = ""; + //impl->mLastTitle = ""; LLMediaEvent event( impl, 100 ); impl->getEventEmitter().update( &LLMediaObserver::onUpdateProgress, event ); @@ -529,12 +529,12 @@ gboolean LLMediaImplGStreamer::bus_callback(GstBus *bus, GstMessage *message, gp gst_message_parse_tag( message, &new_tags ); gchar *title; - gchar *artist; if ( gst_tag_list_get_string(new_tags, GST_TAG_TITLE, &title) ) { LL_INFOS("MediaInfo") << "Title: " << title << LL_ENDL; std::string newtitle(title); + gst_tag_list_free(new_tags); if ( newtitle != impl->mLastTitle && newtitle != "" ) { @@ -546,13 +546,6 @@ gboolean LLMediaImplGStreamer::bus_callback(GstBus *bus, GstMessage *message, gp g_free(title); } - if (gst_tag_list_get_string(new_tags, GST_TAG_ARTIST, &artist)) - { - LL_INFOS("MediaInfo") << "Artist: " << artist << LL_ENDL; - g_free(artist); - } - - gst_tag_list_free(new_tags); break; } case GST_MESSAGE_EOS: -- cgit v1.1 From c174569f9c34f684e2e057ee57b23a6a118ddfcc Mon Sep 17 00:00:00 2001 From: McCabe Maxsted Date: Sun, 9 Aug 2009 11:11:09 -0700 Subject: Basic basic radar that kinda sorta works but not really --- linden/indra/newview/llnetmap.cpp | 173 ++++++++++++++++++++- linden/indra/newview/llnetmap.h | 18 ++- .../skins/default/xui/en-us/panel_mini_map.xml | 46 +++++- 3 files changed, 233 insertions(+), 4 deletions(-) (limited to 'linden') diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp index 6fa6745..765b6e6 100644 --- a/linden/indra/newview/llnetmap.cpp +++ b/linden/indra/newview/llnetmap.cpp @@ -44,7 +44,6 @@ #include "llcallingcard.h" #include "llcolorscheme.h" #include "llviewercontrol.h" -#include "llfloateravatarinfo.h" #include "llfloaterworldmap.h" #include "llframetimer.h" #include "llmutelist.h" @@ -66,6 +65,14 @@ #include "llworldmapview.h" // shared draw code #include "llappviewer.h" // Only for constants! +// radar +#include "llfloateravatarinfo.h" +#include "llfloatergroupinvite.h" +#include "llfloatergroups.h" +#include "roles_constants.h" +#include "llimview.h" +#include "llscrolllistctrl.h" + #include "llglheaders.h" const F32 MAP_SCALE_MIN = 32; @@ -105,6 +112,8 @@ LLNetMap::LLNetMap(const std::string& name) : (new LLEnableProfile())->registerListener(this, "MiniMap.EnableProfile"); LLUICtrlFactory::getInstance()->buildPanel(this, "panel_mini_map.xml"); + //TODO: This'll make it toggle + //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_mini_map_radar.xml"); updateMinorDirections(); @@ -117,6 +126,22 @@ LLNetMap::LLNetMap(const std::string& name) : mPopupMenuHandle = menu->getHandle(); } +BOOL LLNetMap::postBuild() +{ + mRadarList = getChild("RadarList"); + + childSetAction("im_btn", onClickIM, this); + childSetAction("profile_btn", onClickProfile, this); + childSetAction("offer_teleport_btn", onClickOfferTeleport, this); + childSetAction("track_btn", onClickTrack, this); + childSetAction("invite_btn", onClickInvite, this); + childSetAction("add_btn", onClickAddFriend, this); + + setDefaultBtn("im_btn"); + + return TRUE; +} + LLNetMap::~LLNetMap() { } @@ -449,6 +474,8 @@ void LLNetMap::draw() setDirectionPos( getChild("sw_label"), rotation + F_PI + F_PI_BY_TWO / 2); setDirectionPos( getChild("se_label"), rotation + F_PI + F_PI_BY_TWO + F_PI_BY_TWO / 2); + populateRadar(); + LLView::draw(); } @@ -948,3 +975,147 @@ bool LLNetMap::LLEnableProfile::handleEvent(LLPointer event, const LLSD self->findControl(userdata["control"].asString())->setValue(self->isAgentUnderCursor()); return true; } + + +// +// Radar +// + +void LLNetMap::populateRadar() +{ + BOOL all_loaded = TRUE; + BOOL empty = TRUE; + LLScrollListCtrl* radar_scroller = getChild("RadarList"); + radar_scroller->deleteAllItems(); + + std::vector avatar_ids; + LLWorld::getInstance()->getAvatars(&avatar_ids, NULL, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange")); + for(U32 i=0; igetFullName(av, fullname)) + { + element["columns"][0]["value"] = LLCacheName::getDefaultName(); + all_loaded = FALSE; + } + else + { + element["columns"][0]["value"] = fullname; + } + radar_scroller->addElement(element); + empty = FALSE; + } + + if (empty) + { + childDisable("RadarList"); + //radar_scroller->addCommentText(getString("no_one_near")); + } + else + { + childEnable("RadarList"); + radar_scroller->selectFirstItem(); + //onList(radar_scroller, this); + radar_scroller->setFocus(TRUE); + } + + //if (all_loaded) + //{ + // mRadarListComplete = TRUE; + //} +} + +// TODO: Since there're no tabs, move this up above +//void LLNetMap::onList(LLUICtrl* ctrl, void* userdata) +//{ +// LLNetMap* self = (LLNetMap*)userdata; +// if (self) +// { +// self->childSetEnabled("im_btn", self->visibleItemsSelected()); +// self->childSetEnabled("profile_btn", self->visibleItemsSelected()); +// self->childSetEnabled("offer_teleport_btn", self->visibleItemsSelected()); +// self->childSetEnabled("track_btn", self->visibleItemsSelected()); +// self->childSetEnabled("invite_btn", self->visibleItemsSelected()); +// self->childSetEnabled("add_btn", self->visibleItemsSelected()); +// } +//} + +void LLNetMap::onClickIM(void* user_data) +{ + LLNetMap* self = (LLNetMap*) user_data; + + LLScrollListItem *item = self->mRadarList->getFirstSelected(); + LLUUID agent_id = item->getUUID(); + std::string fullname; + if(gCacheName->getFullName(agent_id, fullname)) + { + gIMMgr->setFloaterOpen(TRUE); + gIMMgr->addSession(fullname, IM_NOTHING_SPECIAL, agent_id); + } +} + +void LLNetMap::onClickProfile(void* user_data) +{ + LLNetMap* self = (LLNetMap*) user_data; + + LLScrollListItem *item = self->mRadarList->getFirstSelected(); + LLUUID agent_id = item->getUUID(); + LLFloaterAvatarInfo::show(agent_id); +} + +void LLNetMap::onClickOfferTeleport(void* user_data) +{ +} + +void LLNetMap::onClickTrack(void* user_data) +{ + LLNetMap* self = (LLNetMap*) user_data; + + LLTracker::ETrackingStatus tracking_status = LLTracker::getTrackingStatus(); + if (LLTracker::TRACKING_AVATAR == tracking_status) + { + LLTracker::stopTracking(NULL); + } + else + { + LLScrollListItem *item = self->mRadarList->getFirstSelected(); + LLUUID agent_id = item->getUUID(); + std::string fullname; + gCacheName->getFullName(agent_id, fullname); + LLTracker::trackAvatar(agent_id, fullname); + } +} + +void LLNetMap::onClickInvite(void* user_data) +{ + LLNetMap* self = (LLNetMap*) user_data; + + LLScrollListItem *item = self->mRadarList->getFirstSelected(); + LLUUID agent_id = item->getUUID(); + { + LLFloaterGroupPicker* widget; + widget = LLFloaterGroupPicker::showInstance(LLSD(gAgent.getID())); + if (widget) + { + widget->center(); + widget->setPowersMask(GP_MEMBER_INVITE); + widget->setSelectCallback(callback_invite_to_group, (void *)&agent_id); + } + } +} + +void LLNetMap::callback_invite_to_group(LLUUID group_id, void *user_data) +{ + std::vector agent_ids; + agent_ids.push_back(*(LLUUID *)user_data); + + LLFloaterGroupInvite::showForGroup(group_id, &agent_ids); +} + +void LLNetMap::onClickAddFriend(void* user_data) +{ +} \ No newline at end of file diff --git a/linden/indra/newview/llnetmap.h b/linden/indra/newview/llnetmap.h index ef046d8..58b2066 100644 --- a/linden/indra/newview/llnetmap.h +++ b/linden/indra/newview/llnetmap.h @@ -34,6 +34,7 @@ #include "llpanel.h" #include "llmemberlistener.h" +#include "llscrolllistctrl.h" #include "v3math.h" #include "v3dmath.h" #include "v4color.h" @@ -52,6 +53,8 @@ class LLNetMap : public LLPanel { public: LLNetMap(const std::string& name); + + virtual BOOL postBuild(); virtual ~LLNetMap(); virtual void draw(); @@ -111,8 +114,9 @@ private: LLPointer mObjectImagep; private: - LLUUID mClosestAgentToCursor; - LLUUID mClosestAgentAtLastRightClick; + LLUUID mClosestAgentToCursor; + LLUUID mClosestAgentAtLastRightClick; + LLScrollListCtrl* mRadarList; static BOOL sRotateMap; static LLNetMap* sInstance; @@ -122,6 +126,16 @@ private: static void showAgentProfile(void*); BOOL isAgentUnderCursor() { return mClosestAgentToCursor.notNull(); } + void populateRadar(); + + static void onClickProfile(void* user_data); + static void onClickIM(void* user_data); + static void onClickAddFriend(void* user_data); + static void onClickOfferTeleport(void* user_data); + static void onClickTrack(void* user_data); + static void onClickInvite(void* user_data); + static void callback_invite_to_group(LLUUID group_id, void *user_data); + class LLScaleMap : public LLMemberListener { public: diff --git a/linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml b/linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml index 1a93341..085b576 100644 --- a/linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml +++ b/linden/indra/newview/skins/default/xui/en-us/panel_mini_map.xml @@ -1,6 +1,6 @@ Double-Click opens Map + + + Select nearby resident: + + + + Meters + + +