viewer#2270 The "More" button does not close the "Choose emoji" floater
parent
28638b31af
commit
5608c3998d
|
|
@ -99,6 +99,7 @@ void LLEmojiHelper::showHelper(LLUICtrl* hostctrl_p, S32 local_x, S32 local_y, c
|
||||||
LLFloater* pHelperFloater = LLFloaterReg::getInstance(DEFAULT_EMOJI_HELPER_FLOATER);
|
LLFloater* pHelperFloater = LLFloaterReg::getInstance(DEFAULT_EMOJI_HELPER_FLOATER);
|
||||||
mHelperHandle = pHelperFloater->getHandle();
|
mHelperHandle = pHelperFloater->getHandle();
|
||||||
mHelperCommitConn = pHelperFloater->setCommitCallback(std::bind([&](const LLSD& sdValue) { onCommitEmoji(utf8str_to_wstring(sdValue.asStringRef())[0]); }, std::placeholders::_2));
|
mHelperCommitConn = pHelperFloater->setCommitCallback(std::bind([&](const LLSD& sdValue) { onCommitEmoji(utf8str_to_wstring(sdValue.asStringRef())[0]); }, std::placeholders::_2));
|
||||||
|
mHelperCloseConn = pHelperFloater->setCloseCallback([this](LLUICtrl* ctrl, const LLSD& param) { onCloseHelper(ctrl, param); });
|
||||||
}
|
}
|
||||||
setHostCtrl(hostctrl_p);
|
setHostCtrl(hostctrl_p);
|
||||||
mEmojiCommitCb = cb;
|
mEmojiCommitCb = cb;
|
||||||
|
|
@ -148,6 +149,16 @@ void LLEmojiHelper::onCommitEmoji(llwchar emoji)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LLEmojiHelper::onCloseHelper(LLUICtrl* ctrl, const LLSD& param)
|
||||||
|
{
|
||||||
|
mCloseSignal(ctrl, param);
|
||||||
|
}
|
||||||
|
|
||||||
|
boost::signals2::connection LLEmojiHelper::setCloseCallback(const commit_signal_t::slot_type& cb)
|
||||||
|
{
|
||||||
|
return mCloseSignal.connect(cb);
|
||||||
|
}
|
||||||
|
|
||||||
void LLEmojiHelper::setHostCtrl(LLUICtrl* hostctrl_p)
|
void LLEmojiHelper::setHostCtrl(LLUICtrl* hostctrl_p)
|
||||||
{
|
{
|
||||||
const LLUICtrl* pCurHostCtrl = mHostHandle.get();
|
const LLUICtrl* pCurHostCtrl = mHostHandle.get();
|
||||||
|
|
|
||||||
|
|
@ -51,16 +51,23 @@ public:
|
||||||
// Eventing
|
// Eventing
|
||||||
bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask);
|
bool handleKey(const LLUICtrl* ctrl_p, KEY key, MASK mask);
|
||||||
void onCommitEmoji(llwchar emoji);
|
void onCommitEmoji(llwchar emoji);
|
||||||
|
void onCloseHelper(LLUICtrl* ctrl, const LLSD& param);
|
||||||
|
|
||||||
|
typedef boost::signals2::signal<void(LLUICtrl* ctrl, const LLSD& param)> commit_signal_t;
|
||||||
|
boost::signals2::connection setCloseCallback(const commit_signal_t::slot_type& cb);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
LLUICtrl* getHostCtrl() const { return mHostHandle.get(); }
|
LLUICtrl* getHostCtrl() const { return mHostHandle.get(); }
|
||||||
void setHostCtrl(LLUICtrl* hostctrl_p);
|
void setHostCtrl(LLUICtrl* hostctrl_p);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
commit_signal_t mCloseSignal;
|
||||||
|
|
||||||
LLHandle<LLUICtrl> mHostHandle;
|
LLHandle<LLUICtrl> mHostHandle;
|
||||||
LLHandle<LLFloater> mHelperHandle;
|
LLHandle<LLFloater> mHelperHandle;
|
||||||
boost::signals2::connection mHostCtrlFocusLostConn;
|
boost::signals2::connection mHostCtrlFocusLostConn;
|
||||||
boost::signals2::connection mHelperCommitConn;
|
boost::signals2::connection mHelperCommitConn;
|
||||||
|
boost::signals2::connection mHelperCloseConn;
|
||||||
std::function<void(llwchar)> mEmojiCommitCb;
|
std::function<void(llwchar)> mEmojiCommitCb;
|
||||||
bool mIsHideDisabled;
|
bool mIsHideDisabled;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1211,6 +1211,14 @@ void LLTextEditor::showEmojiHelper()
|
||||||
LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, LLStringUtil::null, cb);
|
LLEmojiHelper::instance().showHelper(this, cursorRect.mLeft, cursorRect.mTop, LLStringUtil::null, cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LLTextEditor::hideEmojiHelper()
|
||||||
|
{
|
||||||
|
if (mShowEmojiHelper)
|
||||||
|
{
|
||||||
|
LLEmojiHelper::instance().hideHelper(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void LLTextEditor::tryToShowEmojiHelper()
|
void LLTextEditor::tryToShowEmojiHelper()
|
||||||
{
|
{
|
||||||
if (mReadOnly || !mShowEmojiHelper)
|
if (mReadOnly || !mShowEmojiHelper)
|
||||||
|
|
|
||||||
|
|
@ -207,6 +207,7 @@ public:
|
||||||
bool getShowContextMenu() const { return mShowContextMenu; }
|
bool getShowContextMenu() const { return mShowContextMenu; }
|
||||||
|
|
||||||
void showEmojiHelper();
|
void showEmojiHelper();
|
||||||
|
void hideEmojiHelper();
|
||||||
void setShowEmojiHelper(bool show);
|
void setShowEmojiHelper(bool show);
|
||||||
bool getShowEmojiHelper() const { return mShowEmojiHelper; }
|
bool getShowEmojiHelper() const { return mShowEmojiHelper; }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@
|
||||||
#include "llchicletbar.h"
|
#include "llchicletbar.h"
|
||||||
#include "lldraghandle.h"
|
#include "lldraghandle.h"
|
||||||
#include "llemojidictionary.h"
|
#include "llemojidictionary.h"
|
||||||
|
#include "llemojihelper.h"
|
||||||
#include "llfloaterreg.h"
|
#include "llfloaterreg.h"
|
||||||
#include "llfloateremojipicker.h"
|
#include "llfloateremojipicker.h"
|
||||||
#include "llfloaterimsession.h"
|
#include "llfloaterimsession.h"
|
||||||
|
|
@ -300,6 +301,8 @@ bool LLFloaterIMSessionTab::postBuild()
|
||||||
|
|
||||||
mEmojiPickerShowBtn = getChild<LLButton>("emoji_picker_show_btn");
|
mEmojiPickerShowBtn = getChild<LLButton>("emoji_picker_show_btn");
|
||||||
mEmojiPickerShowBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnClicked(); });
|
mEmojiPickerShowBtn->setClickedCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnClicked(); });
|
||||||
|
mEmojiPickerShowBtn->setMouseDownCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerShowBtnDown(); });
|
||||||
|
mEmojiCloseConn = LLEmojiHelper::instance().setCloseCallback([this](LLUICtrl*, const LLSD&) { onEmojiPickerClosed(); });
|
||||||
|
|
||||||
mGearBtn = getChild<LLButton>("gear_btn");
|
mGearBtn = getChild<LLButton>("gear_btn");
|
||||||
mAddBtn = getChild<LLButton>("add_btn");
|
mAddBtn = getChild<LLButton>("add_btn");
|
||||||
|
|
@ -532,8 +535,43 @@ void LLFloaterIMSessionTab::onEmojiRecentPanelToggleBtnClicked()
|
||||||
|
|
||||||
void LLFloaterIMSessionTab::onEmojiPickerShowBtnClicked()
|
void LLFloaterIMSessionTab::onEmojiPickerShowBtnClicked()
|
||||||
{
|
{
|
||||||
mInputEditor->setFocus(true);
|
if (!mEmojiPickerShowBtn->getToggleState())
|
||||||
mInputEditor->showEmojiHelper();
|
{
|
||||||
|
mInputEditor->hideEmojiHelper();
|
||||||
|
mInputEditor->setFocus(true);
|
||||||
|
mInputEditor->showEmojiHelper();
|
||||||
|
mEmojiPickerShowBtn->setToggleState(true); // in case hideEmojiHelper closed a visible instance
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mInputEditor->hideEmojiHelper();
|
||||||
|
mEmojiPickerShowBtn->setToggleState(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LLFloaterIMSessionTab::onEmojiPickerShowBtnDown()
|
||||||
|
{
|
||||||
|
if (mEmojiHelperLastCallbackFrame == LLFrameTimer::getFrameCount())
|
||||||
|
{
|
||||||
|
// Helper gets closed by focus lost event on Down before before onEmojiPickerShowBtnDown
|
||||||
|
// triggers.
|
||||||
|
// If this condition is true, user pressed button and it was 'toggled' during press,
|
||||||
|
// restore 'toggled' state so that button will not reopen helper.
|
||||||
|
mEmojiPickerShowBtn->setToggleState(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LLFloaterIMSessionTab::onEmojiPickerClosed()
|
||||||
|
{
|
||||||
|
if (mEmojiPickerShowBtn->getToggleState())
|
||||||
|
{
|
||||||
|
mEmojiPickerShowBtn->setToggleState(false);
|
||||||
|
// Helper gets closed by focus lost event on Down before onEmojiPickerShowBtnDown
|
||||||
|
// triggers. If mEmojiHelperLastCallbackFrame is set and matches Down, means close
|
||||||
|
// was triggered by user's press.
|
||||||
|
// A bit hacky, but I can't think of a better way to handle this without rewriting helper.
|
||||||
|
mEmojiHelperLastCallbackFrame = LLFrameTimer::getFrameCount();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLFloaterIMSessionTab::initEmojiRecentPanel()
|
void LLFloaterIMSessionTab::initEmojiRecentPanel()
|
||||||
|
|
|
||||||
|
|
@ -235,6 +235,8 @@ private:
|
||||||
|
|
||||||
void onEmojiRecentPanelToggleBtnClicked();
|
void onEmojiRecentPanelToggleBtnClicked();
|
||||||
void onEmojiPickerShowBtnClicked();
|
void onEmojiPickerShowBtnClicked();
|
||||||
|
void onEmojiPickerShowBtnDown();
|
||||||
|
void onEmojiPickerClosed();
|
||||||
void initEmojiRecentPanel();
|
void initEmojiRecentPanel();
|
||||||
void onEmojiRecentPanelFocusReceived();
|
void onEmojiRecentPanelFocusReceived();
|
||||||
void onEmojiRecentPanelFocusLost();
|
void onEmojiRecentPanelFocusLost();
|
||||||
|
|
@ -249,6 +251,9 @@ private:
|
||||||
S32 mInputEditorPad;
|
S32 mInputEditorPad;
|
||||||
S32 mChatLayoutPanelHeight;
|
S32 mChatLayoutPanelHeight;
|
||||||
S32 mFloaterHeight;
|
S32 mFloaterHeight;
|
||||||
|
|
||||||
|
boost::signals2::connection mEmojiCloseConn;
|
||||||
|
U32 mEmojiHelperLastCallbackFrame = { 0 };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue