From 1820095dd4a64c142e14869c76ae09e1e0ca6a12 Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Mon, 12 Feb 2024 19:01:00 +0100 Subject: [PATCH] #779 Emoji picker is an unintuitive UX disaster --- indra/newview/llfloateremojipicker.cpp | 68 ++++++++++++++++++++++---- indra/newview/llfloateremojipicker.h | 2 + 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/indra/newview/llfloateremojipicker.cpp b/indra/newview/llfloateremojipicker.cpp index 2380fd357b..1578caa39c 100644 --- a/indra/newview/llfloateremojipicker.cpp +++ b/indra/newview/llfloateremojipicker.cpp @@ -953,6 +953,43 @@ void LLFloaterEmojiPicker::selectFocusedIcon() } } +bool LLFloaterEmojiPicker::moveFocusedIconUp() +{ + for (S32 i = mFocusedIconRow - 1; i >= 0; --i) + { + LLScrollingPanel* panel = mEmojiGrid->getPanelList()[i]; + LLEmojiGridRow* row = dynamic_cast(panel); + if (row && row->mList->getPanelList().size() > mFocusedIconCol) + { + mEmojiScroll->scrollToShowRect(row->getBoundingRect()); + mFocusedIconRow = i; + selectFocusedIcon(); + return true; + } + } + + return false; +} + +bool LLFloaterEmojiPicker::moveFocusedIconDown() +{ + S32 rowCount = mEmojiGrid->getPanelList().size(); + for (S32 i = mFocusedIconRow + 1; i < rowCount; ++i) + { + LLScrollingPanel* panel = mEmojiGrid->getPanelList()[i]; + LLEmojiGridRow* row = dynamic_cast(panel); + if (row && row->mList->getPanelList().size() > mFocusedIconCol) + { + mEmojiScroll->scrollToShowRect(row->getBoundingRect()); + mFocusedIconRow = i; + selectFocusedIcon(); + return true; + } + } + + return false; +} + bool LLFloaterEmojiPicker::moveFocusedIconPrev() { if (mHoveredIcon) @@ -1031,6 +1068,28 @@ void LLFloaterEmojiPicker::unselectGridIcon(LLEmojiGridIcon* icon) BOOL LLFloaterEmojiPicker::handleKey(KEY key, MASK mask, BOOL called_from_parent) { if (mask == MASK_NONE) + { + switch (key) + { + case KEY_UP: + moveFocusedIconUp(); + return TRUE; + case KEY_DOWN: + moveFocusedIconDown(); + return TRUE; + case KEY_LEFT: + moveFocusedIconPrev(); + return TRUE; + case KEY_RIGHT: + moveFocusedIconNext(); + return TRUE; + case KEY_ESCAPE: + hideFloater(); + return TRUE; + } + } + + if (mask == MASK_ALT) { switch (key) { @@ -1040,15 +1099,6 @@ BOOL LLFloaterEmojiPicker::handleKey(KEY key, MASK mask, BOOL called_from_parent case KEY_RIGHT: selectEmojiGroup((mSelectedGroupIndex + 1) % mGroupButtons.size()); return TRUE; - case KEY_UP: - moveFocusedIconPrev(); - return TRUE; - case KEY_DOWN: - moveFocusedIconNext(); - return TRUE; - case KEY_ESCAPE: - hideFloater(); - return TRUE; } } diff --git a/indra/newview/llfloateremojipicker.h b/indra/newview/llfloateremojipicker.h index f169d67a4e..5d0402ca83 100644 --- a/indra/newview/llfloateremojipicker.h +++ b/indra/newview/llfloateremojipicker.h @@ -85,6 +85,8 @@ private: void onEmojiMouseUp(LLUICtrl* ctrl); void selectFocusedIcon(); + bool moveFocusedIconUp(); + bool moveFocusedIconDown(); bool moveFocusedIconPrev(); bool moveFocusedIconNext();