diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llui/llfolderviewitem.h | 2 | ||||
| -rw-r--r-- | indra/llui/llurlentry.cpp | 5 | ||||
| -rw-r--r-- | indra/llui/llurlentry.h | 3 | ||||
| -rw-r--r-- | indra/llui/llurlregistry.cpp | 27 | ||||
| -rw-r--r-- | indra/llui/llurlregistry.h | 2 | ||||
| -rw-r--r-- | indra/newview/llconversationview.cpp | 9 | ||||
| -rw-r--r-- | indra/newview/llconversationview.h | 3 | ||||
| -rw-r--r-- | indra/newview/llfloaterimcontainer.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llfloaterimcontainer.h | 2 | ||||
| -rw-r--r-- | indra/newview/llimview.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llviewermessage.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/skins/default/colors.xml | 3 | 
12 files changed, 59 insertions, 11 deletions
| diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h index 234d0dc7f9..2ee018a90a 100644 --- a/indra/llui/llfolderviewitem.h +++ b/indra/llui/llfolderviewitem.h @@ -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(); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 7218211a44..bcd13b7f0b 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -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 diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index 740e99acfd..6e7d2fc80f 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -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: diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 02d88c83fb..cb101d325d 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -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; +} diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index b9502f4592..592e422487 100644 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -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; diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index a1f627c8cc..0e0ab236d6 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -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(); diff --git a/indra/newview/llconversationview.h b/indra/newview/llconversationview.h index 8eb6392121..a6d240ed84 100644 --- a/indra/newview/llconversationview.h +++ b/indra/newview/llconversationview.h @@ -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; diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index e4b14d8df6..72d4d30dcf 100644 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -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);      }  } diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index e5486e67da..30eed8be36 100644 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -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; diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 474b7b66d7..23bba99ed6 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -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));      }  } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index bdcfec34f6..1501ba41c2 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -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);          } diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index f0ada22d66..0c34a3a5fb 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -1009,4 +1009,7 @@    <color      name="ChatSelfMentionHighlight"      value="1 1 0 1" /> +  <color +    name="MentionFlashBgColor" +    value="1 1 0 0.5" />  </colors> | 
