diff options
| -rw-r--r-- | indra/llui/llscrollbar.cpp | 6 | ||||
| -rw-r--r-- | indra/newview/llpanelemojicomplete.cpp | 449 | ||||
| -rw-r--r-- | indra/newview/llpanelemojicomplete.h | 125 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_emoji_complete.xml | 6 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_im_session.xml | 2 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/widgets/emoji_complete.xml | 2 | 
6 files changed, 350 insertions, 240 deletions
diff --git a/indra/llui/llscrollbar.cpp b/indra/llui/llscrollbar.cpp index fde6de4921..d5d0d97b55 100644 --- a/indra/llui/llscrollbar.cpp +++ b/indra/llui/llscrollbar.cpp @@ -475,13 +475,15 @@ void LLScrollbar::reshape(S32 width, S32 height, BOOL called_from_parent)  	{  		up_button->reshape(up_button->getRect().getWidth(), llmin(getRect().getHeight() / 2, mThickness));  		down_button->reshape(down_button->getRect().getWidth(), llmin(getRect().getHeight() / 2, mThickness)); -		up_button->setOrigin(up_button->getRect().mLeft, getRect().getHeight() - up_button->getRect().getHeight()); +		up_button->setOrigin(0, getRect().getHeight() - up_button->getRect().getHeight()); +		down_button->setOrigin(0, 0);  	}  	else  	{  		up_button->reshape(llmin(getRect().getWidth() / 2, mThickness), up_button->getRect().getHeight());  		down_button->reshape(llmin(getRect().getWidth() / 2, mThickness), down_button->getRect().getHeight()); -		down_button->setOrigin(getRect().getWidth() - down_button->getRect().getWidth(), down_button->getRect().mBottom); +		up_button->setOrigin(0, 0); +		down_button->setOrigin(getRect().getWidth() - down_button->getRect().getWidth(), 0);  	}  	updateThumbRect();  } diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp index 732531691b..b03f16899e 100644 --- a/indra/newview/llpanelemojicomplete.cpp +++ b/indra/newview/llpanelemojicomplete.cpp @@ -29,10 +29,12 @@  #include "llemojidictionary.h"  #include "llemojihelper.h"  #include "llpanelemojicomplete.h" +#include "llscrollbar.h"  #include "lluictrlfactory.h"  constexpr U32 MIN_MOUSE_MOVE_DELTA = 4;  constexpr U32 MIN_SHORT_CODE_WIDTH = 100; +constexpr U32 DEF_PADDING = 8;  // ============================================================================  // LLPanelEmojiComplete @@ -41,26 +43,35 @@ constexpr U32 MIN_SHORT_CODE_WIDTH = 100;  static LLDefaultChildRegistry::Register<LLPanelEmojiComplete> r("emoji_complete");  LLPanelEmojiComplete::Params::Params() -	: autosize("autosize") -	, noscroll("noscroll") -	, vertical("vertical") -	, max_emoji("max_emoji") -	, padding("padding") -	, selected_image("selected_image") +    : autosize("autosize") +    , noscroll("noscroll") +    , vertical("vertical") +    , max_visible("max_visible") +    , padding("padding", DEF_PADDING) +    , selected_image("selected_image")  {  }  LLPanelEmojiComplete::LLPanelEmojiComplete(const LLPanelEmojiComplete::Params& p) -	: LLUICtrl(p) -	, mAutoSize(p.autosize) -	, mNoScroll(p.noscroll) -	, mVertical(p.vertical) -	, mMaxVisible(p.max_emoji) -	, mPadding(p.padding) -	, mSelectedImage(p.selected_image) -	, mIconFont(LLFontGL::getFontEmojiHuge()) -	, mTextFont(LLFontGL::getFontSansSerifBig()) +    : LLUICtrl(p) +    , mAutoSize(p.autosize) +    , mNoScroll(p.noscroll) +    , mVertical(p.vertical) +    , mMaxVisible(p.max_visible) +    , mPadding(p.padding) +    , mSelectedImage(p.selected_image) +    , mIconFont(LLFontGL::getFontEmojiHuge()) +    , mTextFont(LLFontGL::getFontSansSerifBig()) +    , mScrollbar(nullptr)  { +    if (mVertical) +    { +        LLScrollbar::Params sbparams; +        sbparams.orientation(LLScrollbar::VERTICAL); +        sbparams.change_callback([this](S32 index, LLScrollbar*) { onScrollbarChange(index); }); +        mScrollbar = LLUICtrlFactory::create<LLScrollbar>(sbparams); +        addChild(mScrollbar); +    }  }  LLPanelEmojiComplete::~LLPanelEmojiComplete() @@ -69,13 +80,15 @@ LLPanelEmojiComplete::~LLPanelEmojiComplete()  void LLPanelEmojiComplete::draw()  { +    LLUICtrl::draw(); +      if (mEmojis.empty())          return;      const size_t firstVisibleIdx = mScrollPos; -    const size_t lastVisibleIdx = llmin(mScrollPos + mVisibleEmojis, mEmojis.size()) - 1; +    const size_t lastVisibleIdx = llmin(mScrollPos + mVisibleEmojis, mTotalEmojis); -    if (mCurSelected >= firstVisibleIdx && mCurSelected <= lastVisibleIdx) +    if (mCurSelected >= firstVisibleIdx && mCurSelected < lastVisibleIdx)      {          S32 x, y, width, height;          if (mVertical) @@ -100,7 +113,7 @@ void LLPanelEmojiComplete::draw()      S32 textLeft = mVertical ? mRenderRect.mLeft + mEmojiWidth + mPadding : 0;      S32 textWidth = mVertical ? getRect().getWidth() - textLeft - mPadding : 0; -    for (U32 curIdx = firstVisibleIdx; curIdx <= lastVisibleIdx; curIdx++) +    for (U32 curIdx = firstVisibleIdx; curIdx < lastVisibleIdx; curIdx++)      {          mIconFont->render(mEmojis, curIdx, iconCenterX, iconCenterY,              LLColor4::white, LLFontGL::HCENTER, LLFontGL::VCENTER, LLFontGL::NORMAL, @@ -128,100 +141,154 @@ void LLPanelEmojiComplete::draw()  BOOL LLPanelEmojiComplete::handleHover(S32 x, S32 y, MASK mask)  { -	LLVector2 curHover(x, y); -	if ((mLastHover - curHover).lengthSquared() > MIN_MOUSE_MOVE_DELTA) -	{ -		mCurSelected = posToIndex(x, y); -		mLastHover = curHover; -	} - -	return TRUE; +    if (mScrollbar && mScrollbar->getVisible() && childrenHandleHover(x, y, mask)) +        return TRUE; + +    LLVector2 curHover(x, y); +    if ((mLastHover - curHover).lengthSquared() > MIN_MOUSE_MOVE_DELTA) +    { +        size_t index = posToIndex(x, y); +        if (index < mTotalEmojis) +            mCurSelected = index; +        mLastHover = curHover; +    } + +    return TRUE;  }  BOOL LLPanelEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent)  { -	bool handled = false; -	if (MASK_NONE == mask) -	{ -		switch (key) -		{ -			case KEY_LEFT: -			case KEY_UP: -				selectPrevious(); -				handled = true; -				break; -			case KEY_RIGHT: -			case KEY_DOWN: -				selectNext(); -				handled = true; -				break; -			case KEY_RETURN: -				if (!mEmojis.empty()) -				{ -					onCommit(); -					handled = true; -				} -				break; -		} -	} - -	if (handled) -	{ -		return TRUE; -	} -	return LLUICtrl::handleKey(key, mask, called_from_parent); +    bool handled = false; +    if (mTotalEmojis && MASK_NONE == mask) +    { +        switch (key) +        { +        case KEY_HOME: +            select(0); +            handled = true; +            break; + +        case KEY_END: +            select(mTotalEmojis - 1); +            handled = true; +            break; + +        case KEY_PAGE_DOWN: +            select(mCurSelected + mVisibleEmojis - 1); +            handled = true; +            break; + +        case KEY_PAGE_UP: +            select(mCurSelected - llmin(mCurSelected, mVisibleEmojis + 1)); +            handled = true; +            break; + +        case KEY_LEFT: +        case KEY_UP: +            selectPrevious(); +            handled = true; +            break; + +        case KEY_RIGHT: +        case KEY_DOWN: +            selectNext(); +            handled = true; +            break; + +        case KEY_RETURN: +            onCommit(); +            handled = true; +            break; +        } +    } + +    if (handled) +    { +        return TRUE; +    } + +    return LLUICtrl::handleKey(key, mask, called_from_parent);  }  BOOL LLPanelEmojiComplete::handleMouseDown(S32 x, S32 y, MASK mask)  { -	mCurSelected = posToIndex(x, y); -	mLastHover = LLVector2(x, y); +    if (mScrollbar && mScrollbar->getVisible() && childrenHandleMouseDown(x, y, mask)) +        return TRUE; + +    mCurSelected = posToIndex(x, y); +    mLastHover = LLVector2(x, y); -	return TRUE; +    return TRUE;  }  BOOL LLPanelEmojiComplete::handleMouseUp(S32 x, S32 y, MASK mask)  { -	mCurSelected = posToIndex(x, y); -	onCommit(); +    if (mScrollbar && mScrollbar->getVisible() && childrenHandleMouseUp(x, y, mask)) +        return TRUE; + +    mCurSelected = posToIndex(x, y); +    onCommit(); + +    return TRUE; +} + +BOOL LLPanelEmojiComplete::handleScrollWheel(S32 x, S32 y, S32 clicks) +{ +    if (mNoScroll) +        return FALSE; -	return TRUE; +    if (mScrollbar && mScrollbar->getVisible() && mScrollbar->handleScrollWheel(x, y, clicks)) +    { +        mCurSelected = posToIndex(x, y); +        return TRUE; +    } + +    if (mTotalEmojis > mVisibleEmojis) +    { +        mScrollPos = llclamp<size_t>(mScrollPos + clicks, 0, mTotalEmojis - mVisibleEmojis); +        mCurSelected = posToIndex(x, y); +        return TRUE; +    } + +    return FALSE;  }  void LLPanelEmojiComplete::onCommit()  { -	if (mCurSelected < mEmojis.size()) -	{ -		LLWString wstr; -		wstr.push_back(mEmojis.at(mCurSelected)); -		setValue(wstring_to_utf8str(wstr)); -		LLUICtrl::onCommit(); -	} +    if (mCurSelected < mTotalEmojis) +    { +        LLWString wstr; +        wstr.push_back(mEmojis.at(mCurSelected)); +        setValue(wstring_to_utf8str(wstr)); +        LLUICtrl::onCommit(); +    }  }  void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent)  { -	LLUICtrl::reshape(width, height, called_from_parent); -	updateConstraints(); +    LLUICtrl::reshape(width, height, called_from_parent); +    updateConstraints();  }  void LLPanelEmojiComplete::setEmojis(const LLWString& emojis)  { -	mEmojis = emojis; -	mCurSelected = 0; +    mEmojis = emojis; +    mTotalEmojis = mEmojis.size(); +    mCurSelected = 0; -	onEmojisChanged(); +    onEmojisChanged();  }  void LLPanelEmojiComplete::setEmojiHint(const std::string& hint)  { -	llwchar curEmoji = (mCurSelected < mEmojis.size()) ? mEmojis.at(mCurSelected) : 0; +    llwchar curEmoji = mCurSelected < mTotalEmojis ? mEmojis.at(mCurSelected) : 0; -	mEmojis = LLEmojiDictionary::instance().findMatchingEmojis(hint); -	size_t curEmojiIdx = curEmoji ? mEmojis.find(curEmoji) : std::string::npos; -	mCurSelected = (std::string::npos != curEmojiIdx) ? curEmojiIdx : 0; +    mEmojis = LLEmojiDictionary::instance().findMatchingEmojis(hint); +    mTotalEmojis = mEmojis.size(); +    size_t curEmojiIdx = curEmoji ? mEmojis.find(curEmoji) : std::string::npos; +    mCurSelected = std::string::npos != curEmojiIdx ? curEmojiIdx : 0; -	onEmojisChanged(); +    onEmojisChanged();  }  U32 LLPanelEmojiComplete::getMaxShortCodeWidth() const @@ -246,79 +313,104 @@ U32 LLPanelEmojiComplete::getMaxShortCodeWidth() const  void LLPanelEmojiComplete::onEmojisChanged()  { -	if (mAutoSize) -	{ -		mVisibleEmojis = std::min(mEmojis.size(), mMaxVisible); +    if (mAutoSize) +    { +        S32 width, height; +        mVisibleEmojis = llmin(mTotalEmojis, mMaxVisible);          if (mVertical)          {              U32 maxShortCodeWidth = getMaxShortCodeWidth(); -            U32 shortCodeWidth = std::max(maxShortCodeWidth, MIN_SHORT_CODE_WIDTH); -            S32 width = mEmojiWidth + shortCodeWidth + mPadding * 2; -            reshape(width, mVisibleEmojis * mEmojiHeight, false); +            U32 shortCodeWidth = llmax(maxShortCodeWidth, MIN_SHORT_CODE_WIDTH); +            width = mEmojiWidth + shortCodeWidth + mPadding * 2; +            if (!mNoScroll && mVisibleEmojis < mTotalEmojis) +            { +                width += mScrollbar->getThickness(); +            } +            height = mVisibleEmojis * mEmojiHeight;          }          else          { -            S32 height = getRect().getHeight(); -            reshape(mVisibleEmojis * mEmojiWidth, height, false); +            width = mVisibleEmojis * mEmojiWidth; +            height = getRect().getHeight();          } -	} -	else -	{ -		updateConstraints(); -	} +        LLUICtrl::reshape(width, height, false); +    } +    else +    { +        mVisibleEmojis = mVertical ? getRect().getHeight() / mEmojiHeight : getRect().getWidth() / mEmojiWidth; +    } -	mScrollPos = llmin(mScrollPos, mEmojis.size()); +    updateConstraints(); +} + +void LLPanelEmojiComplete::onScrollbarChange(S32 index) +{ +    mScrollPos = llclamp<size_t>(index, 0, mTotalEmojis - mVisibleEmojis);  }  size_t LLPanelEmojiComplete::posToIndex(S32 x, S32 y) const  { -	if (mRenderRect.pointInRect(x, y)) -	{ -		U32 pos = mVertical ? (U32)(mRenderRect.mTop - y) / mEmojiHeight : x / mEmojiWidth; -		return mScrollPos + llmin((size_t)pos, mEmojis.size() - 1); -	} -	return npos; +    if (mRenderRect.pointInRect(x, y)) +    { +        U32 pos = mVertical ? (U32)(mRenderRect.mTop - y) / mEmojiHeight : x / mEmojiWidth; +        return llmin(mScrollPos + pos, mTotalEmojis - 1); +    } +    return std::string::npos;  }  void LLPanelEmojiComplete::select(size_t emoji_idx)  { -	mCurSelected = llclamp<size_t>(emoji_idx, 0, mEmojis.size()); -	updateScrollPos(); +    mCurSelected = llclamp<size_t>(emoji_idx, 0, mTotalEmojis - 1); + +    updateScrollPos();  }  void LLPanelEmojiComplete::selectNext()  { -	select(mCurSelected + 1 < mEmojis.size() ? mCurSelected + 1 : 0); +    if (!mTotalEmojis) +        return; + +    mCurSelected = (mCurSelected < mTotalEmojis - 1) ? mCurSelected + 1 : 0; + +    updateScrollPos();  }  void LLPanelEmojiComplete::selectPrevious()  { -	select(mCurSelected - 1 >= 0 ? mCurSelected - 1 : mEmojis.size() - 1); +    if (!mTotalEmojis) +        return; + +    mCurSelected = (mCurSelected && mCurSelected < mTotalEmojis) ? mCurSelected - 1 : mTotalEmojis - 1; + +    updateScrollPos();  }  void LLPanelEmojiComplete::updateConstraints()  {      mRenderRect = getLocalRect(); -    S32 ctrlWidth = mRenderRect.getWidth(); -    S32 ctrlHeight = mRenderRect.getHeight(); -    mEmojiHeight = mIconFont->getLineHeight() + mPadding * 2;      mEmojiWidth = mIconFont->getWidthF32(u8"\U0001F431") + mPadding * 2;      if (mVertical)      { -        mVisibleEmojis = ctrlHeight / mEmojiHeight; -        mRenderRect.mBottom = mRenderRect.mTop - mVisibleEmojis * mEmojiHeight; +        mEmojiHeight = mIconFont->getLineHeight() + mPadding * 2; +        if (!mNoScroll && mVisibleEmojis < mTotalEmojis) +        { +            mRenderRect.mRight -= mScrollbar->getThickness(); +            mScrollbar->setDocSize(mTotalEmojis); +            mScrollbar->setPageSize(mVisibleEmojis); +            mScrollbar->setOrigin(mRenderRect.mRight, 0); +            mScrollbar->reshape(mScrollbar->getThickness(), mRenderRect.mTop, TRUE); +            mScrollbar->setVisible(TRUE); +        } +        else +        { +            mScrollbar->setVisible(FALSE); +        }      }      else      { -        mVisibleEmojis = ctrlWidth / mEmojiWidth; -        S32 padding = (ctrlWidth - mVisibleEmojis * mEmojiWidth) / 2; -        mRenderRect.mLeft += padding; -        mRenderRect.mRight -= padding; -        if (mEmojiHeight > ctrlHeight) -        { -            mEmojiHeight = ctrlHeight; -        } +        mEmojiHeight = mRenderRect.getHeight(); +        mRenderRect.stretch((mRenderRect.getWidth() - mVisibleEmojis * mEmojiWidth) / -2, 0);      }      updateScrollPos(); @@ -326,23 +418,27 @@ void LLPanelEmojiComplete::updateConstraints()  void LLPanelEmojiComplete::updateScrollPos()  { -	const size_t cntEmoji = mEmojis.size(); -	if (mNoScroll || 0 == cntEmoji || cntEmoji < mVisibleEmojis || 0 == mCurSelected) -	{ -		mScrollPos = 0; -		if (mCurSelected >= mVisibleEmojis) -		{ -			mCurSelected = mVisibleEmojis ? mVisibleEmojis - 1 : 0; -		} -	} -	else if (cntEmoji - 1 == mCurSelected) -	{ -		mScrollPos = mCurSelected - mVisibleEmojis + 1; -	} -	else -	{ -		mScrollPos = mCurSelected - ((float)mCurSelected / (cntEmoji - 2) * (mVisibleEmojis - 2)); -	} +    if (mNoScroll || 0 == mTotalEmojis || mTotalEmojis < mVisibleEmojis || 0 == mCurSelected) +    { +        mScrollPos = 0; +        if (mCurSelected >= mVisibleEmojis) +        { +            mCurSelected = mVisibleEmojis ? mVisibleEmojis - 1 : 0; +        } +    } +    else if (mTotalEmojis - 1 == mCurSelected) +    { +        mScrollPos = mTotalEmojis - mVisibleEmojis; +    } +    else +    { +        mScrollPos = mCurSelected - ((float)mCurSelected / (mTotalEmojis - 2) * (mVisibleEmojis - 2)); +    } + +    if (mScrollbar && mScrollbar->getVisible()) +    { +        mScrollbar->setDocPos(mScrollPos); +    }  }  // ============================================================================ @@ -350,33 +446,33 @@ void LLPanelEmojiComplete::updateScrollPos()  //  LLFloaterEmojiComplete::LLFloaterEmojiComplete(const LLSD& sdKey) -	: LLFloater(sdKey) +    : LLFloater(sdKey)  { -	// This floater should hover on top of our dependent (with the dependent having the focus) -	setFocusStealsFrontmost(false); -	setAutoFocus(false); -	setBackgroundVisible(false); -	setIsChrome(true); +    // This floater should hover on top of our dependent (with the dependent having the focus) +    setFocusStealsFrontmost(false); +    setAutoFocus(false); +    setBackgroundVisible(false); +    setIsChrome(true);  }  BOOL LLFloaterEmojiComplete::handleKey(KEY key, MASK mask, BOOL called_from_parent)  { -	bool handled = false; -	if (MASK_NONE == mask) -	{ -		switch (key) -		{ -			case KEY_ESCAPE: -				LLEmojiHelper::instance().hideHelper(); -				handled = true; -				break; -		} -	} - -	if (handled) -		return TRUE; - -	return LLFloater::handleKey(key, mask, called_from_parent); +    bool handled = false; +    if (MASK_NONE == mask) +    { +        switch (key) +        { +            case KEY_ESCAPE: +                LLEmojiHelper::instance().hideHelper(); +                handled = true; +                break; +        } +    } + +    if (handled) +        return TRUE; + +    return LLFloater::handleKey(key, mask, called_from_parent);  }  void LLFloaterEmojiComplete::onOpen(const LLSD& key) @@ -402,30 +498,33 @@ void LLFloaterEmojiComplete::onOpen(const LLSD& key)  BOOL LLFloaterEmojiComplete::postBuild()  { -	mEmojiCtrl = findChild<LLPanelEmojiComplete>("emoji_complete_ctrl"); -	mEmojiCtrl->setCommitCallback( -		std::bind([&](const LLSD& sdValue) -		{ -			setValue(sdValue); -			onCommit(); -		}, std::placeholders::_2)); -	mEmojiCtrlHorz = getRect().getWidth() - mEmojiCtrl->getRect().getWidth(); - -	return LLFloater::postBuild(); +    mEmojiCtrl = findChild<LLPanelEmojiComplete>("emoji_complete_ctrl"); +    mEmojiCtrl->setCommitCallback( +        [this](LLUICtrl* ctrl, const LLSD& param) +        { +            setValue(param); +            onCommit(); +        }); + +    mEmojiCtrlHorz = getRect().getWidth() - mEmojiCtrl->getRect().getWidth(); +    mEmojiCtrlVert = getRect().getHeight() - mEmojiCtrl->getRect().getHeight(); + +    return LLFloater::postBuild();  }  void LLFloaterEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_parent)  { -	if (!called_from_parent) -	{ -		LLRect rctFloater = getRect(), rctCtrl = mEmojiCtrl->getRect(); -		rctFloater.mRight = rctFloater.mLeft + rctCtrl.getWidth() + mEmojiCtrlHorz; -		setRect(rctFloater); - -		return; -	} - -	LLFloater::reshape(width, height, called_from_parent); +    if (called_from_parent) +    { +        LLFloater::reshape(width, height, called_from_parent); +    } +    else +    { +        LLRect outer(getRect()), inner(mEmojiCtrl->getRect()); +        outer.mRight = outer.mLeft + inner.getWidth() + mEmojiCtrlHorz; +        outer.mTop = outer.mBottom + inner.getHeight() + mEmojiCtrlVert; +        setRect(outer); +    }  }  // ============================================================================ diff --git a/indra/newview/llpanelemojicomplete.h b/indra/newview/llpanelemojicomplete.h index 20d3413765..1af923bda2 100644 --- a/indra/newview/llpanelemojicomplete.h +++ b/indra/newview/llpanelemojicomplete.h @@ -29,79 +29,83 @@  #include "llfloater.h"  #include "lluictrl.h" +class LLScrollbar; +  // ============================================================================  // LLPanelEmojiComplete  //  class LLPanelEmojiComplete : public LLUICtrl  { -	friend class LLUICtrlFactory; +    friend class LLUICtrlFactory;  public: -	struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> -	{ -		Optional<bool>       autosize; -		Optional<bool>       noscroll; -		Optional<bool>       vertical; -		Optional<S32>        max_emoji, -		                     padding; +    struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> +    { +        Optional<bool>       autosize; +        Optional<bool>       noscroll; +        Optional<bool>       vertical; +        Optional<S32>        max_visible, +                             padding; -		Optional<LLUIImage*> selected_image; +        Optional<LLUIImage*> selected_image; -		Params(); -	}; +        Params(); +    };  protected: -	LLPanelEmojiComplete(const LLPanelEmojiComplete::Params&); +    LLPanelEmojiComplete(const LLPanelEmojiComplete::Params&);  public: -	virtual ~LLPanelEmojiComplete(); +    virtual ~LLPanelEmojiComplete(); -	void draw() override; -	BOOL handleHover(S32 x, S32 y, MASK mask) override; -	BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; -	BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; -	BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; -	void onCommit() override; -	void reshape(S32 width, S32 height, BOOL called_from_parent) override; +    void draw() override; +    BOOL handleHover(S32 x, S32 y, MASK mask) override; +    BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; +    BOOL handleMouseDown(S32 x, S32 y, MASK mask) override; +    BOOL handleMouseUp(S32 x, S32 y, MASK mask) override; +    BOOL handleScrollWheel(S32 x, S32 y, S32 clicks) override; +    void onCommit() override; +    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 setEmojis(const LLWString& emojis); -	void setEmojiHint(const std::string& hint); -	bool isAutoSize() const { return mAutoSize; } -	U32 getMaxShortCodeWidth() const; +    const LLWString& getEmojis() const { return mEmojis; } +    size_t getEmojiCount() const { return mEmojis.size(); } +    void setEmojis(const LLWString& emojis); +    void setEmojiHint(const std::string& hint); +    bool isAutoSize() const { return mAutoSize; } +    U32 getMaxShortCodeWidth() const;  protected: -	void onEmojisChanged(); -	size_t posToIndex(S32 x, S32 y) const; -	void select(size_t emoji_idx); -	void selectNext(); -	void selectPrevious(); -	void updateConstraints(); -	void updateScrollPos(); +    void onEmojisChanged(); +    void onScrollbarChange(S32 index); +    size_t posToIndex(S32 x, S32 y) const; +    void select(size_t emoji_idx); +    void selectNext(); +    void selectPrevious(); +    void updateConstraints(); +    void updateScrollPos();  protected: -	static constexpr auto npos = std::numeric_limits<size_t>::max(); - -	const bool      mAutoSize = false; -	const bool      mNoScroll = false; -	const bool      mVertical = false; -	const size_t    mMaxVisible = 0; -	const S32       mPadding = 8; -	const LLUIImagePtr mSelectedImage; -	const LLFontGL* mIconFont; -	const LLFontGL* mTextFont; - -	LLWString       mEmojis; -	LLRect          mRenderRect; -	U16             mEmojiWidth = 0; -	U16             mEmojiHeight = 0; -	size_t          mVisibleEmojis = 0; -	size_t          mFirstVisible = 0; -	size_t          mScrollPos = 0; -	size_t          mCurSelected = 0; -	LLVector2       mLastHover; +    const bool      mAutoSize; +    const bool      mNoScroll; +    const bool      mVertical; +    const size_t    mMaxVisible; +    const S32       mPadding; +    const LLUIImagePtr mSelectedImage; +    const LLFontGL* mIconFont; +    const LLFontGL* mTextFont; + +    LLWString       mEmojis; +    LLScrollbar*    mScrollbar; +    LLRect          mRenderRect; +    U16             mEmojiWidth = 0; +    U16             mEmojiHeight = 0; +    size_t          mTotalEmojis = 0; +    size_t          mVisibleEmojis = 0; +    size_t          mFirstVisible = 0; +    size_t          mScrollPos = 0; +    size_t          mCurSelected = 0; +    LLVector2       mLastHover;  };  // ============================================================================ @@ -111,17 +115,18 @@ protected:  class LLFloaterEmojiComplete : public LLFloater  {  public: -	LLFloaterEmojiComplete(const LLSD& sdKey); +    LLFloaterEmojiComplete(const LLSD& sdKey);  public: -	BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; -	void onOpen(const LLSD& key) override; -	BOOL postBuild() override; -	void reshape(S32 width, S32 height, BOOL called_from_parent) override; +    BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent) override; +    void onOpen(const LLSD& key) override; +    BOOL postBuild() override; +    void reshape(S32 width, S32 height, BOOL called_from_parent) override;  protected: -	LLPanelEmojiComplete* mEmojiCtrl = nullptr; -	S32                   mEmojiCtrlHorz = 0; +    LLPanelEmojiComplete* mEmojiCtrl = nullptr; +    S32 mEmojiCtrlHorz = 0; +    S32 mEmojiCtrlVert = 0;  };  // ============================================================================ diff --git a/indra/newview/skins/default/xui/en/floater_emoji_complete.xml b/indra/newview/skins/default/xui/en/floater_emoji_complete.xml index 207a8af118..d290d647e8 100644 --- a/indra/newview/skins/default/xui/en/floater_emoji_complete.xml +++ b/indra/newview/skins/default/xui/en/floater_emoji_complete.xml @@ -3,6 +3,8 @@   name="emoji_complete"   single_instance="true"   layout="topleft" + bg_opaque_image="Window_NoTitle_Foreground" + bg_alpha_image="Window_NoTitle_Background"   can_close="false"   can_dock="false"   can_drag_on_left="false" @@ -11,6 +13,7 @@   can_tear_off="false"   header_height="0"   legacy_header_height="0" + show_title="false"   width="240"   height="40"   > @@ -20,7 +23,8 @@  	 layout="topleft"  	 autosize="true"  	 vertical="true" -	 max_emoji="7" +	 max_visible="7" +	 padding="4"  	 width="230"  	 height="30"  	 left="5" diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index fa65842c28..eb5d88bba6 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -353,7 +353,7 @@                   name="emoji_recent_icons_ctrl"                   follows="top|left|right"                   layout="topleft" -                 max_emoji="20" +                 max_visible="20"                   top="0"                   left="1"                   right="-65" diff --git a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml index f9db441815..6cc8d7118f 100644 --- a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml +++ b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml @@ -3,7 +3,7 @@    autosize="false"    hover_image="ListItem_Over"    selected_image="ListItem_Select" -  max_emoji="7" +  max_visible="7"    padding="8"    >  </emoji_complete>  | 
