diff options
| author | Sabrina Shanman <cosmic@lindenlab.com> | 2022-04-05 19:10:26 +0000 | 
|---|---|---|
| committer | Sabrina Shanman <cosmic@lindenlab.com> | 2022-04-05 19:10:26 +0000 | 
| commit | 268da741927ddde059fad4a47940fa050c9e0f4e (patch) | |
| tree | 8b0f992ed5011ccb81093c047550b26b3be66641 | |
| parent | 26d23e2e6da9115d5d7a28548faa5743bd2ebaac (diff) | |
| parent | f2b57ac03b187e0a33b40bb5b8a1e7a73b5aee58 (diff) | |
Merged in SL-16916 (pull request #932)
SL-16916: Update minimap context menu
Approved-by: Andrey Lihatskiy
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 2 | ||||
| -rwxr-xr-x | indra/newview/llfloatermap.cpp | 26 | ||||
| -rw-r--r-- | indra/newview/llfloatermap.h | 1 | ||||
| -rwxr-xr-x[-rw-r--r--] | indra/newview/llnetmap.cpp | 194 | ||||
| -rw-r--r-- | indra/newview/llnetmap.h | 19 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/menu_mini_map.xml | 129 | 
6 files changed, 258 insertions, 113 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 3ecfa4ef9a..b098a2a18e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6819,7 +6819,7 @@        <key>Type</key>        <string>F32</string>        <key>Value</key> -      <real>128.0</real> +      <real>64.0</real>      </map>      <key>MiniMapShowPropertyLines</key>      <map> diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index 95c43805d4..fd1af7ccc0 100755 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -248,32 +248,6 @@ void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)  	updateMinorDirections();  } -void LLFloaterMap::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) -	{ -		mMap->setScale(scale); -	} -} -  LLFloaterMap* LLFloaterMap::getInstance()  {  	return LLFloaterReg::getTypedInstance<LLFloaterMap>("mini_map"); diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h index ff2fb20535..929b1795aa 100644 --- a/indra/newview/llfloatermap.h +++ b/indra/newview/llfloatermap.h @@ -48,7 +48,6 @@ public:  	/*virtual*/ void	draw();  private: -	void handleZoom(const LLSD& userdata);  	void setDirectionPos( LLTextBox* text_box, F32 rotation );  	void updateMinorDirections(); diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 66cf6272fd..d0fe771295 100644..100755 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -48,6 +48,7 @@  #include "llagentcamera.h"  #include "llappviewer.h" // for gDisconnected  #include "llcallingcard.h" // LLAvatarTracker +#include "llfloaterland.h"  #include "llfloaterworldmap.h"  #include "llparcel.h"  #include "lltracker.h" @@ -69,7 +70,10 @@  static LLDefaultChildRegistry::Register<LLNetMap> r1("net_map");  const F32 LLNetMap::MAP_SCALE_MIN = 32; -const F32 LLNetMap::MAP_SCALE_MID = 1024; +const F32 LLNetMap::MAP_SCALE_FAR = 32; +const F32 LLNetMap::MAP_SCALE_MEDIUM = 128; +const F32 LLNetMap::MAP_SCALE_CLOSE = 256; +const F32 LLNetMap::MAP_SCALE_VERY_CLOSE = 1024;  const F32 LLNetMap::MAP_SCALE_MAX = 4096;  const F32 MAP_SCALE_ZOOM_FACTOR = 1.04f; // Zoom in factor per click of scroll wheel (4%) @@ -83,12 +87,13 @@ const F64 COARSEUPDATE_MAX_Z = 1020.0f;  LLNetMap::LLNetMap (const Params & p)  :	LLUICtrl (p),  	mBackgroundColor (p.bg_color()), -	mScale( MAP_SCALE_MID ), -	mPixelsPerMeter( MAP_SCALE_MID / REGION_WIDTH_METERS ), +    mScale( MAP_SCALE_MEDIUM ), +    mPixelsPerMeter( MAP_SCALE_MEDIUM / REGION_WIDTH_METERS ),  	mObjectMapTPM(0.f),  	mObjectMapPixels(0.f),  	mCurPan(0.f, 0.f),  	mStartPan(0.f, 0.f), +    mPopupWorldPos(0.f, 0.f, 0.f),  	mMouseDown(0, 0),  	mPanning(false),  	mUpdateNow(false), @@ -112,14 +117,19 @@ LLNetMap::~LLNetMap()  BOOL LLNetMap::postBuild()  {      LLUICtrl::CommitCallbackRegistry::ScopedRegistrar commitRegistrar; +    LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enableRegistrar; -    commitRegistrar.add("Minimap.Zoom", boost::bind(&LLNetMap::handleZoom, this, _2)); +    enableRegistrar.add("Minimap.Zoom.Check", boost::bind(&LLNetMap::isZoomChecked, this, _2)); +    commitRegistrar.add("Minimap.Zoom.Set", boost::bind(&LLNetMap::setZoom, this, _2));      commitRegistrar.add("Minimap.Tracker", boost::bind(&LLNetMap::handleStopTracking, this, _2));      commitRegistrar.add("Minimap.Center.Activate", boost::bind(&LLNetMap::activateCenterMap, this, _2)); +    enableRegistrar.add("Minimap.MapOrientation.Check", boost::bind(&LLNetMap::isMapOrientationChecked, this, _2)); +    commitRegistrar.add("Minimap.MapOrientation.Set", boost::bind(&LLNetMap::setMapOrientation, this, _2)); +    commitRegistrar.add("Minimap.AboutLand", boost::bind(&LLNetMap::popupShowAboutLand, this, _2));      mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder,                                                                            LLViewerMenuHolderGL::child_registry_t::instance()); -    mPopupMenu->setItemEnabled("Re-Center Map", false); +    mPopupMenu->setItemEnabled("Re-center map", false);      return true;  } @@ -186,7 +196,8 @@ void LLNetMap::draw()      }      bool can_recenter_map = !(centered || mCentering || auto_centering); -    mPopupMenu->setItemEnabled("Re-Center Map", can_recenter_map); +    mPopupMenu->setItemEnabled("Re-center map", can_recenter_map); +    updateAboutLandPopupButton();  	// Prepare a scissor region  	F32 rotation = 0; @@ -578,6 +589,65 @@ void LLNetMap::drawTracking(const LLVector3d& pos_global, const LLColor4& color,  	}  } +bool LLNetMap::isMouseOnPopupMenu() +{ +    if (!mPopupMenu->isOpen()) +    { +        return false; +    } + +    S32 popup_x; +    S32 popup_y; +    LLUI::getInstance()->getMousePositionLocal(mPopupMenu, &popup_x, &popup_y); +    // *NOTE: Tolerance is larger than it needs to be because the context menu is offset from the mouse when the menu is opened from certain +    // directions. This may be a quirk of LLMenuGL::showPopup. -Cosmic,2022-03-22 +    constexpr S32 tolerance = 10; +    // Test tolerance from all four corners, as the popup menu can appear from a different direction if there's not enough space. +    // Assume the size of the popup menu is much larger than the provided tolerance. +    // In practice, this is a [tolerance]px margin around the popup menu. +    for (S32 sign_x = -1; sign_x <= 1; sign_x += 2) +    { +        for (S32 sign_y = -1; sign_y <= 1; sign_y += 2) +        { +            if (mPopupMenu->pointInView(popup_x + (sign_x * tolerance), popup_y + (sign_y * tolerance))) +            { +                return true; +            } +        } +    } +    return false; +} + +void LLNetMap::updateAboutLandPopupButton() +{ +    if (!mPopupMenu->isOpen()) +    { +        return; +    } + +    LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosGlobal(mPopupWorldPos); +    if (!region) +    { +        mPopupMenu->setItemEnabled("About Land", false); +    } +    else +    { +        // Check if the mouse is in the bounds of the popup. If so, it's safe to assume no other hover function will be called, so the hover +        // parcel can be used to check if location-sensitive tooltip options are available. +        if (isMouseOnPopupMenu()) +        { +            LLViewerParcelMgr::getInstance()->setHoverParcel(mPopupWorldPos); +            LLParcel *hover_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel(); +            bool      valid_parcel = false; +            if (hover_parcel) +            { +                valid_parcel = hover_parcel->getOwnerID().notNull(); +            } +            mPopupMenu->setItemEnabled("About Land", valid_parcel); +        } +    } +} +  LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y )  {  	x -= ll_round(getRect().getWidth() / 2 + mCurPan.mV[VX]); @@ -638,6 +708,15 @@ BOOL LLNetMap::handleToolTip(S32 x, S32 y, MASK mask)          return true;      } +    // The popup menu uses the hover parcel when it is open and the mouse is on +    // top of it, with some additional tolerance. Returning early here prevents +    // fighting over that hover parcel when getting tooltip info in the +    // tolerance region. +    if (isMouseOnPopupMenu()) +    { +        return false; +    } +      LLRect sticky_rect;      S32 SLOP = 4;      localPointToScreen(x - SLOP, y - SLOP, &(sticky_rect.mLeft), &(sticky_rect.mBottom)); @@ -962,9 +1041,10 @@ BOOL LLNetMap::handleRightMouseDown(S32 x, S32 y, MASK mask)  {  	if (mPopupMenu)  	{ +        mPopupWorldPos = viewPosToGlobal(x, y);  		mPopupMenu->buildDrawLabels();  		mPopupMenu->updateParent(LLMenuGL::sMenuContainer); -		mPopupMenu->setItemEnabled("Stop Tracking", LLTracker::isTracking(0)); +		mPopupMenu->setItemEnabled("Stop tracking", LLTracker::isTracking(0));  		LLMenuGL::showPopup(this, mPopupMenu, x, y);  	}  	return TRUE; @@ -1012,6 +1092,27 @@ BOOL LLNetMap::handleDoubleClick(S32 x, S32 y, MASK mask)  	return TRUE;  } +F32 LLNetMap::getScaleForName(std::string scale_name) +{ +    if (scale_name == "very close") +    { +        return LLNetMap::MAP_SCALE_VERY_CLOSE; +    } +    else if (scale_name == "close") +    { +        return LLNetMap::MAP_SCALE_CLOSE; +    } +    else if (scale_name == "medium") +    { +        return LLNetMap::MAP_SCALE_MEDIUM; +    } +    else if (scale_name == "far") +    { +        return LLNetMap::MAP_SCALE_FAR; +    } +    return 0.0f; +} +  // static  bool LLNetMap::outsideSlop( S32 x, S32 y, S32 start_x, S32 start_y, S32 slop )  { @@ -1058,39 +1159,70 @@ BOOL LLNetMap::handleHover( S32 x, S32 y, MASK mask )  	return TRUE;  } -void LLNetMap::handleZoom(const LLSD& userdata) +bool LLNetMap::isZoomChecked(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); -	} +    std::string level = userdata.asString(); +    F32         scale = getScaleForName(level); +    return scale == mScale; +} + +void LLNetMap::setZoom(const LLSD &userdata) +{ +    std::string level = userdata.asString(); +    F32         scale = getScaleForName(level); +    if (scale != 0.0f) +    { +        setScale(scale); +    }  }  void LLNetMap::handleStopTracking (const LLSD& userdata)  {  	if (mPopupMenu)  	{ -		mPopupMenu->setItemEnabled ("Stop Tracking", false); +		mPopupMenu->setItemEnabled ("Stop tracking", false);  		LLTracker::stopTracking (LLTracker::isTracking(NULL));  	}  }  void LLNetMap::activateCenterMap(const LLSD &userdata) { mCentering = true; } + +bool LLNetMap::isMapOrientationChecked(const LLSD &userdata) +{ +    const std::string command_name = userdata.asString(); +    const bool        rotate_map   = gSavedSettings.getBOOL("MiniMapRotate"); +    if (command_name == "north_at_top") +    { +        return !rotate_map; +    } + +    if (command_name == "camera_at_top") +    { +        return rotate_map; +    } + +    return false; +} + +void LLNetMap::setMapOrientation(const LLSD &userdata) +{ +    const std::string command_name = userdata.asString(); +    if (command_name == "north_at_top") +    { +        gSavedSettings.setBOOL("MiniMapRotate", false); +    } +    else if (command_name == "camera_at_top") +    { +        gSavedSettings.setBOOL("MiniMapRotate", true); +    } +} + +void LLNetMap::popupShowAboutLand(const LLSD &userdata) +{ +    // Update parcel selection. It's important to deselect land first so the "About Land" floater doesn't refresh with the old selection. +    LLViewerParcelMgr::getInstance()->deselectLand(); +    LLParcelSelectionHandle selection = LLViewerParcelMgr::getInstance()->selectParcelAt(mPopupWorldPos); +    gMenuHolder->setParcelSelection(selection); + +    LLFloaterReg::showInstance("about_land", LLSD(), false); +} diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 0f2eee171d..fe1aca65a9 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -62,9 +62,12 @@ protected:  public:  	virtual ~LLNetMap(); -	static const F32 MAP_SCALE_MIN; -	static const F32 MAP_SCALE_MID; -	static const F32 MAP_SCALE_MAX; +    static const F32 MAP_SCALE_MIN; +    static const F32 MAP_SCALE_FAR; +    static const F32 MAP_SCALE_MEDIUM; +    static const F32 MAP_SCALE_CLOSE; +    static const F32 MAP_SCALE_VERY_CLOSE; +    static const F32 MAP_SCALE_MAX;  	/*virtual*/ void	draw();  	/*virtual*/ BOOL	handleScrollWheel(S32 x, S32 y, S32 clicks); @@ -103,11 +106,14 @@ private:  	void			drawTracking( const LLVector3d& pos_global,   								  const LLColor4& color,  								  BOOL draw_arrow = TRUE); +    bool            isMouseOnPopupMenu(); +    void            updateAboutLandPopupButton();  	BOOL			handleToolTipAgent(const LLUUID& avatar_id);  	static void		showAvatarInspector(const LLUUID& avatar_id);  	void			createObjectImage(); +    F32             getScaleForName(std::string scale_name);  	static bool		outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y, S32 slop);  private: @@ -125,6 +131,7 @@ private:      bool            mCentering; // map is being re-centered around the agent      LLVector2       mCurPan;      LLVector2       mStartPan; // pan offset at start of drag +    LLVector3d      mPopupWorldPos; // world position picked under mouse when context menu is opened      LLCoordGL       mMouseDown; // pointer position at start of drag  	LLVector3d		mObjectImageCenterGlobal; @@ -147,9 +154,13 @@ public:  	void			setSelected(uuid_vec_t uuids) { gmSelected=uuids; };  private: -	void handleZoom(const LLSD& userdata); +    bool isZoomChecked(const LLSD& userdata); +    void setZoom(const LLSD& userdata);      void handleStopTracking(const LLSD& userdata);      void activateCenterMap(const LLSD& userdata); +    bool isMapOrientationChecked(const LLSD& userdata); +    void setMapOrientation(const LLSD& userdata); +    void popupShowAboutLand(const LLSD& userdata);  	LLMenuGL*		mPopupMenu;  	uuid_vec_t		gmSelected; diff --git a/indra/newview/skins/default/xui/en/menu_mini_map.xml b/indra/newview/skins/default/xui/en/menu_mini_map.xml index 402e1b34d0..2715c916d4 100644 --- a/indra/newview/skins/default/xui/en/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/en/menu_mini_map.xml @@ -8,80 +8,109 @@   top="724"   visible="false"   width="128"> -	<menu_item_call -     label="Zoom Close" -     name="Zoom Close"> -        <menu_item_call.on_click -         function="Minimap.Zoom" +    <menu_item_check +     label="Zoom very close" +     name="Zoom very close"> +        <menu_item_check.on_check +         function="Minimap.Zoom.Check" +         parameter="very close" /> +        <menu_item_check.on_click +         function="Minimap.Zoom.Set" +         parameter="very close" /> +    </menu_item_check> +    <menu_item_check +     label="Zoom close" +     name="Zoom close"> +        <menu_item_check.on_check +         function="Minimap.Zoom.Check"           parameter="close" /> -    </menu_item_call> -    <menu_item_call -     label="Zoom Medium" -     name="Zoom Medium"> -        <menu_item_call.on_click -         function="Minimap.Zoom" +        <menu_item_check.on_click +         function="Minimap.Zoom.Set" +         parameter="close" /> +    </menu_item_check> +    <menu_item_check +     label="Zoom medium" +     name="Zoom medium"> +        <menu_item_check.on_check +         function="Minimap.Zoom.Check"           parameter="medium" /> -    </menu_item_call> -    <menu_item_call -     label="Zoom Far" -     name="Zoom Far"> -        <menu_item_call.on_click -         function="Minimap.Zoom" +        <menu_item_check.on_click +         function="Minimap.Zoom.Set" +         parameter="medium" /> +    </menu_item_check> +    <menu_item_check +     label="Zoom far" +     name="Zoom far"> +        <menu_item_check.on_check +         function="Minimap.Zoom.Check"           parameter="far" /> -    </menu_item_call> -	<menu_item_call -     label="Zoom Default" -     name="Zoom Default"> -		<menu_item_call.on_click -         function="Minimap.Zoom" -         parameter="default" /> -	</menu_item_call> +        <menu_item_check.on_click +         function="Minimap.Zoom.Set" +         parameter="far" /> +    </menu_item_check>  	<menu_item_separator />      <menu_item_check -       label="Rotate Map" -       name="Rotate Map"> +       label="North at top" +       name="North at top">            <menu_item_check.on_check -             control="MiniMapRotate" /> +             function="Minimap.MapOrientation.Check" +             parameter="north_at_top" />            <menu_item_check.on_click -             function="ToggleControl" -             parameter="MiniMapRotate" /> +             function="Minimap.MapOrientation.Set" +             parameter="north_at_top" />      </menu_item_check> -    <menu_item_separator />      <menu_item_check -       label="Auto-center map" -       name="Auto-center map"> +       label="Camera at top" +       name="Camera at top">            <menu_item_check.on_check -             control="MiniMapAutoCenter" /> +             function="Minimap.MapOrientation.Check" +             parameter="camera_at_top" />            <menu_item_check.on_click -             function="ToggleControl" -             parameter="MiniMapAutoCenter" /> +             function="Minimap.MapOrientation.Set" +             parameter="camera_at_top" /> +    </menu_item_check> +	<menu_item_separator /> +    <menu_item_check +     label="Show parcel boundaries" +     name="Show parcel boundaries"> +        <menu_item_check.on_check +         control="MiniMapShowPropertyLines" /> +        <menu_item_check.on_click +         function="ToggleControl" +         parameter="MiniMapShowPropertyLines" /> +    </menu_item_check> +    <menu_item_separator /> +    <menu_item_check +     label="Auto-center map" +     name="Auto-center map"> +        <menu_item_check.on_check +         control="MiniMapAutoCenter" /> +        <menu_item_check.on_click +         function="ToggleControl" +         parameter="MiniMapAutoCenter" />      </menu_item_check>      <menu_item_separator />      <menu_item_call -     label="Re-Center Map" -     name="Re-Center Map"> +     label="Re-center map" +     name="Re-center map">          <menu_item_call.on_click           function="Minimap.Center.Activate" />      </menu_item_call>      <menu_item_call -     label="Stop Tracking" -     name="Stop Tracking"> +     label="Stop tracking" +     name="Stop tracking">          <menu_item_call.on_click           function="Minimap.Tracker"           parameter="task_properties" />      </menu_item_call> -	<menu_item_separator /> -    <menu_item_check -     label="Show Property Lines" -     name="Show Property Lines"> -        <menu_item_check.on_check -         control="MiniMapShowPropertyLines" /> -        <menu_item_check.on_click -         function="ToggleControl" -         parameter="MiniMapShowPropertyLines" /> -    </menu_item_check>      <menu_item_separator />      <menu_item_call +     label="About Land" +     name="About Land"> +        <menu_item_call.on_click +         function="Minimap.AboutLand" /> +    </menu_item_call> +    <menu_item_call       label="World Map"       name="World Map">          <menu_item_call.on_click | 
