From 2b56570c6867dc39aa4c8a19d2657ffed6c596b2 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 24 Feb 2023 12:51:03 +0200 Subject: [PATCH] SL-19108 Fallback thumbnail --- indra/newview/llthumbnailctrl.cpp | 28 +++++++++++++++++- indra/newview/llthumbnailctrl.h | 2 ++ .../icons/thumbnail_fallback_icon.png | Bin 0 -> 6162 bytes .../skins/default/textures/textures.xml | 1 + .../xui/en/floater_change_item_thumbnail.xml | 1 + .../default/xui/en/sidepanel_item_info.xml | 1 + 6 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 indra/newview/skins/default/textures/icons/thumbnail_fallback_icon.png diff --git a/indra/newview/llthumbnailctrl.cpp b/indra/newview/llthumbnailctrl.cpp index 4245237529..1b054b4c27 100644 --- a/indra/newview/llthumbnailctrl.cpp +++ b/indra/newview/llthumbnailctrl.cpp @@ -43,6 +43,7 @@ static LLDefaultChildRegistry::Register r("thumbnail"); LLThumbnailCtrl::Params::Params() : border("border") , border_color("border_color") +, fallback_image("fallback_image") , image_name("image_name") , border_visible("show_visible", false) , interactable("interactable", false) @@ -53,6 +54,7 @@ LLThumbnailCtrl::LLThumbnailCtrl(const LLThumbnailCtrl::Params& p) : LLUICtrl(p) , mBorderColor(p.border_color()) , mBorderVisible(p.border_visible()) +, mFallbackImagep(p.fallback_image) , mInteractable(p.interactable()) , mShowLoadingPlaceholder(p.show_loading()) , mPriority(LLGLTexture::BOOST_PREVIEW) @@ -76,6 +78,7 @@ LLThumbnailCtrl::~LLThumbnailCtrl() { mTexturep = nullptr; mImagep = nullptr; + mFallbackImagep = nullptr; } @@ -106,7 +109,30 @@ void LLThumbnailCtrl::draw() } else if( mImagep.notNull() ) { - mImagep->draw(getLocalRect(), UI_VERTEX_COLOR % alpha ); + mImagep->draw(draw_rect, UI_VERTEX_COLOR % alpha ); + } + else if (mFallbackImagep.notNull()) + { + if (draw_rect.getWidth() > mFallbackImagep->getWidth() + && draw_rect.getHeight() > mFallbackImagep->getHeight()) + { + S32 img_width = mFallbackImagep->getWidth(); + S32 img_height = mFallbackImagep->getHeight(); + S32 rect_width = draw_rect.getWidth(); + S32 rect_height = draw_rect.getHeight(); + + LLRect fallback_rect; + fallback_rect.mLeft = draw_rect.mLeft + (rect_width - img_width) / 2; + fallback_rect.mRight = fallback_rect.mLeft + img_width; + fallback_rect.mBottom = draw_rect.mBottom + (rect_height - img_height) / 2; + fallback_rect.mTop = fallback_rect.mBottom + img_height; + + mFallbackImagep->draw(fallback_rect, UI_VERTEX_COLOR % alpha); + } + else + { + mFallbackImagep->draw(draw_rect, UI_VERTEX_COLOR % alpha); + } } else { diff --git a/indra/newview/llthumbnailctrl.h b/indra/newview/llthumbnailctrl.h index 978da8d71c..dc21046841 100644 --- a/indra/newview/llthumbnailctrl.h +++ b/indra/newview/llthumbnailctrl.h @@ -49,6 +49,7 @@ public: Optional border; Optional border_color; Optional image_name; + Optional fallback_image; Optional border_visible; Optional interactable; Optional show_loading; @@ -80,6 +81,7 @@ private: LLPointer mTexturep; LLPointer mImagep; + LLPointer mFallbackImagep; }; #endif diff --git a/indra/newview/skins/default/textures/icons/thumbnail_fallback_icon.png b/indra/newview/skins/default/textures/icons/thumbnail_fallback_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8d5ca624af31012a632d2bdc38caa3744082969b GIT binary patch literal 6162 zcmV+t813hYP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000Uv 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 +