#4011 Add conversation list highlight for chat mention
parent
ed705097c4
commit
50108bf0b7
|
|
@ -154,7 +154,7 @@ protected:
|
|||
virtual bool isHighlightActive();
|
||||
virtual bool isFadeItem();
|
||||
virtual bool isFlashing() { return false; }
|
||||
virtual void setFlashState(bool) { }
|
||||
virtual void setFlashState(bool, bool) { }
|
||||
|
||||
static LLFontGL* getLabelFontForStyle(U8 style);
|
||||
const LLFontGL* getLabelFont();
|
||||
|
|
|
|||
|
|
@ -630,6 +630,11 @@ LLUUID LLUrlEntryAgent::getID(const std::string &string) const
|
|||
return LLUUID(getIDStringFromUrl(string));
|
||||
}
|
||||
|
||||
bool LLUrlEntryAgent::isAgentID(const std::string& url) const
|
||||
{
|
||||
return sAgentID == getID(url);
|
||||
}
|
||||
|
||||
std::string LLUrlEntryAgent::getTooltip(const std::string &string) const
|
||||
{
|
||||
// return a tooltip corresponding to the URL type instead of the generic one
|
||||
|
|
|
|||
|
|
@ -103,6 +103,7 @@ public:
|
|||
virtual bool getSkipProfileIcon(const std::string& string) const { return false; }
|
||||
|
||||
virtual LLUUID getID(const std::string &string) const { return LLUUID::null; }
|
||||
virtual bool isAgentID(const std::string& url) const { return false; }
|
||||
|
||||
bool isLinkDisabled() const;
|
||||
|
||||
|
|
@ -232,6 +233,8 @@ public:
|
|||
/*virtual*/ LLStyle::Params getStyle(const std::string &url) const;
|
||||
/*virtual*/ LLUUID getID(const std::string &string) const;
|
||||
|
||||
bool isAgentID(const std::string& url) const;
|
||||
|
||||
LLStyle::EUnderlineLink getUnderline(const std::string& string) const;
|
||||
|
||||
protected:
|
||||
|
|
|
|||
|
|
@ -327,3 +327,30 @@ void LLUrlRegistry::setKeybindingHandler(LLKeyBindingToStringHandler* handler)
|
|||
LLUrlEntryKeybinding *entry = (LLUrlEntryKeybinding*)mUrlEntryKeybinding;
|
||||
entry->setHandler(handler);
|
||||
}
|
||||
|
||||
bool LLUrlRegistry::containsAgentMention(const std::string& text)
|
||||
{
|
||||
// avoid costly regexes if there is clearly no URL in the text
|
||||
if (!stringHasUrl(text))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
boost::sregex_iterator it(text.begin(), text.end(), mUrlEntryAgentMention->getPattern());
|
||||
boost::sregex_iterator end;
|
||||
for (; it != end; ++it)
|
||||
{
|
||||
if (mUrlEntryAgentMention->isAgentID(it->str()))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (boost::regex_error&)
|
||||
{
|
||||
LL_INFOS() << "Regex error for: " << text << LL_ENDL;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -92,6 +92,8 @@ public:
|
|||
// Set handler for url registry to be capable of parsing and populating keybindings
|
||||
void setKeybindingHandler(LLKeyBindingToStringHandler* handler);
|
||||
|
||||
bool containsAgentMention(const std::string& text);
|
||||
|
||||
private:
|
||||
std::vector<LLUrlEntryBase *> mUrlEntry;
|
||||
LLUrlEntryBase* mUrlEntryTrusted;
|
||||
|
|
|
|||
|
|
@ -86,7 +86,8 @@ LLConversationViewSession::LLConversationViewSession(const LLConversationViewSes
|
|||
mHasArrow(true),
|
||||
mIsInActiveVoiceChannel(false),
|
||||
mFlashStateOn(false),
|
||||
mFlashStarted(false)
|
||||
mFlashStarted(false),
|
||||
mIsAltFlashColor(false)
|
||||
{
|
||||
mFlashTimer = new LLFlashTimer();
|
||||
mAreChildrenInited = true; // inventory only
|
||||
|
|
@ -157,7 +158,7 @@ void LLConversationViewSession::destroyView()
|
|||
LLFolderViewFolder::destroyView();
|
||||
}
|
||||
|
||||
void LLConversationViewSession::setFlashState(bool flash_state)
|
||||
void LLConversationViewSession::setFlashState(bool flash_state, bool alternate_color)
|
||||
{
|
||||
if (flash_state && !mFlashStateOn)
|
||||
{
|
||||
|
|
@ -170,6 +171,7 @@ void LLConversationViewSession::setFlashState(bool flash_state)
|
|||
|
||||
mFlashStateOn = flash_state;
|
||||
mFlashStarted = false;
|
||||
mIsAltFlashColor = mFlashStateOn && (alternate_color || mIsAltFlashColor);
|
||||
mFlashTimer->stopFlashing();
|
||||
}
|
||||
|
||||
|
|
@ -288,7 +290,8 @@ void LLConversationViewSession::draw()
|
|||
startFlashing();
|
||||
|
||||
// draw highlight for selected items
|
||||
drawHighlight(show_context, true, sHighlightBgColor, sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
|
||||
static LLUIColor alt_color = LLUIColorTable::instance().getColor("MentionFlashBgColor", DEFAULT_WHITE);
|
||||
drawHighlight(show_context, true, sHighlightBgColor, mIsAltFlashColor ? alt_color : sFlashBgColor, sFocusOutlineColor, sMouseOverColor);
|
||||
|
||||
// Draw children if root folder, or any other folder that is open. Do not draw children when animating to closed state or you get rendering overlap.
|
||||
bool draw_children = getRoot() == static_cast<LLFolderViewFolder*>(this) || isOpen();
|
||||
|
|
|
|||
|
|
@ -90,7 +90,7 @@ public:
|
|||
|
||||
virtual void refresh();
|
||||
|
||||
/*virtual*/ void setFlashState(bool flash_state);
|
||||
/*virtual*/ void setFlashState(bool flash_state, bool alternate_color = false);
|
||||
void setHighlightState(bool hihglight_state);
|
||||
|
||||
LLFloater* getSessionFloater();
|
||||
|
|
@ -111,6 +111,7 @@ private:
|
|||
LLFlashTimer* mFlashTimer;
|
||||
bool mFlashStateOn;
|
||||
bool mFlashStarted;
|
||||
bool mIsAltFlashColor;
|
||||
|
||||
bool mCollapsedMode;
|
||||
bool mHasArrow;
|
||||
|
|
|
|||
|
|
@ -2302,14 +2302,14 @@ bool LLFloaterIMContainer::isConversationLoggingAllowed()
|
|||
return gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0;
|
||||
}
|
||||
|
||||
void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, bool is_flashes)
|
||||
void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, bool is_flashes, bool alternate_color)
|
||||
{
|
||||
//Finds the conversation line item to flash using the session_id
|
||||
LLConversationViewSession * widget = dynamic_cast<LLConversationViewSession *>(get_ptr_in_map(mConversationsWidgets,session_id));
|
||||
|
||||
if (widget)
|
||||
{
|
||||
widget->setFlashState(is_flashes);
|
||||
widget->setFlashState(is_flashes, alternate_color);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -208,7 +208,7 @@ public:
|
|||
void reSelectConversation();
|
||||
void updateSpeakBtnState();
|
||||
static bool isConversationLoggingAllowed();
|
||||
void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes);
|
||||
void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes, bool alternate_color = false);
|
||||
void highlightConversationItemWidget(const LLUUID& session_id, bool is_highlighted);
|
||||
bool isScrolledOutOfSight(LLConversationViewSession* conversation_item_widget);
|
||||
boost::signals2::connection mMicroChangedSignal;
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
#include "llviewerregion.h"
|
||||
#include "llcorehttputil.h"
|
||||
#include "lluiusage.h"
|
||||
#include "llurlregistry.h"
|
||||
|
||||
#include <array>
|
||||
|
||||
|
|
@ -197,6 +198,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
|
|||
LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id);
|
||||
bool store_dnd_message = false; // flag storage of a dnd message
|
||||
bool is_session_focused = session_floater->isTornOff() && session_floater->hasFocus();
|
||||
bool contains_mention = LLUrlRegistry::getInstance()->containsAgentMention(msg["message"].asString());
|
||||
if (!LLFloater::isVisible(im_box) || im_box->isMinimized())
|
||||
{
|
||||
conversations_floater_status = CLOSED;
|
||||
|
|
@ -323,7 +325,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
|
|||
if ("openconversations" == user_preferences
|
||||
|| ON_TOP == conversations_floater_status
|
||||
|| ("toast" == user_preferences && ON_TOP != conversations_floater_status)
|
||||
|| ("flash" == user_preferences && (CLOSED == conversations_floater_status
|
||||
|| (("flash" == user_preferences || contains_mention) && (CLOSED == conversations_floater_status
|
||||
|| NOT_ON_TOP == conversations_floater_status))
|
||||
|| is_dnd_msg)
|
||||
{
|
||||
|
|
@ -343,7 +345,7 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg)
|
|||
}
|
||||
else
|
||||
{
|
||||
im_box->flashConversationItemWidget(session_id, true);
|
||||
im_box->flashConversationItemWidget(session_id, true, contains_mention);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3269,7 +3271,7 @@ void LLIMMgr::addMessage(
|
|||
{
|
||||
LLFloaterReg::showInstance("im_container");
|
||||
LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container")->
|
||||
flashConversationItemWidget(new_session_id, true);
|
||||
flashConversationItemWidget(new_session_id, true, LLUrlRegistry::getInstance()->containsAgentMention(msg));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2583,6 +2583,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
|
|||
msg_notify["session_id"] = LLUUID();
|
||||
msg_notify["from_id"] = chat.mFromID;
|
||||
msg_notify["source_type"] = chat.mSourceType;
|
||||
// used to check if there is agent mention in the message
|
||||
msg_notify["message"] = mesg;
|
||||
on_new_message(msg_notify);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1009,4 +1009,7 @@
|
|||
<color
|
||||
name="ChatSelfMentionHighlight"
|
||||
value="1 1 0 1" />
|
||||
<color
|
||||
name="MentionFlashBgColor"
|
||||
value="1 1 0 0.5" />
|
||||
</colors>
|
||||
|
|
|
|||
Loading…
Reference in New Issue