diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-08-31 00:30:07 +0300 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-08-31 00:30:49 +0300 | 
| commit | d19d82712125b8a70056f2fa288cdd25205770a8 (patch) | |
| tree | ece789aa802dac877fc8fe8cb035894e3a4427a6 /indra/llui | |
| parent | fbccc0986d6487c4490edee6e5793fcaeaf3415b (diff) | |
| parent | d31a83fb946c49a38376ea3b312b5380d0c8c065 (diff) | |
Merge branch master (DRTVWR-483) into DRTVWR-559
# Conflicts:
#	indra/newview/lllocalbitmaps.cpp
#	indra/newview/lllocalbitmaps.h
#	indra/newview/llviewerregion.cpp
#            lllocalgltfmaterials.* were modified to match lllocalbitmaps*
Diffstat (limited to 'indra/llui')
| -rw-r--r-- | indra/llui/llfloater.cpp | 17 | ||||
| -rw-r--r-- | indra/llui/llfloater.h | 1 | ||||
| -rw-r--r-- | indra/llui/lliconctrl.cpp | 13 | ||||
| -rw-r--r-- | indra/llui/lliconctrl.h | 7 | ||||
| -rw-r--r-- | indra/llui/llmenubutton.cpp | 8 | ||||
| -rw-r--r-- | indra/llui/llmenubutton.h | 3 | ||||
| -rw-r--r-- | indra/llui/lltabcontainer.cpp | 18 | ||||
| -rw-r--r-- | indra/llui/lltextbase.cpp | 50 | ||||
| -rw-r--r-- | indra/llui/lltextbase.h | 7 | 
9 files changed, 108 insertions, 16 deletions
| diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 03efd09689..c6a3ada777 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -259,6 +259,7 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)  	mMinHeight(p.min_height),  	mHeaderHeight(p.header_height),  	mLegacyHeaderHeight(p.legacy_header_height), +	mDefaultRectForGroup(true),  	mMinimized(FALSE),  	mForeground(FALSE),  	mFirstLook(TRUE), @@ -906,7 +907,10 @@ bool LLFloater::applyRectControl()  	if (last_in_group && last_in_group != this)  	{  		// other floaters in our group, position ourselves relative to them and don't save the rect -		mRectControl.clear(); +		if (mDefaultRectForGroup) +		{ +			mRectControl.clear(); +		}  		mPositioning = LLFloaterEnums::POSITIONING_CASCADE_GROUP;  	}  	else @@ -3481,8 +3485,15 @@ void LLFloater::stackWith(LLFloater& other)  	}  	next_rect.translate(floater_offset, -floater_offset); -	next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, getRect().getWidth(), getRect().getHeight()); -	 +	const LLRect& rect = getControlGroup()->getRect(mRectControl); +	if (rect.notEmpty() && !mDefaultRectForGroup && mResizable) +	{ +		next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, llmax(mMinWidth, rect.getWidth()), llmax(mMinHeight, rect.getHeight())); +	} +	else +	{ +		next_rect.setLeftTopAndSize(next_rect.mLeft, next_rect.mTop, getRect().getWidth(), getRect().getHeight()); +	}  	setShape(next_rect);  	if (!other.getHost()) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 306760b7fb..668cd208a9 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -454,6 +454,7 @@ public:  protected:  	bool			mSaveRect; +	bool			mDefaultRectForGroup;  	std::string		mRectControl;  	std::string		mPosXControl;  	std::string		mPosYControl; diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp index 82b01e705d..e01aba402e 100644 --- a/indra/llui/lliconctrl.cpp +++ b/indra/llui/lliconctrl.cpp @@ -35,6 +35,7 @@  #include "llui.h"  #include "lluictrlfactory.h"  #include "lluiimage.h" +#include "llwindow.h"  static LLDefaultChildRegistry::Register<LLIconCtrl> r("icon"); @@ -42,6 +43,7 @@ LLIconCtrl::Params::Params()  :	image("image_name"),  	color("color"),  	use_draw_context_alpha("use_draw_context_alpha", true), +    interactable("interactable", false),  	scale_image("scale_image"),  	min_width("min_width", 0),  	min_height("min_height", 0) @@ -52,6 +54,7 @@ LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p)  	mColor(p.color()),  	mImagep(p.image),  	mUseDrawContextAlpha(p.use_draw_context_alpha), +    mInteractable(p.interactable),  	mPriority(0),  	mMinWidth(p.min_width),  	mMinHeight(p.min_height), @@ -81,6 +84,16 @@ void LLIconCtrl::draw()  	LLUICtrl::draw();  } +BOOL LLIconCtrl::handleHover(S32 x, S32 y, MASK mask) +{ +    if (mInteractable && getEnabled()) +    { +        getWindow()->setCursor(UI_CURSOR_HAND); +        return TRUE; +    } +    return LLUICtrl::handleHover(x, y, mask); +} +  // virtual  // value might be a string or a UUID  void LLIconCtrl::setValue(const LLSD& value) diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h index dd83e78fd3..9c3b517bca 100644 --- a/indra/llui/lliconctrl.h +++ b/indra/llui/lliconctrl.h @@ -48,7 +48,8 @@ public:  	{  		Optional<LLUIImage*>	image;  		Optional<LLUIColor>		color; -		Optional<bool>			use_draw_context_alpha; +		Optional<bool>			use_draw_context_alpha, +                                interactable;  		Optional<S32>			min_width,  								min_height;  		Ignored					scale_image; @@ -67,6 +68,9 @@ public:  	// llview overrides  	virtual void	draw(); +    // llview overrides +    virtual BOOL handleHover(S32 x, S32 y, MASK mask); +  	// lluictrl overrides  	virtual void	setValue(const LLSD& value ); @@ -88,6 +92,7 @@ protected:  	// If set to true (default), use the draw context transparency.  	// If false, will use transparency returned by getCurrentTransparency(). See STORM-698.  	bool mUseDrawContextAlpha; +    bool mInteractable;  private:  	LLUIColor mColor; diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp index 303afcda15..583704418b 100644 --- a/indra/llui/llmenubutton.cpp +++ b/indra/llui/llmenubutton.cpp @@ -40,6 +40,7 @@ void LLMenuButton::MenuPositions::declareValues()  	declare("topleft", MP_TOP_LEFT);  	declare("topright", MP_TOP_RIGHT);  	declare("bottomleft", MP_BOTTOM_LEFT); +	declare("bottomright", MP_BOTTOM_RIGHT);  }  LLMenuButton::Params::Params() @@ -212,6 +213,13 @@ void LLMenuButton::updateMenuOrigin()  			mY = rect.mBottom;  			break;  		} +		case MP_BOTTOM_RIGHT: +		{ +			const LLRect& menu_rect = menu->getRect(); +			mX = rect.mRight - menu_rect.getWidth(); +			mY = rect.mBottom; +			break; +		}  	}  } diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h index 67ec1983b3..e42f8f53bd 100644 --- a/indra/llui/llmenubutton.h +++ b/indra/llui/llmenubutton.h @@ -41,7 +41,8 @@ public:  	{  		MP_TOP_LEFT,  		MP_TOP_RIGHT, -		MP_BOTTOM_LEFT +		MP_BOTTOM_LEFT, +		MP_BOTTOM_RIGHT  	} EMenuPosition;  	struct MenuPositions diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index 459fdcf2ae..0aa7a2d217 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -402,9 +402,13 @@ void LLTabContainer::draw()  	S32 cur_scroll_pos = getScrollPos();  	if (cur_scroll_pos > 0)  	{ -		S32 available_width_with_arrows = getRect().getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + tabcntr_arrow_btn_size  + tabcntr_arrow_btn_size + 1); -		if (!mIsVertical) +		if (mIsVertical)  		{ +			target_pixel_scroll = cur_scroll_pos * (BTN_HEIGHT + tabcntrv_pad); +		} +		else +		{ +			S32 available_width_with_arrows = getRect().getWidth() - mRightTabBtnOffset - 2 * (LLPANEL_BORDER_WIDTH + tabcntr_arrow_btn_size  + tabcntr_arrow_btn_size + 1);  			for(tuple_list_t::iterator iter = mTabList.begin(); iter != mTabList.end(); ++iter)  			{  				if (cur_scroll_pos == 0) @@ -1189,13 +1193,15 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)  	sendChildToFront(mNextArrowBtn);  	sendChildToFront(mJumpPrevArrowBtn);  	sendChildToFront(mJumpNextArrowBtn); -	 + +	updateMaxScrollPos(); +  	if( select )  	{  		selectLastTab(); +		mScrollPos = mMaxScrollPos;  	} -	updateMaxScrollPos();  }  void LLTabContainer::addPlaceholder(LLPanel* child, const std::string& label) @@ -2079,9 +2085,9 @@ void LLTabContainer::updateMaxScrollPos()  		if( tab_total_height > available_height )  		{  			static LLUICachedControl<S32> tabcntrv_arrow_btn_size ("UITabCntrvArrowBtnSize", 0); -			S32 available_height_with_arrows = getRect().getHeight() - 2*(tabcntrv_arrow_btn_size + 3*tabcntrv_pad); +			S32 available_height_with_arrows = getRect().getHeight() - 2*(tabcntrv_arrow_btn_size + 3*tabcntrv_pad) - mNextArrowBtn->getRect().mBottom;  			S32 additional_needed = tab_total_height - available_height_with_arrows; -			setMaxScrollPos((S32) ceil(additional_needed / float(BTN_HEIGHT) ) ); +			setMaxScrollPos((S32) ceil(additional_needed / float(BTN_HEIGHT + tabcntrv_pad) ) );  			no_scroll = FALSE;  		}  	} diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 0dc99fdde6..c4a529e4ad 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -163,6 +163,7 @@ LLTextBase::Params::Params()  	font_shadow("font_shadow"),  	wrap("wrap"),  	trusted_content("trusted_content", true), +	always_show_icons("always_show_icons", false),  	use_ellipses("use_ellipses", false),  	parse_urls("parse_urls", false),  	force_urls_external("force_urls_external", false), @@ -212,6 +213,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)  	mClip(p.clip),  	mClipPartial(p.clip_partial && !p.allow_scroll),  	mTrustedContent(p.trusted_content), +	mAlwaysShowIcons(p.always_show_icons),  	mTrackEnd( p.track_end ),  	mScrollIndex(-1),  	mSelectionStart( 0 ), @@ -448,8 +450,48 @@ void LLTextBase::drawSelectionBackground()  			++rect_it)  		{  			LLRect selection_rect = *rect_it; -			selection_rect = *rect_it; -			selection_rect.translate(mVisibleTextRect.mLeft - content_display_rect.mLeft, mVisibleTextRect.mBottom - content_display_rect.mBottom); +            if (mScroller) +            { +                // If scroller is On content_display_rect has correct rect and safe to use as is +                // Note: we might need to account for border +                selection_rect.translate(mVisibleTextRect.mLeft - content_display_rect.mLeft, mVisibleTextRect.mBottom - content_display_rect.mBottom); +            } +            else +            { +                // If scroller is Off content_display_rect will have rect from document, adjusted to text width, heigh and position +                // and we have to acount for offset depending on position +                S32 v_delta = 0; +                S32 h_delta = 0; +                switch (mVAlign) +                { +                case LLFontGL::TOP: +                    v_delta = mVisibleTextRect.mTop - content_display_rect.mTop - mVPad; +                    break; +                case LLFontGL::VCENTER: +                    v_delta = (llmax(mVisibleTextRect.getHeight() - content_display_rect.mTop, -content_display_rect.mBottom) + (mVisibleTextRect.mBottom - content_display_rect.mBottom)) / 2; +                    break; +                case LLFontGL::BOTTOM: +                    v_delta = mVisibleTextRect.mBottom - content_display_rect.mBottom; +                    break; +                default: +                    break; +                } +                switch (mHAlign) +                { +                case LLFontGL::LEFT: +                    h_delta = mVisibleTextRect.mLeft - content_display_rect.mLeft + mHPad; +                    break; +                case LLFontGL::HCENTER: +                    h_delta = (llmax(mVisibleTextRect.getWidth() - content_display_rect.mLeft, -content_display_rect.mRight) + (mVisibleTextRect.mRight - content_display_rect.mRight)) / 2; +                    break; +                case LLFontGL::RIGHT: +                    h_delta = mVisibleTextRect.mRight - content_display_rect.mRight; +                    break; +                default: +                    break; +                } +                selection_rect.translate(h_delta, v_delta); +            }  			gl_rect_2d(selection_rect, selection_color);  		}  	} @@ -2116,7 +2158,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para  		LLUrlMatch match;  		std::string text = new_text;  		while ( LLUrlRegistry::instance().findUrl(text, match, -				boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3),isContentTrusted())) +				boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3),isContentTrusted() || mAlwaysShowIcons))  		{  			start = match.getStart();  			end = match.getEnd()+1; @@ -2141,7 +2183,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para  			}  			// add icon before url if need -			LLTextUtil::processUrlMatch(&match, this, isContentTrusted() || match.isTrusted()); +			LLTextUtil::processUrlMatch(&match, this, isContentTrusted() || match.isTrusted() || mAlwaysShowIcons);  			if ((isContentTrusted() || match.isTrusted()) && !match.getIcon().empty() )  			{  				setLastSegmentToolTip(LLTrans::getString("TooltipSLIcon")); diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index a4e83b42b4..25f8fa1c2b 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -321,7 +321,8 @@ public:  								parse_highlights,  								clip,  								clip_partial, -								trusted_content; +								trusted_content, +								always_show_icons;  		Optional<S32>			v_pad,  								h_pad; @@ -369,6 +370,8 @@ public:  	virtual void	onFocusReceived();  	virtual void	onFocusLost(); +    void        setParseHTML(bool parse_html) { mParseHTML = parse_html; } +  	// LLSpellCheckMenuHandler overrides  	/*virtual*/ bool		getSpellCheck() const; @@ -702,6 +705,8 @@ protected:  	bool						mAutoIndent;  	S32							mMaxTextByteLength;	// Maximum length mText is allowed to be in bytes  	bool						mSkipTripleClick; +	bool						mAlwaysShowIcons; +  	bool						mSkipLinkUnderline;  	// support widgets | 
