Sync LLChatBar with alchemy's LLChatBar and LLChatUtilities
Stops typing anim on chatbar focus loss Makes a couple classes final Adds checkChatVolume and canSendChannel to RlvActions Updates other bits of Rlv, but adds no functionality
This commit is contained in:
@@ -212,6 +212,17 @@
|
|||||||
<key>Value</key>
|
<key>Value</key>
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</map>
|
</map>
|
||||||
|
<key>AlchemyNearbyChatChannel</key>
|
||||||
|
<map>
|
||||||
|
<key>Comment</key>
|
||||||
|
<string>Chat channel used for sending nearby chat from the viewer</string>
|
||||||
|
<key>Persist</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>S32</string>
|
||||||
|
<key>Value</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</map>
|
||||||
<key>AlchemyRainbowEffects</key>
|
<key>AlchemyRainbowEffects</key>
|
||||||
<map>
|
<map>
|
||||||
<key>Comment</key>
|
<key>Comment</key>
|
||||||
|
|||||||
@@ -72,6 +72,8 @@
|
|||||||
#include "chatbar_as_cmdline.h"
|
#include "chatbar_as_cmdline.h"
|
||||||
|
|
||||||
// [RLVa:KB]
|
// [RLVa:KB]
|
||||||
|
#include "rlvcommon.h"
|
||||||
|
#include "rlvactions.h"
|
||||||
#include "rlvhandler.h"
|
#include "rlvhandler.h"
|
||||||
// [/RLVa:KB]
|
// [/RLVa:KB]
|
||||||
|
|
||||||
@@ -100,25 +102,24 @@ class LLChatBarGestureObserver : public LLGestureManagerObserver
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
LLChatBarGestureObserver(LLChatBar* chat_barp) : mChatBar(chat_barp){}
|
LLChatBarGestureObserver(LLChatBar* chat_barp) : mChatBar(chat_barp){}
|
||||||
virtual ~LLChatBarGestureObserver() {}
|
virtual ~LLChatBarGestureObserver() = default;
|
||||||
virtual void changed() { mChatBar->refreshGestures(); }
|
void changed() override { mChatBar->refreshGestures(); }
|
||||||
private:
|
private:
|
||||||
LLChatBar* mChatBar;
|
LLChatBar* mChatBar;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Functions
|
// Functions
|
||||||
//
|
//
|
||||||
|
|
||||||
LLChatBar::LLChatBar()
|
LLChatBar::LLChatBar()
|
||||||
: LLPanel(),
|
: LLPanel(),
|
||||||
mInputEditor(NULL),
|
mInputEditor(nullptr),
|
||||||
mGestureLabelTimer(),
|
mGestureLabelTimer(),
|
||||||
mLastSpecialChatChannel(0),
|
mLastSpecialChatChannel(0),
|
||||||
mIsBuilt(FALSE),
|
mIsBuilt(FALSE),
|
||||||
mGestureCombo(NULL),
|
mGestureCombo(nullptr),
|
||||||
mObserver(NULL)
|
mObserver(nullptr)
|
||||||
{
|
{
|
||||||
setIsChrome(TRUE);
|
setIsChrome(TRUE);
|
||||||
|
|
||||||
@@ -132,10 +133,14 @@ LLChatBar::~LLChatBar()
|
|||||||
{
|
{
|
||||||
LLGestureMgr::instance().removeObserver(mObserver);
|
LLGestureMgr::instance().removeObserver(mObserver);
|
||||||
delete mObserver;
|
delete mObserver;
|
||||||
mObserver = NULL;
|
mObserver = nullptr;
|
||||||
// LLView destructor cleans up children
|
// LLView destructor cleans up children
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
// Overrides
|
||||||
|
//-----------------------------------------------------------------------
|
||||||
|
|
||||||
BOOL LLChatBar::postBuild()
|
BOOL LLChatBar::postBuild()
|
||||||
{
|
{
|
||||||
if (LLUICtrl* history_ctrl = findChild<LLUICtrl>("History"))
|
if (LLUICtrl* history_ctrl = findChild<LLUICtrl>("History"))
|
||||||
@@ -189,7 +194,7 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
|
|||||||
else if (mask == MASK_SHIFT)
|
else if (mask == MASK_SHIFT)
|
||||||
{
|
{
|
||||||
// whisper
|
// whisper
|
||||||
sendChat( CHAT_TYPE_WHISPER );
|
sendChat(CHAT_TYPE_WHISPER);
|
||||||
handled = TRUE;
|
handled = TRUE;
|
||||||
}
|
}
|
||||||
else if (mask == MASK_NONE)
|
else if (mask == MASK_NONE)
|
||||||
@@ -210,6 +215,11 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
|
|||||||
return handled;
|
return handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LLChatBar::onFocusLost()
|
||||||
|
{
|
||||||
|
stopChat();
|
||||||
|
}
|
||||||
|
|
||||||
void LLChatBar::refresh()
|
void LLChatBar::refresh()
|
||||||
{
|
{
|
||||||
// HACK: Leave the name of the gesture in place for a few seconds.
|
// HACK: Leave the name of the gesture in place for a few seconds.
|
||||||
@@ -242,17 +252,16 @@ void LLChatBar::refreshGestures()
|
|||||||
//store current selection so we can maintain it
|
//store current selection so we can maintain it
|
||||||
std::string cur_gesture = mGestureCombo->getValue().asString();
|
std::string cur_gesture = mGestureCombo->getValue().asString();
|
||||||
mGestureCombo->selectFirstItem();
|
mGestureCombo->selectFirstItem();
|
||||||
std::string label = mGestureCombo->getValue().asString();;
|
|
||||||
// clear
|
// clear
|
||||||
mGestureCombo->clearRows();
|
mGestureCombo->clearRows();
|
||||||
|
|
||||||
// collect list of unique gestures
|
// collect list of unique gestures
|
||||||
std::map <std::string, BOOL> unique;
|
std::map <std::string, BOOL> unique;
|
||||||
LLGestureMgr::item_map_t::const_iterator it;
|
|
||||||
const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
|
const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
|
||||||
for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
|
for (const auto& active_gesture : active_gestures)
|
||||||
{
|
{
|
||||||
LLMultiGesture* gesture = (*it).second;
|
LLMultiGesture* gesture = active_gesture.second;
|
||||||
if (gesture)
|
if (gesture)
|
||||||
{
|
{
|
||||||
if (!gesture->mTrigger.empty())
|
if (!gesture->mTrigger.empty())
|
||||||
@@ -262,11 +271,9 @@ void LLChatBar::refreshGestures()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// add unique gestures
|
for (auto& it2 : unique)
|
||||||
std::map <std::string, BOOL>::iterator it2;
|
|
||||||
for (it2 = unique.begin(); it2 != unique.end(); ++it2)
|
|
||||||
{
|
{
|
||||||
mGestureCombo->addSimpleElement((*it2).first);
|
mGestureCombo->addSimpleElement(it2.first);
|
||||||
}
|
}
|
||||||
|
|
||||||
mGestureCombo->sortByName();
|
mGestureCombo->sortByName();
|
||||||
@@ -316,12 +323,12 @@ void LLChatBar::setIgnoreArrowKeys(BOOL b)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL LLChatBar::inputEditorHasFocus()
|
BOOL LLChatBar::inputEditorHasFocus() const
|
||||||
{
|
{
|
||||||
return mInputEditor && mInputEditor->hasFocus();
|
return mInputEditor && mInputEditor->hasFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string LLChatBar::getCurrentChat()
|
std::string LLChatBar::getCurrentChat() const
|
||||||
{
|
{
|
||||||
return mInputEditor ? mInputEditor->getText() : LLStringUtil::null;
|
return mInputEditor ? mInputEditor->getText() : LLStringUtil::null;
|
||||||
}
|
}
|
||||||
@@ -390,7 +397,7 @@ LLWString LLChatBar::stripChannelNumber(const LLWString &mesg, S32* channel)
|
|||||||
pos++;
|
pos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
mLastSpecialChatChannel = strtol(wstring_to_utf8str(channel_string).c_str(), NULL, 10);
|
mLastSpecialChatChannel = strtol(wstring_to_utf8str(channel_string).c_str(), nullptr, 10);
|
||||||
// <edit>
|
// <edit>
|
||||||
if(mesg[1] == '-')
|
if(mesg[1] == '-')
|
||||||
mLastSpecialChatChannel = -mLastSpecialChatChannel;
|
mLastSpecialChatChannel = -mLastSpecialChatChannel;
|
||||||
@@ -570,9 +577,12 @@ void LLChatBar::onInputEditorKeystroke()
|
|||||||
|
|
||||||
S32 length = raw_text.length();
|
S32 length = raw_text.length();
|
||||||
|
|
||||||
//if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
|
// if( (length > 0)
|
||||||
// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d)
|
// && (raw_text[0] != '/') // forward slash is used for escape (eg. emote) sequences
|
||||||
if ( (length > 0) && (raw_text[0] != '/') && (!gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT)) )
|
// && (raw_text[0] != ':') // colon is used in for MUD poses
|
||||||
|
// )
|
||||||
|
// [RLVa:KB] - Checked: 2010-03-26 (RLVa-1.2.0b) | Modified: RLVa-1.0.0d
|
||||||
|
if ( (length > 0) && (raw_text[0] != '/') && (raw_text[0] != ':') && (!RlvActions::hasBehaviour(RLV_BHVR_REDIRCHAT)) )
|
||||||
// [/RLVa:KB]
|
// [/RLVa:KB]
|
||||||
{
|
{
|
||||||
gAgent.startTyping();
|
gAgent.startTyping();
|
||||||
@@ -582,21 +592,6 @@ void LLChatBar::onInputEditorKeystroke()
|
|||||||
gAgent.stopTyping();
|
gAgent.stopTyping();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Doesn't work -- can't tell the difference between a backspace
|
|
||||||
that killed the selection vs. backspace at the end of line.
|
|
||||||
if (length > 1
|
|
||||||
&& text[0] == '/'
|
|
||||||
&& key == KEY_BACKSPACE)
|
|
||||||
{
|
|
||||||
// the selection will already be deleted, but we need to trim
|
|
||||||
// off the character before
|
|
||||||
std::string new_text = raw_text.substr(0, length-1);
|
|
||||||
mInputEditor->setText( new_text );
|
|
||||||
mInputEditor->setCursorToEnd();
|
|
||||||
length = length - 1;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
KEY key = gKeyboard->currentKey();
|
KEY key = gKeyboard->currentKey();
|
||||||
|
|
||||||
// Ignore "special" keys, like backspace, arrows, etc.
|
// Ignore "special" keys, like backspace, arrows, etc.
|
||||||
@@ -622,11 +617,6 @@ void LLChatBar::onInputEditorKeystroke()
|
|||||||
mInputEditor->setSelection(length, outlength);
|
mInputEditor->setSelection(length, outlength);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//LL_INFOS() << "GESTUREDEBUG " << trigger
|
|
||||||
// << " len " << length
|
|
||||||
// << " outlen " << out_str.getLength()
|
|
||||||
// << LL_ENDL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -668,11 +658,11 @@ void LLChatBar::sendChatFromViewer(const std::string &utf8text, EChatType type,
|
|||||||
void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate)
|
void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate)
|
||||||
{
|
{
|
||||||
// Look for "/20 foo" channel chats.
|
// Look for "/20 foo" channel chats.
|
||||||
S32 channel = 0;
|
S32 channel = gSavedSettings.getS32("AlchemyNearbyChatChannel");
|
||||||
LLWString out_text = stripChannelNumber(wtext, &channel);
|
LLWString out_text = stripChannelNumber(wtext, &channel);
|
||||||
std::string utf8_out_text = wstring_to_utf8str(out_text);
|
std::string utf8_out_text = wstring_to_utf8str(out_text);
|
||||||
|
|
||||||
std::string utf8_text = wstring_to_utf8str(wtext);
|
std::string utf8_text = wstring_to_utf8str(wtext);
|
||||||
|
|
||||||
utf8_text = utf8str_trim(utf8_text);
|
utf8_text = utf8str_trim(utf8_text);
|
||||||
if (!utf8_text.empty())
|
if (!utf8_text.empty())
|
||||||
{
|
{
|
||||||
@@ -680,17 +670,12 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL
|
|||||||
}
|
}
|
||||||
|
|
||||||
// [RLVa:KB] - Checked: 2010-03-27 (RLVa-1.2.0b) | Modified: RLVa-1.2.0b
|
// [RLVa:KB] - Checked: 2010-03-27 (RLVa-1.2.0b) | Modified: RLVa-1.2.0b
|
||||||
if ( (0 == channel) && (rlv_handler_t::isEnabled()) )
|
// RELEASE-RLVa: [SL-2.0.0] This entire class appears to be dead/non-functional?
|
||||||
|
if ( (0 == channel) && (RlvActions::isRlvEnabled()) )
|
||||||
{
|
{
|
||||||
// Adjust the (public) chat "volume" on chat and gestures (also takes care of playing the proper animation)
|
// Adjust the (public) chat "volume" on chat and gestures (also takes care of playing the proper animation)
|
||||||
if ( ((CHAT_TYPE_SHOUT == type) || (CHAT_TYPE_NORMAL == type)) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATNORMAL)) )
|
type = RlvActions::checkChatVolume(type);
|
||||||
type = CHAT_TYPE_WHISPER;
|
animate &= !RlvActions::hasBehaviour( (!RlvUtil::isEmote(utf8_text)) ? RLV_BHVR_REDIRCHAT : RLV_BHVR_REDIREMOTE );
|
||||||
else if ( (CHAT_TYPE_SHOUT == type) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATSHOUT)) )
|
|
||||||
type = CHAT_TYPE_NORMAL;
|
|
||||||
else if ( (CHAT_TYPE_WHISPER == type) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATWHISPER)) )
|
|
||||||
type = CHAT_TYPE_NORMAL;
|
|
||||||
|
|
||||||
animate &= !gRlvHandler.hasBehaviour( (!RlvUtil::isEmote(utf8_text)) ? RLV_BHVR_REDIRCHAT : RLV_BHVR_REDIREMOTE );
|
|
||||||
}
|
}
|
||||||
// [/RLVa:KB]
|
// [/RLVa:KB]
|
||||||
|
|
||||||
@@ -731,23 +716,19 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL
|
|||||||
send_chat_from_viewer(utf8_out_text, type, channel);
|
send_chat_from_viewer(utf8_out_text, type, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
// [RLVa:KB] - Checked: 2009-07-07 (RLVa-1.0.0d) | Modified: RLVa-0.2.2a
|
//void send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel)
|
||||||
|
// [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0b) | Modified: RLVa-0.2.2a
|
||||||
void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel)
|
void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel)
|
||||||
// [/RLVa:KB]
|
// [/RLVa:KB]
|
||||||
{
|
{
|
||||||
// [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0b) | Modified: RLVa-1.2.0a
|
// [RLVa:KB] - Checked: 2010-02-27 (RLVa-1.2.0b) | Modified: RLVa-1.2.0a
|
||||||
// Only process chat messages (ie not CHAT_TYPE_START, CHAT_TYPE_STOP, etc)
|
// Only process chat messages (ie not CHAT_TYPE_START, CHAT_TYPE_STOP, etc)
|
||||||
if ( (rlv_handler_t::isEnabled()) && ( (CHAT_TYPE_WHISPER == type) || (CHAT_TYPE_NORMAL == type) || (CHAT_TYPE_SHOUT == type) ) )
|
if ( (RlvActions::isRlvEnabled()) && ( (CHAT_TYPE_WHISPER == type) || (CHAT_TYPE_NORMAL == type) || (CHAT_TYPE_SHOUT == type) ) )
|
||||||
{
|
{
|
||||||
if (0 == channel)
|
if (0 == channel)
|
||||||
{
|
{
|
||||||
// (We already did this before, but LLChatHandler::handle() calls this directly)
|
// Clamp the volume of the chat if needed
|
||||||
if ( ((CHAT_TYPE_SHOUT == type) || (CHAT_TYPE_NORMAL == type)) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATNORMAL)) )
|
type = RlvActions::checkChatVolume(type);
|
||||||
type = CHAT_TYPE_WHISPER;
|
|
||||||
else if ( (CHAT_TYPE_SHOUT == type) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATSHOUT)) )
|
|
||||||
type = CHAT_TYPE_NORMAL;
|
|
||||||
else if ( (CHAT_TYPE_WHISPER == type) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATWHISPER)) )
|
|
||||||
type = CHAT_TYPE_NORMAL;
|
|
||||||
|
|
||||||
// Redirect chat if needed
|
// Redirect chat if needed
|
||||||
if ( ( (gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT) || (gRlvHandler.hasBehaviour(RLV_BHVR_REDIREMOTE)) ) &&
|
if ( ( (gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT) || (gRlvHandler.hasBehaviour(RLV_BHVR_REDIREMOTE)) ) &&
|
||||||
@@ -763,7 +744,7 @@ void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channe
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Don't allow chat on a non-public channel if sendchannel restricted (unless the channel is an exception)
|
// Don't allow chat on a non-public channel if sendchannel restricted (unless the channel is an exception)
|
||||||
if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHANNEL)) && (!gRlvHandler.isException(RLV_BHVR_SENDCHANNEL, channel)) )
|
if (!RlvActions::canSendChannel(channel))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Don't allow chat on debug channel if @sendchat, @redirchat or @rediremote restricted (shows as public chat on viewers)
|
// Don't allow chat on debug channel if @sendchat, @redirchat or @rediremote restricted (shows as public chat on viewers)
|
||||||
@@ -836,10 +817,8 @@ void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channe
|
|||||||
void really_send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel)
|
void really_send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel)
|
||||||
{
|
{
|
||||||
LLMessageSystem* msg = gMessageSystem;
|
LLMessageSystem* msg = gMessageSystem;
|
||||||
// <edit>
|
if (channel >= 0)
|
||||||
if(channel >= 0)
|
|
||||||
{
|
{
|
||||||
// </edit>
|
|
||||||
msg->newMessageFast(_PREHASH_ChatFromViewer);
|
msg->newMessageFast(_PREHASH_ChatFromViewer);
|
||||||
msg->nextBlockFast(_PREHASH_AgentData);
|
msg->nextBlockFast(_PREHASH_AgentData);
|
||||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||||
@@ -848,21 +827,19 @@ void really_send_chat_from_viewer(const std::string& utf8_out_text, EChatType ty
|
|||||||
msg->addStringFast(_PREHASH_Message, utf8_out_text);
|
msg->addStringFast(_PREHASH_Message, utf8_out_text);
|
||||||
msg->addU8Fast(_PREHASH_Type, type);
|
msg->addU8Fast(_PREHASH_Type, type);
|
||||||
msg->addS32("Channel", channel);
|
msg->addS32("Channel", channel);
|
||||||
// <edit>
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
msg->newMessage("ScriptDialogReply");
|
msg->newMessageFast(_PREHASH_ScriptDialogReply);
|
||||||
msg->nextBlock("AgentData");
|
msg->nextBlockFast(_PREHASH_AgentData);
|
||||||
msg->addUUID("AgentID", gAgent.getID());
|
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||||
msg->addUUID("SessionID", gAgent.getSessionID());
|
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||||
msg->nextBlock("Data");
|
msg->nextBlockFast(_PREHASH_Data);
|
||||||
msg->addUUID("ObjectID", gAgent.getID());
|
msg->addUUIDFast(_PREHASH_ObjectID, gAgent.getID());
|
||||||
msg->addS32("ChatChannel", channel);
|
msg->addS32("ChatChannel", channel);
|
||||||
msg->addS32("ButtonIndex", 0);
|
msg->addS32Fast(_PREHASH_ButtonIndex, 0);
|
||||||
msg->addString("ButtonLabel", utf8_out_text);
|
msg->addStringFast(_PREHASH_ButtonLabel, utf8_out_text);
|
||||||
}
|
}
|
||||||
// </edit>
|
|
||||||
gAgent.sendReliableMessage();
|
gAgent.sendReliableMessage();
|
||||||
|
|
||||||
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
|
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_CHAT_COUNT);
|
||||||
@@ -895,7 +872,7 @@ void LLChatBar::onCommitGesture(LLUICtrl* ctrl)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
mGestureLabelTimer.start();
|
mGestureLabelTimer.start();
|
||||||
if (mGestureCombo != NULL)
|
if (mGestureCombo != nullptr)
|
||||||
{
|
{
|
||||||
// free focus back to chat bar
|
// free focus back to chat bar
|
||||||
mGestureCombo->setFocus(FALSE);
|
mGestureCombo->setFocus(FALSE);
|
||||||
@@ -907,24 +884,39 @@ void toggleChatHistory()
|
|||||||
LLFloaterChat::toggleInstance(LLSD());
|
LLFloaterChat::toggleInstance(LLSD());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// LLChatCommandHandler
|
||||||
|
//
|
||||||
|
|
||||||
class LLChatHandler : public LLCommandHandler
|
class LLChatCommandHandler final : public LLCommandHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// not allowed from outside the app
|
// not allowed from outside the app
|
||||||
LLChatHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
|
LLChatCommandHandler() : LLCommandHandler("chat", UNTRUSTED_BLOCK) { }
|
||||||
|
|
||||||
// Your code here
|
// Your code here
|
||||||
bool handle(const LLSD& tokens, const LLSD& query_map,
|
bool handle(const LLSD& tokens, const LLSD& query_map,
|
||||||
LLMediaCtrl* web)
|
LLMediaCtrl* web) override
|
||||||
|
{
|
||||||
|
bool retval = false;
|
||||||
|
// Need at least 2 tokens to have a valid message.
|
||||||
|
if (tokens.size() < 2)
|
||||||
|
{
|
||||||
|
retval = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (tokens.size() < 2) return false;
|
|
||||||
S32 channel = tokens[0].asInteger();
|
S32 channel = tokens[0].asInteger();
|
||||||
std::string mesg = tokens[1].asString();
|
{
|
||||||
send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel);
|
retval = true;
|
||||||
return true;
|
// Send unescaped message, see EXT-6353.
|
||||||
|
std::string unescaped_mesg (LLURI::unescape(tokens[1].asString()));
|
||||||
|
send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Creating the object registers with the dispatcher.
|
// Creating the object registers with the dispatcher.
|
||||||
LLChatHandler gChatHandler;
|
LLChatCommandHandler gChatHandler;
|
||||||
|
|||||||
@@ -33,10 +33,9 @@
|
|||||||
#ifndef LL_LLCHATBAR_H
|
#ifndef LL_LLCHATBAR_H
|
||||||
#define LL_LLCHATBAR_H
|
#define LL_LLCHATBAR_H
|
||||||
|
|
||||||
#include "llpanel.h"
|
|
||||||
#include "llframetimer.h"
|
#include "llframetimer.h"
|
||||||
#include "llchat.h"
|
#include "llchat.h"
|
||||||
#include "lllayoutstack.h"
|
#include "llpanel.h"
|
||||||
|
|
||||||
class LLLineEditor;
|
class LLLineEditor;
|
||||||
class LLMessageSystem;
|
class LLMessageSystem;
|
||||||
@@ -46,17 +45,19 @@ class LLFrameTimer;
|
|||||||
class LLChatBarGestureObserver;
|
class LLChatBarGestureObserver;
|
||||||
class LLComboBox;
|
class LLComboBox;
|
||||||
|
|
||||||
class LLChatBar : public LLPanel
|
|
||||||
|
class LLChatBar final
|
||||||
|
: public LLPanel
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// constructor for inline chat-bars (e.g. hosted in chat history window)
|
// constructor for inline chat-bars (e.g. hosted in chat history window)
|
||||||
LLChatBar();
|
LLChatBar();
|
||||||
~LLChatBar();
|
|
||||||
virtual BOOL postBuild();
|
|
||||||
|
|
||||||
virtual BOOL handleKeyHere(KEY key, MASK mask);
|
BOOL postBuild() override;
|
||||||
|
BOOL handleKeyHere(KEY key, MASK mask) override;
|
||||||
|
void onFocusLost() override;
|
||||||
|
|
||||||
void refresh();
|
void refresh() override;
|
||||||
void refreshGestures();
|
void refreshGestures();
|
||||||
|
|
||||||
// Move cursor into chat input field.
|
// Move cursor into chat input field.
|
||||||
@@ -65,8 +66,8 @@ public:
|
|||||||
// Ignore arrow keys for chat bar
|
// Ignore arrow keys for chat bar
|
||||||
void setIgnoreArrowKeys(BOOL b);
|
void setIgnoreArrowKeys(BOOL b);
|
||||||
|
|
||||||
BOOL inputEditorHasFocus();
|
BOOL inputEditorHasFocus() const;
|
||||||
std::string getCurrentChat();
|
std::string getCurrentChat() const;
|
||||||
|
|
||||||
// since chat bar logic is reused for chat history
|
// since chat bar logic is reused for chat history
|
||||||
// gesture combo box might not be a direct child
|
// gesture combo box might not be a direct child
|
||||||
@@ -94,10 +95,11 @@ public:
|
|||||||
static void stopChat();
|
static void stopChat();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
~LLChatBar();
|
||||||
|
|
||||||
void sendChat(EChatType type);
|
void sendChat(EChatType type);
|
||||||
void updateChat();
|
void updateChat();
|
||||||
|
|
||||||
protected:
|
|
||||||
LLLineEditor* mInputEditor;
|
LLLineEditor* mInputEditor;
|
||||||
|
|
||||||
LLFrameTimer mGestureLabelTimer;
|
LLFrameTimer mGestureLabelTimer;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright (c) 2009-2013, Kitty Barnett
|
* Copyright (c) 2009-2016, Kitty Barnett
|
||||||
*
|
*
|
||||||
* The source code in this file is provided to you under the terms of the
|
* The source code in this file is provided to you under the terms of the
|
||||||
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
|
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
|
||||||
@@ -38,6 +38,13 @@ bool RlvActions::canReceiveIM(const LLUUID& idSender)
|
|||||||
( (!gRlvHandler.hasBehaviour(RLV_BHVR_RECVIMFROM)) || (!gRlvHandler.isException(RLV_BHVR_RECVIMFROM, idSender)) ) );
|
( (!gRlvHandler.hasBehaviour(RLV_BHVR_RECVIMFROM)) || (!gRlvHandler.isException(RLV_BHVR_RECVIMFROM, idSender)) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RlvActions::canSendChannel(int nChannel)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
( (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHANNEL)) || (gRlvHandler.isException(RLV_BHVR_SENDCHANNEL, nChannel)) ) /*&&
|
||||||
|
( (!gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHANNELEXCEPT)) || (!gRlvHandler.isException(RLV_BHVR_SENDCHANNELEXCEPT, nChannel)) )*/;
|
||||||
|
}
|
||||||
|
|
||||||
// Checked: 2010-11-30 (RLVa-1.3.0)
|
// Checked: 2010-11-30 (RLVa-1.3.0)
|
||||||
bool RlvActions::canSendIM(const LLUUID& idRecipient)
|
bool RlvActions::canSendIM(const LLUUID& idRecipient)
|
||||||
{
|
{
|
||||||
@@ -62,29 +69,44 @@ bool RlvActions::canStartIM(const LLUUID& idRecipient)
|
|||||||
( (!gRlvHandler.hasBehaviour(RLV_BHVR_STARTIMTO)) || (!gRlvHandler.isException(RLV_BHVR_STARTIMTO, idRecipient)) ) );
|
( (!gRlvHandler.hasBehaviour(RLV_BHVR_STARTIMTO)) || (!gRlvHandler.isException(RLV_BHVR_STARTIMTO, idRecipient)) ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handles: @chatwhisper, @chatnormal and @chatshout
|
||||||
|
EChatType RlvActions::checkChatVolume(EChatType chatType)
|
||||||
|
{
|
||||||
|
// In vs Bhvr | whisper | normal | shout | n+w | n+s | s+w | s+n+w |
|
||||||
|
// ---------------------------------------------------------------------------------
|
||||||
|
// whisper | normal | - | - | normal | - | normal | normal |
|
||||||
|
// normal | - | whisper | - | whisper | whisper | - | whisper |
|
||||||
|
// shout | - | whisper | normal | whisper | whisper | normal | whisper |
|
||||||
|
|
||||||
|
RlvHandler& rlvHandler = gRlvHandler;
|
||||||
|
if ( ((CHAT_TYPE_SHOUT == chatType) || (CHAT_TYPE_NORMAL == chatType)) && (rlvHandler.hasBehaviour(RLV_BHVR_CHATNORMAL)) )
|
||||||
|
chatType = CHAT_TYPE_WHISPER;
|
||||||
|
else if ( (CHAT_TYPE_SHOUT == chatType) && (rlvHandler.hasBehaviour(RLV_BHVR_CHATSHOUT)) )
|
||||||
|
chatType = CHAT_TYPE_NORMAL;
|
||||||
|
else if ( (CHAT_TYPE_WHISPER == chatType) && (rlvHandler.hasBehaviour(RLV_BHVR_CHATWHISPER)) )
|
||||||
|
chatType = CHAT_TYPE_NORMAL;
|
||||||
|
return chatType;
|
||||||
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// Movement
|
// Movement
|
||||||
//
|
//
|
||||||
|
|
||||||
// Checked: 2010-12-11 (RLVa-1.2.2)
|
|
||||||
bool RlvActions::canAcceptTpOffer(const LLUUID& idSender)
|
bool RlvActions::canAcceptTpOffer(const LLUUID& idSender)
|
||||||
{
|
{
|
||||||
return ((!gRlvHandler.hasBehaviour(RLV_BHVR_TPLURE)) || (gRlvHandler.isException(RLV_BHVR_TPLURE, idSender))) && (canStand());
|
return ((!gRlvHandler.hasBehaviour(RLV_BHVR_TPLURE)) || (gRlvHandler.isException(RLV_BHVR_TPLURE, idSender))) && (canStand());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checked: 2013-11-08 (RLVa-1.4.9)
|
|
||||||
bool RlvActions::autoAcceptTeleportOffer(const LLUUID& idSender)
|
bool RlvActions::autoAcceptTeleportOffer(const LLUUID& idSender)
|
||||||
{
|
{
|
||||||
return ((idSender.notNull()) && (gRlvHandler.isException(RLV_BHVR_ACCEPTTP, idSender))) || (gRlvHandler.hasBehaviour(RLV_BHVR_ACCEPTTP));
|
return ((idSender.notNull()) && (gRlvHandler.isException(RLV_BHVR_ACCEPTTP, idSender))) || (gRlvHandler.hasBehaviour(RLV_BHVR_ACCEPTTP));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checked: 2013-11-08 (RLVa-1.4.9)
|
|
||||||
bool RlvActions::canAcceptTpRequest(const LLUUID& idSender)
|
bool RlvActions::canAcceptTpRequest(const LLUUID& idSender)
|
||||||
{
|
{
|
||||||
return (!gRlvHandler.hasBehaviour(RLV_BHVR_TPREQUEST)) || (gRlvHandler.isException(RLV_BHVR_TPREQUEST, idSender));
|
return (!gRlvHandler.hasBehaviour(RLV_BHVR_TPREQUEST)) || (gRlvHandler.isException(RLV_BHVR_TPREQUEST, idSender));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checked: 2013-11-08 (RLVa-1.4.9)
|
|
||||||
bool RlvActions::autoAcceptTeleportRequest(const LLUUID& idRequester)
|
bool RlvActions::autoAcceptTeleportRequest(const LLUUID& idRequester)
|
||||||
{
|
{
|
||||||
return ((idRequester.notNull()) && (gRlvHandler.isException(RLV_BHVR_ACCEPTTPREQUEST, idRequester))) || (gRlvHandler.hasBehaviour(RLV_BHVR_ACCEPTTPREQUEST));
|
return ((idRequester.notNull()) && (gRlvHandler.isException(RLV_BHVR_ACCEPTTPREQUEST, idRequester))) || (gRlvHandler.hasBehaviour(RLV_BHVR_ACCEPTTPREQUEST));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright (c) 2009-2013, Kitty Barnett
|
* Copyright (c) 2009-2016, Kitty Barnett
|
||||||
*
|
*
|
||||||
* The source code in this file is provided to you under the terms of the
|
* The source code in this file is provided to you under the terms of the
|
||||||
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
|
* GNU Lesser General Public License, version 2.1, but WITHOUT ANY WARRANTY;
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
#ifndef RLV_ACTIONS_H
|
#ifndef RLV_ACTIONS_H
|
||||||
#define RLV_ACTIONS_H
|
#define RLV_ACTIONS_H
|
||||||
|
|
||||||
|
#include "llchat.h"
|
||||||
#include "rlvdefines.h"
|
#include "rlvdefines.h"
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@@ -34,6 +35,13 @@ public:
|
|||||||
*/
|
*/
|
||||||
static bool canReceiveIM(const LLUUID& idSender);
|
static bool canReceiveIM(const LLUUID& idSender);
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns true if the user is allowed to chat on the specified channel
|
||||||
|
*/
|
||||||
|
static bool canSendChannel(int nChannel);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns true if the user is allowed to send IMs to the specified recipient (can be an avatar or a group)
|
* Returns true if the user is allowed to send IMs to the specified recipient (can be an avatar or a group)
|
||||||
*/
|
*/
|
||||||
@@ -53,6 +61,11 @@ public:
|
|||||||
static bool canShowName(EShowNamesContext eContext) { return (eContext < SNC_COUNT) ? !s_BlockNamesContexts[eContext] : false; }
|
static bool canShowName(EShowNamesContext eContext) { return (eContext < SNC_COUNT) ? !s_BlockNamesContexts[eContext] : false; }
|
||||||
static void setShowName(EShowNamesContext eContext, bool fShowName) { if ( (eContext < SNC_COUNT) && (isRlvEnabled()) ) { s_BlockNamesContexts[eContext] = !fShowName; } }
|
static void setShowName(EShowNamesContext eContext, bool fShowName) { if ( (eContext < SNC_COUNT) && (isRlvEnabled()) ) { s_BlockNamesContexts[eContext] = !fShowName; } }
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Checks if the user is allowed to use the specified volume in (main) chat and returns the appropriate chat volume type
|
||||||
|
*/
|
||||||
|
static EChatType checkChatVolume(EChatType chatType);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Backwards logic so that we can initialize to 0 and it won't block when we forget to/don't check if RLVa is disabled
|
// Backwards logic so that we can initialize to 0 and it won't block when we forget to/don't check if RLVa is disabled
|
||||||
static bool s_BlockNamesContexts[SNC_COUNT];
|
static bool s_BlockNamesContexts[SNC_COUNT];
|
||||||
@@ -108,7 +121,7 @@ public:
|
|||||||
static bool hasBehaviour(ERlvBehaviour eBhvr);
|
static bool hasBehaviour(ERlvBehaviour eBhvr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns true if a - P2P or group - IM session is open with the specified UUID.
|
* Returns true if a - P2P or group - IM session is open with the specified UUID
|
||||||
*/
|
*/
|
||||||
static bool hasOpenP2PSession(const LLUUID& idAgent);
|
static bool hasOpenP2PSession(const LLUUID& idAgent);
|
||||||
static bool hasOpenGroupSession(const LLUUID& idGroup);
|
static bool hasOpenGroupSession(const LLUUID& idGroup);
|
||||||
|
|||||||
@@ -434,9 +434,19 @@ bool RlvObject::hasBehaviour(ERlvBehaviour eBehaviour, bool fStrictOnly) const
|
|||||||
|
|
||||||
bool RlvObject::hasBehaviour(ERlvBehaviour eBehaviour, const std::string& strOption, bool fStrictOnly) const
|
bool RlvObject::hasBehaviour(ERlvBehaviour eBehaviour, const std::string& strOption, bool fStrictOnly) const
|
||||||
{
|
{
|
||||||
for (rlv_command_list_t::const_iterator itCmd = m_Commands.begin(); itCmd != m_Commands.end(); ++itCmd)
|
for (const RlvCommand& rlvCmd : m_Commands)
|
||||||
if ( (itCmd->getBehaviourType() == eBehaviour) && (itCmd->getOption() == strOption) && ((!fStrictOnly) || (itCmd->isStrict())) )
|
{
|
||||||
|
// The specified behaviour is contained within the current object if:
|
||||||
|
// - the (parsed) behaviour matches
|
||||||
|
// - the option matches (or we're checking for an empty option and the command was reference counted)
|
||||||
|
// - we're not matching on strict (or it is a strict command)
|
||||||
|
if ( (rlvCmd.getBehaviourType() == eBehaviour) &&
|
||||||
|
( (rlvCmd.getOption() == strOption) /*|| ((strOption.empty()) && (rlvCmd.isRefCounted()))*/ ) &&
|
||||||
|
( (!fStrictOnly) ||(rlvCmd.isStrict()) ) )
|
||||||
|
{
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user