From b9de65d2750c0f5632116864af792c40078830ab Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Tue, 29 Aug 2023 15:07:41 +0200 Subject: SL-20209 Add 'noscroll' parameter to LLPanelEmojiComplete::Params --- indra/newview/llpanelemojicomplete.cpp | 25 ++++++++++++++++++++++--- indra/newview/llpanelemojicomplete.h | 17 ++++++++++++----- 2 files changed, 34 insertions(+), 8 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index 8b89e3aa14..8fc84c0387 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -41,6 +41,7 @@ static LLDefaultChildRegistry::Register r("emoji_complete" LLPanelEmojiComplete::Params::Params() : autosize("autosize") + , noscroll("noscroll") , max_emoji("max_emoji") , padding("padding") , selected_image("selected_image") @@ -50,6 +51,7 @@ LLPanelEmojiComplete::Params::Params() LLPanelEmojiComplete::LLPanelEmojiComplete(const LLPanelEmojiComplete::Params& p) : LLUICtrl(p) , mAutoSize(p.autosize) + , mNoScroll(p.noscroll) , mMaxVisible(p.max_emoji) , mPadding(p.padding) , mSelectedImage(p.selected_image) @@ -152,7 +154,7 @@ BOOL LLPanelEmojiComplete::handleMouseUp(S32 x, S32 y, MASK mask) void LLPanelEmojiComplete::onCommit() { - if (npos != mCurSelected) + if (mCurSelected < mEmojis.size()) { LLWString wstr; wstr.push_back(mEmojis.at(mCurSelected)); @@ -167,6 +169,14 @@ void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_paren updateConstraints(); } +void LLPanelEmojiComplete::setEmojis(const LLWString& emojis) +{ + mEmojis = emojis; + mCurSelected = 0; + + onEmojisChanged(); +} + void LLPanelEmojiComplete::setEmojiHint(const std::string& hint) { llwchar curEmoji = (mCurSelected < mEmojis.size()) ? mEmojis.at(mCurSelected) : 0; @@ -175,6 +185,11 @@ void LLPanelEmojiComplete::setEmojiHint(const std::string& hint) size_t curEmojiIdx = (curEmoji) ? mEmojis.find(curEmoji) : std::string::npos; mCurSelected = (std::string::npos != curEmojiIdx) ? curEmojiIdx : 0; + onEmojisChanged(); +} + +void LLPanelEmojiComplete::onEmojisChanged() +{ if (mAutoSize) { mVisibleEmojis = std::min(mEmojis.size(), mMaxVisible); @@ -233,9 +248,13 @@ void LLPanelEmojiComplete::updateConstraints() void LLPanelEmojiComplete::updateScrollPos() { const size_t cntEmoji = mEmojis.size(); - if (0 == cntEmoji || cntEmoji < mVisibleEmojis || 0 == mCurSelected) + if (mNoScroll || 0 == cntEmoji || cntEmoji < mVisibleEmojis || 0 == mCurSelected) { mScrollPos = 0; + if (mCurSelected >= mVisibleEmojis) + { + mCurSelected = mVisibleEmojis ? mVisibleEmojis - 1 : 0; + } } else if (cntEmoji - 1 == mCurSelected) { @@ -273,11 +292,11 @@ BOOL LLFloaterEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_pare handled = true; break; } - } if (handled) return TRUE; + return LLFloater::handleKey(key, mask, called_from_parent); } diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index aa0f806525..3456de4044 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -40,6 +40,7 @@ public: struct Params : public LLInitParam::Block { Optional autosize; + Optional noscroll; Optional max_emoji, padding; @@ -50,6 +51,7 @@ public: protected: LLPanelEmojiComplete(const LLPanelEmojiComplete::Params&); + public: virtual ~LLPanelEmojiComplete(); @@ -62,9 +64,13 @@ public: void reshape(S32 width, S32 height, BOOL called_from_parent) override; public: + const LLWString& getEmojis() const { return mEmojis; } size_t getEmojiCount() const { return mEmojis.size(); } - void setEmojiHint(const std::string& hint); + void setEmojis(const LLWString& emojis); + void setEmojiHint(const std::string& hint); + protected: + void LLPanelEmojiComplete::onEmojisChanged(); size_t posToIndex(S32 x, S32 y) const; void select(size_t emoji_idx); void selectNext(); @@ -76,13 +82,14 @@ protected: protected: static constexpr auto npos = std::numeric_limits::max(); - bool mAutoSize = false; + const bool mAutoSize = false; + const bool mNoScroll = false; const LLFontGL* mFont; U16 mEmojiWidth = 0; - size_t mMaxVisible = 0; - S32 mPadding = 8; + const size_t mMaxVisible = 0; + const S32 mPadding = 8; LLRect mRenderRect; - LLUIImagePtr mSelectedImage; + const LLUIImagePtr mSelectedImage; LLWString mEmojis; size_t mVisibleEmojis = 0; -- cgit v1.2.3