Merge Firestorm LGPL tip
commit
4144783a64
|
|
@ -296,6 +296,10 @@ public:
|
|||
|
||||
ELoadStatus getStatus() { return mStatus; }
|
||||
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
S32 getNumFrames() const { return mNumFrames; }
|
||||
// </FS:Sei>
|
||||
|
||||
protected:
|
||||
// Consumes one line of input from file.
|
||||
|
||||
|
|
|
|||
|
|
@ -2600,7 +2600,10 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
|
|||
}
|
||||
}
|
||||
F32 wsum = wght.mV[VX] + wght.mV[VY] + wght.mV[VZ] + wght.mV[VW];
|
||||
if (wsum <= 0.f)
|
||||
|
||||
// <FS:ND/> FIRE-17341 / BUG-10747 do allow weights of zero, or some rigged mesh will display broken.
|
||||
// if (wsum <= 0.f)
|
||||
if (wsum < 0.f)
|
||||
{
|
||||
wght = LLVector4(0.99999f,0.f,0.f,0.f);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -131,17 +131,6 @@ CURLcode LLURLRequest::_sslCtxCallback(CURL * curl, void *sslctx, void *param)
|
|||
SSL_CTX_set_cert_verify_callback(ctx, req->mDetail->mSSLVerifyCallback, (void *)req);
|
||||
// the calls are void
|
||||
|
||||
// <FS:ND> FIRE-11406
|
||||
// Some server at LL don't like it at all when curl/openssl try to speak TLSv1.2 to them, instead
|
||||
// of renegotiating to SSLv3 they clamp up and don't talk to us at all anywmore, not even dropping the connection.
|
||||
// This then leads to unfun timeouts and failed transactions.
|
||||
|
||||
#ifdef SSL_TXT_TLSV1_2
|
||||
SSL_CTX_set_options( ctx, SSL_OP_ALL | SSL_OP_NO_TLSv1_2 );
|
||||
#endif
|
||||
|
||||
// </FS:ND>
|
||||
|
||||
return CURLE_OK;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -432,7 +432,13 @@ void LLTabContainer::draw()
|
|||
{
|
||||
break;
|
||||
}
|
||||
target_pixel_scroll += (*iter)->mButton->getRect().getWidth();
|
||||
//target_pixel_scroll += (*iter)->mButton->getRect().getWidth();
|
||||
// <FS:Ansariel> Only show button if tab is visible
|
||||
if ((*iter)->mVisible)
|
||||
{
|
||||
target_pixel_scroll += (*iter)->mButton->getRect().getWidth();
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
cur_scroll_pos--;
|
||||
}
|
||||
|
||||
|
|
@ -2318,7 +2324,10 @@ void LLTabContainer::updateMaxScrollPos()
|
|||
setMaxScrollPos(getTabCount());
|
||||
for(tuple_list_t::reverse_iterator tab_it = mTabList.rbegin(); tab_it != mTabList.rend(); ++tab_it)
|
||||
{
|
||||
running_tab_width += (*tab_it)->mButton->getRect().getWidth();
|
||||
// <FS:Ansariel> Only show button if tab is visible
|
||||
//running_tab_width += (*tab_it)->mButton->getRect().getWidth();
|
||||
running_tab_width += (*tab_it)->mVisible ? (*tab_it)->mButton->getRect().getWidth() : 0;
|
||||
// </FS:Ansariel>
|
||||
if (running_tab_width > available_width_with_arrows)
|
||||
{
|
||||
break;
|
||||
|
|
@ -2327,7 +2336,9 @@ void LLTabContainer::updateMaxScrollPos()
|
|||
}
|
||||
// in case last tab doesn't actually fit on screen, make it the last scrolling position
|
||||
setMaxScrollPos(llmin(getMaxScrollPos(), getTabCount() - 1));
|
||||
no_scroll = FALSE;
|
||||
// <FS:Ansariel> Only show button if tab is visible
|
||||
//no_scroll = FALSE;
|
||||
no_scroll = (running_tab_width <= available_width_with_arrows);
|
||||
}
|
||||
}
|
||||
if (no_scroll)
|
||||
|
|
@ -2445,5 +2456,7 @@ void LLTabContainer::setTabVisibility( LLPanel const *aPanel, bool aVisible )
|
|||
this->setVisible( TRUE );
|
||||
else
|
||||
this->setVisible( FALSE );
|
||||
|
||||
updateMaxScrollPos();
|
||||
}
|
||||
// </FS:ND>
|
||||
|
|
|
|||
|
|
@ -1167,7 +1167,11 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id)
|
|||
}
|
||||
else
|
||||
{
|
||||
button->setCommitCallback(executeParam);
|
||||
// <FS:Ansariel> Check enabled state of button before executing!
|
||||
//button->setCommitCallback(executeParam);
|
||||
LLUICtrl::commit_callback_t execute_func = initCommitCallback(executeParam);
|
||||
button->setCommitCallback(boost::bind(&LLToolBarButton::callIfEnabled, button, execute_func, _1, _2));
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
// Set up "is running" query callback
|
||||
|
|
|
|||
|
|
@ -33,12 +33,25 @@ LLViewerEventRecorder::LLViewerEventRecorder() {
|
|||
clear(UNDEFINED);
|
||||
logEvents = false;
|
||||
// Remove any previous event log file
|
||||
std::string old_log_ui_events_to_llsd_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.old");
|
||||
LLFile::remove(old_log_ui_events_to_llsd_file);
|
||||
|
||||
// <FS:Ansariel> Name this properly and silence the warnings
|
||||
//std::string old_log_ui_events_to_llsd_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.old");
|
||||
//LLFile::remove(old_log_ui_events_to_llsd_file);
|
||||
//
|
||||
|
||||
mLogFilename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.llsd");
|
||||
LLFile::rename(mLogFilename, old_log_ui_events_to_llsd_file);
|
||||
//mLogFilename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.llsd");
|
||||
//LLFile::rename(mLogFilename, old_log_ui_events_to_llsd_file);
|
||||
std::string old_log_ui_events_to_llsd_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, llformat("%s_Events_log.old", APP_NAME.c_str()));
|
||||
if (LLFile::isfile(old_log_ui_events_to_llsd_file))
|
||||
{
|
||||
LLFile::remove(old_log_ui_events_to_llsd_file);
|
||||
}
|
||||
|
||||
mLogFilename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, llformat("%s_Events_log.llsd", APP_NAME.c_str()));
|
||||
if (LLFile::isfile(mLogFilename))
|
||||
{
|
||||
LLFile::rename(mLogFilename, old_log_ui_events_to_llsd_file);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -147,6 +147,7 @@ set(viewer_SOURCE_FILES
|
|||
fsavatarsearchmenu.cpp
|
||||
fsblocklistmenu.cpp
|
||||
fschathistory.cpp
|
||||
fschatoptionsmenu.cpp
|
||||
fscommon.cpp
|
||||
fsconsoleutils.cpp
|
||||
fscontactsfriendsmenu.cpp
|
||||
|
|
@ -892,6 +893,7 @@ set(viewer_HEADER_FILES
|
|||
fsavatarsearchmenu.h
|
||||
fsblocklistmenu.h
|
||||
fschathistory.h
|
||||
fschatoptionsmenu.h
|
||||
fscommon.h
|
||||
fsconsoleutils.h
|
||||
fscontactsfriendsmenu.h
|
||||
|
|
|
|||
|
|
@ -234,7 +234,7 @@ BOOL NACLFloaterExploreSounds::tick()
|
|||
{
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["TIME"] = llformat("%.1f", static_cast<F32>((LLTimer::getElapsedSeconds() - item.mTimeStopped) / 60.0));
|
||||
playing_column["value"] = formatString(str_not_playing, format_args);
|
||||
playing_column["value"] = format_string(str_not_playing, format_args);
|
||||
}
|
||||
|
||||
LLSD& type_column = element["columns"][1];
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@
|
|||
tooltip_ref="Command_Avatar_Tooltip"
|
||||
execute_function="Floater.Toggle"
|
||||
execute_parameters="avatar"
|
||||
is_enabled_function="GridFeatureCheck"
|
||||
is_enabled_parameters="avatar_picker"
|
||||
is_running_function="Floater.IsOpen"
|
||||
is_running_parameters="avatar"
|
||||
/>
|
||||
|
|
@ -72,6 +74,8 @@
|
|||
tooltip_ref="Command_Destinations_Tooltip"
|
||||
execute_function="Floater.Toggle"
|
||||
execute_parameters="destinations"
|
||||
is_enabled_function="GridFeatureCheck"
|
||||
is_enabled_parameters="destination_guide"
|
||||
is_running_function="Floater.IsOpen"
|
||||
is_running_parameters="destinations"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -1044,7 +1044,7 @@
|
|||
<key>AutoCloseOOC</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Auto-close OOC chat (i.e. add \"))\" if not found and \"((\" was used)</string>
|
||||
<string>Auto-close OOC chat (i.e. add "))" if not found and "((" was used)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
@ -1074,19 +1074,6 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
|
||||
<key>GlobalOnlineStatusToggle</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Saves the state of global online status permission for friends</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
|
||||
<key>RenderVolumeSAProtection</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -1098,7 +1085,6 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
|
||||
<key>RenderVolumeSAThreshold</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -7575,17 +7561,6 @@
|
|||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>LegacyMultiAttachmentSupport</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Converts legacy "secondary attachment points" to multi-attachments for other avatars</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>LimitDragDistance</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -23740,6 +23715,74 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSEnableMovingFolderLinks</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable moving of folder links via drag and drop</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>ForceInitialCOFDelay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Number of seconds to delay initial processing of COF contents</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.0</real>
|
||||
</map>
|
||||
<key>FSTypeDuringEmote</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enables the typing animation even while emoting</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSLegacyNotificationWell</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enables the legacy notifications and system messages well</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSInternalLegacyNotificationWell</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Internal state of FSLegacyNotificationWell</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>HideFromEditor</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FSShowIMSendButton</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Shows the send chat button in IM session windows</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
||||
|
|
|
|||
|
|
@ -531,6 +531,18 @@
|
|||
<integer>0</integer>
|
||||
</map>
|
||||
|
||||
<key>FSLegacyNotificationWell</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enables the legacy notifications and system messages well</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
|
||||
<!-- <FS_Zi> Animated dialogs -->
|
||||
<key>FSAnimatedScriptDialogs</key>
|
||||
<map>
|
||||
|
|
|
|||
|
|
@ -102,22 +102,22 @@ public:
|
|||
doZdCleanup();
|
||||
if (mErrorCode == 1)
|
||||
{
|
||||
reportToNearbyChat(llformat("The object with the UUID of \"%s\" can no longer be found in-world.", mDropUUID.c_str()));
|
||||
reportToNearbyChat("This can occur if the object was returned or deleted, or if your client is no longer rendering it.");
|
||||
reportToNearbyChat(llformat("Transfer from \"%s\" to \"%s\" aborted.", mFolderName.c_str(), mDropUUID.c_str()));
|
||||
report_to_nearby_chat(llformat("The object with the UUID of \"%s\" can no longer be found in-world.", mDropUUID.c_str()));
|
||||
report_to_nearby_chat("This can occur if the object was returned or deleted, or if your client is no longer rendering it.");
|
||||
report_to_nearby_chat(llformat("Transfer from \"%s\" to \"%s\" aborted.", mFolderName.c_str(), mDropUUID.c_str()));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mPackage)
|
||||
{
|
||||
reportToNearbyChat("Packager finished, you may now pick up the prim that contains the objects.");
|
||||
reportToNearbyChat(llformat("Packaged what you had selected in world into the folder \"%s\" in your inventory and into the prim with the UUID of \"%s\"", mFolderName.c_str(), mDropUUID.c_str()));
|
||||
reportToNearbyChat("Don't worry if you look at the contents of package right now, it may show as empty, it isn't, it's just a bug with Second Life itself.");
|
||||
reportToNearbyChat("If you take it into your inventory then rez it back out, all the contents will be there.");
|
||||
report_to_nearby_chat("Packager finished, you may now pick up the prim that contains the objects.");
|
||||
report_to_nearby_chat(llformat("Packaged what you had selected in world into the folder \"%s\" in your inventory and into the prim with the UUID of \"%s\"", mFolderName.c_str(), mDropUUID.c_str()));
|
||||
report_to_nearby_chat("Don't worry if you look at the contents of package right now, it may show as empty, it isn't, it's just a bug with Second Life itself.");
|
||||
report_to_nearby_chat("If you take it into your inventory then rez it back out, all the contents will be there.");
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Completed transfer from \"%s\" to \"%s\".", mFolderName.c_str(), mDropUUID.c_str()));
|
||||
report_to_nearby_chat(llformat("Completed transfer from \"%s\" to \"%s\".", mFolderName.c_str(), mDropUUID.c_str()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -129,7 +129,7 @@ public:
|
|||
LLViewerObject* objectp = gObjectList.findObject(mDestination);
|
||||
if (objectp)
|
||||
{
|
||||
reportToNearbyChat(std::string("transferring ") + subj->getName());
|
||||
report_to_nearby_chat(std::string("transferring ") + subj->getName());
|
||||
LLToolDragAndDrop::dropInventory(objectp, subj, LLToolDragAndDrop::SOURCE_AGENT, gAgentID);
|
||||
if (mStack.size() > 0)
|
||||
{
|
||||
|
|
@ -218,11 +218,11 @@ public:
|
|||
|
||||
if (mPackage)
|
||||
{
|
||||
reportToNearbyChat("Packager started. Phase 1 (taking in-world objects into inventory) starting in: ");
|
||||
report_to_nearby_chat("Packager started. Phase 1 (taking in-world objects into inventory) starting in: ");
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("Ztake activated. Taking selected in-world objects into inventory in: ");
|
||||
report_to_nearby_chat("Ztake activated. Taking selected in-world objects into inventory in: ");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -230,7 +230,7 @@ public:
|
|||
{
|
||||
if (!mPackage)
|
||||
{
|
||||
reportToNearbyChat("Ztake deactivated.");
|
||||
report_to_nearby_chat("Ztake deactivated.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -239,7 +239,7 @@ public:
|
|||
{
|
||||
switch (mState) {
|
||||
case ZTS_COUNTDOWN:
|
||||
reportToNearbyChat(llformat("%i...", mCountdown--));
|
||||
report_to_nearby_chat(llformat("%i...", mCountdown--));
|
||||
if (mCountdown == 0) mState = ZTS_SELECTION;
|
||||
break;
|
||||
|
||||
|
|
@ -298,25 +298,25 @@ public:
|
|||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("Ktake has taken all selected objects.");
|
||||
report_to_nearby_chat("Ktake has taken all selected objects.");
|
||||
doZtCleanup();
|
||||
mState = ZTS_DONE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("Ztake has taken all selected objects. Say \"ztake off\" to deactivate ztake or select more objects to continue.");
|
||||
report_to_nearby_chat("Ztake has taken all selected objects. Say \"ztake off\" to deactivate ztake or select more objects to continue.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mPackage)
|
||||
{
|
||||
reportToNearbyChat(llformat("Packager: %i objects left to take.", mToTake.size()));
|
||||
report_to_nearby_chat(llformat("Packager: %i objects left to take.", mToTake.size()));
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Ztake: %i objects left to take.", mToTake.size()));
|
||||
report_to_nearby_chat(llformat("Ztake: %i objects left to take.", mToTake.size()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -325,12 +325,12 @@ public:
|
|||
{
|
||||
if (mPackage)
|
||||
{
|
||||
reportToNearbyChat(llformat("Packager: no objects to take."));
|
||||
report_to_nearby_chat(llformat("Packager: no objects to take."));
|
||||
doZtCleanup();
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Ztake: no objects to take."));
|
||||
report_to_nearby_chat(llformat("Ztake: no objects to take."));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -350,14 +350,14 @@ public:
|
|||
if (itemstack.size() >= mPackSize || mCountdown == 0)
|
||||
{
|
||||
if (itemstack.size() < mPackSize) {
|
||||
reportToNearbyChat("Phase 1 of the packager finished, but some items mave have been missed.");
|
||||
report_to_nearby_chat("Phase 1 of the packager finished, but some items mave have been missed.");
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("Phase 1 of the packager finished.");
|
||||
report_to_nearby_chat("Phase 1 of the packager finished.");
|
||||
}
|
||||
|
||||
reportToNearbyChat("Do not have the destination prim selected while transfer is running to reduce the chances of \"Inventory creation on in-world object failed.\"");
|
||||
report_to_nearby_chat("Do not have the destination prim selected while transfer is running to reduce the chances of \"Inventory creation on in-world object failed.\"");
|
||||
|
||||
LLUUID sdest = LLUUID(mPackageDest);
|
||||
new JCZdrop(itemstack, sdest, mFolderName.c_str(), mPackageDest.asString().c_str(), true);
|
||||
|
|
@ -421,12 +421,12 @@ public:
|
|||
|
||||
TMZtake(const LLUUID& target) : LLEventTimer(0.33f), mTarget(target), mRunning(FALSE), mCountdown(5)
|
||||
{
|
||||
reportToNearbyChat("Mtake activated. Taking selected in-world objects into inventory in: ");
|
||||
report_to_nearby_chat("Mtake activated. Taking selected in-world objects into inventory in: ");
|
||||
}
|
||||
|
||||
~TMZtake()
|
||||
{
|
||||
reportToNearbyChat("Mtake deactivated.");
|
||||
report_to_nearby_chat("Mtake deactivated.");
|
||||
}
|
||||
|
||||
BOOL tick()
|
||||
|
|
@ -470,7 +470,7 @@ public:
|
|||
}
|
||||
if (mCountdown > 0)
|
||||
{
|
||||
reportToNearbyChat(llformat("%i...", mCountdown--));
|
||||
report_to_nearby_chat(llformat("%i...", mCountdown--));
|
||||
}
|
||||
else if (mToTake.size() > 0)
|
||||
{
|
||||
|
|
@ -496,11 +496,11 @@ public:
|
|||
{
|
||||
if (mToTake.size() == 0)
|
||||
{
|
||||
reportToNearbyChat("Mtake has taken all selected objects. Say \"mtake off\" to deactivate Mtake or select more objects to continue.");
|
||||
report_to_nearby_chat("Mtake has taken all selected objects. Say \"mtake off\" to deactivate Mtake or select more objects to continue.");
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Mtake: %i objects left to take.", mToTake.size()));
|
||||
report_to_nearby_chat(llformat("Mtake: %i objects left to take.", mToTake.size()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -582,7 +582,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
if (from_gesture)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("DrawDistanceSteppingGestureObsolete"));
|
||||
report_to_nearby_chat(LLTrans::getString("DrawDistanceSteppingGestureObsolete"));
|
||||
gSavedSettings.setBOOL("FSRenderFarClipStepping", TRUE);
|
||||
return false;
|
||||
}
|
||||
|
|
@ -593,7 +593,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
gAgentCamera.mDrawDistance = drawDist;
|
||||
LLStringUtil::format_map_t args;
|
||||
args["DISTANCE"] = llformat("%.0f", drawDist);
|
||||
reportToNearbyChat(LLTrans::getString("FSCmdLineDrawDistanceSet", args));
|
||||
report_to_nearby_chat(LLTrans::getString("FSCmdLineDrawDistanceSet", args));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -655,7 +655,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
std::string bw_cmd_respond;
|
||||
args["[VALUE]"] = llformat ("%d", band_width);
|
||||
bw_cmd_respond = LLTrans::getString("FSCmdLineRSP", args);
|
||||
reportToNearbyChat(bw_cmd_respond);
|
||||
report_to_nearby_chat(bw_cmd_respond);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -707,7 +707,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
object_name = RlvStrings::getAnonym(object_name);
|
||||
}
|
||||
reportToNearbyChat(llformat("%s: (%s)", target_key.asString().c_str(), object_name.c_str()));
|
||||
report_to_nearby_chat(llformat("%s: (%s)", target_key.asString().c_str(), object_name.c_str()));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -720,7 +720,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
|
||||
if (!myObject)
|
||||
{
|
||||
reportToNearbyChat(llformat("Object with key %s not found!", target_key.asString().c_str()));
|
||||
report_to_nearby_chat(llformat("Object with key %s not found!", target_key.asString().c_str()));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -760,7 +760,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
msg->addVector3("Normal", LLVector3::zero);
|
||||
msg->addVector3("Binormal", LLVector3::zero);
|
||||
msg->sendMessage(myObject->getRegion()->getHost());
|
||||
reportToNearbyChat(llformat("Touched object with key %s", target_key.asString().c_str()));
|
||||
report_to_nearby_chat(llformat("Touched object with key %s", target_key.asString().c_str()));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
@ -774,7 +774,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
|
||||
if (!myObject)
|
||||
{
|
||||
reportToNearbyChat(llformat("Object with key %s not found!", target_key.asString().c_str()));
|
||||
report_to_nearby_chat(llformat("Object with key %s not found!", target_key.asString().c_str()));
|
||||
return false;
|
||||
}
|
||||
if ((!rlv_handler_t::isEnabled()) || (gRlvHandler.canSit(myObject, LLVector3::zero)))
|
||||
|
|
@ -789,7 +789,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
msg->addVector3Fast(_PREHASH_Offset, LLVector3::zero);
|
||||
gAgent.getRegion()->sendReliableMessage();
|
||||
|
||||
reportToNearbyChat(llformat("Sat on object with key %s", target_key.asString().c_str()));
|
||||
report_to_nearby_chat(llformat("Sat on object with key %s", target_key.asString().c_str()));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
@ -799,7 +799,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
if ((!rlv_handler_t::isEnabled()) || (RlvActions::canStand()))
|
||||
{
|
||||
gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
|
||||
reportToNearbyChat(std::string("Standing up"));
|
||||
report_to_nearby_chat(std::string("Standing up"));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -822,7 +822,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
gAgent.sendReliableMessage();
|
||||
LLStringUtil::format_map_t args;
|
||||
args["NAME"] = LLSLURL("agent", target_key, "inspect").getSLURLString();
|
||||
reportToNearbyChat(LLTrans::getString("FSCmdLineTpOffered", args));
|
||||
report_to_nearby_chat(LLTrans::getString("FSCmdLineTpOffered", args));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -932,7 +932,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["RAND"] = llformat("%s", look_for.c_str());
|
||||
reportToNearbyChat(LLTrans::getString("FSCmdLineCalcRandError", args));
|
||||
report_to_nearby_chat(LLTrans::getString("FSCmdLineCalcRandError", args));
|
||||
}
|
||||
std::string random_number_text = llformat("%d", random_number);
|
||||
expr.replace(random_string_pos, look_for.length(), random_number_text);
|
||||
|
|
@ -957,7 +957,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
result_str << result;
|
||||
out = result_str.str();
|
||||
}
|
||||
reportToNearbyChat(out);
|
||||
report_to_nearby_chat(out);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -990,22 +990,22 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
if (zdrop)
|
||||
{
|
||||
reportToNearbyChat("Zdrop is already active.");
|
||||
report_to_nearby_chat("Zdrop is already active.");
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string destination;
|
||||
if (i >> destination)
|
||||
{
|
||||
reportToNearbyChat("Beginning Zdrop.");
|
||||
reportToNearbyChat("Verifying destination prim is present inworld...");
|
||||
report_to_nearby_chat("Beginning Zdrop.");
|
||||
report_to_nearby_chat("Verifying destination prim is present inworld...");
|
||||
if (!LLUUID::validate(destination))
|
||||
{
|
||||
reportToNearbyChat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
report_to_nearby_chat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
}
|
||||
else if (!gObjectList.findObject(LLUUID(destination)))
|
||||
{
|
||||
reportToNearbyChat("Unable to locate object. Please verify the object is rezzed and in view, and that the UUID is correct.");
|
||||
report_to_nearby_chat("Unable to locate object. Please verify the object is rezzed and in view, and that the UUID is correct.");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1021,7 +1021,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
LLUUID folder_id = gInventory.findCategoryByName(folder);
|
||||
if (folder_id.notNull())
|
||||
{
|
||||
reportToNearbyChat("Verifying folder location...");
|
||||
report_to_nearby_chat("Verifying folder location...");
|
||||
std::stack<LLViewerInventoryItem*> inventorystack;
|
||||
std::vector<LLPointer<LLViewerInventoryItem> > inventory = findInventoryInFolder(folder);
|
||||
for (std::vector<LLPointer<LLViewerInventoryItem> >::iterator it = inventory.begin(); it != inventory.end(); ++it)
|
||||
|
|
@ -1031,32 +1031,32 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
}
|
||||
if (inventorystack.size())
|
||||
{
|
||||
reportToNearbyChat(llformat("Found folder \"%s\".", folder.c_str()));
|
||||
reportToNearbyChat(llformat("Found prim \"%s\".", destination.c_str()));
|
||||
reportToNearbyChat(llformat("Transferring inventory items from \"%s\" to prim \"%s\".", folder.c_str(), destination.c_str()));
|
||||
reportToNearbyChat("WARNING: No-copy items will be moved to the destination prim!");
|
||||
reportToNearbyChat("Do not have the prim selected while transfer is running to reduce the chances of \"Inventory creation on in-world object failed.\"");
|
||||
reportToNearbyChat("Use \"zdrop off\" to stop the transfer");
|
||||
report_to_nearby_chat(llformat("Found folder \"%s\".", folder.c_str()));
|
||||
report_to_nearby_chat(llformat("Found prim \"%s\".", destination.c_str()));
|
||||
report_to_nearby_chat(llformat("Transferring inventory items from \"%s\" to prim \"%s\".", folder.c_str(), destination.c_str()));
|
||||
report_to_nearby_chat("WARNING: No-copy items will be moved to the destination prim!");
|
||||
report_to_nearby_chat("Do not have the prim selected while transfer is running to reduce the chances of \"Inventory creation on in-world object failed.\"");
|
||||
report_to_nearby_chat("Use \"zdrop off\" to stop the transfer");
|
||||
LLUUID sdest = LLUUID(destination);
|
||||
zdrop = new JCZdrop(inventorystack, sdest, folder.c_str(), destination.c_str());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("\"%s\" folder not found. Please check the spelling.", folder.c_str()));
|
||||
reportToNearbyChat("Zdrop cannot work if the folder is inside another folder.");
|
||||
report_to_nearby_chat(llformat("\"%s\" folder not found. Please check the spelling.", folder.c_str()));
|
||||
report_to_nearby_chat("Zdrop cannot work if the folder is inside another folder.");
|
||||
}
|
||||
}
|
||||
catch (std::out_of_range)
|
||||
{
|
||||
reportToNearbyChat("The Zdrop command transfers items from your inventory to a rezzed prim without the need to wait for the contents of the prim to load. No-copy items are moved to the prim. All other items are copied.");
|
||||
reportToNearbyChat("Valid command: Zdrop (rezzed prim UUID) (source inventory folder name)");
|
||||
report_to_nearby_chat("The Zdrop command transfers items from your inventory to a rezzed prim without the need to wait for the contents of the prim to load. No-copy items are moved to the prim. All other items are copied.");
|
||||
report_to_nearby_chat("Valid command: Zdrop (rezzed prim UUID) (source inventory folder name)");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("Please specify an object UUID to copy the items in this folder to.");
|
||||
report_to_nearby_chat("Please specify an object UUID to copy the items in this folder to.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1064,7 +1064,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
if (!zdrop)
|
||||
{
|
||||
reportToNearbyChat("Zdrop is already deactivated.");
|
||||
report_to_nearby_chat("Zdrop is already deactivated.");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1075,13 +1075,13 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Invalid command: \"%s\". Valid commands: zdrop on (source inventory folder) (rezzed prim UUID); zdrop off", setting.c_str()));
|
||||
report_to_nearby_chat(llformat("Invalid command: \"%s\". Valid commands: zdrop on (source inventory folder) (rezzed prim UUID); zdrop off", setting.c_str()));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("The Zdrop command transfers items from your inventory to a rezzed prim without the need to wait for the contents of the prim to load. No-copy items are moved to the prim. All other items are copied.");
|
||||
reportToNearbyChat("Valid commands: zdrop on (rezzed prim UUID) (source inventory folder name); zdrop off");
|
||||
report_to_nearby_chat("The Zdrop command transfers items from your inventory to a rezzed prim without the need to wait for the contents of the prim to load. No-copy items are moved to the prim. All other items are copied.");
|
||||
report_to_nearby_chat("Valid commands: zdrop on (rezzed prim UUID) (source inventory folder name); zdrop off");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1094,12 +1094,12 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
if (ztake)
|
||||
{
|
||||
reportToNearbyChat("Ztake is already active.");
|
||||
report_to_nearby_chat("Ztake is already active.");
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("Beginning Ztake.");
|
||||
reportToNearbyChat("Verifying folder location...");
|
||||
report_to_nearby_chat("Beginning Ztake.");
|
||||
report_to_nearby_chat("Verifying folder location...");
|
||||
std::string folder_name;
|
||||
std::string tmp;
|
||||
while (i >> tmp)
|
||||
|
|
@ -1112,18 +1112,18 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
LLUUID folder = gInventory.findCategoryByName(folder_name);
|
||||
if (folder.notNull())
|
||||
{
|
||||
reportToNearbyChat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
|
||||
report_to_nearby_chat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
|
||||
ztake = new JCZtake(folder);
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
reportToNearbyChat("Ztake cannot work if the folder is inside another folder.");
|
||||
report_to_nearby_chat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
report_to_nearby_chat("Ztake cannot work if the folder is inside another folder.");
|
||||
}
|
||||
}
|
||||
catch (std::out_of_range)
|
||||
{
|
||||
reportToNearbyChat("Please specify a destination folder in your inventory.");
|
||||
report_to_nearby_chat("Please specify a destination folder in your inventory.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1131,7 +1131,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
if (!ztake)
|
||||
{
|
||||
reportToNearbyChat("Ztake is already deactivated.");
|
||||
report_to_nearby_chat("Ztake is already deactivated.");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1142,14 +1142,14 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Invalid command: \"%s\". Valid commands: ztake on (destination inventory folder); ztake off", setting.c_str()));
|
||||
report_to_nearby_chat(llformat("Invalid command: \"%s\". Valid commands: ztake on (destination inventory folder); ztake off", setting.c_str()));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("The Ztake command copies selected rezzed objects into the folder you specify in your inventory.");
|
||||
reportToNearbyChat("Valid commands: ztake on (destination inventory folder name); ztake off");
|
||||
report_to_nearby_chat("The Ztake command copies selected rezzed objects into the folder you specify in your inventory.");
|
||||
report_to_nearby_chat("Valid commands: ztake on (destination inventory folder name); ztake off");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1158,14 +1158,14 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
std::string destination;
|
||||
if (i >> destination)
|
||||
{
|
||||
reportToNearbyChat("Verifying destination prim is present inworld...");
|
||||
report_to_nearby_chat("Verifying destination prim is present inworld...");
|
||||
if (!LLUUID::validate(destination))
|
||||
{
|
||||
reportToNearbyChat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
report_to_nearby_chat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
}
|
||||
else if (!gObjectList.findObject(LLUUID(destination)))
|
||||
{
|
||||
reportToNearbyChat("Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct.");
|
||||
report_to_nearby_chat("Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct.");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1181,24 +1181,24 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
LLUUID folder = gInventory.findCategoryByName(folder_name);
|
||||
if (folder.notNull())
|
||||
{
|
||||
reportToNearbyChat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
|
||||
report_to_nearby_chat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
|
||||
ztake = new JCZtake(folder, true, LLUUID(destination), folder_name, (command == "cpackage") ? DRD_ACQUIRE_TO_AGENT_INVENTORY : DRD_TAKE_INTO_AGENT_INVENTORY);
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
reportToNearbyChat("The packager cannot work if the folder is inside another folder.");
|
||||
report_to_nearby_chat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
report_to_nearby_chat("The packager cannot work if the folder is inside another folder.");
|
||||
}
|
||||
}
|
||||
catch (std::out_of_range)
|
||||
{
|
||||
reportToNearbyChat("Please specify a destination folder in your inventory.");
|
||||
report_to_nearby_chat("Please specify a destination folder in your inventory.");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Packager usage: \"%s destination_prim_UUID inventory folder name\"",command.c_str()));
|
||||
report_to_nearby_chat(llformat("Packager usage: \"%s destination_prim_UUID inventory folder name\"",command.c_str()));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1207,14 +1207,14 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
std::string destination;
|
||||
if (i >> destination)
|
||||
{
|
||||
reportToNearbyChat("Verifying destination prim is present inworld...");
|
||||
report_to_nearby_chat("Verifying destination prim is present inworld...");
|
||||
if (!LLUUID::validate(destination))
|
||||
{
|
||||
reportToNearbyChat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
report_to_nearby_chat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
}
|
||||
else if (!gObjectList.findObject(LLUUID(destination)))
|
||||
{
|
||||
reportToNearbyChat("Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct.");
|
||||
report_to_nearby_chat("Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct.");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1234,7 +1234,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
|
||||
if (!LLUUID::validate(take))
|
||||
{
|
||||
reportToNearbyChat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
report_to_nearby_chat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
|
|
@ -1242,7 +1242,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
LLViewerObject* objectp = gObjectList.findObject(LLUUID(take));
|
||||
if(!objectp)
|
||||
{
|
||||
reportToNearbyChat("Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct.");
|
||||
report_to_nearby_chat("Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct.");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
|
|
@ -1258,30 +1258,30 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
|
||||
if (to_take.empty())
|
||||
{
|
||||
reportToNearbyChat("No objects to take.");
|
||||
report_to_nearby_chat("No objects to take.");
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
|
||||
report_to_nearby_chat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
|
||||
ztake = new JCZtake(folder, true, LLUUID(destination), folder_name, DRD_ACQUIRE_TO_AGENT_INVENTORY, false, to_take);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
reportToNearbyChat("The packager cannot work if the folder is inside another folder.");
|
||||
report_to_nearby_chat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
report_to_nearby_chat("The packager cannot work if the folder is inside another folder.");
|
||||
}
|
||||
}
|
||||
catch (std::out_of_range)
|
||||
{
|
||||
reportToNearbyChat("Please specify a destination folder in your inventory.");
|
||||
report_to_nearby_chat("Please specify a destination folder in your inventory.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Packager usage: \"%s destination_prim_UUID inventory folder name\"",command.c_str()));
|
||||
report_to_nearby_chat(llformat("Packager usage: \"%s destination_prim_UUID inventory folder name\"",command.c_str()));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1291,14 +1291,14 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
std::string destination;
|
||||
if (i >> destination)
|
||||
{
|
||||
reportToNearbyChat("Verifying destination prim is present inworld...");
|
||||
report_to_nearby_chat("Verifying destination prim is present inworld...");
|
||||
if (!LLUUID::validate(destination))
|
||||
{
|
||||
reportToNearbyChat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
report_to_nearby_chat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
}
|
||||
else if (!gObjectList.findObject(LLUUID(destination)))
|
||||
{
|
||||
reportToNearbyChat("Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct.");
|
||||
report_to_nearby_chat("Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct.");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1310,7 +1310,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
LLUUID folder = gInventory.findCategoryByName(folder_name);
|
||||
if (folder.notNull())
|
||||
{
|
||||
reportToNearbyChat(llformat("kpackager started. Destination folder: \"%s\" Listening to object: \"%s\"", folder_name.c_str(), destination.c_str()));
|
||||
report_to_nearby_chat(llformat("kpackager started. Destination folder: \"%s\" Listening to object: \"%s\"", folder_name.c_str(), destination.c_str()));
|
||||
|
||||
cmd_line_mPackagerToTake.clear();
|
||||
cmd_line_mPackagerTargetFolderName = folder_name;
|
||||
|
|
@ -1319,20 +1319,20 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
reportToNearbyChat("The packager cannot work if the folder is inside another folder.");
|
||||
report_to_nearby_chat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
report_to_nearby_chat("The packager cannot work if the folder is inside another folder.");
|
||||
}
|
||||
}
|
||||
catch (std::out_of_range)
|
||||
{
|
||||
reportToNearbyChat("Please specify a destination folder in your inventory.");
|
||||
report_to_nearby_chat("Please specify a destination folder in your inventory.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Packager usage: \"%s destination_prim_UUID inventory folder name\"",command.c_str()));
|
||||
report_to_nearby_chat(llformat("Packager usage: \"%s destination_prim_UUID inventory folder name\"",command.c_str()));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1342,7 +1342,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
cmd_line_mPackagerTargetFolderName = "";
|
||||
cmd_line_mPackagerTargetFolder.setNull();
|
||||
cmd_line_mPackagerDest.setNull();
|
||||
reportToNearbyChat("Packager: Stopped and cleared.");
|
||||
report_to_nearby_chat("Packager: Stopped and cleared.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1364,7 +1364,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
|
||||
if (!LLUUID::validate(take))
|
||||
{
|
||||
reportToNearbyChat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
report_to_nearby_chat("Entered UUID is invalid! (Hint: use the \"copy key\" button in the build menu.)");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
|
|
@ -1372,7 +1372,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
LLViewerObject* objectp = gObjectList.findObject(LLUUID(take));
|
||||
if(!objectp)
|
||||
{
|
||||
reportToNearbyChat("Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct.");
|
||||
report_to_nearby_chat("Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct.");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
|
|
@ -1388,23 +1388,23 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
|
||||
if (to_take.empty())
|
||||
{
|
||||
reportToNearbyChat("No objects to take.");
|
||||
report_to_nearby_chat("No objects to take.");
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
|
||||
report_to_nearby_chat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
|
||||
ztake = new JCZtake(folder, true, LLUUID::null, folder_name, (command == "kcopy") ? DRD_ACQUIRE_TO_AGENT_INVENTORY : DRD_TAKE_INTO_AGENT_INVENTORY, false, to_take);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
reportToNearbyChat("The packager cannot work if the folder is inside another folder.");
|
||||
report_to_nearby_chat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
report_to_nearby_chat("The packager cannot work if the folder is inside another folder.");
|
||||
}
|
||||
}
|
||||
catch (std::out_of_range)
|
||||
{
|
||||
reportToNearbyChat("Please specify a destination folder in your inventory.");
|
||||
report_to_nearby_chat("Please specify a destination folder in your inventory.");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
|
@ -1418,12 +1418,12 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
if (mtake)
|
||||
{
|
||||
reportToNearbyChat("Mtake is already active.");
|
||||
report_to_nearby_chat("Mtake is already active.");
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("Beginning Mtake.");
|
||||
reportToNearbyChat("Verifying folder location...");
|
||||
report_to_nearby_chat("Beginning Mtake.");
|
||||
report_to_nearby_chat("Verifying folder location...");
|
||||
std::string folder_name;
|
||||
std::string tmp;
|
||||
while (i >> tmp)
|
||||
|
|
@ -1436,18 +1436,18 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
LLUUID folder = gInventory.findCategoryByName(folder_name);
|
||||
if (folder.notNull())
|
||||
{
|
||||
reportToNearbyChat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
|
||||
report_to_nearby_chat(llformat("Found destination folder \"%s\".", folder_name.c_str()));
|
||||
mtake = new TMZtake(folder);
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
reportToNearbyChat("Mtake cannot work if the folder is inside another folder.");
|
||||
report_to_nearby_chat(llformat("\"%s\" folder not found. Please check the spelling.", folder_name.c_str()));
|
||||
report_to_nearby_chat("Mtake cannot work if the folder is inside another folder.");
|
||||
}
|
||||
}
|
||||
catch (std::out_of_range)
|
||||
{
|
||||
reportToNearbyChat("Please specify a destination folder in your inventory.");
|
||||
report_to_nearby_chat("Please specify a destination folder in your inventory.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1455,7 +1455,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
if (!mtake)
|
||||
{
|
||||
reportToNearbyChat("Mtake is already deactivated.");
|
||||
report_to_nearby_chat("Mtake is already deactivated.");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1466,14 +1466,14 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("Invalid command: \"%s\". Valid commands: mtake on (destination inventory folder); mtake off", setting.c_str()));
|
||||
report_to_nearby_chat(llformat("Invalid command: \"%s\". Valid commands: mtake on (destination inventory folder); mtake off", setting.c_str()));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("The Mtake command renames selected rezzed objects to the dimensions of the prim, then copies them into the folder you specify in your inventory.");
|
||||
reportToNearbyChat("Valid commands: mtake on (destination inventory folder name); mtake off");
|
||||
report_to_nearby_chat("The Mtake command renames selected rezzed objects to the dimensions of the prim, then copies them into the folder you specify in your inventory.");
|
||||
report_to_nearby_chat("Valid commands: mtake on (destination inventory folder name); mtake off");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1493,11 +1493,11 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[POS]"] = cameraPositionString;
|
||||
reportToNearbyChat(LLTrans::getString("FSCameraPositionCopied", args));
|
||||
report_to_nearby_chat(LLTrans::getString("FSCameraPositionCopied", args));
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat("Could not get a valid region pointer.");
|
||||
report_to_nearby_chat("Could not get a valid region pointer.");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
@ -1535,7 +1535,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["COMMAND"] = llformat("%s", std::string(sFSCmdLineRollDice).c_str());
|
||||
reportToNearbyChat(LLTrans::getString("FSCmdLineRollDiceModifiersInvalid", args));
|
||||
report_to_nearby_chat(LLTrans::getString("FSCmdLineRollDiceModifiersInvalid", args));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1552,11 +1552,11 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
result_per_die -= 1;
|
||||
die_penetrated = 0;
|
||||
reportToNearbyChat(llformat("#%d 1d%d-1: %d.", die_iter, faces, result_per_die));
|
||||
report_to_nearby_chat(llformat("#%d 1d%d-1: %d.", die_iter, faces, result_per_die));
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(llformat("#%d 1d%d: %d.", die_iter, faces, result_per_die));
|
||||
report_to_nearby_chat(llformat("#%d 1d%d: %d.", die_iter, faces, result_per_die));
|
||||
}
|
||||
result += result_per_die;
|
||||
++die_iter;
|
||||
|
|
@ -1566,7 +1566,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
// Modifier: Successes lower than a value
|
||||
if (result_per_die <= modifier)
|
||||
{
|
||||
reportToNearbyChat(" ^-- " + LLTrans::getString("FSCmdLineRollDiceSuccess"));
|
||||
report_to_nearby_chat(" ^-- " + LLTrans::getString("FSCmdLineRollDiceSuccess"));
|
||||
++successes;
|
||||
}
|
||||
else
|
||||
|
|
@ -1579,7 +1579,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
// Modifier: Successes greater than a value
|
||||
if (result_per_die >= modifier)
|
||||
{
|
||||
reportToNearbyChat(" ^-- " + LLTrans::getString("FSCmdLineRollDiceSuccess"));
|
||||
report_to_nearby_chat(" ^-- " + LLTrans::getString("FSCmdLineRollDiceSuccess"));
|
||||
++successes;
|
||||
}
|
||||
else
|
||||
|
|
@ -1590,13 +1590,13 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
else if ((modifier_type == "!" && result_per_die == modifier) || (modifier_type == "!>" && result_per_die >= modifier) || (modifier_type == "!<" && result_per_die <= modifier))
|
||||
{
|
||||
// Modifier: Exploding dice
|
||||
reportToNearbyChat(" ^-- " + LLTrans::getString("FSCmdLineRollDiceExploded"));
|
||||
report_to_nearby_chat(" ^-- " + LLTrans::getString("FSCmdLineRollDiceExploded"));
|
||||
--die_iter;
|
||||
}
|
||||
else if ((modifier_type == "!p" && result_per_die == modifier) || (modifier_type == "!p>" && result_per_die >= modifier) || (modifier_type == "!p<" && result_per_die <= modifier))
|
||||
{
|
||||
// Modifier: Penetrating dice (special style of exploding dice)
|
||||
reportToNearbyChat(" ^-- " + LLTrans::getString("FSCmdLineRollDicePenetrated"));
|
||||
report_to_nearby_chat(" ^-- " + LLTrans::getString("FSCmdLineRollDicePenetrated"));
|
||||
die_penetrated = 1;
|
||||
--die_iter;
|
||||
}
|
||||
|
|
@ -1604,7 +1604,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
{
|
||||
// Modifier: Reroll
|
||||
result -= result_per_die;
|
||||
reportToNearbyChat(" ^-- " + LLTrans::getString("FSCmdLineRollDiceReroll"));
|
||||
report_to_nearby_chat(" ^-- " + LLTrans::getString("FSCmdLineRollDiceReroll"));
|
||||
--die_iter;
|
||||
}
|
||||
|
||||
|
|
@ -1614,7 +1614,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
// More than 1000 iterations already? We probably have an infinite loop - kill all further rolls
|
||||
// Explosions can trigger this easily, "rolld 1 6 !> 0" for example
|
||||
die_iter = 102;
|
||||
reportToNearbyChat(LLTrans::getString("FSCmdLineRollDiceFreezeGuard"));
|
||||
report_to_nearby_chat(LLTrans::getString("FSCmdLineRollDiceFreezeGuard"));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1634,14 +1634,14 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
else if (modifier_type == ">" || modifier_type == "<")
|
||||
{
|
||||
// Modifier: Successes
|
||||
reportToNearbyChat(LLTrans::getString("FSCmdLineRollDiceSuccess") + ": " + llformat("%d", successes));
|
||||
report_to_nearby_chat(LLTrans::getString("FSCmdLineRollDiceSuccess") + ": " + llformat("%d", successes));
|
||||
}
|
||||
modifier_type = modifier_type + llformat("%d", modifier);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("FSCmdLineRollDiceLimits"));
|
||||
report_to_nearby_chat(LLTrans::getString("FSCmdLineRollDiceLimits"));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1657,7 +1657,7 @@ bool cmd_line_chat(const std::string& revised_text, EChatType type, bool from_ge
|
|||
args["FACES"] = llformat("%d", faces);
|
||||
args["RESULT"] = llformat("%d", result);
|
||||
args["MODIFIER"] = llformat("%s", modifier_type.c_str());
|
||||
reportToNearbyChat(LLTrans::getString("FSCmdLineRollDiceTotal", args));
|
||||
report_to_nearby_chat(LLTrans::getString("FSCmdLineRollDiceTotal", args));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1790,7 +1790,7 @@ bool cmdline_packager(const std::string& message, const LLUUID& fromID, const LL
|
|||
LLViewerObject* objectp = gObjectList.findObject(LLUUID(item));
|
||||
if(!objectp)
|
||||
{
|
||||
reportToNearbyChat(llformat("Packager: Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct: \"%s\"", item.c_str()));
|
||||
report_to_nearby_chat(llformat("Packager: Unable to locate object. Please verify the object is rezzed, in view, and that the UUID is correct: \"%s\"", item.c_str()));
|
||||
return false;
|
||||
}
|
||||
else
|
||||
|
|
@ -1806,12 +1806,12 @@ bool cmdline_packager(const std::string& message, const LLUUID& fromID, const LL
|
|||
}
|
||||
while(comma < csv.length());
|
||||
|
||||
reportToNearbyChat(llformat("Packager: adding objects: \"%s\"", csv.c_str()));
|
||||
report_to_nearby_chat(llformat("Packager: adding objects: \"%s\"", csv.c_str()));
|
||||
return true;
|
||||
}
|
||||
else if (cmd == "kpackagerend") {
|
||||
|
||||
reportToNearbyChat("Packager: finilizing.");
|
||||
report_to_nearby_chat("Packager: finilizing.");
|
||||
ztake = new JCZtake(cmd_line_mPackagerTargetFolder, true, cmd_line_mPackagerDest, cmd_line_mPackagerTargetFolderName, DRD_ACQUIRE_TO_AGENT_INVENTORY, false, cmd_line_mPackagerToTake);
|
||||
cmd_line_mPackagerToTake.clear();
|
||||
cmd_line_mPackagerTargetFolderName = "";
|
||||
|
|
|
|||
|
|
@ -966,8 +966,6 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
name_params.color(name_color);
|
||||
name_params.readonly_color(name_color);
|
||||
|
||||
std::string prefix = chat.mText.substr(0, 4);
|
||||
|
||||
// FS:LO FIRE-2899 - Faded text for IMs in nearby chat
|
||||
F32 FSIMChatHistoryFade = gSavedSettings.getF32("FSIMChatHistoryFade");
|
||||
|
||||
|
|
@ -979,7 +977,7 @@ void FSChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
// FS:LO FIRE-2899 - Faded text for IMs in nearby chat
|
||||
|
||||
//IRC styled /me messages.
|
||||
bool irc_me = (prefix == "/me " || prefix == "/me'");
|
||||
bool irc_me = is_irc_me_prefix(chat.mText);
|
||||
|
||||
// Delimiter after a name in header copy/past and in plain text mode
|
||||
std::string delimiter = ": ";
|
||||
|
|
|
|||
|
|
@ -0,0 +1,184 @@
|
|||
/**
|
||||
* @file fschatoptionsmenu.cpp
|
||||
* @brief Handler for chat options menu
|
||||
*
|
||||
* $LicenseInfo:firstyear=2015&license=viewerlgpl$
|
||||
* Phoenix Firestorm Viewer Source Code
|
||||
* Copyright (c) 2015 Ansariel Hiller
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
|
||||
* http://www.firestormviewer.org
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "fschatoptionsmenu.h"
|
||||
|
||||
#include "fsfloaterim.h"
|
||||
#include "fsfloaternearbychat.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloatersidepanelcontainer.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
void FSChatOptionsMenu::onMenuItemClick(const LLSD& userdata, LLUICtrl* source)
|
||||
{
|
||||
const std::string option = userdata.asString();
|
||||
|
||||
if (option == "blocklist")
|
||||
{
|
||||
if (gSavedSettings.getBOOL("FSUseStandaloneBlocklistFloater"))
|
||||
{
|
||||
LLFloaterReg::toggleInstance("fs_blocklist");
|
||||
}
|
||||
else
|
||||
{
|
||||
LLPanel* panel = LLFloaterSidePanelContainer::getPanel("people", "panel_people");
|
||||
if (!panel)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (panel->isInVisibleChain())
|
||||
{
|
||||
LLFloaterReg::hideInstance("people");
|
||||
}
|
||||
else
|
||||
{
|
||||
LLFloaterSidePanelContainer::showPanel("people", "panel_people", LLSD().with("people_panel_tab_name", "blocked_panel"));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (option == "font_size_small")
|
||||
{
|
||||
gSavedSettings.setS32("ChatFontSize", 0);
|
||||
}
|
||||
else if (option == "font_size_medium")
|
||||
{
|
||||
gSavedSettings.setS32("ChatFontSize", 1);
|
||||
}
|
||||
else if (option == "font_size_large")
|
||||
{
|
||||
gSavedSettings.setS32("ChatFontSize", 2);
|
||||
}
|
||||
else if (option == "font_size_huge")
|
||||
{
|
||||
gSavedSettings.setS32("ChatFontSize", 3);
|
||||
}
|
||||
else if (option == "new_message_notification")
|
||||
{
|
||||
if (dynamic_cast<FSFloaterNearbyChat*>(source))
|
||||
{
|
||||
gSavedSettings.setBOOL("FSNotifyUnreadChatMessages", !gSavedSettings.getBOOL("FSNotifyUnreadChatMessages"));
|
||||
}
|
||||
else if (dynamic_cast<FSFloaterIM*>(source))
|
||||
{
|
||||
gSavedSettings.setBOOL("FSNotifyUnreadIMMessages", !gSavedSettings.getBOOL("FSNotifyUnreadIMMessages"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool FSChatOptionsMenu::onMenuItemEnable(const LLSD& userdata, LLUICtrl* source)
|
||||
{
|
||||
const std::string option = userdata.asString();
|
||||
|
||||
if (option == "typing_chevron")
|
||||
{
|
||||
FSFloaterIM* floater = dynamic_cast<FSFloaterIM*>(source);
|
||||
return (floater && floater->isP2PChat());
|
||||
}
|
||||
else if (option == "show_channel_selection")
|
||||
{
|
||||
return gSavedSettings.getBOOL("FSNearbyChatbar");
|
||||
}
|
||||
else if (option == "show_send_button")
|
||||
{
|
||||
return gSavedSettings.getBOOL("FSNearbyChatbar");
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FSChatOptionsMenu::onMenuItemVisible(const LLSD& userdata, LLUICtrl* source)
|
||||
{
|
||||
const std::string option = userdata.asString();
|
||||
|
||||
if (option == "typing_chevron")
|
||||
{
|
||||
return (dynamic_cast<FSFloaterIM*>(source) != NULL);
|
||||
}
|
||||
else if (option == "show_chat_bar")
|
||||
{
|
||||
return (dynamic_cast<FSFloaterNearbyChat*>(source) != NULL);
|
||||
}
|
||||
else if (option == "show_channel_selection")
|
||||
{
|
||||
return (dynamic_cast<FSFloaterNearbyChat*>(source) != NULL);
|
||||
}
|
||||
else if (option == "show_send_button")
|
||||
{
|
||||
return (dynamic_cast<FSFloaterNearbyChat*>(source) != NULL);
|
||||
}
|
||||
else if (option == "show_im_send_button")
|
||||
{
|
||||
return (dynamic_cast<FSFloaterIM*>(source) != NULL);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FSChatOptionsMenu::onMenuItemCheck(const LLSD& userdata, LLUICtrl* source)
|
||||
{
|
||||
const std::string option = userdata.asString();
|
||||
|
||||
if (option == "blocklist")
|
||||
{
|
||||
if (gSavedSettings.getBOOL("FSUseStandaloneBlocklistFloater"))
|
||||
{
|
||||
return LLFloaterReg::instanceVisible("fs_blocklist");
|
||||
}
|
||||
}
|
||||
else if (option == "font_size_small")
|
||||
{
|
||||
return (gSavedSettings.getS32("ChatFontSize") == 0);
|
||||
}
|
||||
else if (option == "font_size_medium")
|
||||
{
|
||||
return (gSavedSettings.getS32("ChatFontSize") == 1);
|
||||
}
|
||||
else if (option == "font_size_large")
|
||||
{
|
||||
return (gSavedSettings.getS32("ChatFontSize") == 2);
|
||||
}
|
||||
else if (option == "font_size_huge")
|
||||
{
|
||||
return (gSavedSettings.getS32("ChatFontSize") == 3);
|
||||
}
|
||||
else if (option == "new_message_notification")
|
||||
{
|
||||
if (dynamic_cast<FSFloaterNearbyChat*>(source))
|
||||
{
|
||||
return gSavedSettings.getBOOL("FSNotifyUnreadChatMessages");
|
||||
}
|
||||
else if (dynamic_cast<FSFloaterIM*>(source))
|
||||
{
|
||||
return gSavedSettings.getBOOL("FSNotifyUnreadIMMessages");
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
/**
|
||||
* @file fschatoptionsmenu.h
|
||||
* @brief Handler for chat options menu
|
||||
*
|
||||
* $LicenseInfo:firstyear=2015&license=viewerlgpl$
|
||||
* Phoenix Firestorm Viewer Source Code
|
||||
* Copyright (c) 2015 Ansariel Hiller
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* The Phoenix Firestorm Project, Inc., 1831 Oakwood Drive, Fairmont, Minnesota 56031-3225 USA
|
||||
* http://www.firestormviewer.org
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef FS_CHATOPTIONSMENU_H
|
||||
#define FS_CHATOPTIONSMENU_H
|
||||
|
||||
#include "lluictrl.h"
|
||||
|
||||
namespace FSChatOptionsMenu
|
||||
{
|
||||
void onMenuItemClick(const LLSD& userdata, LLUICtrl* source);
|
||||
bool onMenuItemEnable(const LLSD& userdata, LLUICtrl* source);
|
||||
bool onMenuItemVisible(const LLSD& userdata, LLUICtrl* source);
|
||||
bool onMenuItemCheck(const LLSD& userdata, LLUICtrl* source);
|
||||
};
|
||||
|
||||
#endif // FS_CHATOPTIONSMENU_H
|
||||
|
|
@ -61,7 +61,7 @@ extern S32 gMaxAgentGroups;
|
|||
|
||||
S32 FSCommon::sObjectAddMsg = 0;
|
||||
|
||||
void reportToNearbyChat(const std::string& message)
|
||||
void report_to_nearby_chat(const std::string& message)
|
||||
{
|
||||
LLChat chat;
|
||||
chat.mText = message;
|
||||
|
|
@ -69,76 +69,78 @@ void reportToNearbyChat(const std::string& message)
|
|||
LLNotificationsUI::LLNotificationManager::instance().onChat(chat, LLSD());
|
||||
}
|
||||
|
||||
std::string applyAutoCloseOoc(const std::string& message)
|
||||
std::string format_string(std::string text, const LLStringUtil::format_map_t& args)
|
||||
{
|
||||
LLStringUtil::format(text, args);
|
||||
return text;
|
||||
}
|
||||
|
||||
bool is_irc_me_prefix(const std::string& text)
|
||||
{
|
||||
const std::string prefix = text.substr(0, 4);
|
||||
return (prefix == "/me " || prefix == "/me'");
|
||||
}
|
||||
|
||||
std::string FSCommon::applyAutoCloseOoc(std::string message)
|
||||
{
|
||||
if (!gSavedSettings.getBOOL("AutoCloseOOC"))
|
||||
{
|
||||
return message;
|
||||
}
|
||||
|
||||
std::string utf8_text(message);
|
||||
|
||||
// Try to find any unclosed OOC chat (i.e. an opening
|
||||
// double parenthesis without a matching closing double
|
||||
// parenthesis.
|
||||
if (utf8_text.find("(( ") != -1 && utf8_text.find("))") == -1)
|
||||
if (message.find("(( ") != std::string::npos && message.find("))") == std::string::npos)
|
||||
{
|
||||
// add the missing closing double parenthesis.
|
||||
utf8_text += " ))";
|
||||
message += " ))";
|
||||
}
|
||||
else if (utf8_text.find("((") != -1 && utf8_text.find("))") == -1)
|
||||
else if (message.find("((") != std::string::npos && message.find("))") == std::string::npos)
|
||||
{
|
||||
if (utf8_text.at(utf8_text.length() - 1) == ')')
|
||||
if (message.at(message.length() - 1) == ')')
|
||||
{
|
||||
// cosmetic: add a space first to avoid a closing triple parenthesis
|
||||
utf8_text += " ";
|
||||
message += " ";
|
||||
}
|
||||
// add the missing closing double parenthesis.
|
||||
utf8_text += "))";
|
||||
message += "))";
|
||||
}
|
||||
else if (utf8_text.find("[[ ") != -1 && utf8_text.find("]]") == -1)
|
||||
else if (message.find("[[ ") != std::string::npos && message.find("]]") == std::string::npos)
|
||||
{
|
||||
// add the missing closing double parenthesis.
|
||||
utf8_text += " ]]";
|
||||
message += " ]]";
|
||||
}
|
||||
else if (utf8_text.find("[[") != -1 && utf8_text.find("]]") == -1)
|
||||
else if (message.find("[[") != std::string::npos && message.find("]]") == std::string::npos)
|
||||
{
|
||||
if (utf8_text.at(utf8_text.length() - 1) == ']')
|
||||
if (message.at(message.length() - 1) == ']')
|
||||
{
|
||||
// cosmetic: add a space first to avoid a closing triple parenthesis
|
||||
utf8_text += " ";
|
||||
message += " ";
|
||||
}
|
||||
// add the missing closing double parenthesis.
|
||||
utf8_text += "]]";
|
||||
message += "]]";
|
||||
}
|
||||
|
||||
return utf8_text;
|
||||
return message;
|
||||
}
|
||||
|
||||
std::string applyMuPose(const std::string& message)
|
||||
std::string FSCommon::applyMuPose(std::string message)
|
||||
{
|
||||
std::string utf8_text(message);
|
||||
|
||||
// Convert MU*s style poses into IRC emotes here.
|
||||
if (gSavedSettings.getBOOL("AllowMUpose") && utf8_text.find(":") == 0 && utf8_text.length() > 3)
|
||||
if (gSavedSettings.getBOOL("AllowMUpose") && message.find(":") == 0 && message.length() > 3)
|
||||
{
|
||||
if (utf8_text.find(":'") == 0)
|
||||
if (message.find(":'") == 0)
|
||||
{
|
||||
utf8_text.replace(0, 1, "/me");
|
||||
message.replace(0, 1, "/me");
|
||||
}
|
||||
else if (!isdigit(utf8_text.at(1)) && !ispunct(utf8_text.at(1)) && !isspace(utf8_text.at(1))) // Do not prevent smileys and such.
|
||||
else if (!isdigit(message.at(1)) && !ispunct(message.at(1)) && !isspace(message.at(1))) // Do not prevent smileys and such.
|
||||
{
|
||||
utf8_text.replace(0, 1, "/me ");
|
||||
message.replace(0, 1, "/me ");
|
||||
}
|
||||
}
|
||||
|
||||
return utf8_text;
|
||||
}
|
||||
|
||||
std::string formatString(std::string text, const LLStringUtil::format_map_t& args)
|
||||
{
|
||||
LLStringUtil::format(text, args);
|
||||
return text;
|
||||
return message;
|
||||
}
|
||||
|
||||
S32 FSCommon::secondsSinceEpochFromString(const std::string& format, const std::string& str)
|
||||
|
|
|
|||
|
|
@ -36,13 +36,15 @@ class LLViewerObject;
|
|||
const F32 AVATAR_UNKNOWN_Z_OFFSET = -1.f; // Const value for avatars at unknown height
|
||||
const F32 AVATAR_UNKNOWN_RANGE = -1.f;
|
||||
|
||||
void reportToNearbyChat(const std::string& message);
|
||||
std::string applyAutoCloseOoc(const std::string& message);
|
||||
std::string applyMuPose(const std::string& message);
|
||||
std::string formatString(std::string text, const LLStringUtil::format_map_t& args);
|
||||
void report_to_nearby_chat(const std::string& message);
|
||||
std::string format_string(std::string text, const LLStringUtil::format_map_t& args);
|
||||
bool is_irc_me_prefix(const std::string& text);
|
||||
|
||||
namespace FSCommon
|
||||
{
|
||||
std::string applyAutoCloseOoc(std::string message);
|
||||
std::string applyMuPose(std::string message);
|
||||
|
||||
/**
|
||||
* Convert a string of a specified date format into seconds since the Epoch.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -30,22 +30,14 @@
|
|||
#include "fsconsoleutils.h"
|
||||
|
||||
#include "fscommon.h"
|
||||
#include "fsfloaternearbychat.h"
|
||||
#include "llagent.h"
|
||||
#include "llavatarnamecache.h"
|
||||
#include "llconsole.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llimview.h"
|
||||
#include "lltrans.h"
|
||||
#include "llviewerchat.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
// static
|
||||
BOOL FSConsoleUtils::isNearbyChatVisible()
|
||||
{
|
||||
FSFloaterNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<FSFloaterNearbyChat>("fs_nearby_chat", LLSD());
|
||||
return nearby_chat->getVisible();
|
||||
}
|
||||
|
||||
// static
|
||||
bool FSConsoleUtils::ProcessChatMessage(const LLChat& chat_msg, const LLSD &args)
|
||||
{
|
||||
|
|
@ -74,11 +66,9 @@ bool FSConsoleUtils::ProcessChatMessage(const LLChat& chat_msg, const LLSD &args
|
|||
else if (chat_msg.mSourceType == CHAT_SOURCE_OBJECT)
|
||||
{
|
||||
std::string senderName(chat_msg.mFromName);
|
||||
std::string prefix = chat_msg.mText.substr(0, 4);
|
||||
LLStringUtil::toLower(prefix);
|
||||
|
||||
//IRC styled /me messages.
|
||||
bool irc_me = prefix == "/me " || prefix == "/me'";
|
||||
bool irc_me = is_irc_me_prefix(chat_msg.mText);
|
||||
|
||||
// Delimiter after a name in header copy/past and in plain text mode
|
||||
std::string delimiter = ": ";
|
||||
|
|
@ -135,11 +125,9 @@ void FSConsoleUtils::onProcessChatAvatarNameLookup(const LLUUID& agent_id, const
|
|||
{
|
||||
std::string consoleChat;
|
||||
std::string senderName(chat_msg.mFromName);
|
||||
std::string prefix = chat_msg.mText.substr(0, 4);
|
||||
LLStringUtil::toLower(prefix);
|
||||
|
||||
//IRC styled /me messages.
|
||||
bool irc_me = prefix == "/me " || prefix == "/me'";
|
||||
bool irc_me = is_irc_me_prefix(chat_msg.mText);
|
||||
|
||||
// Delimiter after a name in header copy/past and in plain text mode
|
||||
std::string delimiter = ": ";
|
||||
|
|
@ -224,11 +212,9 @@ void FSConsoleUtils::onProccessInstantMessageNameLookup(const LLUUID& agent_id,
|
|||
std::string senderName;
|
||||
std::string message(message_str);
|
||||
std::string delimiter = ": ";
|
||||
std::string prefix = message.substr(0, 4);
|
||||
LLStringUtil::toLower(prefix);
|
||||
|
||||
// irc styled messages
|
||||
if (prefix == "/me " || prefix == "/me'")
|
||||
if (is_irc_me_prefix(message))
|
||||
{
|
||||
delimiter = LLStringUtil::null;
|
||||
message = message.substr(3);
|
||||
|
|
|
|||
|
|
@ -34,12 +34,10 @@ class LLChat;
|
|||
class FSConsoleUtils
|
||||
{
|
||||
public:
|
||||
|
||||
static bool ProcessChatMessage(const LLChat& chat_msg, const LLSD &args);
|
||||
static bool ProcessInstantMessage(const LLUUID& session_id, const LLUUID& from_id, const std::string& message);
|
||||
|
||||
protected:
|
||||
static BOOL isNearbyChatVisible();
|
||||
static void onProcessChatAvatarNameLookup(const LLUUID& agent_id, const LLAvatarName& av_name, const LLChat& chat_msg);
|
||||
static void onProccessInstantMessageNameLookup(const LLUUID& agent_id, const LLAvatarName& av_name, const std::string& message_str, const std::string& group, const LLUUID& session_id);
|
||||
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ BOOL FSFloaterGroupTitles::postBuild()
|
|||
mTitleList->setDoubleClickCallback(boost::bind(&FSFloaterGroupTitles::activateGroupTitle, this));
|
||||
mTitleList->setCommitCallback(boost::bind(&FSFloaterGroupTitles::selectedTitleChanged, this));
|
||||
|
||||
mTitleList->sortByColumn("grouptitle", TRUE);
|
||||
mTitleList->sortByColumn("title_sort_column", TRUE);
|
||||
|
||||
refreshGroupTitles();
|
||||
|
||||
|
|
@ -156,10 +156,10 @@ void FSFloaterGroupTitles::addListItem(const LLUUID& group_id, const LLUUID& rol
|
|||
item["columns"][3]["value"] = group_id;
|
||||
item["columns"][4]["column"] = "title_sort_column";
|
||||
item["columns"][4]["type"] = "text";
|
||||
item["columns"][4]["value"] = (is_group ? title : "");
|
||||
item["columns"][4]["value"] = (is_group ? ("1_" + title) : "0");
|
||||
item["columns"][5]["column"] = "name_sort_column";
|
||||
item["columns"][5]["type"] = "text";
|
||||
item["columns"][5]["value"] = (is_group ? group_name : "");
|
||||
item["columns"][5]["value"] = (is_group ? ("1_" + group_name) : "0");
|
||||
|
||||
mTitleList->addElement(item);
|
||||
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#include "fsfloaterim.h"
|
||||
|
||||
#include "fschathistory.h"
|
||||
#include "fschatoptionsmenu.h"
|
||||
#include "fscommon.h"
|
||||
#include "fsdata.h"
|
||||
#include "fsfloaterimcontainer.h" // to replace separate IM Floaters with multifloater container
|
||||
|
|
@ -139,7 +140,12 @@ FSFloaterIM::FSFloaterIM(const LLUUID& session_id)
|
|||
|
||||
mCommitCallbackRegistrar.add("IMSession.Menu.Action", boost::bind(&FSFloaterIM::doToSelected, this, _2));
|
||||
mEnableCallbackRegistrar.add("IMSession.Menu.Enable", boost::bind(&FSFloaterIM::checkEnabled, this, _2));
|
||||
|
||||
|
||||
mEnableCallbackRegistrar.add("ChatOptions.Check", boost::bind(&FSFloaterIM::onChatOptionsCheckContextMenuItem, this, _2));
|
||||
mCommitCallbackRegistrar.add("ChatOptions.Action", boost::bind(&FSFloaterIM::onChatOptionsContextMenuItemClicked, this, _2));
|
||||
mEnableCallbackRegistrar.add("ChatOptions.Visible", boost::bind(&FSFloaterIM::onChatOptionsVisibleContextMenuItem, this, _2));
|
||||
mEnableCallbackRegistrar.add("ChatOptions.Enable", boost::bind(&FSFloaterIM::onChatOptionsEnableContextMenuItem, this, _2));
|
||||
|
||||
setOverlapsScreenChannel(true);
|
||||
|
||||
LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
|
||||
|
|
@ -350,8 +356,8 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
|
|||
std::string utf8_text = wstring_to_utf8str(text);
|
||||
|
||||
// Convert OOC and MU* style poses
|
||||
utf8_text = applyAutoCloseOoc(utf8_text);
|
||||
utf8_text = applyMuPose(utf8_text);
|
||||
utf8_text = FSCommon::applyAutoCloseOoc(utf8_text);
|
||||
utf8_text = FSCommon::applyMuPose(utf8_text);
|
||||
|
||||
// <FS:Techwolf Lupindo> Support group chat prefix
|
||||
static LLCachedControl<bool> chat_prefix(gSavedSettings, "FSSupportGroupChatPrefix2");
|
||||
|
|
@ -377,7 +383,7 @@ void FSFloaterIM::sendMsgFromInputEditor(EChatType type)
|
|||
#else
|
||||
std::string strFSTag = "(FS64 ";
|
||||
#endif
|
||||
if (utf8_text.find("/me ") == 0 || utf8_text.find("/me'") == 0)
|
||||
if (is_irc_me_prefix(utf8_text))
|
||||
{
|
||||
utf8_text.insert(4,(strFSTag + LLVersionInfo::getShortVersion() + skinIndicator +
|
||||
#ifdef OPENSIM
|
||||
|
|
@ -596,6 +602,26 @@ bool FSFloaterIM::checkEnabled(const LLSD& userdata)
|
|||
return false;
|
||||
}
|
||||
|
||||
void FSFloaterIM::onChatOptionsContextMenuItemClicked(const LLSD& userdata)
|
||||
{
|
||||
FSChatOptionsMenu::onMenuItemClick(userdata, this);
|
||||
}
|
||||
|
||||
bool FSFloaterIM::onChatOptionsCheckContextMenuItem(const LLSD& userdata)
|
||||
{
|
||||
return FSChatOptionsMenu::onMenuItemCheck(userdata, this);
|
||||
}
|
||||
|
||||
bool FSFloaterIM::onChatOptionsVisibleContextMenuItem(const LLSD& userdata)
|
||||
{
|
||||
return FSChatOptionsMenu::onMenuItemVisible(userdata, this);
|
||||
}
|
||||
|
||||
bool FSFloaterIM::onChatOptionsEnableContextMenuItem(const LLSD& userdata)
|
||||
{
|
||||
return FSChatOptionsMenu::onMenuItemEnable(userdata, this);
|
||||
}
|
||||
|
||||
// support sysinfo button -Zi
|
||||
void FSFloaterIM::onSysinfoButtonClicked()
|
||||
{
|
||||
|
|
@ -842,6 +868,8 @@ BOOL FSFloaterIM::postBuild()
|
|||
mInputEditor->enableSingleLineMode(gSavedSettings.getBOOL("FSUseSingleLineChatEntry"));
|
||||
mInputEditor->setCommitCallback(boost::bind(&FSFloaterIM::sendMsgFromInputEditor, this, CHAT_TYPE_NORMAL));
|
||||
|
||||
getChild<LLButton>("send_chat")->setCommitCallback(boost::bind(&FSFloaterIM::sendMsgFromInputEditor, this, CHAT_TYPE_NORMAL));
|
||||
|
||||
BOOL isFSSupportGroup = FSData::getInstance()->isSupportGroup(mSessionID);
|
||||
getChild<LLUICtrl>("support_panel")->setVisible(isFSSupportGroup);
|
||||
|
||||
|
|
|
|||
|
|
@ -153,6 +153,8 @@ public:
|
|||
|
||||
void loadInitialInvitedIDs();
|
||||
|
||||
bool isP2PChat() const { return mIsP2PChat; }
|
||||
|
||||
protected:
|
||||
/* virtual */
|
||||
void onClickCloseBtn(bool app_quitting = false);
|
||||
|
|
@ -226,6 +228,11 @@ private:
|
|||
void addSessionParticipants(const uuid_vec_t& uuids);
|
||||
void addP2PSessionParticipants(const LLSD& notification, const LLSD& response, const uuid_vec_t& uuids);
|
||||
|
||||
void onChatOptionsContextMenuItemClicked(const LLSD& userdata);
|
||||
bool onChatOptionsCheckContextMenuItem(const LLSD& userdata);
|
||||
bool onChatOptionsVisibleContextMenuItem(const LLSD& userdata);
|
||||
bool onChatOptionsEnableContextMenuItem(const LLSD& userdata);
|
||||
|
||||
FSPanelChatControlPanel* mControlPanel;
|
||||
LLUUID mSessionID;
|
||||
S32 mLastMessageIndex;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
|
||||
#include "chatbar_as_cmdline.h"
|
||||
#include "fschathistory.h"
|
||||
#include "fschatoptionsmenu.h"
|
||||
#include "fscommon.h"
|
||||
#include "fsfloaterim.h"
|
||||
#include "fsfloaterimcontainer.h"
|
||||
|
|
@ -50,7 +51,6 @@
|
|||
#include "llconsole.h"
|
||||
#include "lldraghandle.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloatersidepanelcontainer.h"
|
||||
#include "llfocusmgr.h"
|
||||
#include "llgesturemgr.h"
|
||||
#include "lliconctrl.h"
|
||||
|
|
@ -76,20 +76,6 @@
|
|||
|
||||
S32 FSFloaterNearbyChat::sLastSpecialChatChannel = 0;
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-02-27 (RLVa-0.2.2)
|
||||
void send_chat_from_nearby_floater(std::string utf8_out_text, EChatType type, S32 channel);
|
||||
// [/RLVa:KB]
|
||||
void really_send_chat_from_nearby_floater(std::string utf8_out_text, EChatType type, S32 channel);
|
||||
|
||||
struct LLChatTypeTrigger {
|
||||
std::string name;
|
||||
EChatType type;
|
||||
};
|
||||
|
||||
static LLChatTypeTrigger sChatTypeTriggers[] = {
|
||||
{ "/whisper" , CHAT_TYPE_WHISPER},
|
||||
{ "/shout" , CHAT_TYPE_SHOUT}
|
||||
};
|
||||
|
||||
FSFloaterNearbyChat::FSFloaterNearbyChat(const LLSD& key)
|
||||
: LLFloater(key)
|
||||
|
|
@ -104,6 +90,11 @@ FSFloaterNearbyChat::FSFloaterNearbyChat(const LLSD& key)
|
|||
,mUnreadMessages(0)
|
||||
,mUnreadMessagesMuted(0)
|
||||
{
|
||||
//menu
|
||||
mEnableCallbackRegistrar.add("ChatOptions.Check", boost::bind(&FSFloaterNearbyChat::onChatOptionsCheckContextMenuItem, this, _2));
|
||||
mCommitCallbackRegistrar.add("ChatOptions.Action", boost::bind(&FSFloaterNearbyChat::onChatOptionsContextMenuItemClicked, this, _2));
|
||||
mEnableCallbackRegistrar.add("ChatOptions.Visible", boost::bind(&FSFloaterNearbyChat::onChatOptionsVisibleContextMenuItem, this, _2));
|
||||
mEnableCallbackRegistrar.add("ChatOptions.Enable", boost::bind(&FSFloaterNearbyChat::onChatOptionsEnableContextMenuItem, this, _2));
|
||||
}
|
||||
|
||||
FSFloaterNearbyChat::~FSFloaterNearbyChat()
|
||||
|
|
@ -129,21 +120,6 @@ void FSFloaterNearbyChat::updateFSUseNearbyChatConsole(const LLSD &data)
|
|||
BOOL FSFloaterNearbyChat::postBuild()
|
||||
{
|
||||
setIsSingleInstance(TRUE);
|
||||
|
||||
//menu
|
||||
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
|
||||
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
|
||||
|
||||
enable_registrar.add("NearbyChat.Check", boost::bind(&FSFloaterNearbyChat::onNearbyChatCheckContextMenuItem, this, _2));
|
||||
registrar.add("NearbyChat.Action", boost::bind(&FSFloaterNearbyChat::onNearbyChatContextMenuItemClicked, this, _2));
|
||||
|
||||
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_nearby_chat.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
|
||||
if (menu)
|
||||
{
|
||||
mPopupMenuHandle = menu->getHandle();
|
||||
}
|
||||
|
||||
gSavedSettings.declareS32("nearbychat_showicons_and_names", 2, "NearByChat header settings");
|
||||
|
||||
mInputEditor = getChild<LLChatEntry>("chat_box");
|
||||
mInputEditor->setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2, _3, _4, _5));
|
||||
|
|
@ -316,13 +292,6 @@ BOOL FSFloaterNearbyChat::focusFirstItem(BOOL prefer_text_fields, BOOL focus_fla
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
void FSFloaterNearbyChat::onNearbySpeakers()
|
||||
{
|
||||
LLSD param;
|
||||
param["people_panel_tab_name"] = "nearby_panel";
|
||||
LLFloaterSidePanelContainer::showPanel("people", "panel_people", param);
|
||||
}
|
||||
|
||||
void FSFloaterNearbyChat::onHistoryButtonClicked()
|
||||
{
|
||||
if (gSavedSettings.getBOOL("FSUseBuiltInHistory"))
|
||||
|
|
@ -335,18 +304,24 @@ void FSFloaterNearbyChat::onHistoryButtonClicked()
|
|||
}
|
||||
}
|
||||
|
||||
void FSFloaterNearbyChat::onNearbyChatContextMenuItemClicked(const LLSD& userdata)
|
||||
void FSFloaterNearbyChat::onChatOptionsContextMenuItemClicked(const LLSD& userdata)
|
||||
{
|
||||
FSChatOptionsMenu::onMenuItemClick(userdata, this);
|
||||
}
|
||||
|
||||
bool FSFloaterNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)
|
||||
bool FSFloaterNearbyChat::onChatOptionsCheckContextMenuItem(const LLSD& userdata)
|
||||
{
|
||||
std::string str = userdata.asString();
|
||||
if (str == "nearby_people")
|
||||
{
|
||||
onNearbySpeakers();
|
||||
}
|
||||
return false;
|
||||
return FSChatOptionsMenu::onMenuItemCheck(userdata, this);
|
||||
}
|
||||
|
||||
bool FSFloaterNearbyChat::onChatOptionsVisibleContextMenuItem(const LLSD& userdata)
|
||||
{
|
||||
return FSChatOptionsMenu::onMenuItemVisible(userdata, this);
|
||||
}
|
||||
|
||||
bool FSFloaterNearbyChat::onChatOptionsEnableContextMenuItem(const LLSD& userdata)
|
||||
{
|
||||
return FSChatOptionsMenu::onMenuItemEnable(userdata, this);
|
||||
}
|
||||
|
||||
void FSFloaterNearbyChat::openFloater(const LLSD& key)
|
||||
|
|
@ -693,6 +668,7 @@ BOOL FSFloaterNearbyChat::handleKeyHere( KEY key, MASK mask )
|
|||
}
|
||||
else if (mask == (MASK_SHIFT | MASK_CONTROL))
|
||||
{
|
||||
// linefeed
|
||||
if (!gSavedSettings.getBOOL("FSUseSingleLineChatEntry"))
|
||||
{
|
||||
if ((wstring_utf8_length(mInputEditor->getWText()) + wchar_utf8_length('\n')) > mInputEditor->getMaxTextLength())
|
||||
|
|
@ -726,7 +702,14 @@ BOOL FSFloaterNearbyChat::handleKeyHere( KEY key, MASK mask )
|
|||
|
||||
void FSFloaterNearbyChat::onChatBoxKeystroke()
|
||||
{
|
||||
FSNearbyChat::handleChatBarKeystroke(mInputEditor);
|
||||
S32 channel = 0;
|
||||
if (gSavedSettings.getBOOL("FSNearbyChatbar") &&
|
||||
gSavedSettings.getBOOL("FSShowChatChannel"))
|
||||
{
|
||||
channel = (S32)(FSFloaterNearbyChat::getInstance()->getChild<LLSpinCtrl>("ChatChannel")->get());
|
||||
}
|
||||
|
||||
FSNearbyChat::handleChatBarKeystroke(mInputEditor, channel);
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
@ -746,38 +729,6 @@ void FSFloaterNearbyChat::reshapeChatLayoutPanel()
|
|||
mChatLayoutPanel->reshape(mChatLayoutPanel->getRect().getWidth(), mInputEditor->getRect().getHeight() + mInputEditorPad, FALSE);
|
||||
}
|
||||
|
||||
EChatType FSFloaterNearbyChat::processChatTypeTriggers(EChatType type, std::string &str)
|
||||
{
|
||||
U32 length = str.length();
|
||||
S32 cnt = sizeof(sChatTypeTriggers) / sizeof(*sChatTypeTriggers);
|
||||
|
||||
for (S32 n = 0; n < cnt; n++)
|
||||
{
|
||||
if (length >= sChatTypeTriggers[n].name.length())
|
||||
{
|
||||
std::string trigger = str.substr(0, sChatTypeTriggers[n].name.length());
|
||||
|
||||
if (!LLStringUtil::compareInsensitive(trigger, sChatTypeTriggers[n].name))
|
||||
{
|
||||
U32 trigger_length = sChatTypeTriggers[n].name.length();
|
||||
|
||||
// It's to remove space after trigger name
|
||||
if (length > trigger_length && str[trigger_length] == ' ')
|
||||
trigger_length++;
|
||||
|
||||
str = str.substr(trigger_length, length);
|
||||
|
||||
if (CHAT_TYPE_NORMAL == type)
|
||||
return sChatTypeTriggers[n].type;
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
void FSFloaterNearbyChat::sendChat( EChatType type )
|
||||
{
|
||||
if (mInputEditor)
|
||||
|
|
@ -813,8 +764,8 @@ void FSFloaterNearbyChat::sendChat( EChatType type )
|
|||
if (0 == channel)
|
||||
{
|
||||
// Convert OOC and MU* style poses
|
||||
utf8text = applyAutoCloseOoc(utf8text);
|
||||
utf8text = applyMuPose(utf8text);
|
||||
utf8text = FSCommon::applyAutoCloseOoc(utf8text);
|
||||
utf8text = FSCommon::applyMuPose(utf8text);
|
||||
|
||||
// discard returned "found" boolean
|
||||
if(!LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text))
|
||||
|
|
@ -839,7 +790,7 @@ void FSFloaterNearbyChat::sendChat( EChatType type )
|
|||
nType = type;
|
||||
}
|
||||
|
||||
type = processChatTypeTriggers(nType, utf8_revised_text);
|
||||
type = FSNearbyChat::processChatTypeTriggers(nType, utf8_revised_text);
|
||||
|
||||
if (!utf8_revised_text.empty() && cmd_line_chat(utf8_revised_text, type))
|
||||
{
|
||||
|
|
@ -891,82 +842,19 @@ void FSFloaterNearbyChat::onChatTypeChanged()
|
|||
|
||||
void FSFloaterNearbyChat::sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate)
|
||||
{
|
||||
sendChatFromViewer(utf8str_to_wstring(utf8text), type, animate);
|
||||
}
|
||||
|
||||
void FSFloaterNearbyChat::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate)
|
||||
{
|
||||
LLWString wtext = utf8string_to_wstring(utf8text);
|
||||
S32 channel = 0;
|
||||
bool is_set = false;
|
||||
LLWString out_text = FSNearbyChat::stripChannelNumber(wtext, &channel, &sLastSpecialChatChannel, &is_set);
|
||||
// If "/<number>" is not specified, see if a channel has been set in
|
||||
// the spinner.
|
||||
// If "/<number>" is not specified, see if a channel has been set in the spinner.
|
||||
if (!is_set &&
|
||||
gSavedSettings.getBOOL("FSNearbyChatbar") &&
|
||||
gSavedSettings.getBOOL("FSShowChatChannel"))
|
||||
{
|
||||
// <FS:Ansariel> [FS communication UI]
|
||||
//channel = (S32)(LLFloaterNearbyChat::getInstance()->getChild<LLSpinCtrl>("ChatChannel")->get());
|
||||
channel = (S32)(FSFloaterNearbyChat::getInstance()->getChild<LLSpinCtrl>("ChatChannel")->get());
|
||||
// </FS:Ansariel> [FS communication UI]
|
||||
}
|
||||
std::string utf8_out_text = wstring_to_utf8str(out_text);
|
||||
std::string utf8_text = wstring_to_utf8str(wtext);
|
||||
|
||||
utf8_text = utf8str_trim(utf8_text);
|
||||
if (!utf8_text.empty())
|
||||
{
|
||||
utf8_text = utf8str_truncate(utf8_text, MAX_STRING - 1);
|
||||
}
|
||||
|
||||
// [RLVa:KB] - Checked: 2010-03-27 (RLVa-1.2.0b) | Modified: RLVa-1.2.0b
|
||||
if ( (0 == channel) && (rlv_handler_t::isEnabled()) )
|
||||
{
|
||||
// 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 = 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;
|
||||
|
||||
animate &= !gRlvHandler.hasBehaviour( (!RlvUtil::isEmote(utf8_text)) ? RLV_BHVR_REDIRCHAT : RLV_BHVR_REDIREMOTE );
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
// Don't animate for chats people can't hear (chat to scripts)
|
||||
if (animate && (channel == 0))
|
||||
{
|
||||
if (type == CHAT_TYPE_WHISPER)
|
||||
{
|
||||
LL_DEBUGS("FSFloaterNearbyChat") << "You whisper " << utf8_text << LL_ENDL;
|
||||
gAgent.sendAnimationRequest(ANIM_AGENT_WHISPER, ANIM_REQUEST_START);
|
||||
}
|
||||
else if (type == CHAT_TYPE_NORMAL)
|
||||
{
|
||||
LL_DEBUGS("FSFloaterNearbyChat") << "You say " << utf8_text << LL_ENDL;
|
||||
gAgent.sendAnimationRequest(ANIM_AGENT_TALK, ANIM_REQUEST_START);
|
||||
}
|
||||
else if (type == CHAT_TYPE_SHOUT)
|
||||
{
|
||||
LL_DEBUGS("FSFloaterNearbyChat") << "You shout " << utf8_text << LL_ENDL;
|
||||
gAgent.sendAnimationRequest(ANIM_AGENT_SHOUT, ANIM_REQUEST_START);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_INFOS("FSFloaterNearbyChat") << "send_chat_from_viewer() - invalid volume" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (type != CHAT_TYPE_START && type != CHAT_TYPE_STOP)
|
||||
{
|
||||
LL_DEBUGS("FSFloaterNearbyChat") << "Channel chat: " << utf8_text << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
send_chat_from_nearby_floater(utf8_out_text, type, channel);
|
||||
|
||||
FSNearbyChat::sendChatFromViewer(wtext, out_text, type, animate, channel);
|
||||
}
|
||||
|
||||
// Exit "chat mode" and do the appropriate focus changes
|
||||
|
|
@ -977,161 +865,10 @@ void FSFloaterNearbyChat::stopChat()
|
|||
if (nearby_chat)
|
||||
{
|
||||
nearby_chat->mInputEditor->setFocus(FALSE);
|
||||
gAgent.stopTyping();
|
||||
gAgent.stopTyping();
|
||||
}
|
||||
}
|
||||
|
||||
//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_nearby_floater(std::string utf8_out_text, EChatType type, S32 channel)
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
// [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)
|
||||
if ( (rlv_handler_t::isEnabled()) && ( (CHAT_TYPE_WHISPER == type) || (CHAT_TYPE_NORMAL == type) || (CHAT_TYPE_SHOUT == type) ) )
|
||||
{
|
||||
if (0 == channel)
|
||||
{
|
||||
// (We already did this before, but LLChatHandler::handle() calls this directly)
|
||||
if ( ((CHAT_TYPE_SHOUT == type) || (CHAT_TYPE_NORMAL == type)) && (gRlvHandler.hasBehaviour(RLV_BHVR_CHATNORMAL)) )
|
||||
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
|
||||
if ( ( (gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT) || (gRlvHandler.hasBehaviour(RLV_BHVR_REDIREMOTE)) ) &&
|
||||
(gRlvHandler.redirectChatOrEmote(utf8_out_text)) ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Filter public chat if sendchat restricted
|
||||
if (gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHAT))
|
||||
gRlvHandler.filterChat(utf8_out_text, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 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)) )
|
||||
return;
|
||||
|
||||
// Don't allow chat on debug channel if @sendchat, @redirchat or @rediremote restricted (shows as public chat on viewers)
|
||||
if (CHAT_CHANNEL_DEBUG == channel)
|
||||
{
|
||||
bool fIsEmote = RlvUtil::isEmote(utf8_out_text);
|
||||
if ( (gRlvHandler.hasBehaviour(RLV_BHVR_SENDCHAT)) ||
|
||||
((!fIsEmote) && (gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT))) ||
|
||||
((fIsEmote) && (gRlvHandler.hasBehaviour(RLV_BHVR_REDIREMOTE))) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
//<FS:TS> FIRE-787: break up too long chat lines into multiple messages
|
||||
U32 split = MAX_MSG_BUF_SIZE - 1;
|
||||
U32 pos = 0;
|
||||
U32 total = utf8_out_text.length();
|
||||
|
||||
// Don't break null messages
|
||||
if(total == 0)
|
||||
{
|
||||
really_send_chat_from_nearby_floater(utf8_out_text, type, channel);
|
||||
}
|
||||
|
||||
while(pos < total)
|
||||
{
|
||||
U32 next_split = split;
|
||||
|
||||
if (pos + next_split > total)
|
||||
{
|
||||
// just send the rest of the message
|
||||
next_split = total - pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
// first, try to split at a space
|
||||
while((U8(utf8_out_text[pos + next_split]) != ' ')
|
||||
&& (next_split > 0))
|
||||
{
|
||||
--next_split;
|
||||
}
|
||||
|
||||
if (next_split == 0)
|
||||
{
|
||||
next_split = split;
|
||||
// no space found, split somewhere not in the middle of UTF-8
|
||||
while((U8(utf8_out_text[pos + next_split]) >= 0x80)
|
||||
&& (U8(utf8_out_text[pos + next_split]) < 0xC0)
|
||||
&& (next_split > 0))
|
||||
{
|
||||
--next_split;
|
||||
}
|
||||
}
|
||||
|
||||
if(next_split == 0)
|
||||
{
|
||||
next_split = split;
|
||||
LL_WARNS("Splitting") << "utf-8 couldn't be split correctly" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
std::string send = utf8_out_text.substr(pos, next_split);
|
||||
pos += next_split;
|
||||
|
||||
// *FIXME: Queue messages and wait for server
|
||||
really_send_chat_from_nearby_floater(send, type, channel);
|
||||
}
|
||||
|
||||
// moved here so we don't bump the count for every message segment
|
||||
add(LLStatViewer::CHAT_COUNT,1);
|
||||
//</FS:TS> FIRE-787
|
||||
}
|
||||
|
||||
//<FS:TS> FIRE-787: break up too long chat lines into multiple messages
|
||||
// This function just sends the message, with no other processing. Moved out
|
||||
// of send_chat_from_viewer.
|
||||
void really_send_chat_from_nearby_floater(std::string utf8_out_text, EChatType type, S32 channel)
|
||||
{
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
|
||||
// <FS:ND> gMessageSystem can be 0, not sure how it is exactly to reproduce, maybe during viewer shutdown?
|
||||
if( !msg )
|
||||
return;
|
||||
// </FS:ND>
|
||||
|
||||
if(channel >= 0)
|
||||
{
|
||||
msg->newMessageFast(_PREHASH_ChatFromViewer);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
msg->nextBlockFast(_PREHASH_ChatData);
|
||||
msg->addStringFast(_PREHASH_Message, utf8_out_text);
|
||||
msg->addU8Fast(_PREHASH_Type, type);
|
||||
msg->addS32("Channel", channel);
|
||||
}
|
||||
else
|
||||
{
|
||||
msg->newMessage("ScriptDialogReply");
|
||||
msg->nextBlock("AgentData");
|
||||
msg->addUUID("AgentID", gAgentID);
|
||||
msg->addUUID("SessionID", gAgentSessionID);
|
||||
msg->nextBlock("Data");
|
||||
msg->addUUID("ObjectID", gAgentID);
|
||||
msg->addS32("ChatChannel", channel);
|
||||
msg->addS32("ButtonIndex", 0);
|
||||
msg->addString("ButtonLabel", utf8_out_text);
|
||||
}
|
||||
|
||||
gAgent.sendReliableMessage();
|
||||
}
|
||||
//</FS:TS> FIRE-787
|
||||
|
||||
void FSFloaterNearbyChat::updateUnreadMessageNotification(S32 unread_messages, bool muted_history)
|
||||
{
|
||||
BOOL show_muted_history = gSavedSettings.getBOOL("FSShowMutedChatHistory");
|
||||
|
|
|
|||
|
|
@ -49,16 +49,14 @@ public:
|
|||
FSFloaterNearbyChat(const LLSD& key);
|
||||
~FSFloaterNearbyChat();
|
||||
|
||||
BOOL postBuild ();
|
||||
BOOL postBuild();
|
||||
|
||||
/** @param archive true - to save a message to the chat history log */
|
||||
void addMessage (const LLChat& message,bool archive = true, const LLSD &args = LLSD());
|
||||
void onNearbyChatContextMenuItemClicked(const LLSD& userdata);
|
||||
bool onNearbyChatCheckContextMenuItem(const LLSD& userdata);
|
||||
void addMessage(const LLChat& message,bool archive = true, const LLSD &args = LLSD());
|
||||
|
||||
/*virtual*/ void onOpen (const LLSD& key);
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
/*virtual*/ void setVisible(BOOL visible);
|
||||
|
||||
/*virtual*/ void setVisible(BOOL visible);
|
||||
void openFloater(const LLSD& key);
|
||||
|
||||
void clearChatHistory();
|
||||
|
|
@ -71,11 +69,11 @@ public:
|
|||
|
||||
static FSFloaterNearbyChat* findInstance();
|
||||
static FSFloaterNearbyChat* getInstance();
|
||||
|
||||
|
||||
void removeScreenChat();
|
||||
|
||||
|
||||
static bool isChatMultiTab();
|
||||
|
||||
|
||||
BOOL getVisible();
|
||||
|
||||
void onHistoryButtonClicked();
|
||||
|
|
@ -92,12 +90,9 @@ public:
|
|||
S32 getMessageArchiveLength() {return mMessageArchive.size();}
|
||||
|
||||
virtual BOOL handleKeyHere( KEY key, MASK mask );
|
||||
|
||||
|
||||
static void startChat(const char* line);
|
||||
static void stopChat();
|
||||
|
||||
static void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate);
|
||||
static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate);
|
||||
|
||||
void updateUnreadMessageNotification(S32 unread_messages, bool muted_history);
|
||||
void updateShowMutedChatHistory(const LLSD &data);
|
||||
|
|
@ -108,20 +103,21 @@ protected:
|
|||
void onChatBoxFocusReceived();
|
||||
|
||||
void sendChat( EChatType type );
|
||||
void sendChatFromViewer(const std::string& utf8text, EChatType type, BOOL animate);
|
||||
void onChatBoxCommit();
|
||||
void onChatTypeChanged();
|
||||
|
||||
EChatType processChatTypeTriggers(EChatType type, std::string &str);
|
||||
void reshapeFloater(bool collapse);
|
||||
void reshapeChatLayoutPanel();
|
||||
|
||||
static S32 sLastSpecialChatChannel;
|
||||
|
||||
private:
|
||||
void onNearbySpeakers();
|
||||
void onChatOptionsContextMenuItemClicked(const LLSD& userdata);
|
||||
bool onChatOptionsCheckContextMenuItem(const LLSD& userdata);
|
||||
bool onChatOptionsVisibleContextMenuItem(const LLSD& userdata);
|
||||
bool onChatOptionsEnableContextMenuItem(const LLSD& userdata);
|
||||
|
||||
private:
|
||||
LLHandle<LLView> mPopupMenuHandle;
|
||||
FSChatHistory* mChatHistory;
|
||||
FSChatHistory* mChatHistoryMuted;
|
||||
LLChatEntry* mInputEditor;
|
||||
|
|
|
|||
|
|
@ -2746,20 +2746,10 @@ void FSPanelSearchWeb::loadURL(const SearchQuery &p)
|
|||
{
|
||||
url = debug_url;
|
||||
}
|
||||
else if(LLGridManager::getInstance()->isInOpenSim())
|
||||
{
|
||||
std::string os_search_url = LFSimFeatureHandler::instance().searchURL();
|
||||
if (!os_search_url.empty())
|
||||
url = os_search_url;
|
||||
else if (LLLoginInstance::getInstance()->hasResponse("search"))
|
||||
url = LLLoginInstance::getInstance()->getResponse("search").asString();
|
||||
else
|
||||
url = gSavedSettings.getString("SearchURLOpenSim");
|
||||
}
|
||||
else
|
||||
#endif // OPENSIM
|
||||
{
|
||||
url = gSavedSettings.getString("SearchURL");
|
||||
url = LFSimFeatureHandler::instance().searchURL();
|
||||
}
|
||||
|
||||
url = LLWeb::expandURLSubstitutions(url, subs);
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "fscommon.h"
|
||||
#include "fskeywords.h"
|
||||
#include "growlmanager.h"
|
||||
#include "llagent.h"
|
||||
|
|
@ -155,8 +156,7 @@ void FSKeywords::notify(const LLChat& chat)
|
|||
if (FSEnableGrowl)
|
||||
{
|
||||
std::string msg = chat.mFromName;
|
||||
std::string prefix = chat.mText.substr(0, 4);
|
||||
if (prefix == "/me " || prefix == "/me'")
|
||||
if (is_irc_me_prefix(chat.mText))
|
||||
{
|
||||
msg = msg + chat.mText.substr(3);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -221,7 +221,7 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID,
|
|||
if (gSavedPerAccountSettings.getBOOL("UseMoveLock"))
|
||||
{
|
||||
updateBoolSettingValue("UseMoveLock");
|
||||
reportToNearbyChat(LLTrans::getString("MovelockEnabling"));
|
||||
report_to_nearby_chat(LLTrans::getString("MovelockEnabling"));
|
||||
}
|
||||
// </FS:PP>
|
||||
|
||||
|
|
@ -238,7 +238,7 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID,
|
|||
{
|
||||
// Don't call for update here and only change setting to 'false', getCommitSignal()->connect->boost in llviewercontrol.cpp will send a message to Bridge anyway
|
||||
gSavedPerAccountSettings.setBOOL("UseMoveLock", false);
|
||||
reportToNearbyChat(LLTrans::getString("MovelockDisabling"));
|
||||
report_to_nearby_chat(LLTrans::getString("MovelockDisabling"));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -329,24 +329,24 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID,
|
|||
{
|
||||
LLStringUtil::format_map_t args2;
|
||||
args2["OBJECT_CHARACTER_TIME"] = scriptInfoArray[5].asString();
|
||||
args["PATHFINDING_TEXT"] = " " + formatString(LLTrans::getString("fsbridge_script_info_pf"), args2);
|
||||
args["PATHFINDING_TEXT"] = " " + format_string(LLTrans::getString("fsbridge_script_info_pf"), args2);
|
||||
}
|
||||
else
|
||||
{
|
||||
args["PATHFINDING_TEXT"] = "";
|
||||
}
|
||||
reportToNearbyChat(formatString(LLTrans::getString("fsbridge_script_info"), args));
|
||||
report_to_nearby_chat(format_string(LLTrans::getString("fsbridge_script_info"), args));
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_error_scriptinfonotfound"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_error_scriptinfonotfound"));
|
||||
LL_WARNS("FSLSLBridge") << "ScriptInfo - Object to check is invalid or out of range (warning returned by viewer, data somehow passed bridge script check)" << LL_ENDL;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_error_scriptinfomalformed"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_error_scriptinfomalformed"));
|
||||
LL_WARNS("FSLSLBridge") << "ScriptInfo - Received malformed response from bridge (missing ending tag)" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
|
@ -361,11 +361,11 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID,
|
|||
{
|
||||
if (message.substr(valuepos + FS_STATE_ATTRIBUTE.size(), 1) == "1")
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("MovelockEnabled"));
|
||||
report_to_nearby_chat(LLTrans::getString("MovelockEnabled"));
|
||||
}
|
||||
else if (message.substr(valuepos + FS_STATE_ATTRIBUTE.size(), 1) == "0")
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("MovelockDisabled"));
|
||||
report_to_nearby_chat(LLTrans::getString("MovelockDisabled"));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -384,17 +384,17 @@ bool FSLSLBridge::lslToViewer(const std::string& message, const LLUUID& fromID,
|
|||
{
|
||||
if (message.substr(valuepos + FS_ERROR_ATTRIBUTE.size(), 9) == "injection")
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_error_injection"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_error_injection"));
|
||||
LL_WARNS("FSLSLBridge") << "Script injection detected" << LL_ENDL;
|
||||
}
|
||||
else if (message.substr(valuepos + FS_ERROR_ATTRIBUTE.size(), 18) == "scriptinfonotfound")
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_error_scriptinfonotfound"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_error_scriptinfonotfound"));
|
||||
LL_WARNS("FSLSLBridge") << "ScriptInfo - Object to check is invalid or out of range (warning returned by bridge)" << LL_ENDL;
|
||||
}
|
||||
else if (message.substr(valuepos + FS_ERROR_ATTRIBUTE.size(), 7) == "wrongvm")
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_error_wrongvm"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_error_wrongvm"));
|
||||
LL_WARNS("FSLSLBridge") << "Script is using old LSO (16 KB memory limit) instead of new Mono (64 KB memory limit) virtual machine, which creates high probability of stack-heap collision and bridge failure by running out of memory" << LL_ENDL;
|
||||
}
|
||||
else
|
||||
|
|
@ -485,7 +485,7 @@ void FSLSLBridge::recreateBridge()
|
|||
{
|
||||
//<FS:TS> FIRE-11746: Recreate should throw error if disabled
|
||||
LL_WARNS("FSLSLBridge") << "Asked to create bridge, but bridge is disabled. Aborting." << LL_ENDL;
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_cant_create_disabled"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_cant_create_disabled"));
|
||||
setBridgeCreating(false);
|
||||
//</FS:TS> FIRE-11746
|
||||
return;
|
||||
|
|
@ -494,7 +494,7 @@ void FSLSLBridge::recreateBridge()
|
|||
if (gSavedSettings.getBOOL("NoInventoryLibrary"))
|
||||
{
|
||||
LL_WARNS("FSLSLBridge") << "Asked to create bridge, but we don't have a library. Aborting." << LL_ENDL;
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_no_library"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_no_library"));
|
||||
setBridgeCreating(false);
|
||||
return;
|
||||
}
|
||||
|
|
@ -502,12 +502,12 @@ void FSLSLBridge::recreateBridge()
|
|||
if (mBridgeCreating)
|
||||
{
|
||||
LL_WARNS("FSLSLBridge") << "Bridge creation already in progress, aborting new attempt." << LL_ENDL;
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_already_creating"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_already_creating"));
|
||||
return;
|
||||
}
|
||||
|
||||
//announce yourself
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_creating"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_creating"));
|
||||
|
||||
LLUUID catID = findFSCategory();
|
||||
|
||||
|
|
@ -593,7 +593,7 @@ void FSLSLBridge::initBridge()
|
|||
if (gSavedSettings.getBOOL("NoInventoryLibrary"))
|
||||
{
|
||||
LL_WARNS("FSLSLBridge") << "Asked to create bridge, but we don't have a library. Aborting." << LL_ENDL;
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_no_library"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_no_library"));
|
||||
setBridgeCreating(false);
|
||||
return;
|
||||
}
|
||||
|
|
@ -663,7 +663,7 @@ void FSLSLBridge::startCreation()
|
|||
setBridgeCreating(true);
|
||||
mFinishCreation = false;
|
||||
//announce yourself
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_creating"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_creating"));
|
||||
|
||||
createNewBridge();
|
||||
}
|
||||
|
|
@ -724,7 +724,7 @@ void FSLSLBridge::processAttach(LLViewerObject* object, const LLViewerJointAttac
|
|||
LL_WARNS("FSLSLBridge") << "Bridge not created. Our bridge container attachment isn't named correctly." << LL_ENDL;
|
||||
if (mBridgeCreating)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_failure_creation_bad_name"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_failure_creation_bad_name"));
|
||||
setBridgeCreating(false); //in case we interrupted the creation
|
||||
}
|
||||
return;
|
||||
|
|
@ -736,7 +736,7 @@ void FSLSLBridge::processAttach(LLViewerObject* object, const LLViewerJointAttac
|
|||
LL_WARNS("FSLSLBridge") << "Bridge container is still NULL in inventory. Aborting." << LL_ENDL;
|
||||
if (mBridgeCreating)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_failure_creation_null"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_failure_creation_null"));
|
||||
setBridgeCreating(false); //in case we interrupted the creation
|
||||
}
|
||||
return;
|
||||
|
|
@ -750,7 +750,7 @@ void FSLSLBridge::processAttach(LLViewerObject* object, const LLViewerJointAttac
|
|||
mAllowDetach = true;
|
||||
LLVOAvatarSelf::detachAttachmentIntoInventory(fsObject->getUUID());
|
||||
LL_WARNS("FSLSLBridge") << "Attempt to attach to bridge point an object other than current bridge" << LL_ENDL;
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_failure_attach_wrong_object"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_failure_attach_wrong_object"));
|
||||
if (mBridgeCreating)
|
||||
{
|
||||
setBridgeCreating(false); //in case we interrupted the creation
|
||||
|
|
@ -768,7 +768,7 @@ void FSLSLBridge::processAttach(LLViewerObject* object, const LLViewerJointAttac
|
|||
LL_WARNS("FSLSLBridge") << "Bridge container isn't in the correct inventory location. Detaching it and aborting." << LL_ENDL;
|
||||
if (mBridgeCreating)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fs_bridge_failure_attach_wrong_location"));
|
||||
report_to_nearby_chat(LLTrans::getString("fs_bridge_failure_attach_wrong_location"));
|
||||
setBridgeCreating(false); //in case we interrupted the creation
|
||||
}
|
||||
return;
|
||||
|
|
@ -785,7 +785,7 @@ void FSLSLBridge::processAttach(LLViewerObject* object, const LLViewerJointAttac
|
|||
LL_WARNS("FSLSLBridge") << "Something unknown just got attached to bridge point, detaching and aborting." << LL_ENDL;
|
||||
if (mBridgeCreating)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_failure_attach_point_in_use"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_failure_attach_point_in_use"));
|
||||
setBridgeCreating(false); //in case we interrupted the creation
|
||||
}
|
||||
LLVOAvatarSelf::detachAttachmentIntoInventory(mpBridge->getUUID());
|
||||
|
|
@ -861,7 +861,7 @@ void FSLSLBridge::inventoryChanged(LLViewerObject* object,
|
|||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_warning_unexpected_items"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_warning_unexpected_items"));
|
||||
LL_WARNS("FSLSLBridge") << "The bridge inventory contains items other than bridge script." << LL_ENDL;
|
||||
if (!isOurScript) //some junk but no valid script? Unlikely to happen, but lets add script anyway.
|
||||
{
|
||||
|
|
@ -885,7 +885,7 @@ void FSLSLBridge::inventoryChanged(LLViewerObject* object,
|
|||
LL_INFOS("FSLSLBridge") << "Bridge created." << LL_ENDL;
|
||||
mFinishCreation = false;
|
||||
mAllowedDetachables.clear();
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_created"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_created"));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -970,11 +970,11 @@ void FSLSLBridge::processDetach(LLViewerObject* object, const LLViewerJointAttac
|
|||
if (mpBridge && mpBridge->getUUID() == fsObject->getUUID())
|
||||
{
|
||||
mpBridge = NULL;
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_detached"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_detached"));
|
||||
mIsFirstCallDone = false;
|
||||
if (mBridgeCreating)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_warning_not_finished"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_warning_not_finished"));
|
||||
setBridgeCreating(false); //in case we interrupted the creation
|
||||
mAllowedDetachables.clear();
|
||||
}
|
||||
|
|
@ -1183,7 +1183,7 @@ void FSLSLBridgeScriptCallback::fire(const LLUUID& inv_item)
|
|||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_failure_creation_create_script"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_failure_creation_create_script"));
|
||||
cleanup = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -1309,7 +1309,7 @@ void FSLSLBridge::cleanUpBridge()
|
|||
{
|
||||
//something unexpected went wrong. Try to clean up and not crash.
|
||||
LL_WARNS("FSLSLBridge") << "Bridge object not found. Can't proceed with creation, exiting." << LL_ENDL;
|
||||
reportToNearbyChat(LLTrans::getString("fsbridge_failure_not_found"));
|
||||
report_to_nearby_chat(LLTrans::getString("fsbridge_failure_not_found"));
|
||||
|
||||
if (isBridgeValid())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -27,14 +27,8 @@
|
|||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
// llui
|
||||
#include "lllineeditor.h"
|
||||
#include "llspinctrl.h"
|
||||
|
||||
// newview
|
||||
#include "fsnearbychatcontrol.h"
|
||||
#include "fsnearbychathub.h"
|
||||
#include "fsfloaternearbychat.h"
|
||||
#include "llagent.h" // gAgent
|
||||
#include "llagentcamera.h" // gAgentCamera
|
||||
#include "llautoreplace.h"
|
||||
|
|
@ -43,7 +37,8 @@
|
|||
static LLDefaultChildRegistry::Register<FSNearbyChatControl> r("fs_nearby_chat_control");
|
||||
|
||||
FSNearbyChatControl::FSNearbyChatControl(const FSNearbyChatControl::Params& p) :
|
||||
LLLineEditor(p)
|
||||
LLLineEditor(p),
|
||||
mDefault(p.is_default)
|
||||
{
|
||||
//<FS:TS> FIRE-11373: Autoreplace doesn't work in nearby chat bar
|
||||
setAutoreplaceCallback(boost::bind(&LLAutoReplace::autoreplaceCallback, LLAutoReplace::getInstance(), _1, _2, _3, _4, _5));
|
||||
|
|
@ -93,7 +88,7 @@ void FSNearbyChatControl::setFocus(BOOL focus)
|
|||
|
||||
void FSNearbyChatControl::autohide()
|
||||
{
|
||||
if (getName() == "default_chat_bar")
|
||||
if (isDefault())
|
||||
{
|
||||
if (gSavedSettings.getBOOL("CloseChatOnReturn"))
|
||||
{
|
||||
|
|
@ -142,6 +137,7 @@ BOOL FSNearbyChatControl::handleKeyHere(KEY key, MASK mask)
|
|||
}
|
||||
else if (mask == (MASK_SHIFT | MASK_CONTROL))
|
||||
{
|
||||
// linefeed
|
||||
addChar(llwchar(182));
|
||||
return TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,13 +28,20 @@
|
|||
#ifndef FS_NEARBYCHATCONTROL_H
|
||||
#define FS_NEARBYCHATCONTROL_H
|
||||
|
||||
#include "llchat.h"
|
||||
#include "lllineeditor.h"
|
||||
|
||||
class FSNearbyChatControl : public LLLineEditor
|
||||
{
|
||||
public:
|
||||
struct Params : public LLInitParam::Block<Params, LLLineEditor::Params> {};
|
||||
struct Params : public LLInitParam::Block<Params, LLLineEditor::Params>
|
||||
{
|
||||
Optional<bool> is_default;
|
||||
|
||||
Params()
|
||||
: is_default("default", false)
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
FSNearbyChatControl(const Params& p);
|
||||
~FSNearbyChatControl();
|
||||
|
|
@ -45,12 +52,16 @@ public:
|
|||
|
||||
virtual BOOL handleKeyHere(KEY key, MASK mask);
|
||||
|
||||
bool isDefault() const { return mDefault; }
|
||||
|
||||
private:
|
||||
// Typing in progress, expand gestures etc.
|
||||
static void onKeystroke(LLLineEditor* caller, void* userdata);
|
||||
|
||||
// Unfocus and autohide chat bar accordingly if we are the default chat bar
|
||||
void autohide();
|
||||
void autohide();
|
||||
|
||||
bool mDefault;
|
||||
};
|
||||
|
||||
#endif // FS_NEARBYCHATCONTROL_H
|
||||
|
|
|
|||
|
|
@ -48,15 +48,8 @@
|
|||
|
||||
static const U32 NAME_PREDICTION_MINIMUM_LENGTH = 3;
|
||||
|
||||
// <FS:KC> Fix for bad edge snapping
|
||||
// *HACK* chat bar cannot return its correct height for some reason
|
||||
static const S32 MAGIC_CHAT_BAR_PAD = 5;
|
||||
// </FS:KC> Fix for bad edge snapping
|
||||
|
||||
//<FS:TS> FIRE-787: break up too long chat lines into multiple messages
|
||||
void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel);
|
||||
void really_send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel);
|
||||
//</FS:TS> FIRE-787
|
||||
|
||||
struct LLChatTypeTrigger {
|
||||
std::string name;
|
||||
|
|
@ -65,33 +58,50 @@ struct LLChatTypeTrigger {
|
|||
|
||||
static LLChatTypeTrigger sChatTypeTriggers[] = {
|
||||
{ "/whisper" , CHAT_TYPE_WHISPER},
|
||||
{ "/shout" , CHAT_TYPE_SHOUT}
|
||||
{ "/shout" , CHAT_TYPE_SHOUT}
|
||||
};
|
||||
|
||||
S32 FSNearbyChat::sLastSpecialChatChannel = 0;
|
||||
|
||||
FSNearbyChat::FSNearbyChat() :
|
||||
mDefaultChatBar(NULL),
|
||||
mFocusedInputEditor(NULL)
|
||||
// This function just sends the message, with no other processing. Moved out
|
||||
// of send_chat_from_viewer.
|
||||
void really_send_chat_from_viewer(const std::string& utf8_out_text, EChatType type, S32 channel)
|
||||
{
|
||||
gSavedSettings.getControl("MainChatbarVisible")->getSignal()->connect(boost::bind(&FSNearbyChat::onDefaultChatBarButtonClicked, this));
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
|
||||
if (!msg)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (channel >= 0)
|
||||
{
|
||||
msg->newMessageFast(_PREHASH_ChatFromViewer);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgentID);
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
|
||||
msg->nextBlockFast(_PREHASH_ChatData);
|
||||
msg->addStringFast(_PREHASH_Message, utf8_out_text);
|
||||
msg->addU8Fast(_PREHASH_Type, type);
|
||||
msg->addS32("Channel", channel);
|
||||
}
|
||||
else
|
||||
{
|
||||
msg->newMessage("ScriptDialogReply");
|
||||
msg->nextBlock("AgentData");
|
||||
msg->addUUID("AgentID", gAgentID);
|
||||
msg->addUUID("SessionID", gAgentSessionID);
|
||||
msg->nextBlock("Data");
|
||||
msg->addUUID("ObjectID", gAgentID);
|
||||
msg->addS32("ChatChannel", channel);
|
||||
msg->addS32("ButtonIndex", 0);
|
||||
msg->addString("ButtonLabel", utf8_out_text);
|
||||
}
|
||||
|
||||
gAgent.sendReliableMessage();
|
||||
}
|
||||
|
||||
FSNearbyChat::~FSNearbyChat()
|
||||
{
|
||||
}
|
||||
|
||||
void FSNearbyChat::onDefaultChatBarButtonClicked()
|
||||
{
|
||||
showDefaultChatBar(gSavedSettings.getBOOL("MainChatbarVisible"));
|
||||
}
|
||||
|
||||
//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)
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
// [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)
|
||||
if ( (rlv_handler_t::isEnabled()) && ( (CHAT_TYPE_WHISPER == type) || (CHAT_TYPE_NORMAL == type) || (CHAT_TYPE_SHOUT == type) ) )
|
||||
{
|
||||
|
|
@ -135,9 +145,7 @@ void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channe
|
|||
}
|
||||
}
|
||||
}
|
||||
// [/RLVa:KB]
|
||||
|
||||
//<FS:TS> FIRE-787: break up too long chat lines into multiple messages
|
||||
U32 split = MAX_MSG_BUF_SIZE - 1;
|
||||
U32 pos = 0;
|
||||
U32 total = utf8_out_text.length();
|
||||
|
|
@ -178,11 +186,10 @@ void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channe
|
|||
}
|
||||
}
|
||||
|
||||
if(next_split == 0)
|
||||
if (next_split == 0)
|
||||
{
|
||||
next_split = split;
|
||||
LL_WARNS("Splitting") <<
|
||||
"utf-8 couldn't be split correctly" << LL_ENDL;
|
||||
LL_WARNS("Splitting") << "utf-8 couldn't be split correctly" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -194,51 +201,100 @@ void send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channe
|
|||
}
|
||||
|
||||
// moved here so we don't bump the count for every message segment
|
||||
add(LLStatViewer::CHAT_COUNT,1);
|
||||
//</FS:TS> FIRE-787
|
||||
add(LLStatViewer::CHAT_COUNT, 1);
|
||||
}
|
||||
|
||||
//<FS:TS> FIRE-787: break up too long chat lines into multiple messages
|
||||
// This function just sends the message, with no other processing. Moved out
|
||||
// of send_chat_from_viewer.
|
||||
void really_send_chat_from_viewer(std::string utf8_out_text, EChatType type, S32 channel)
|
||||
bool matchChatTypeTrigger(const std::string& in_str, std::string* out_str)
|
||||
{
|
||||
LLMessageSystem* msg = gMessageSystem;
|
||||
|
||||
// <FS:ND> gMessageSystem can be 0, not sure how it is exactly to reproduce, maybe during viewer shutdown?
|
||||
if (!msg)
|
||||
U32 in_len = in_str.length();
|
||||
S32 cnt = sizeof(sChatTypeTriggers) / sizeof(*sChatTypeTriggers);
|
||||
|
||||
for (S32 n = 0; n < cnt; n++)
|
||||
{
|
||||
return;
|
||||
if (in_len > sChatTypeTriggers[n].name.length())
|
||||
continue;
|
||||
|
||||
std::string trigger_trunc = sChatTypeTriggers[n].name;
|
||||
LLStringUtil::truncate(trigger_trunc, in_len);
|
||||
|
||||
if (!LLStringUtil::compareInsensitive(in_str, trigger_trunc))
|
||||
{
|
||||
*out_str = sChatTypeTriggers[n].name;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// </FS:ND>
|
||||
|
||||
if (channel >= 0)
|
||||
{
|
||||
msg->newMessageFast(_PREHASH_ChatFromViewer);
|
||||
msg->nextBlockFast(_PREHASH_AgentData);
|
||||
msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
msg->nextBlockFast(_PREHASH_ChatData);
|
||||
msg->addStringFast(_PREHASH_Message, utf8_out_text);
|
||||
msg->addU8Fast(_PREHASH_Type, type);
|
||||
msg->addS32("Channel", channel);
|
||||
}
|
||||
else
|
||||
{
|
||||
msg->newMessage("ScriptDialogReply");
|
||||
msg->nextBlock("AgentData");
|
||||
msg->addUUID("AgentID", gAgent.getID());
|
||||
msg->addUUID("SessionID", gAgent.getSessionID());
|
||||
msg->nextBlock("Data");
|
||||
msg->addUUID("ObjectID", gAgent.getID());
|
||||
msg->addS32("ChatChannel", channel);
|
||||
msg->addS32("ButtonIndex", 0);
|
||||
msg->addString("ButtonLabel", utf8_out_text);
|
||||
}
|
||||
|
||||
gAgent.sendReliableMessage();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// FSNearbyChat
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
S32 FSNearbyChat::sLastSpecialChatChannel = 0;
|
||||
|
||||
FSNearbyChat::FSNearbyChat() :
|
||||
mDefaultChatBar(NULL),
|
||||
mFocusedInputEditor(NULL)
|
||||
{
|
||||
gSavedSettings.getControl("MainChatbarVisible")->getSignal()->connect(boost::bind(&FSNearbyChat::onDefaultChatBarButtonClicked, this));
|
||||
}
|
||||
|
||||
FSNearbyChat::~FSNearbyChat()
|
||||
{
|
||||
}
|
||||
|
||||
void FSNearbyChat::sendChat(LLWString text, EChatType type)
|
||||
{
|
||||
LLWStringUtil::trim(text);
|
||||
|
||||
if (!text.empty())
|
||||
{
|
||||
if (type == CHAT_TYPE_OOC)
|
||||
{
|
||||
text = utf8string_to_wstring(gSavedSettings.getString("FSOOCPrefix") + " ") + text + utf8string_to_wstring(" " + gSavedSettings.getString("FSOOCPostfix"));
|
||||
}
|
||||
|
||||
// Check if this is destined for another channel
|
||||
S32 channel = 0;
|
||||
bool is_set = false;
|
||||
stripChannelNumber(text, &channel, &sLastSpecialChatChannel, &is_set);
|
||||
|
||||
std::string utf8text = wstring_to_utf8str(text);
|
||||
// Try to trigger a gesture, if not chat to a script.
|
||||
std::string utf8_revised_text;
|
||||
if (0 == channel)
|
||||
{
|
||||
// Convert OOC and MU* style poses
|
||||
utf8text = FSCommon::applyAutoCloseOoc(utf8text);
|
||||
utf8text = FSCommon::applyMuPose(utf8text);
|
||||
|
||||
// discard returned "found" boolean
|
||||
if(!LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text))
|
||||
{
|
||||
utf8_revised_text = utf8text;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
utf8_revised_text = utf8text;
|
||||
}
|
||||
|
||||
utf8_revised_text = utf8str_trim(utf8_revised_text);
|
||||
|
||||
EChatType nType = (type == CHAT_TYPE_OOC ? CHAT_TYPE_NORMAL : type);
|
||||
type = processChatTypeTriggers(nType, utf8_revised_text);
|
||||
|
||||
if (!utf8_revised_text.empty() && cmd_line_chat(utf8_revised_text, type))
|
||||
{
|
||||
// Chat with animation
|
||||
sendChatFromViewer(utf8_revised_text, type, gSavedSettings.getBOOL("PlayChatAnim"));
|
||||
}
|
||||
}
|
||||
|
||||
gAgent.stopTyping();
|
||||
}
|
||||
//</FS:TS> FIRE-787
|
||||
|
||||
void FSNearbyChat::sendChatFromViewer(const std::string& utf8text, EChatType type, BOOL animate)
|
||||
{
|
||||
|
|
@ -251,14 +307,106 @@ void FSNearbyChat::sendChatFromViewer(const LLWString& wtext, EChatType type, BO
|
|||
S32 channel = 0;
|
||||
bool is_set = false;
|
||||
LLWString out_text = stripChannelNumber(wtext, &channel, &sLastSpecialChatChannel, &is_set);
|
||||
// If "/<number>" is not specified, see if a channel has been set in
|
||||
// the spinner.
|
||||
if (!is_set &&
|
||||
gSavedSettings.getBOOL("FSNearbyChatbar") &&
|
||||
gSavedSettings.getBOOL("FSShowChatChannel"))
|
||||
sendChatFromViewer(wtext, out_text, type, animate, channel);
|
||||
}
|
||||
|
||||
// all chat bars call this function and we keep the first or one that's seen as the default
|
||||
void FSNearbyChat::registerChatBar(FSNearbyChatControl* chatBar)
|
||||
{
|
||||
if (!mDefaultChatBar || chatBar->isDefault())
|
||||
{
|
||||
channel = (S32)(FSFloaterNearbyChat::getInstance()->getChild<LLSpinCtrl>("ChatChannel")->get());
|
||||
mDefaultChatBar = chatBar;
|
||||
}
|
||||
}
|
||||
|
||||
// unhide the default nearby chat bar on request (pressing Enter or a letter key)
|
||||
void FSNearbyChat::showDefaultChatBar(BOOL visible, const char* text) const
|
||||
{
|
||||
if (!mDefaultChatBar)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// change settings control to signal button state
|
||||
gSavedSettings.setBOOL("MainChatbarVisible", visible);
|
||||
|
||||
mDefaultChatBar->getParent()->setVisible(visible);
|
||||
mDefaultChatBar->setVisible(visible);
|
||||
mDefaultChatBar->setFocus(visible);
|
||||
|
||||
// <FS:KC> Fix for bad edge snapping
|
||||
if (visible)
|
||||
{
|
||||
gFloaterView->setSnapOffsetChatBar(mDefaultChatBar->getRect().getHeight() + MAGIC_CHAT_BAR_PAD);
|
||||
}
|
||||
else
|
||||
{
|
||||
gFloaterView->setSnapOffsetChatBar(0);
|
||||
}
|
||||
|
||||
if (!text)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (mDefaultChatBar->getText().empty())
|
||||
{
|
||||
mDefaultChatBar->setText(LLStringExplicit(text));
|
||||
mDefaultChatBar->setCursorToEnd();
|
||||
}
|
||||
// </FS:KC> Fix for bad edge snapping
|
||||
}
|
||||
|
||||
// We want to know which nearby chat editor (if any) currently has focus
|
||||
void FSNearbyChat::setFocusedInputEditor(FSNearbyChatControl* inputEditor, BOOL focus)
|
||||
{
|
||||
if (focus)
|
||||
{
|
||||
mFocusedInputEditor = inputEditor;
|
||||
}
|
||||
else if (mFocusedInputEditor == inputEditor)
|
||||
{
|
||||
// only remove focus if the request came from the previously active input editor
|
||||
// to avoid races
|
||||
mFocusedInputEditor = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// for the "arrow key moves avatar when chat is empty" hack in llviewerwindow.cpp
|
||||
// and the hide chat bar feature in mouselook in llagent.cpp
|
||||
BOOL FSNearbyChat::defaultChatBarIsIdle() const
|
||||
{
|
||||
if (mFocusedInputEditor && mFocusedInputEditor->isDefault())
|
||||
{
|
||||
return mFocusedInputEditor->getText().empty();
|
||||
}
|
||||
|
||||
// if any other chat bar has focus, report "idle", because they're not the default
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// for the "arrow key moves avatar when chat is empty" hack in llviewerwindow.cpp
|
||||
BOOL FSNearbyChat::defaultChatBarHasFocus() const
|
||||
{
|
||||
if (mFocusedInputEditor && mFocusedInputEditor->isDefault())
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void FSNearbyChat::onDefaultChatBarButtonClicked()
|
||||
{
|
||||
showDefaultChatBar(gSavedSettings.getBOOL("MainChatbarVisible"));
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// General chat handling methods
|
||||
|
||||
void FSNearbyChat::sendChatFromViewer(const LLWString& wtext, const LLWString& out_text, EChatType type, BOOL animate, S32 channel)
|
||||
{
|
||||
std::string utf8_out_text = wstring_to_utf8str(out_text);
|
||||
std::string utf8_text = wstring_to_utf8str(wtext);
|
||||
|
||||
|
|
@ -318,6 +466,7 @@ void FSNearbyChat::sendChatFromViewer(const LLWString& wtext, EChatType type, BO
|
|||
send_chat_from_viewer(utf8_out_text, type, channel);
|
||||
}
|
||||
|
||||
// static
|
||||
EChatType FSNearbyChat::processChatTypeTriggers(EChatType type, std::string &str)
|
||||
{
|
||||
U32 length = str.length();
|
||||
|
|
@ -431,189 +580,8 @@ LLWString FSNearbyChat::stripChannelNumber(const LLWString &mesg, S32* channel,
|
|||
}
|
||||
}
|
||||
|
||||
void FSNearbyChat::sendChat(LLWString text, EChatType type)
|
||||
{
|
||||
LLWStringUtil::trim(text);
|
||||
|
||||
if (!text.empty())
|
||||
{
|
||||
if (type == CHAT_TYPE_OOC)
|
||||
{
|
||||
std::string tempText = wstring_to_utf8str( text );
|
||||
tempText = gSavedSettings.getString("FSOOCPrefix") + " " + tempText + " " + gSavedSettings.getString("FSOOCPostfix");
|
||||
text = utf8str_to_wstring(tempText);
|
||||
}
|
||||
|
||||
// Check if this is destined for another channel
|
||||
S32 channel = 0;
|
||||
bool is_set = false;
|
||||
stripChannelNumber(text, &channel, &sLastSpecialChatChannel, &is_set);
|
||||
// If "/<number>" is not specified, see if a channel has been set in
|
||||
// the spinner.
|
||||
if (!is_set &&
|
||||
gSavedSettings.getBOOL("FSNearbyChatbar") &&
|
||||
gSavedSettings.getBOOL("FSShowChatChannel"))
|
||||
{
|
||||
channel = (S32)(FSFloaterNearbyChat::getInstance()->getChild<LLSpinCtrl>("ChatChannel")->get());
|
||||
}
|
||||
|
||||
std::string utf8text = wstring_to_utf8str(text);
|
||||
// Try to trigger a gesture, if not chat to a script.
|
||||
std::string utf8_revised_text;
|
||||
if (0 == channel)
|
||||
{
|
||||
// Convert OOC and MU* style poses
|
||||
utf8text = applyAutoCloseOoc(utf8text);
|
||||
utf8text = applyMuPose(utf8text);
|
||||
|
||||
// discard returned "found" boolean
|
||||
if(!LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text))
|
||||
{
|
||||
utf8_revised_text = utf8text;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
utf8_revised_text = utf8text;
|
||||
}
|
||||
|
||||
utf8_revised_text = utf8str_trim(utf8_revised_text);
|
||||
|
||||
EChatType nType;
|
||||
if (type == CHAT_TYPE_OOC)
|
||||
{
|
||||
nType = CHAT_TYPE_NORMAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
nType = type;
|
||||
}
|
||||
|
||||
type = processChatTypeTriggers(nType, utf8_revised_text);
|
||||
|
||||
if (!utf8_revised_text.empty() && cmd_line_chat(utf8_revised_text, type))
|
||||
{
|
||||
// Chat with animation
|
||||
sendChatFromViewer(utf8_revised_text, type, gSavedSettings.getBOOL("PlayChatAnim"));
|
||||
}
|
||||
}
|
||||
|
||||
gAgent.stopTyping();
|
||||
}
|
||||
|
||||
// all chat bars call this function and we keep the first or one that's seen as the default
|
||||
void FSNearbyChat::registerChatBar(FSNearbyChatControl* chatBar)
|
||||
{
|
||||
// TODO: make this a Param option "is_default"
|
||||
if (!mDefaultChatBar || chatBar->getName() == "default_chat_bar")
|
||||
{
|
||||
mDefaultChatBar=chatBar;
|
||||
}
|
||||
}
|
||||
|
||||
// unhide the default nearby chat bar on request (pressing Enter or a letter key)
|
||||
void FSNearbyChat::showDefaultChatBar(BOOL visible, const char* text) const
|
||||
{
|
||||
if (!mDefaultChatBar)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// change settings control to signal button state
|
||||
gSavedSettings.setBOOL("MainChatbarVisible",visible);
|
||||
|
||||
mDefaultChatBar->getParent()->setVisible(visible);
|
||||
mDefaultChatBar->setVisible(visible);
|
||||
mDefaultChatBar->setFocus(visible);
|
||||
|
||||
// <FS:KC> Fix for bad edge snapping
|
||||
if (visible)
|
||||
{
|
||||
gFloaterView->setSnapOffsetChatBar(mDefaultChatBar->getRect().getHeight() + MAGIC_CHAT_BAR_PAD);
|
||||
}
|
||||
else
|
||||
{
|
||||
gFloaterView->setSnapOffsetChatBar(0);
|
||||
}
|
||||
|
||||
if (!text)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (mDefaultChatBar->getText().empty())
|
||||
{
|
||||
mDefaultChatBar->setText(LLStringExplicit(text));
|
||||
mDefaultChatBar->setCursorToEnd();
|
||||
}
|
||||
// </FS:KC> Fix for bad edge snapping
|
||||
}
|
||||
|
||||
// We want to know which nearby chat editor (if any) currently has focus
|
||||
void FSNearbyChat::setFocusedInputEditor(FSNearbyChatControl* inputEditor, BOOL focus)
|
||||
{
|
||||
if (focus)
|
||||
{
|
||||
mFocusedInputEditor = inputEditor;
|
||||
}
|
||||
|
||||
// only remove focus if the request came from the previously active input editor
|
||||
// to avoid races
|
||||
else if (mFocusedInputEditor == inputEditor)
|
||||
{
|
||||
mFocusedInputEditor = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// for the "arrow key moves avatar when chat is empty" hack in llviewerwindow.cpp
|
||||
// and the hide chat bar feature in mouselook in llagent.cpp
|
||||
BOOL FSNearbyChat::defaultChatBarIsIdle() const
|
||||
{
|
||||
if (mFocusedInputEditor && mFocusedInputEditor->getName() == "default_chat_bar")
|
||||
{
|
||||
return mFocusedInputEditor->getText().empty();
|
||||
}
|
||||
|
||||
// if any other chat bar has focus, report "idle", because they're not the default
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// for the "arrow key moves avatar when chat is empty" hack in llviewerwindow.cpp
|
||||
BOOL FSNearbyChat::defaultChatBarHasFocus() const
|
||||
{
|
||||
if (mFocusedInputEditor && mFocusedInputEditor->getName() == "default_chat_bar")
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool matchChatTypeTrigger(const std::string& in_str, std::string* out_str)
|
||||
{
|
||||
U32 in_len = in_str.length();
|
||||
S32 cnt = sizeof(sChatTypeTriggers) / sizeof(*sChatTypeTriggers);
|
||||
|
||||
for (S32 n = 0; n < cnt; n++)
|
||||
{
|
||||
if (in_len > sChatTypeTriggers[n].name.length())
|
||||
continue;
|
||||
|
||||
std::string trigger_trunc = sChatTypeTriggers[n].name;
|
||||
LLStringUtil::truncate(trigger_trunc, in_len);
|
||||
|
||||
if (!LLStringUtil::compareInsensitive(in_str, trigger_trunc))
|
||||
{
|
||||
*out_str = sChatTypeTriggers[n].name;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
//static
|
||||
void FSNearbyChat::handleChatBarKeystroke(LLUICtrl* source)
|
||||
void FSNearbyChat::handleChatBarKeystroke(LLUICtrl* source, S32 channel /* = 0 */)
|
||||
{
|
||||
LLChatEntry* chat_entry = dynamic_cast<LLChatEntry*>(source);
|
||||
LLLineEditor* line_editor = dynamic_cast<LLLineEditor*>(source);
|
||||
|
|
@ -636,28 +604,27 @@ void FSNearbyChat::handleChatBarKeystroke(LLUICtrl* source)
|
|||
// Can't trim the end, because that will cause autocompletion
|
||||
// to eat trailing spaces that might be part of a gesture.
|
||||
LLWStringUtil::trimHead(raw_text);
|
||||
S32 length = raw_text.length();
|
||||
size_t length = raw_text.length();
|
||||
|
||||
S32 channel=0;
|
||||
if (gSavedSettings.getBOOL("FSNearbyChatbar") &&
|
||||
gSavedSettings.getBOOL("FSShowChatChannel"))
|
||||
LLWString prefix;
|
||||
if (length > 3)
|
||||
{
|
||||
// <FS:Ansariel> [FS communication UI]
|
||||
//channel = (S32)(LLFloaterNearbyChat::getInstance()->getChild<LLSpinCtrl>("ChatChannel")->get());
|
||||
channel = (S32)(FSFloaterNearbyChat::getInstance()->getChild<LLSpinCtrl>("ChatChannel")->get());
|
||||
// </FS:Ansariel> [FS communication UI]
|
||||
prefix = raw_text.substr(0, 3);
|
||||
LLWStringUtil::toLower(prefix);
|
||||
}
|
||||
|
||||
// if( (length > 0) && (raw_text[0] != '/') ) // forward slash is used for escape (eg. emote) sequences
|
||||
// [RLVa:KB] - Checked: 2010-03-26 (RLVa-1.2.0b) | Modified: RLVa-1.0.0d
|
||||
static LLCachedControl<bool> type_during_emote(gSavedSettings, "FSTypeDuringEmote");
|
||||
static LLCachedControl<bool> allow_mu_pose(gSavedSettings, "AllowMUpose");
|
||||
if (length > 0 &&
|
||||
raw_text[0] != '/' && (raw_text[0] != ':' || !gSavedSettings.getBOOL("AllowMUpose")) &&
|
||||
((raw_text[0] != '/' || (type_during_emote && length > 3 && prefix == utf8string_to_wstring("/me") && (raw_text[3] == ' ' || raw_text[3] == '\'')))
|
||||
&& (raw_text[0] != ':' || !allow_mu_pose || type_during_emote)) &&
|
||||
!gRlvHandler.hasBehaviour(RLV_BHVR_REDIRCHAT))
|
||||
// [/RLVa:KB]
|
||||
{
|
||||
// only start typing animation if we are chatting without / on channel 0 -Zi
|
||||
if(channel==0)
|
||||
if (channel == 0)
|
||||
{
|
||||
gAgent.startTyping();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -57,16 +57,17 @@ public:
|
|||
|
||||
void sendChat(LLWString text, EChatType type);
|
||||
static LLWString stripChannelNumber(const LLWString &mesg, S32* channel, S32* last_channel, bool* is_set);
|
||||
EChatType processChatTypeTriggers(EChatType type, std::string &str);
|
||||
static EChatType processChatTypeTriggers(EChatType type, std::string &str);
|
||||
void sendChatFromViewer(const std::string& utf8text, EChatType type, BOOL animate);
|
||||
void sendChatFromViewer(const LLWString& wtext, EChatType type, BOOL animate);
|
||||
static void sendChatFromViewer(const LLWString& wtext, const LLWString& out_text, EChatType type, BOOL animate, S32 channel);
|
||||
|
||||
void setFocusedInputEditor(FSNearbyChatControl* inputEditor, BOOL focus);
|
||||
|
||||
BOOL defaultChatBarIsIdle() const;
|
||||
BOOL defaultChatBarHasFocus() const;
|
||||
|
||||
static void handleChatBarKeystroke(LLUICtrl* source);
|
||||
static void handleChatBarKeystroke(LLUICtrl* source, S32 channel = 0);
|
||||
|
||||
FSNearbyChatControl* mFocusedInputEditor;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
#include "fsnearbychatvoicemonitor.h"
|
||||
#include "llvoiceclient.h"
|
||||
|
||||
static LLDefaultChildRegistry::Register<FSNearbyChatVoiceControl> r("nearby_chat_voice_monitor");
|
||||
static LLDefaultChildRegistry::Register<FSNearbyChatVoiceControl> r("fs_nearby_chat_voice_monitor");
|
||||
|
||||
FSNearbyChatVoiceControl::Params::Params() :
|
||||
voice_monitor_padding("voice_monitor_padding"),
|
||||
|
|
|
|||
|
|
@ -177,8 +177,8 @@ void FSRadar::updateRadarList()
|
|||
LLMuteList* mutelist = LLMuteList::getInstance();
|
||||
FSWSAssetBlacklist* blacklist = FSWSAssetBlacklist::getInstance();
|
||||
|
||||
static const F32 chat_range_say = LFSimFeatureHandler::getInstance()->sayRange();
|
||||
static const F32 chat_range_shout = LFSimFeatureHandler::getInstance()->shoutRange();
|
||||
const F32 chat_range_say = LFSimFeatureHandler::getInstance()->sayRange();
|
||||
const F32 chat_range_shout = LFSimFeatureHandler::getInstance()->shoutRange();
|
||||
|
||||
static const std::string str_chat_entering = LLTrans::getString("entering_chat_range");
|
||||
static const std::string str_chat_leaving = LLTrans::getString("leaving_chat_range");
|
||||
|
|
@ -380,7 +380,7 @@ void FSRadar::updateRadarList()
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["DISTANCE"] = llformat("%3.2f", avRange);
|
||||
std::string message = formatString(str_chat_entering, args);
|
||||
std::string message = format_string(str_chat_entering, args);
|
||||
make_ui_sound("UISndRadarChatEnter"); // <FS:PP> FIRE-6069: Radar alerts sounds
|
||||
LLAvatarNameCache::get(avId, boost::bind(&FSRadar::radarAlertMsg, this, _1, _2, message));
|
||||
}
|
||||
|
|
@ -388,7 +388,7 @@ void FSRadar::updateRadarList()
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["DISTANCE"] = llformat("%3.2f", avRange);
|
||||
std::string message = formatString(str_draw_distance_entering, args);
|
||||
std::string message = format_string(str_draw_distance_entering, args);
|
||||
make_ui_sound("UISndRadarDrawEnter"); // <FS:PP> FIRE-6069: Radar alerts sounds
|
||||
LLAvatarNameCache::get(avId, boost::bind(&FSRadar::radarAlertMsg, this, _1, _2, message));
|
||||
}
|
||||
|
|
@ -399,7 +399,7 @@ void FSRadar::updateRadarList()
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["DISTANCE"] = llformat("%3.2f", avRange);
|
||||
std::string message = formatString(str_region_entering_distance, args);
|
||||
std::string message = format_string(str_region_entering_distance, args);
|
||||
LLAvatarNameCache::get(avId, boost::bind(&FSRadar::radarAlertMsg, this, _1, _2, message));
|
||||
}
|
||||
else
|
||||
|
|
@ -437,7 +437,7 @@ void FSRadar::updateRadarList()
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["DISTANCE"] = llformat("%3.2f", avRange);
|
||||
std::string message = formatString(str_chat_entering, args);
|
||||
std::string message = format_string(str_chat_entering, args);
|
||||
make_ui_sound("UISndRadarChatEnter"); // <FS:PP> FIRE-6069: Radar alerts sounds
|
||||
LLAvatarNameCache::get(avId, boost::bind(&FSRadar::radarAlertMsg, this, _1, _2, message));
|
||||
}
|
||||
|
|
@ -453,7 +453,7 @@ void FSRadar::updateRadarList()
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["DISTANCE"] = llformat("%3.2f", avRange);
|
||||
std::string message = formatString(str_draw_distance_entering, args);
|
||||
std::string message = format_string(str_draw_distance_entering, args);
|
||||
make_ui_sound("UISndRadarDrawEnter"); // <FS:PP> FIRE-6069: Radar alerts sounds
|
||||
LLAvatarNameCache::get(avId, boost::bind(&FSRadar::radarAlertMsg, this, _1, _2, message));
|
||||
}
|
||||
|
|
@ -472,7 +472,7 @@ void FSRadar::updateRadarList()
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["DISTANCE"] = llformat("%3.2f", avRange);
|
||||
std::string message = formatString(str_region_entering_distance, args);
|
||||
std::string message = format_string(str_region_entering_distance, args);
|
||||
LLAvatarNameCache::get(avId, boost::bind(&FSRadar::radarAlertMsg, this, _1, _2, message));
|
||||
}
|
||||
else
|
||||
|
|
@ -526,7 +526,7 @@ void FSRadar::updateRadarList()
|
|||
make_ui_sound("UISndRadarAgeAlert");
|
||||
LLStringUtil::format_map_t args;
|
||||
args["AGE"] = llformat("%d", avAge);
|
||||
std::string message = formatString(str_avatar_age_alert, args);
|
||||
std::string message = format_string(str_avatar_age_alert, args);
|
||||
LLAvatarNameCache::get(avId, boost::bind(&FSRadar::radarAlertMsg, this, _1, _2, message));
|
||||
}
|
||||
ent->mAgeAlertPerformed = true;
|
||||
|
|
@ -980,7 +980,7 @@ void FSRadar::zoomAvatar(const LLUUID& avatar_id, const std::string& name)
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["AVATARNAME"] = name.c_str();
|
||||
reportToNearbyChat(LLTrans::getString("camera_no_focus", args));
|
||||
report_to_nearby_chat(LLTrans::getString("camera_no_focus", args));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
|
||||
#include "growlmanager.h"
|
||||
|
||||
#include "fscommon.h"
|
||||
#include "growlnotifier.h"
|
||||
#include "llagentdata.h"
|
||||
#include "llappviewer.h"
|
||||
|
|
@ -319,19 +320,18 @@ void GrowlManager::onInstantMessage(const LLSD& im)
|
|||
if (session->isP2PSessionType() && (!im["keyword_alert_performed"].asBoolean() || !gSavedSettings.getBOOL("FSFilterGrowlKeywordDuplicateIMs")))
|
||||
{
|
||||
// Don't show messages from ourselves or the system.
|
||||
LLUUID from_id = im["from_id"].asUUID();
|
||||
const LLUUID from_id = im["from_id"].asUUID();
|
||||
if (from_id.isNull() || from_id == gAgentID)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
std::string message = im["message"].asString();
|
||||
std::string prefix = message.substr(0, 4);
|
||||
if (prefix == "/me " || prefix == "/me'")
|
||||
if (is_irc_me_prefix(message))
|
||||
{
|
||||
message = message.substr(3);
|
||||
}
|
||||
gGrowlManager->performNotification(im["from"].asString(), message, GROWL_IM_MESSAGE_TYPE);
|
||||
LLAvatarNameCache::get(from_id, boost::bind(&GrowlManager::onAvatarNameCache, _2, message, GROWL_IM_MESSAGE_TYPE));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -379,17 +379,22 @@ void GrowlManager::onNearbyChatMessage(const LLSD& chat)
|
|||
if ((EChatType)chat["chat_type"].asInteger() == CHAT_TYPE_IM)
|
||||
{
|
||||
std::string message = chat["message"].asString();
|
||||
|
||||
const std::string prefix = message.substr(0, 4);
|
||||
if (prefix == "/me " || prefix == "/me'")
|
||||
if (is_irc_me_prefix(message))
|
||||
{
|
||||
message = message.substr(3);
|
||||
}
|
||||
|
||||
gGrowlManager->performNotification(chat["from"].asString(), message, GROWL_IM_MESSAGE_TYPE);
|
||||
LLAvatarNameCache::get(chat["from_id"].asUUID(), boost::bind(&GrowlManager::onAvatarNameCache, _2, message, GROWL_IM_MESSAGE_TYPE));
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
void GrowlManager::onAvatarNameCache(const LLAvatarName& av_name, const std::string& message, const std::string& type)
|
||||
{
|
||||
const std::string sender = FSCommon::getAvatarNameByDisplaySettings(av_name);
|
||||
notify(sender, message, type);
|
||||
}
|
||||
|
||||
bool GrowlManager::shouldNotify()
|
||||
{
|
||||
// This magic stolen from llappviewer.cpp. LLViewerWindow::getActive lies.
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@
|
|||
#include "llnotifications.h"
|
||||
#include "growlnotifier.h"
|
||||
#include "lleventtimer.h"
|
||||
#include "llavatarnamecache.h"
|
||||
|
||||
struct GrowlNotification
|
||||
{
|
||||
|
|
@ -80,6 +81,7 @@ private:
|
|||
static void onScriptDialog(const LLSD& data);
|
||||
static void onNearbyChatMessage(const LLSD& chat);
|
||||
static inline bool shouldNotify();
|
||||
static void onAvatarNameCache(const LLAvatarName& av_name, const std::string& message, const std::string& type);
|
||||
|
||||
LLBoundListener mNotificationConnection;
|
||||
boost::signals2::connection mInstantMessageConnection;
|
||||
|
|
|
|||
|
|
@ -44,12 +44,30 @@
|
|||
|
||||
const F32 PARCEL_WL_CHECK_TIME = 5.f;
|
||||
const S32 PARCEL_WL_MIN_ALT_CHANGE = 3;
|
||||
const std::string PARCEL_WL_DEFAULT = "Default";
|
||||
|
||||
class KCWindlightInterface::LLParcelChangeObserver : public LLParcelObserver
|
||||
{
|
||||
public:
|
||||
LLParcelChangeObserver(KCWindlightInterface* windlightInterface) : mKCWindlightInterface(windlightInterface) {}
|
||||
|
||||
private:
|
||||
/*virtual*/ void changed()
|
||||
{
|
||||
if (mKCWindlightInterface)
|
||||
{
|
||||
mKCWindlightInterface->ParcelChange();
|
||||
}
|
||||
}
|
||||
|
||||
KCWindlightInterface* mKCWindlightInterface;
|
||||
};
|
||||
|
||||
KCWindlightInterface::KCWindlightInterface() :
|
||||
LLEventTimer(PARCEL_WL_CHECK_TIME),
|
||||
mWLset(false),
|
||||
mWeChangedIt(false),
|
||||
mCurrentSpace(-2.f),
|
||||
mCurrentSpace(-2),
|
||||
mLastParcelID(-1),
|
||||
mLastRegion(NULL),
|
||||
mRegionOverride(false),
|
||||
|
|
@ -61,6 +79,17 @@ KCWindlightInterface::KCWindlightInterface() :
|
|||
mEventTimer.stop();
|
||||
mDisabled = true;
|
||||
}
|
||||
|
||||
mParcelMgrConnection = gAgent.addParcelChangedCallback(
|
||||
boost::bind(&KCWindlightInterface::onAgentParcelChange, this));
|
||||
}
|
||||
|
||||
KCWindlightInterface::~KCWindlightInterface()
|
||||
{
|
||||
if (mParcelMgrConnection.connected())
|
||||
{
|
||||
mParcelMgrConnection.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
void KCWindlightInterface::ParcelChange()
|
||||
|
|
@ -92,11 +121,11 @@ void KCWindlightInterface::ParcelChange()
|
|||
|
||||
if ( (this_parcel_id != mLastParcelID) || (mLastParcelDesc != desc) ) //parcel changed
|
||||
{
|
||||
//LL_INFOS() << "agent in new parcel: "<< this_parcel_id << " : " << parcel->getName() << LL_ENDL;
|
||||
LL_DEBUGS() << "Agent in new parcel: " << this_parcel_id << LL_ENDL;
|
||||
|
||||
mLastParcelID = this_parcel_id;
|
||||
mLastParcelDesc = desc;
|
||||
mCurrentSpace = -2.f;
|
||||
mCurrentSpace = -2;
|
||||
mCurrentSettings.clear();
|
||||
setWL_Status(false); //clear the status bar icon
|
||||
const LLVector3& agent_pos_region = gAgent.getPositionAgent();
|
||||
|
|
@ -122,6 +151,12 @@ void KCWindlightInterface::ParcelChange()
|
|||
}
|
||||
}
|
||||
|
||||
void KCWindlightInterface::onAgentParcelChange()
|
||||
{
|
||||
ParcelChange();
|
||||
}
|
||||
|
||||
|
||||
BOOL KCWindlightInterface::tick()
|
||||
{
|
||||
if ((LLStartUp::getStartupState() < STATE_STARTED) || checkSettings())
|
||||
|
|
@ -163,17 +198,29 @@ void KCWindlightInterface::ApplySettings(const LLSD& settings)
|
|||
|
||||
mRegionOverride = settings.has("region_override");
|
||||
|
||||
ApplySkySettings(settings);
|
||||
bool non_region_default_applied = ApplySkySettings(settings);
|
||||
|
||||
if (settings.has("water") && (!mHaveRegionSettings || mRegionOverride))
|
||||
// We can only apply a water preset if we didn't set region WL default previously
|
||||
// or there will be unpredictable behavior where the region WL defaults will be
|
||||
// disabled again and sky/day cycle presets will be reverted to whatever the user
|
||||
// has set before.
|
||||
if (non_region_default_applied)
|
||||
{
|
||||
LLEnvManagerNew::instance().setUseWaterPreset(settings["water"].asString(), gSavedSettings.getBOOL("FSInterpolateParcelWL"));
|
||||
setWL_Status(true);
|
||||
if (settings.has("water") && (!mHaveRegionSettings || mRegionOverride))
|
||||
{
|
||||
LL_DEBUGS() << "Applying WL water set: " << settings["water"].asString() << LL_ENDL;
|
||||
LLEnvManagerNew::instance().setUseWaterPreset(settings["water"].asString(), gSavedSettings.getBOOL("FSInterpolateParcelWL"));
|
||||
setWL_Status(true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Cannot apply Parcel WL water preset because region WL default has been set due to invalid sky preset" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KCWindlightInterface::ApplySkySettings(const LLSD& settings)
|
||||
bool KCWindlightInterface::ApplySkySettings(const LLSD& settings)
|
||||
{
|
||||
if (settings.has("sky"))
|
||||
{
|
||||
|
|
@ -193,28 +240,32 @@ void KCWindlightInterface::ApplySkySettings(const LLSD& settings)
|
|||
if (lower != mCurrentSpace) //workaround: only apply once
|
||||
{
|
||||
mCurrentSpace = lower; //use lower as an id
|
||||
LL_DEBUGS() << "Applying WL sky set: " << (*space_it)["preset"].asString() << LL_ENDL;
|
||||
ApplyWindLightPreset((*space_it)["preset"].asString());
|
||||
}
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mCurrentSpace != -1.f)
|
||||
if (mCurrentSpace != -1)
|
||||
{
|
||||
mCurrentSpace = -1.f;
|
||||
mCurrentSpace = -1;
|
||||
// set notes on KCWindlightInterface::haveParcelOverride
|
||||
if (settings.has("sky_default") && (!mHaveRegionSettings || mRegionOverride))
|
||||
{
|
||||
//LL_INFOS() << "WL set : " << settings["sky_default"] << LL_ENDL;
|
||||
LL_DEBUGS() << "Applying WL sky set: " << settings["sky_default"] << " (Parcel WL Default)" << LL_ENDL;
|
||||
ApplyWindLightPreset(settings["sky_default"].asString());
|
||||
}
|
||||
else //reset to default
|
||||
{
|
||||
//LL_INFOS() << "WL set : Default" << LL_ENDL;
|
||||
ApplyWindLightPreset("Default");
|
||||
LL_DEBUGS() << "Applying WL sky set: Region Default" << LL_ENDL;
|
||||
ApplyWindLightPreset(PARCEL_WL_DEFAULT);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void KCWindlightInterface::ApplyWindLightPreset(const std::string& preset)
|
||||
|
|
@ -224,7 +275,7 @@ void KCWindlightInterface::ApplyWindLightPreset(const std::string& preset)
|
|||
|
||||
LLWLParamManager* wlprammgr = LLWLParamManager::getInstance();
|
||||
LLWLParamKey key(preset, LLEnvKey::SCOPE_LOCAL);
|
||||
if ( (preset != "Default") && (wlprammgr->hasParamSet(key)) )
|
||||
if ( (preset != PARCEL_WL_DEFAULT) && (wlprammgr->hasParamSet(key)) )
|
||||
{
|
||||
LLEnvManagerNew::instance().setUseSkyPreset(preset, gSavedSettings.getBOOL("FSInterpolateParcelWL"));
|
||||
setWL_Status(true);
|
||||
|
|
@ -233,7 +284,9 @@ void KCWindlightInterface::ApplyWindLightPreset(const std::string& preset)
|
|||
else
|
||||
{
|
||||
if (!LLEnvManagerNew::instance().getUseRegionSettings())
|
||||
{
|
||||
LLEnvManagerNew::instance().setUseRegionSettings(true, gSavedSettings.getBOOL("FSInterpolateParcelWL"));
|
||||
}
|
||||
setWL_Status(false);
|
||||
mWeChangedIt = false;
|
||||
}
|
||||
|
|
@ -247,7 +300,7 @@ void KCWindlightInterface::ResetToRegion(bool force)
|
|||
//TODO: clear per parcel
|
||||
if (mWeChangedIt || force) //dont reset anything if we didnt do it
|
||||
{
|
||||
ApplyWindLightPreset("Default");
|
||||
ApplyWindLightPreset(PARCEL_WL_DEFAULT);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -379,11 +432,11 @@ bool KCWindlightInterface::ParseParcelForWLSettings(const std::string& desc, LLS
|
|||
{
|
||||
if (match[1].matched)
|
||||
{
|
||||
//LL_INFOS() << "sky flag: " << match[1] << " : " << match[2] << " : " << match[3] << " : " << match[5] << LL_ENDL;
|
||||
LL_DEBUGS() << "Sky Flags: type = " << match[1] << " from = " << match[2] << " to = " << match[3] << " preset = " << match[5] << LL_ENDL;
|
||||
|
||||
std::string preset(match[5]);
|
||||
LLWLParamKey key(preset, LLEnvKey::SCOPE_LOCAL);
|
||||
if(wlprammgr->hasParamSet(key))
|
||||
if (wlprammgr->hasParamSet(key))
|
||||
{
|
||||
if (match[2].matched && match[3].matched)
|
||||
{
|
||||
|
|
@ -396,22 +449,29 @@ bool KCWindlightInterface::ParseParcelForWLSettings(const std::string& desc, LLS
|
|||
space["upper"] = upper;
|
||||
space["preset"] = preset;
|
||||
if (!settings.has("sky"))
|
||||
{
|
||||
settings["sky"] = LLSD();
|
||||
}
|
||||
settings["sky"][sky_index++] = space;
|
||||
found_settings = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_DEBUGS() << "Sky Default = " << preset << LL_ENDL;
|
||||
settings["sky_default"] = preset;
|
||||
found_settings = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Parcel Windlight contains unknown sky: " << preset << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else if (match[4].matched)
|
||||
{
|
||||
std::string preset(match[5]);
|
||||
//LL_INFOS() << "got water: " << preset << LL_ENDL;
|
||||
LL_DEBUGS() << "Got Water Preset: " << preset << LL_ENDL;
|
||||
if(wwprammgr->hasParamSet(preset))
|
||||
{
|
||||
settings["water"] = preset;
|
||||
|
|
@ -420,8 +480,7 @@ bool KCWindlightInterface::ParseParcelForWLSettings(const std::string& desc, LLS
|
|||
}
|
||||
else if (match[6].matched)
|
||||
{
|
||||
//std::string preset(match[5]);
|
||||
LL_INFOS() << "got region override flag" << LL_ENDL;
|
||||
LL_DEBUGS() << "Got Region Override Flag" << LL_ENDL;
|
||||
settings["region_override"] = true;
|
||||
}
|
||||
|
||||
|
|
@ -569,7 +628,7 @@ bool KCWindlightInterface::haveParcelOverride(const LLEnvironmentSettings& new_s
|
|||
//*ASSUMPTION: if region day cycle is empty, its set to default
|
||||
mHaveRegionSettings = new_settings.getWLDayCycle().size() > 0;
|
||||
|
||||
return mRegionOverride || mCurrentSpace != -1.f;
|
||||
return mRegionOverride || mCurrentSpace != -1;
|
||||
}
|
||||
|
||||
void KCWindlightInterface::setWL_Status(bool pwl_status)
|
||||
|
|
@ -590,7 +649,7 @@ bool KCWindlightInterface::checkSettings()
|
|||
{
|
||||
mCurrentSettings.clear();
|
||||
mWeChangedIt = false;
|
||||
mCurrentSpace = -2.f;
|
||||
mCurrentSpace = -2;
|
||||
mLastParcelID = -1;
|
||||
mRegionOverride = false;
|
||||
mHaveRegionSettings = false;
|
||||
|
|
|
|||
|
|
@ -33,15 +33,19 @@
|
|||
class LLParcel;
|
||||
class LLViewerRegion;
|
||||
class LLEnvironmentSettings;
|
||||
class LLParcelChangeObserver;
|
||||
|
||||
class KCWindlightInterface : public LLSingleton<KCWindlightInterface>, LLEventTimer
|
||||
{
|
||||
LOG_CLASS(KCWindlightInterface);
|
||||
|
||||
public:
|
||||
KCWindlightInterface();
|
||||
~KCWindlightInterface();
|
||||
void ParcelChange();
|
||||
virtual BOOL tick();
|
||||
void ApplySettings(const LLSD& settings);
|
||||
void ApplySkySettings(const LLSD& settings);
|
||||
bool ApplySkySettings(const LLSD& settings);
|
||||
void ApplyWindLightPreset(const std::string& preset);
|
||||
void ResetToRegion(bool force = false);
|
||||
//bool ChatCommand(std::string message, std::string from_name, LLUUID source_id, LLUUID owner_id);
|
||||
|
|
@ -54,6 +58,11 @@ public:
|
|||
bool getWLset() { return mWLset; }
|
||||
|
||||
private:
|
||||
class LLParcelChangeObserver;
|
||||
friend class LLParcelChangeObserver;
|
||||
boost::signals2::connection mParcelMgrConnection;
|
||||
void onAgentParcelChange();
|
||||
|
||||
bool callbackParcelWL(const LLSD& notification, const LLSD& response);
|
||||
bool callbackParcelWLClear(const LLSD& notification, const LLSD& response);
|
||||
bool AllowedLandOwners(const LLUUID& agent_id);
|
||||
|
|
|
|||
|
|
@ -20,17 +20,27 @@
|
|||
#include "lfsimfeaturehandler.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "lllogininstance.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewernetwork.h"
|
||||
#include "llviewerregion.h"
|
||||
|
||||
LFSimFeatureHandler::LFSimFeatureHandler()
|
||||
: mSupportsExport(false)
|
||||
, mSayRange(20)
|
||||
, mShoutRange(100)
|
||||
, mWhisperRange(10)
|
||||
: mSupportsExport(false),
|
||||
mSayRange(20),
|
||||
mShoutRange(100),
|
||||
mWhisperRange(10),
|
||||
mHasAvatarPicker(false),
|
||||
mHasDestinationGuide(false)
|
||||
{
|
||||
if (!LLGridManager::getInstance()->isInSecondLife()) // Remove this line if we ever handle SecondLife sim features
|
||||
gAgent.addRegionChangedCallback(boost::bind(&LFSimFeatureHandler::handleRegionChange, this));
|
||||
LL_INFOS() << "Initializing Sim Feature Handler" << LL_ENDL;
|
||||
|
||||
gAgent.addRegionChangedCallback(boost::bind(&LFSimFeatureHandler::handleRegionChange, this));
|
||||
|
||||
// Call setSupportedFeatures -> This will work because we construct
|
||||
// our singleton instance during STATE_SEED_CAP_GRANTED startup state
|
||||
// after we received the initial region caps
|
||||
setSupportedFeatures();
|
||||
}
|
||||
|
||||
ExportSupport LFSimFeatureHandler::exportPolicy() const
|
||||
|
|
@ -59,27 +69,115 @@ void LFSimFeatureHandler::setSupportedFeatures()
|
|||
{
|
||||
LLSD info;
|
||||
region->getSimulatorFeatures(info);
|
||||
if (info.has("OpenSimExtras")) // OpenSim specific sim features
|
||||
if (!LLGridManager::getInstance()->isInSecondLife() && info.has("OpenSimExtras")) // OpenSim specific sim features
|
||||
{
|
||||
LL_INFOS() << "Setting OpenSimExtras..." << LL_ENDL;
|
||||
|
||||
// For definition of OpenSimExtras please see
|
||||
// http://opensimulator.org/wiki/SimulatorFeatures_Extras
|
||||
const LLSD& extras(info["OpenSimExtras"]);
|
||||
LL_DEBUGS() << "OpenSimExtras received: " << extras << LL_ENDL;
|
||||
|
||||
mSupportsExport = extras.has("ExportSupported") ? extras["ExportSupported"].asBoolean() : false;
|
||||
mMapServerURL = extras.has("map-server-url") ? extras["map-server-url"].asString() : "";
|
||||
mSearchURL = extras.has("search-server-url") ? extras["search-server-url"].asString() : "";
|
||||
mMapServerURL = extras.has("map-server-url") ? extras["map-server-url"].asString() : gSavedSettings.getString("CurrentMapServerURL");
|
||||
mSayRange = extras.has("say-range") ? extras["say-range"].asInteger() : 20;
|
||||
mShoutRange = extras.has("shout-range") ? extras["shout-range"].asInteger() : 100;
|
||||
mWhisperRange = extras.has("whisper-range") ? extras["whisper-range"].asInteger() : 10;
|
||||
|
||||
if (extras.has("search-server-url"))
|
||||
{
|
||||
mSearchURL = extras["search-server-url"].asString();
|
||||
}
|
||||
else if (LLLoginInstance::getInstance()->hasResponse("search"))
|
||||
{
|
||||
mSearchURL = LLLoginInstance::getInstance()->getResponse("search").asString();
|
||||
}
|
||||
else
|
||||
{
|
||||
mSearchURL = LLGridManager::getInstance()->isInSecondLife() ? gSavedSettings.getString("SearchURL") : gSavedSettings.getString("SearchURLOpenSim");
|
||||
}
|
||||
|
||||
if (extras.has("destination-guide-url"))
|
||||
{
|
||||
mDestinationGuideURL = extras["destination-guide-url"].asString();
|
||||
}
|
||||
else if (LLLoginInstance::getInstance()->hasResponse("destination_guide_url"))
|
||||
{
|
||||
mDestinationGuideURL = LLLoginInstance::getInstance()->getResponse("destination_guide_url").asString();
|
||||
}
|
||||
else if (LLGridManager::instance().isInSecondLife())
|
||||
{
|
||||
mDestinationGuideURL = gSavedSettings.getString("DestinationGuideURL");
|
||||
}
|
||||
else
|
||||
{
|
||||
mDestinationGuideURL = LLStringUtil::null;
|
||||
}
|
||||
|
||||
if (extras.has("avatar-picker-url"))
|
||||
{
|
||||
mAvatarPickerURL = extras["avatar-picker-url"].asString();
|
||||
}
|
||||
else if (LLLoginInstance::getInstance()->hasResponse("avatar-picker-url"))
|
||||
{
|
||||
mAvatarPickerURL = LLLoginInstance::getInstance()->getResponse("avatar-picker-url").asString();
|
||||
}
|
||||
else if (LLGridManager::instance().isInSecondLife())
|
||||
{
|
||||
mAvatarPickerURL = gSavedSettings.getString("AvatarPickerURL");
|
||||
}
|
||||
else
|
||||
{
|
||||
mAvatarPickerURL = LLStringUtil::null;
|
||||
}
|
||||
}
|
||||
else // OpenSim specifics are unsupported reset all to default
|
||||
{
|
||||
LL_INFOS() << "Setting defaults..." << LL_ENDL;
|
||||
mSupportsExport = false;
|
||||
mMapServerURL = "";
|
||||
mSearchURL = "";
|
||||
mMapServerURL = gSavedSettings.getString("CurrentMapServerURL");
|
||||
mSayRange = 20;
|
||||
mShoutRange = 100;
|
||||
mWhisperRange = 10;
|
||||
|
||||
if (LLLoginInstance::getInstance()->hasResponse("search"))
|
||||
{
|
||||
mSearchURL = LLLoginInstance::getInstance()->getResponse("search").asString();
|
||||
}
|
||||
else
|
||||
{
|
||||
mSearchURL = LLGridManager::getInstance()->isInSecondLife() ? gSavedSettings.getString("SearchURL") : gSavedSettings.getString("SearchURLOpenSim");
|
||||
}
|
||||
|
||||
if (LLLoginInstance::getInstance()->hasResponse("destination_guide_url"))
|
||||
{
|
||||
mDestinationGuideURL = LLLoginInstance::getInstance()->getResponse("destination_guide_url").asString();
|
||||
}
|
||||
else if (LLGridManager::instance().isInSecondLife())
|
||||
{
|
||||
mDestinationGuideURL = gSavedSettings.getString("DestinationGuideURL");
|
||||
}
|
||||
else
|
||||
{
|
||||
mDestinationGuideURL = LLStringUtil::null;
|
||||
}
|
||||
|
||||
if (LLLoginInstance::getInstance()->hasResponse("avatar-picker-url"))
|
||||
{
|
||||
mAvatarPickerURL = LLLoginInstance::getInstance()->getResponse("avatar-picker-url").asString();
|
||||
}
|
||||
else if (LLGridManager::instance().isInSecondLife())
|
||||
{
|
||||
mAvatarPickerURL = gSavedSettings.getString("AvatarPickerURL");
|
||||
}
|
||||
else
|
||||
{
|
||||
mAvatarPickerURL = LLStringUtil::null;
|
||||
}
|
||||
}
|
||||
|
||||
mHasAvatarPicker = !avatarPickerURL().empty();
|
||||
mHasDestinationGuide = !destinationGuideURL().empty();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -107,3 +205,13 @@ boost::signals2::connection LFSimFeatureHandler::setWhisperRangeCallback(const b
|
|||
{
|
||||
return mWhisperRange.connect(slot);
|
||||
}
|
||||
|
||||
boost::signals2::connection LFSimFeatureHandler::setAvatarPickerCallback(const boost::signals2::signal<void()>::slot_type& slot)
|
||||
{
|
||||
return mAvatarPickerURL.connect(slot);
|
||||
}
|
||||
|
||||
boost::signals2::connection LFSimFeatureHandler::setDestinationGuideCallback(const boost::signals2::signal<void()>::slot_type& slot)
|
||||
{
|
||||
return mDestinationGuideURL.connect(slot);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@ typedef enum e_export_support
|
|||
|
||||
class LFSimFeatureHandler : public LLSingleton<LFSimFeatureHandler>
|
||||
{
|
||||
LOG_CLASS(LFSimFeatureHandler);
|
||||
|
||||
protected:
|
||||
friend class LLSingleton<LFSimFeatureHandler>;
|
||||
LFSimFeatureHandler();
|
||||
|
|
@ -69,6 +71,8 @@ public:
|
|||
boost::signals2::connection setSayRangeCallback(const boost::signals2::signal<void()>::slot_type& slot);
|
||||
boost::signals2::connection setShoutRangeCallback(const boost::signals2::signal<void()>::slot_type& slot);
|
||||
boost::signals2::connection setWhisperRangeCallback(const boost::signals2::signal<void()>::slot_type& slot);
|
||||
boost::signals2::connection setAvatarPickerCallback(const boost::signals2::signal<void()>::slot_type& slot);
|
||||
boost::signals2::connection setDestinationGuideCallback(const boost::signals2::signal<void()>::slot_type& slot);
|
||||
|
||||
// Accessors
|
||||
bool simSupportsExport() const { return mSupportsExport; }
|
||||
|
|
@ -78,6 +82,11 @@ public:
|
|||
U32 shoutRange() const { return mShoutRange; }
|
||||
U32 whisperRange() const { return mWhisperRange; }
|
||||
ExportSupport exportPolicy() const;
|
||||
std::string avatarPickerURL() const { return mAvatarPickerURL; }
|
||||
std::string destinationGuideURL() const { return mDestinationGuideURL; }
|
||||
|
||||
bool hasAvatarPicker() const { return mHasAvatarPicker; }
|
||||
bool hasDestinationGuide() const { return mHasDestinationGuide; }
|
||||
|
||||
private:
|
||||
// SignaledTypes
|
||||
|
|
@ -87,6 +96,11 @@ private:
|
|||
SignaledType<U32> mSayRange;
|
||||
SignaledType<U32> mShoutRange;
|
||||
SignaledType<U32> mWhisperRange;
|
||||
SignaledType<std::string> mAvatarPickerURL;
|
||||
SignaledType<std::string> mDestinationGuideURL;
|
||||
|
||||
bool mHasAvatarPicker;
|
||||
bool mHasDestinationGuide;
|
||||
};
|
||||
|
||||
#endif //LFSIMFEATUREHANDLER_H
|
||||
|
|
|
|||
|
|
@ -4472,7 +4472,7 @@ bool LLAgent::teleportCore(bool is_local)
|
|||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// bit of a hack -KC
|
||||
//<FS:KC> bit of a hack
|
||||
KCWindlightInterface::instance().setTPing(true);
|
||||
}
|
||||
make_ui_sound("UISndTeleportOut");
|
||||
|
|
@ -4783,7 +4783,8 @@ void LLAgent::doTeleportViaLocation(const LLVector3d& pos_global)
|
|||
msg->addUUIDFast(_PREHASH_SessionID, getSessionID());
|
||||
|
||||
msg->nextBlockFast(_PREHASH_Info);
|
||||
F32 width = regionp->getWidth();
|
||||
// <FS:Ansariel> FIRE-17262: Wrong local teleports on a large opensim region (apparently need to divide by grid unit size)
|
||||
F32 width = REGION_WIDTH_METERS;// regionp->getWidth();
|
||||
LLVector3 pos(fmod((F32)pos_global.mdV[VX], width),
|
||||
fmod((F32)pos_global.mdV[VY], width),
|
||||
(F32)pos_global.mdV[VZ]);
|
||||
|
|
|
|||
|
|
@ -2934,13 +2934,13 @@ void LLAgentCamera::loadCameraPosition()
|
|||
|
||||
if (stored_camera_pos.isNull())
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("LoadCameraPositionNoneSaved"));
|
||||
report_to_nearby_chat(LLTrans::getString("LoadCameraPositionNoneSaved"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (dist_vec_squared(gAgent.getPositionGlobal(), stored_camera_pos) > far_clip_squared)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("LoadCameraPositionOutsideDrawDistance"));
|
||||
report_to_nearby_chat(LLTrans::getString("LoadCameraPositionOutsideDrawDistance"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1035,6 +1035,9 @@ bool LLAppViewer::init()
|
|||
settings_map["floater"] = &gSavedSettings; // *TODO: New settings file
|
||||
settings_map["account"] = &gSavedPerAccountSettings;
|
||||
|
||||
// <FS:Ansariel> Optional legacy notification well
|
||||
gSavedSettings.setBOOL("FSInternalLegacyNotificationWell", gSavedSettings.getBOOL("FSLegacyNotificationWell"));
|
||||
|
||||
LLUI::initClass(settings_map,
|
||||
LLUIImageList::getInstance(),
|
||||
ui_audio_callback,
|
||||
|
|
|
|||
|
|
@ -150,7 +150,17 @@ void LLChannelManager::onLoginCompleted()
|
|||
S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
|
||||
S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
|
||||
mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
|
||||
mStartUpChannel->setMouseDownCallback(boost::bind(&LLFloaterNotificationsTabbed::onStartUpToastClick, LLFloaterNotificationsTabbed::getInstance(), _2, _3, _4));
|
||||
// <FS:Ansariel> Optional legacy notification well
|
||||
//mStartUpChannel->setMouseDownCallback(boost::bind(&LLFloaterNotificationsTabbed::onStartUpToastClick, LLFloaterNotificationsTabbed::getInstance(), _2, _3, _4));
|
||||
if (!gSavedSettings.getBOOL("FSInternalLegacyNotificationWell"))
|
||||
{
|
||||
mStartUpChannel->setMouseDownCallback(boost::bind(&LLFloaterNotificationsTabbed::onStartUpToastClick, LLFloaterNotificationsTabbed::getInstance(), _2, _3, _4));
|
||||
}
|
||||
else
|
||||
{
|
||||
mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4));
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
|
||||
mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
|
||||
|
|
|
|||
|
|
@ -313,7 +313,16 @@ LLNotificationChiclet::LLNotificationChiclet(const Params& p)
|
|||
mNotificationChannel.reset(new ChicletNotificationChannel(this));
|
||||
// ensure that notification well window exists, to synchronously
|
||||
// handle toast add/delete events.
|
||||
LLFloaterNotificationsTabbed::getInstance()->setSysWellChiclet(this);
|
||||
// <FS:Ansariel> Optional legacy notification well
|
||||
//LLFloaterNotificationsTabbed::getInstance()->setSysWellChiclet(this);
|
||||
if (!gSavedSettings.getBOOL("FSInternalLegacyNotificationWell"))
|
||||
{
|
||||
LLFloaterNotificationsTabbed::getInstance()->setSysWellChiclet(this);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLNotificationWellWindow::getInstance()->setSysWellChiclet(this);
|
||||
}
|
||||
}
|
||||
|
||||
void LLNotificationChiclet::onMenuItemClicked(const LLSD& user_data)
|
||||
|
|
@ -321,7 +330,16 @@ void LLNotificationChiclet::onMenuItemClicked(const LLSD& user_data)
|
|||
std::string action = user_data.asString();
|
||||
if("close all" == action)
|
||||
{
|
||||
LLFloaterNotificationsTabbed::getInstance()->closeAll();
|
||||
// <FS:Ansariel> Optional legacy notification well
|
||||
//LLFloaterNotificationsTabbed::getInstance()->closeAll();
|
||||
if (!gSavedSettings.getBOOL("FSInternalLegacyNotificationWell"))
|
||||
{
|
||||
LLFloaterNotificationsTabbed::getInstance()->closeAll();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLNotificationWellWindow::getInstance()->closeAll();
|
||||
}
|
||||
// <FS:Ansariel> [FS communication UI] - We have our own IM well button again
|
||||
//LLIMWellWindow::getInstance()->closeAll();
|
||||
}
|
||||
|
|
@ -374,7 +392,11 @@ bool LLNotificationChiclet::ChicletNotificationChannel::filterNotification( LLNo
|
|||
if ( (notification->getName() == "ScriptDialog") // special case for scripts
|
||||
// if there is no toast window for the notification, filter it
|
||||
//|| (!LLNotificationWellWindow::getInstance()->findItemByID(notification->getID()))
|
||||
|| (!LLFloaterNotificationsTabbed::getInstance()->findItemByID(notification->getID(), notification->getName()))
|
||||
// <FS:Ansariel> Optional legacy notification well
|
||||
//|| (!LLFloaterNotificationsTabbed::getInstance()->findItemByID(notification->getID(), notification->getName()))
|
||||
|| ((!gSavedSettings.getBOOL("FSInternalLegacyNotificationWell") && !LLFloaterNotificationsTabbed::getInstance()->findItemByID(notification->getID(), notification->getName()))
|
||||
|| (gSavedSettings.getBOOL("FSInternalLegacyNotificationWell") && !LLNotificationWellWindow::getInstance()->findItemByID(notification->getID())))
|
||||
// </FS:Ansariel>
|
||||
)
|
||||
{
|
||||
displayNotification = false;
|
||||
|
|
|
|||
|
|
@ -150,7 +150,17 @@ BOOL LLChicletBar::postBuild()
|
|||
// <FS:Ansariel> [FS communication UI]
|
||||
showWellButton("im_well", !LLIMWellWindow::getInstance()->isWindowEmpty());
|
||||
|
||||
showWellButton("notification_well", !LLFloaterNotificationsTabbed::getInstance()->isWindowEmpty());
|
||||
// <FS:Ansariel> Optional legacy notification well
|
||||
//showWellButton("notification_well", !LLFloaterNotificationsTabbed::getInstance()->isWindowEmpty());
|
||||
if (!gSavedSettings.getBOOL("FSInternalLegacyNotificationWell"))
|
||||
{
|
||||
showWellButton("notification_well", !LLFloaterNotificationsTabbed::getInstance()->isWindowEmpty());
|
||||
}
|
||||
else
|
||||
{
|
||||
showWellButton("notification_well", !LLNotificationWellWindow::getInstance()->isWindowEmpty());
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
LLPanelTopInfoBar::instance().setResizeCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this));
|
||||
LLPanelTopInfoBar::instance().setVisibleCallback(boost::bind(&LLChicletBar::fitWithTopInfoBar, this));
|
||||
|
|
|
|||
|
|
@ -503,7 +503,7 @@ void LLEnvManagerNew::onRegionSettingsResponse(const LLSD& content)
|
|||
// Load region sky presets.
|
||||
LLWLParamManager::instance().refreshRegionPresets();
|
||||
|
||||
// Use the region settings if parcel settings didnt override it already -KC
|
||||
//<FS:KC> Use the region settings if parcel settings didnt override it already
|
||||
if (KCWindlightInterface::instance().haveParcelOverride(new_settings))
|
||||
{
|
||||
// If using server settings, update managers.
|
||||
|
|
@ -523,6 +523,7 @@ void LLEnvManagerNew::onRegionSettingsResponse(const LLSD& content)
|
|||
setUserPrefs(getWaterPresetName(), getSkyPresetName(), getDayCycleName(), false, true, mInterpNextChangeMessage);
|
||||
}
|
||||
}
|
||||
//</FS:KC>
|
||||
|
||||
// Let interested parties know about the region settings update.
|
||||
mRegionSettingsChangeSignal();
|
||||
|
|
|
|||
|
|
@ -36,9 +36,13 @@
|
|||
#include "lluictrlfactory.h"
|
||||
#include "llmediactrl.h"
|
||||
|
||||
#include "lfsimfeaturehandler.h"
|
||||
#include "llhttpconstants.h"
|
||||
#include "llweb.h"
|
||||
|
||||
LLFloaterAvatar::LLFloaterAvatar(const LLSD& key)
|
||||
: LLFloater(key)
|
||||
: LLFloater(key),
|
||||
mAvatarPickerUrlChangedSignal() // <FS:Ansariel> Avatar chooser does not change between OpenSim grids
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -51,6 +55,13 @@ LLFloaterAvatar::~LLFloaterAvatar()
|
|||
avatar_picker->clearCache(); //images are reloading each time already
|
||||
avatar_picker->unloadMediaSource();
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Avatar chooser does not change between OpenSim grids
|
||||
if (mAvatarPickerUrlChangedSignal.connected())
|
||||
{
|
||||
mAvatarPickerUrlChangedSignal.disconnect();
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
BOOL LLFloaterAvatar::postBuild()
|
||||
|
|
@ -59,4 +70,23 @@ BOOL LLFloaterAvatar::postBuild()
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Avatar chooser does not change between OpenSim grids
|
||||
void LLFloaterAvatar::onOpen(const LLSD& key)
|
||||
{
|
||||
// Connect during onOpen instead of ctor because LLFloaterAvatar instance
|
||||
// gets created before we can safely create a LFSimFeatureHandler instance!
|
||||
// Assuming we receive the avatar picker URL via login response and it
|
||||
// is the same URL being sent by region caps so we will be good for the initial
|
||||
// region the avatar logs into as well.
|
||||
if (!mAvatarPickerUrlChangedSignal.connected())
|
||||
{
|
||||
mAvatarPickerUrlChangedSignal = LFSimFeatureHandler::instance().setAvatarPickerCallback(boost::bind(&LLFloaterAvatar::handleUrlChanged, this));
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterAvatar::handleUrlChanged()
|
||||
{
|
||||
getChild<LLMediaCtrl>("avatar_picker_contents")->navigateTo(LLWeb::expandURLSubstitutions(LFSimFeatureHandler::instance().avatarPickerURL(), LLSD()), HTTP_CONTENT_TEXT_HTML);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,13 @@ private:
|
|||
LLFloaterAvatar(const LLSD& key);
|
||||
/*virtual*/ ~LLFloaterAvatar();
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
// <FS:Ansariel> Avatar chooser does not change between OpenSim grids
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
void handleUrlChanged();
|
||||
|
||||
boost::signals2::connection mAvatarPickerUrlChangedSignal;
|
||||
// </FS:Ansariel>
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -176,6 +176,12 @@ void LLFloaterBvhPreview::setAnimCallbacks()
|
|||
getChild<LLUICtrl>("loop_in_point")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateLoopIn, this, _1));
|
||||
getChild<LLUICtrl>("loop_out_point")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitLoopOut, this));
|
||||
getChild<LLUICtrl>("loop_out_point")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateLoopOut, this, _1));
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
getChild<LLUICtrl>("loop_in_frames")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitLoopInFrames, this));
|
||||
getChild<LLUICtrl>("loop_in_frames")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateLoopInFrames, this, _1));
|
||||
getChild<LLUICtrl>("loop_out_frames")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitLoopOutFrames, this));
|
||||
getChild<LLUICtrl>("loop_out_frames")->setValidateBeforeCommit( boost::bind(&LLFloaterBvhPreview::validateLoopOutFrames, this, _1));
|
||||
// </FS:Sei>
|
||||
|
||||
getChild<LLUICtrl>("hand_pose_combo")->setCommitCallback(boost::bind(&LLFloaterBvhPreview::onCommitHandPose, this));
|
||||
|
||||
|
|
@ -329,6 +335,20 @@ BOOL LLFloaterBvhPreview::loadBVH()
|
|||
// motion will be returned, but it will be in a load-pending state, as this is a new motion
|
||||
// this motion will not request an asset transfer until next update, so we have a chance to
|
||||
// load the keyframe data locally
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
mNumFrames = loaderp->getNumFrames();
|
||||
getChild<LLSpinCtrl>("loop_in_frames")->setMaxValue(LLSD((F32)mNumFrames));
|
||||
getChild<LLSpinCtrl>("loop_out_frames")->setMaxValue(LLSD((F32)mNumFrames));
|
||||
// (Re)assign loop frames spinners from loop percentages.
|
||||
getChild<LLUICtrl>("loop_in_frames")->setValue(LLSD((F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal() / 100.f * (F32)mNumFrames));
|
||||
getChild<LLUICtrl>("loop_out_frames")->setValue(LLSD((F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal() / 100.f * (F32)mNumFrames));
|
||||
|
||||
LLUIString out_str = getString("FS_report_frames");
|
||||
out_str.setArg("[F]", llformat("%d", mNumFrames));
|
||||
out_str.setArg("[S]", llformat("%.1f", loaderp->getDuration()));
|
||||
out_str.setArg("[FPS]", llformat("%.1f", (F32)mNumFrames / loaderp->getDuration()));
|
||||
getChild<LLUICtrl>("frames_label")->setValue(LLSD(out_str));
|
||||
// </FS:Sei>
|
||||
// <FS> Preview on own avatar
|
||||
//motionp = (LLKeyframeMotion*)mAnimPreview->getDummyAvatar()->createMotion(mMotionID);
|
||||
motionp = dynamic_cast<LLKeyframeMotion*>(mAnimPreview->getPreviewAvatar(this)->createMotion(mMotionID));
|
||||
|
|
@ -388,8 +408,18 @@ BOOL LLFloaterBvhPreview::loadBVH()
|
|||
motionp->setLoopOut((F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal() / 100.f * motionp->getDuration());
|
||||
motionp->setPriority(getChild<LLUICtrl>("priority")->getValue().asInteger());
|
||||
motionp->setHandPose(LLHandMotion::getHandPose(getChild<LLUICtrl>("hand_pose_combo")->getValue().asString()));
|
||||
motionp->setEaseIn((F32)getChild<LLUICtrl>("ease_in_time")->getValue().asReal());
|
||||
motionp->setEaseOut((F32)getChild<LLUICtrl>("ease_out_time")->getValue().asReal());
|
||||
F32 ease_in = (F32)getChild<LLUICtrl>("ease_in_time")->getValue().asReal();
|
||||
F32 ease_out = (F32)getChild<LLUICtrl>("ease_out_time")->getValue().asReal();
|
||||
if (motionp->getDuration() != 0.f && ease_in + ease_out > motionp->getDuration() && !getChild<LLUICtrl>("loop_check")->getValue().asBoolean())
|
||||
{
|
||||
F32 factor = motionp->getDuration() / (ease_in + ease_out);
|
||||
ease_in *= factor;
|
||||
ease_out *= factor;
|
||||
getChild<LLUICtrl>("ease_in_time")->setValue(LLSD(ease_in));
|
||||
getChild<LLUICtrl>("ease_out_time")->setValue(LLSD(ease_out));
|
||||
}
|
||||
motionp->setEaseIn(ease_in);
|
||||
motionp->setEaseOut(ease_out);
|
||||
//</FS>
|
||||
setEnabled(TRUE);
|
||||
std::string seconds_string;
|
||||
|
|
@ -869,7 +899,10 @@ void LLFloaterBvhPreview::onCommitLoopIn()
|
|||
|
||||
if (motionp)
|
||||
{
|
||||
motionp->setLoopIn((F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal() / 100.f);
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
//motionp->setLoopIn((F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal() / 100.f);
|
||||
getChild<LLUICtrl>("loop_in_frames")->setValue(LLSD((F32)getChild<LLUICtrl>("loop_in_point")->getValue().asReal() / 100.f * (F32)mNumFrames));
|
||||
// </FS:Sei>
|
||||
resetMotion();
|
||||
getChild<LLUICtrl>("loop_check")->setValue(LLSD(TRUE));
|
||||
onCommitLoop();
|
||||
|
|
@ -893,13 +926,61 @@ void LLFloaterBvhPreview::onCommitLoopOut()
|
|||
|
||||
if (motionp)
|
||||
{
|
||||
motionp->setLoopOut((F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal() * 0.01f * motionp->getDuration());
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
//motionp->setLoopOut((F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal() * 0.01f * motionp->getDuration());
|
||||
getChild<LLUICtrl>("loop_out_frames")->setValue(LLSD((F32)getChild<LLUICtrl>("loop_out_point")->getValue().asReal() / 100.f * (F32)mNumFrames));
|
||||
// </FS:Sei>
|
||||
resetMotion();
|
||||
getChild<LLUICtrl>("loop_check")->setValue(LLSD(TRUE));
|
||||
onCommitLoop();
|
||||
}
|
||||
}
|
||||
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
//-----------------------------------------------------------------------------
|
||||
// onCommitLoopInFrames()
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLFloaterBvhPreview::onCommitLoopInFrames()
|
||||
{
|
||||
if (!getEnabled() || !mAnimPreview)
|
||||
return;
|
||||
|
||||
// Preview on own avatar
|
||||
LLVOAvatar* avatarp = mAnimPreview->getPreviewAvatar(this);
|
||||
LLKeyframeMotion* motionp = dynamic_cast<LLKeyframeMotion*>(avatarp->findMotion(mMotionID));
|
||||
|
||||
if (motionp)
|
||||
{
|
||||
getChild<LLUICtrl>("loop_in_point")->setValue(LLSD(mNumFrames == 0 ? 0.f : 100.f * (F32)getChild<LLUICtrl>("loop_in_frames")->getValue().asReal() / (F32)mNumFrames));
|
||||
resetMotion();
|
||||
getChild<LLUICtrl>("loop_check")->setValue(LLSD(TRUE));
|
||||
// The values are actually set here:
|
||||
onCommitLoop();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// onCommitLoopOutFrames()
|
||||
//-----------------------------------------------------------------------------
|
||||
void LLFloaterBvhPreview::onCommitLoopOutFrames()
|
||||
{
|
||||
if (!getEnabled() || !mAnimPreview)
|
||||
return;
|
||||
|
||||
// Preview on own avatar
|
||||
LLVOAvatar* avatarp = mAnimPreview->getPreviewAvatar(this);
|
||||
LLKeyframeMotion* motionp = dynamic_cast<LLKeyframeMotion*>(avatarp->findMotion(mMotionID));
|
||||
|
||||
if (motionp)
|
||||
{
|
||||
getChild<LLUICtrl>("loop_out_point")->setValue(LLSD(mNumFrames == 0 ? 100.f : 100.f * (F32)getChild<LLUICtrl>("loop_out_frames")->getValue().asReal() / (F32)mNumFrames));
|
||||
resetMotion();
|
||||
getChild<LLUICtrl>("loop_check")->setValue(LLSD(TRUE));
|
||||
onCommitLoop();
|
||||
}
|
||||
}
|
||||
// </FS:Sei>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// onCommitName()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -1083,6 +1164,9 @@ bool LLFloaterBvhPreview::validateLoopIn(const LLSD& data)
|
|||
}
|
||||
|
||||
getChild<LLUICtrl>("loop_in_point")->setValue(LLSD(loop_in_value));
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
getChild<LLUICtrl>("loop_in_frames")->setValue(LLSD(loop_in_value / 100.f * (F32)mNumFrames));
|
||||
// </FS:Sei>
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -1111,10 +1195,74 @@ bool LLFloaterBvhPreview::validateLoopOut(const LLSD& data)
|
|||
}
|
||||
|
||||
getChild<LLUICtrl>("loop_out_point")->setValue(LLSD(loop_out_value));
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
getChild<LLUICtrl>("loop_out_frames")->setValue(LLSD(loop_out_value / 100.f * (F32)mNumFrames));
|
||||
// </FS:Sei>
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
//-----------------------------------------------------------------------------
|
||||
// validateLoopInFrames()
|
||||
//-----------------------------------------------------------------------------
|
||||
bool LLFloaterBvhPreview::validateLoopInFrames(const LLSD& data)
|
||||
{
|
||||
if (!getEnabled())
|
||||
return false;
|
||||
|
||||
F32 loop_in_value = (F32)getChild<LLUICtrl>("loop_in_frames")->getValue().asReal();
|
||||
F32 loop_out_value = (F32)getChild<LLUICtrl>("loop_out_frames")->getValue().asReal();
|
||||
|
||||
if (loop_in_value < 0.f)
|
||||
{
|
||||
loop_in_value = 0.f;
|
||||
}
|
||||
else if (loop_in_value > 100.f)
|
||||
{
|
||||
loop_in_value = 100.f;
|
||||
}
|
||||
else if (loop_in_value > loop_out_value)
|
||||
{
|
||||
loop_in_value = loop_out_value;
|
||||
}
|
||||
|
||||
getChild<LLUICtrl>("loop_in_frames")->setValue(LLSD(loop_in_value));
|
||||
getChild<LLUICtrl>("loop_in_point")->setValue(LLSD(mNumFrames == 0 ? 0.f : 100.f * loop_in_value / (F32)mNumFrames));
|
||||
return true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// validateLoopOutFrames()
|
||||
//-----------------------------------------------------------------------------
|
||||
bool LLFloaterBvhPreview::validateLoopOutFrames(const LLSD& data)
|
||||
{
|
||||
if (!getEnabled())
|
||||
return false;
|
||||
|
||||
F32 loop_out_value = (F32)getChild<LLUICtrl>("loop_out_frames")->getValue().asReal();
|
||||
F32 loop_in_value = (F32)getChild<LLUICtrl>("loop_in_frames")->getValue().asReal();
|
||||
|
||||
if (loop_out_value < 0.f)
|
||||
{
|
||||
loop_out_value = 0.f;
|
||||
}
|
||||
else if (loop_out_value > 100.f)
|
||||
{
|
||||
loop_out_value = 100.f;
|
||||
}
|
||||
else if (loop_out_value < loop_in_value)
|
||||
{
|
||||
loop_out_value = loop_in_value;
|
||||
}
|
||||
|
||||
getChild<LLUICtrl>("loop_out_frames")->setValue(LLSD(loop_out_value));
|
||||
getChild<LLUICtrl>("loop_out_point")->setValue(LLSD(mNumFrames == 0 ? 100.f : 100.f * loop_out_value / (F32)mNumFrames));
|
||||
return true;
|
||||
}
|
||||
// </FS:Sei>
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// refresh()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -116,6 +116,12 @@ public:
|
|||
LLAssetType::EType type,
|
||||
void* user_data,
|
||||
S32 status, LLExtStat ext_status);
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
void onCommitLoopInFrames();
|
||||
void onCommitLoopOutFrames();
|
||||
bool validateLoopInFrames(const LLSD& data);
|
||||
bool validateLoopOutFrames(const LLSD& data);
|
||||
// </FS:Sei>
|
||||
private:
|
||||
void setAnimCallbacks() ;
|
||||
// <FS> Reload animation from disk
|
||||
|
|
@ -146,6 +152,9 @@ protected:
|
|||
|
||||
// <FS:Ansariel> FIRE-2083: Slider in upload animation floater doesn't work
|
||||
LLFrameTimer mTimer;
|
||||
|
||||
// <FS:Sei> FIRE-17277: Allow entering Loop In/Loop Out as frames
|
||||
S32 mNumFrames;
|
||||
};
|
||||
|
||||
#endif // LL_LLFLOATERBVHPREVIEW_H
|
||||
|
|
|
|||
|
|
@ -35,14 +35,25 @@
|
|||
#include "llfloaterdestinations.h"
|
||||
#include "lluictrlfactory.h"
|
||||
|
||||
#include "lfsimfeaturehandler.h"
|
||||
#include "llhttpconstants.h"
|
||||
#include "llmediactrl.h"
|
||||
#include "llweb.h"
|
||||
|
||||
LLFloaterDestinations::LLFloaterDestinations(const LLSD& key)
|
||||
: LLFloater(key)
|
||||
: LLFloater(key),
|
||||
mDestinationGuideUrlChangedSignal() // <FS:Ansariel> FIRE-16833: Destination guide does not change between OpenSim grids
|
||||
{
|
||||
}
|
||||
|
||||
LLFloaterDestinations::~LLFloaterDestinations()
|
||||
{
|
||||
// <FS:Ansariel> FIRE-16833: Destination guide does not change between OpenSim grids
|
||||
if (mDestinationGuideUrlChangedSignal.connected())
|
||||
{
|
||||
mDestinationGuideUrlChangedSignal.disconnect();
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
BOOL LLFloaterDestinations::postBuild()
|
||||
|
|
@ -51,4 +62,22 @@ BOOL LLFloaterDestinations::postBuild()
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
// <FS:Ansariel> FIRE-16833: Destination guide does not change between OpenSim grids
|
||||
void LLFloaterDestinations::onOpen(const LLSD& key)
|
||||
{
|
||||
// Connect during onOpen instead of ctor because LLFloaterDestinations instance
|
||||
// gets created before we can safely create a LFSimFeatureHandler instance!
|
||||
// Assuming we receive the destination guide URL via login response and it
|
||||
// is the same URL being sent by region caps so we will be good for the initial
|
||||
// region the avatar logs into as well.
|
||||
if (!mDestinationGuideUrlChangedSignal.connected())
|
||||
{
|
||||
mDestinationGuideUrlChangedSignal = LFSimFeatureHandler::instance().setDestinationGuideCallback(boost::bind(&LLFloaterDestinations::handleUrlChanged, this));
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterDestinations::handleUrlChanged()
|
||||
{
|
||||
getChild<LLMediaCtrl>("destination_guide_contents")->navigateTo(LLWeb::expandURLSubstitutions(LFSimFeatureHandler::instance().destinationGuideURL(), LLSD()), HTTP_CONTENT_TEXT_HTML);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
|
|
|||
|
|
@ -38,6 +38,13 @@ private:
|
|||
LLFloaterDestinations(const LLSD& key);
|
||||
/*virtual*/ ~LLFloaterDestinations();
|
||||
/*virtual*/ BOOL postBuild();
|
||||
|
||||
// <FS:Ansariel> FIRE-16833: Destination guide does not change between OpenSim grids
|
||||
/*virtual*/ void onOpen(const LLSD& key);
|
||||
void handleUrlChanged();
|
||||
|
||||
boost::signals2::connection mDestinationGuideUrlChangedSignal;
|
||||
// </FS:Ansariel>
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -80,8 +80,10 @@ void LLFloaterDisplayName::onOpen(const LLSD& key)
|
|||
av_name.mNextUpdate - LLStringOps::getLocalTimeOffset();
|
||||
LLDate next_update_local(next_update_local_secs);
|
||||
// display as "July 18 12:17 PM"
|
||||
//<FS:TS> FIRE-17293: Abbreviate month to make sure it fits
|
||||
std::string next_update_string =
|
||||
next_update_local.toHTTPDateString("%B %d %I:%M %p");
|
||||
//next_update_local.toHTTPDateString("%B %d %I:%M %p");
|
||||
next_update_local.toHTTPDateString("%b %d %I:%M %p");
|
||||
getChild<LLUICtrl>("lockout_text")->setTextArg("[TIME]", next_update_string);
|
||||
getChild<LLUICtrl>("lockout_text")->setVisible(true);
|
||||
getChild<LLUICtrl>("save_btn")->setEnabled(false);
|
||||
|
|
|
|||
|
|
@ -56,6 +56,8 @@
|
|||
|
||||
#include "llspinctrl.h"
|
||||
|
||||
#include "lfsimfeaturehandler.h"
|
||||
|
||||
static LLPanelInjector<LLFacebookStatusPanel> t_panel_status("llfacebookstatuspanel");
|
||||
static LLPanelInjector<LLFacebookPhotoPanel> t_panel_photo("llfacebookphotopanel");
|
||||
static LLPanelInjector<LLFacebookCheckinPanel> t_panel_checkin("llfacebookcheckinpanel");
|
||||
|
|
@ -80,7 +82,10 @@ std::string get_map_url()
|
|||
}
|
||||
int x_pos = center_agent[0] / 256.0;
|
||||
int y_pos = center_agent[1] / 256.0;
|
||||
std::string map_url = gSavedSettings.getString("CurrentMapServerURL") + llformat("map-1-%d-%d-objects.jpg", x_pos, y_pos);
|
||||
// <FS:Ansariel> OpenSim support
|
||||
//std::string map_url = gSavedSettings.getString("CurrentMapServerURL") + llformat("map-1-%d-%d-objects.jpg", x_pos, y_pos);
|
||||
std::string map_url = LFSimFeatureHandler::instance().mapServerURL() + llformat("map-1-%d-%d-objects.jpg", x_pos, y_pos);
|
||||
// </FS:Ansariel>
|
||||
return map_url;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -303,6 +303,15 @@ BOOL LLFloaterLand::postBuild()
|
|||
tab->selectTab(sLastTab);
|
||||
}
|
||||
|
||||
// <FS:Ansariel> FIRE-17280: Requesting Experience access allow & block list breaks OpenSim
|
||||
#if OPENSIM
|
||||
if (!LLGridManager::instance().isInSecondLife())
|
||||
{
|
||||
mTabLand->removeTabPanel(mTabLand->getPanelByName("land_experiences_panel"));
|
||||
}
|
||||
#endif
|
||||
// </FS:Ansariel>
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@
|
|||
#include "fsdroptarget.h"
|
||||
#include "fsfloaterimcontainer.h"
|
||||
#include "growlmanager.h"
|
||||
#include "lfsimfeaturehandler.h"
|
||||
#include "llavatarname.h" // <FS:CR> Deeper name cache stuffs
|
||||
#include "lleventtimer.h"
|
||||
#include "lldiriterator.h" // <Kadah> for populating the fonts combo
|
||||
|
|
@ -379,22 +380,29 @@ bool callback_pick_debug_search(const LLSD& notification, const LLSD& response)
|
|||
if ( option == 0 ) // YES
|
||||
{
|
||||
std::string url;
|
||||
#ifdef OPENSIM // <FS:AW optional opensim support>
|
||||
if(LLGridManager::getInstance()->isInOpenSim())
|
||||
|
||||
if (LFSimFeatureHandler::instanceExists())
|
||||
{
|
||||
url = LLLoginInstance::getInstance()->hasResponse("search")
|
||||
? LLLoginInstance::getInstance()->getResponse("search").asString()
|
||||
: gSavedSettings.getString("SearchURLOpenSim");
|
||||
url = LFSimFeatureHandler::instance().searchURL();
|
||||
}
|
||||
else // we are in SL or SL beta
|
||||
#endif // OPENSIM // <FS:AW optional opensim support>
|
||||
else
|
||||
{
|
||||
//not in OpenSim means we are in SL or SL beta
|
||||
url = gSavedSettings.getString("SearchURL");
|
||||
#ifdef OPENSIM // <FS:AW optional opensim support>
|
||||
if (LLGridManager::getInstance()->isInOpenSim())
|
||||
{
|
||||
url = LLLoginInstance::getInstance()->hasResponse("search")
|
||||
? LLLoginInstance::getInstance()->getResponse("search").asString()
|
||||
: gSavedSettings.getString("SearchURLOpenSim");
|
||||
}
|
||||
else // we are in SL or SL beta
|
||||
#endif // OPENSIM // <FS:AW optional opensim support>
|
||||
{
|
||||
//not in OpenSim means we are in SL or SL beta
|
||||
url = gSavedSettings.getString("SearchURL");
|
||||
}
|
||||
}
|
||||
|
||||
gSavedSettings.setString("SearchURLDebug", url);
|
||||
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
@ -487,6 +495,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
|
|||
// mCommitCallbackRegistrar.add("Pref.ClickSkin", boost::bind(&LLFloaterPreference::onClickSkin, this,_1, _2));
|
||||
// mCommitCallbackRegistrar.add("Pref.SelectSkin", boost::bind(&LLFloaterPreference::onSelectSkin, this));
|
||||
mCommitCallbackRegistrar.add("Pref.VoiceSetKey", boost::bind(&LLFloaterPreference::onClickSetKey, this));
|
||||
mCommitCallbackRegistrar.add("Pref.VoiceSetClearKey", boost::bind(&LLFloaterPreference::onClickClearKey, this)); // <FS:Ansariel> FIRE-3803: Clear voice toggle button
|
||||
mCommitCallbackRegistrar.add("Pref.VoiceSetMiddleMouse", boost::bind(&LLFloaterPreference::onClickSetMiddleMouse, this));
|
||||
//<FS:KC> Handled centrally now
|
||||
// mCommitCallbackRegistrar.add("Pref.SetSounds", boost::bind(&LLFloaterPreference::onClickSetSounds, this));
|
||||
|
|
@ -634,13 +643,9 @@ BOOL LLFloaterPreference::postBuild()
|
|||
{
|
||||
// <FS:Ansariel> [FS communication UI]
|
||||
//gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLFloaterIMSessionTab::processChatHistoryStyleUpdate, false));
|
||||
gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&FSFloaterIM::processChatHistoryStyleUpdate, _2));
|
||||
gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&FSFloaterNearbyChat::processChatHistoryStyleUpdate, _2));
|
||||
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&FSFloaterIM::processChatHistoryStyleUpdate, _2));
|
||||
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&FSFloaterNearbyChat::processChatHistoryStyleUpdate, _2));
|
||||
// </FS:Ansariel> [FS communication UI]
|
||||
|
||||
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged));
|
||||
//gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged));
|
||||
// </FS:Ansariel> [FS communication UI]
|
||||
|
||||
gSavedSettings.getControl("ChatBubbleOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onNameTagOpacityChange, this, _2));
|
||||
gSavedSettings.getControl("ConsoleBackgroundOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onConsoleOpacityChange, this, _2)); // <FS:CR> FIRE-1332 - Sepeate opacity settings for nametag and console chat
|
||||
|
|
@ -2615,6 +2620,13 @@ void LLFloaterPreference::onClickSetKey()
|
|||
}
|
||||
}
|
||||
|
||||
// <FS:Ansariel> FIRE-3803: Clear voice toggle button
|
||||
void LLFloaterPreference::onClickClearKey()
|
||||
{
|
||||
gSavedSettings.setString("PushToTalkButton", "");
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
void LLFloaterPreference::setKey(KEY key)
|
||||
{
|
||||
getChild<LLUICtrl>("modifier_combo")->setValue(LLKeyboard::stringFromKey(key));
|
||||
|
|
|
|||
|
|
@ -190,6 +190,7 @@ public:
|
|||
void onClickSkin(LLUICtrl* ctrl,const LLSD& userdata);
|
||||
void onSelectSkin();
|
||||
void onClickSetKey();
|
||||
void onClickClearKey(); // <FS:Ansariel> FIRE-3803: Clear voice toggle button
|
||||
void setKey(KEY key);
|
||||
void onClickSetMiddleMouse();
|
||||
// void onClickSetSounds(); //<FS:KC> Handled centrally now
|
||||
|
|
|
|||
|
|
@ -223,20 +223,10 @@ void LLFloaterSearch::search(const SearchQuery &p)
|
|||
{
|
||||
url = debug_url;
|
||||
}
|
||||
else if(LLGridManager::getInstance()->isInOpenSim())
|
||||
{
|
||||
std::string os_search_url = LFSimFeatureHandler::instance().searchURL();
|
||||
if (!os_search_url.empty())
|
||||
url = os_search_url;
|
||||
else if (LLLoginInstance::getInstance()->hasResponse("search"))
|
||||
url = LLLoginInstance::getInstance()->getResponse("search").asString();
|
||||
else
|
||||
url = gSavedSettings.getString("SearchURLOpenSim");
|
||||
}
|
||||
else // we are in SL or SL beta
|
||||
#endif // OPENSIM // <FS:AW optional opensim support>
|
||||
{
|
||||
url = gSavedSettings.getString("SearchURL");
|
||||
url = LFSimFeatureHandler::instance().searchURL();
|
||||
}
|
||||
// </FS:AW opensim search support>
|
||||
|
||||
|
|
|
|||
|
|
@ -96,10 +96,12 @@ private:
|
|||
*/
|
||||
const LLUUID extractAvatarID(const LLUUID& avatarID);
|
||||
|
||||
public: // <FS:Ansariel> Needed to check in LLOpenTaskOffer
|
||||
bool isAvatarDataStored(const LLUUID& avatarID) const
|
||||
{
|
||||
return (mBuddyIDSet.end() != mBuddyIDSet.find(avatarID));
|
||||
}
|
||||
private: // <FS:Ansariel> Needed to check in LLOpenTaskOffer
|
||||
|
||||
const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const;
|
||||
const LLUUID& findFriendFolderUUIDImpl() const;
|
||||
|
|
|
|||
|
|
@ -3019,7 +3019,7 @@ void LLIMMgr::addMessage(
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["NAME"] = LLSLURL("group", new_session_id, "about").getSLURLString();
|
||||
reportToNearbyChat(LLTrans::getString("GroupChatMuteNotice", args));
|
||||
report_to_nearby_chat(LLTrans::getString("GroupChatMuteNotice", args));
|
||||
}
|
||||
clearPendingInvitation(new_session_id);
|
||||
clearPendingAgentListUpdates(new_session_id);
|
||||
|
|
@ -3103,7 +3103,7 @@ void LLIMMgr::addMessage(
|
|||
}
|
||||
else if (reportIgnoredAdHocSession)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("IgnoredAdHocSession"));
|
||||
report_to_nearby_chat(LLTrans::getString("IgnoredAdHocSession"));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
@ -4339,7 +4339,7 @@ public:
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["NAME"] = LLSLURL("group", session_id, "about").getSLURLString();
|
||||
reportToNearbyChat(LLTrans::getString("GroupChatMuteNotice", args));
|
||||
report_to_nearby_chat(LLTrans::getString("GroupChatMuteNotice", args));
|
||||
}
|
||||
|
||||
//KC: make sure we leave the group chat at the server end as well
|
||||
|
|
|
|||
|
|
@ -4484,7 +4484,10 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
|
|||
// DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER.
|
||||
// If we have an item of AT_LINK_FOLDER type we should process the linked
|
||||
// category being dragged or dropped into folder.
|
||||
if (inv_item && LLAssetType::AT_LINK_FOLDER == inv_item->getActualType())
|
||||
// <FS:Ansariel> FIRE-13863: Allow moving folder links
|
||||
//if (inv_item && LLAssetType::AT_LINK_FOLDER == inv_item->getActualType())
|
||||
if (inv_item && LLAssetType::AT_LINK_FOLDER == inv_item->getActualType() && !gSavedSettings.getBOOL("FSEnableMovingFolderLinks"))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID());
|
||||
if (linked_category)
|
||||
|
|
|
|||
|
|
@ -358,7 +358,7 @@ void LLMuteList::updateAdd(const LLMute& mute)
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["NAME"] = mute.mName;
|
||||
reportToNearbyChat(LLTrans::getString("Mute_Add", args));
|
||||
report_to_nearby_chat(LLTrans::getString("Mute_Add", args));
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
|
@ -465,7 +465,7 @@ void LLMuteList::updateRemove(const LLMute& mute)
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["NAME"] = mute.mName;
|
||||
reportToNearbyChat(LLTrans::getString("Mute_Remove", args));
|
||||
report_to_nearby_chat(LLTrans::getString("Mute_Remove", args));
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1856,7 +1856,7 @@ void LLNetMap::handleCam()
|
|||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("minimap_no_focus"));
|
||||
report_to_nearby_chat(LLTrans::getString("minimap_no_focus"));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -401,14 +401,24 @@ BOOL LLGroupNoticeNotificationListItem::postBuild()
|
|||
mTitleBoxExp->setValue(mParams.subject);
|
||||
mNoticeTextExp->setValue(mParams.message);
|
||||
|
||||
mTimeBox->setValue(buildNotificationDate(mParams.time_stamp, UTC));
|
||||
mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp, UTC));
|
||||
// <FS:Ansariel> FIRE-17313: Display group notices in SLT
|
||||
//mTimeBox->setValue(buildNotificationDate(mParams.time_stamp, UTC));
|
||||
//mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp, UTC));
|
||||
////Workaround: in case server timestamp is 0 - we use the time when notification was actually received
|
||||
//if (mParams.time_stamp.isNull())
|
||||
//{
|
||||
// mTimeBox->setValue(buildNotificationDate(mParams.received_time, UTC));
|
||||
// mTimeBoxExp->setValue(buildNotificationDate(mParams.received_time, UTC));
|
||||
//}
|
||||
mTimeBox->setValue(buildNotificationDate(mParams.time_stamp, SLT));
|
||||
mTimeBoxExp->setValue(buildNotificationDate(mParams.time_stamp, SLT));
|
||||
//Workaround: in case server timestamp is 0 - we use the time when notification was actually received
|
||||
if (mParams.time_stamp.isNull())
|
||||
{
|
||||
mTimeBox->setValue(buildNotificationDate(mParams.received_time, UTC));
|
||||
mTimeBoxExp->setValue(buildNotificationDate(mParams.received_time, UTC));
|
||||
mTimeBox->setValue(buildNotificationDate(mParams.received_time, SLT));
|
||||
mTimeBoxExp->setValue(buildNotificationDate(mParams.received_time, SLT));
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
setSender(mParams.sender);
|
||||
|
||||
if (mInventoryOffer != NULL)
|
||||
|
|
|
|||
|
|
@ -92,7 +92,8 @@ LLPanelGroup::LLPanelGroup()
|
|||
: LLPanel(),
|
||||
LLGroupMgrObserver( LLUUID() ),
|
||||
mSkipRefresh(FALSE),
|
||||
mButtonJoin(NULL)
|
||||
mButtonJoin(NULL),
|
||||
mIsUsingTabContainer(false) // <FS:Ansariel> TabContainer switch
|
||||
{
|
||||
// Set up the factory callbacks.
|
||||
// Roles sub tabs
|
||||
|
|
@ -114,19 +115,60 @@ void LLPanelGroup::onOpen(const LLSD& key)
|
|||
if(!key.has("group_id"))
|
||||
return;
|
||||
|
||||
// open the desired panel
|
||||
if (key.has("open_tab_name"))
|
||||
{
|
||||
// onOpen from selected panel will be called from onTabSelected callback
|
||||
LLTabContainer* tab_ctrl = getChild<LLTabContainer>("groups_accordion");
|
||||
tab_ctrl->selectTabByName(key["open_tab_name"]);
|
||||
}
|
||||
|
||||
LLUUID group_id = key["group_id"];
|
||||
if(!key.has("action"))
|
||||
{
|
||||
setGroupID(group_id);
|
||||
getChild<LLAccordionCtrl>("groups_accordion")->expandDefaultTab();
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
//getChild<LLAccordionCtrl>("groups_accordion")->expandDefaultTab();
|
||||
if (mIsUsingTabContainer)
|
||||
{
|
||||
if (key.has("open_tab_name"))
|
||||
{
|
||||
getChild<LLTabContainer>("groups_accordion")->selectTabByName(key["open_tab_name"].asString());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (key.has("open_tab_name"))
|
||||
{
|
||||
LLAccordionCtrlTab* tab_general = getChild<LLAccordionCtrlTab>("group_general_tab");
|
||||
LLAccordionCtrlTab* tab_roles = getChild<LLAccordionCtrlTab>("group_roles_tab");
|
||||
LLAccordionCtrlTab* tab_notices = getChild<LLAccordionCtrlTab>("group_notices_tab");
|
||||
LLAccordionCtrlTab* tab_land = getChild<LLAccordionCtrlTab>("group_land_tab");
|
||||
LLAccordionCtrlTab* tab_experiences = getChild<LLAccordionCtrlTab>("group_experiences_tab");
|
||||
|
||||
if(tab_general->getDisplayChildren())
|
||||
tab_general->changeOpenClose(tab_general->getDisplayChildren());
|
||||
if(tab_roles->getDisplayChildren())
|
||||
tab_roles->changeOpenClose(tab_roles->getDisplayChildren());
|
||||
if(tab_notices->getDisplayChildren())
|
||||
tab_notices->changeOpenClose(tab_notices->getDisplayChildren());
|
||||
if(tab_land->getDisplayChildren())
|
||||
tab_land->changeOpenClose(tab_land->getDisplayChildren());
|
||||
if(tab_experiences->getDisplayChildren())
|
||||
tab_experiences->changeOpenClose(tab_land->getDisplayChildren());
|
||||
|
||||
tab_general->setSelected(false);
|
||||
tab_roles->setSelected(false);
|
||||
tab_notices->setSelected(false);
|
||||
tab_land->setSelected(false);
|
||||
tab_experiences->setSelected(false);
|
||||
|
||||
LLAccordionCtrlTab* target_tab = getChild<LLPanel>(key["open_tab_name"].asString())->getParentByType<LLAccordionCtrlTab>();
|
||||
if (target_tab)
|
||||
{
|
||||
target_tab->changeOpenClose(false);
|
||||
target_tab->setFocus(TRUE);
|
||||
target_tab->notifyParent(LLSD().with("action", "select_current"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
getChild<LLAccordionCtrl>("groups_accordion")->expandDefaultTab();
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -213,6 +255,9 @@ BOOL LLPanelGroup::postBuild()
|
|||
|
||||
LLVoiceClient::getInstance()->addObserver(this);
|
||||
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
mIsUsingTabContainer = (findChild<LLTabContainer>("groups_accordion") != NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -442,14 +487,39 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
|
|||
|
||||
getChild<LLUICtrl>("prepend_founded_by")->setVisible(!is_null_group_id);
|
||||
|
||||
LLAccordionCtrl* tab_ctrl = getChild<LLAccordionCtrl>("groups_accordion");
|
||||
tab_ctrl->reset();
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
//LLAccordionCtrl* tab_ctrl = getChild<LLAccordionCtrl>("groups_accordion");
|
||||
//tab_ctrl->reset();
|
||||
|
||||
LLAccordionCtrlTab* tab_general = getChild<LLAccordionCtrlTab>("group_general_tab");
|
||||
LLAccordionCtrlTab* tab_roles = getChild<LLAccordionCtrlTab>("group_roles_tab");
|
||||
LLAccordionCtrlTab* tab_notices = getChild<LLAccordionCtrlTab>("group_notices_tab");
|
||||
LLAccordionCtrlTab* tab_land = getChild<LLAccordionCtrlTab>("group_land_tab");
|
||||
LLAccordionCtrlTab* tab_experiences = getChild<LLAccordionCtrlTab>("group_experiences_tab");
|
||||
//LLAccordionCtrlTab* tab_general = getChild<LLAccordionCtrlTab>("group_general_tab");
|
||||
//LLAccordionCtrlTab* tab_roles = getChild<LLAccordionCtrlTab>("group_roles_tab");
|
||||
//LLAccordionCtrlTab* tab_notices = getChild<LLAccordionCtrlTab>("group_notices_tab");
|
||||
//LLAccordionCtrlTab* tab_land = getChild<LLAccordionCtrlTab>("group_land_tab");
|
||||
//LLAccordionCtrlTab* tab_experiences = getChild<LLAccordionCtrlTab>("group_experiences_tab");
|
||||
LLAccordionCtrl* tab_ctrl = NULL;
|
||||
LLAccordionCtrlTab* tab_general = NULL;
|
||||
LLAccordionCtrlTab* tab_roles = NULL;
|
||||
LLAccordionCtrlTab* tab_notices = NULL;
|
||||
LLAccordionCtrlTab* tab_land = NULL;
|
||||
LLAccordionCtrlTab* tab_experiences = NULL;
|
||||
LLTabContainer* tabcont_ctrl = NULL;
|
||||
|
||||
if (mIsUsingTabContainer)
|
||||
{
|
||||
tabcont_ctrl = getChild<LLTabContainer>("groups_accordion");
|
||||
}
|
||||
else
|
||||
{
|
||||
tab_ctrl = getChild<LLAccordionCtrl>("groups_accordion");
|
||||
tab_ctrl->reset();
|
||||
|
||||
tab_general = getChild<LLAccordionCtrlTab>("group_general_tab");
|
||||
tab_roles = getChild<LLAccordionCtrlTab>("group_roles_tab");
|
||||
tab_notices = getChild<LLAccordionCtrlTab>("group_notices_tab");
|
||||
tab_land = getChild<LLAccordionCtrlTab>("group_land_tab");
|
||||
tab_experiences = getChild<LLAccordionCtrlTab>("group_experiences_tab");
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
if(mButtonJoin)
|
||||
mButtonJoin->setVisible(false);
|
||||
|
|
@ -457,9 +527,20 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
|
|||
|
||||
if(is_null_group_id)//creating new group
|
||||
{
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
if (mIsUsingTabContainer)
|
||||
{
|
||||
for (S32 i = 1; i <= 4; ++i)
|
||||
{
|
||||
tabcont_ctrl->setTabVisibility(tabcont_ctrl->getPanelByIndex(i), false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// </FS:Ansariel>
|
||||
if(!tab_general->getDisplayChildren())
|
||||
tab_general->changeOpenClose(tab_general->getDisplayChildren());
|
||||
|
||||
|
||||
if(tab_roles->getDisplayChildren())
|
||||
tab_roles->changeOpenClose(tab_roles->getDisplayChildren());
|
||||
if(tab_notices->getDisplayChildren())
|
||||
|
|
@ -473,6 +554,9 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
|
|||
tab_notices->setVisible(false);
|
||||
tab_land->setVisible(false);
|
||||
tab_experiences->setVisible(false);
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
getChild<LLUICtrl>("group_name")->setVisible(false);
|
||||
getChild<LLUICtrl>("group_name_editor")->setVisible(true);
|
||||
|
|
@ -486,6 +570,14 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
|
|||
{
|
||||
if(!is_same_id)
|
||||
{
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
if (mIsUsingTabContainer)
|
||||
{
|
||||
tabcont_ctrl->selectFirstTab();
|
||||
}
|
||||
else
|
||||
{
|
||||
// </FS:Ansariel>
|
||||
if(!tab_general->getDisplayChildren())
|
||||
tab_general->changeOpenClose(tab_general->getDisplayChildren());
|
||||
if(tab_roles->getDisplayChildren())
|
||||
|
|
@ -496,15 +588,32 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
|
|||
tab_land->changeOpenClose(tab_land->getDisplayChildren());
|
||||
if(tab_experiences->getDisplayChildren())
|
||||
tab_experiences->changeOpenClose(tab_land->getDisplayChildren());
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
|
||||
LLGroupData agent_gdatap;
|
||||
bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlikeWithoutAdminMenuFakery();
|
||||
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
if (mIsUsingTabContainer)
|
||||
{
|
||||
for (S32 i = 1; i <= 4; ++i)
|
||||
{
|
||||
tabcont_ctrl->setTabVisibility(tabcont_ctrl->getPanelByIndex(i), is_member);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// </FS:Ansariel>
|
||||
tab_roles->setVisible(is_member);
|
||||
tab_notices->setVisible(is_member);
|
||||
tab_land->setVisible(is_member);
|
||||
tab_experiences->setVisible(is_member);
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
getChild<LLUICtrl>("group_name")->setVisible(true);
|
||||
getChild<LLUICtrl>("group_name_editor")->setVisible(false);
|
||||
|
|
@ -517,7 +626,13 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
|
|||
button_chat->setVisible(is_member);
|
||||
}
|
||||
|
||||
tab_ctrl->arrange();
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
//tab_ctrl->arrange();
|
||||
if (!mIsUsingTabContainer)
|
||||
{
|
||||
tab_ctrl->arrange();
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
reposButtons();
|
||||
update(GC_ALL);//show/hide "join" button if data is already ready
|
||||
|
|
|
|||
|
|
@ -120,6 +120,9 @@ protected:
|
|||
|
||||
LLButton* mButtonJoin;
|
||||
LLUICtrl* mJoinText;
|
||||
|
||||
// <FS:Ansariel> TabContainer switch
|
||||
bool mIsUsingTabContainer;
|
||||
};
|
||||
|
||||
class LLPanelGroupTab : public LLPanel
|
||||
|
|
|
|||
|
|
@ -650,7 +650,6 @@ BOOL LLPanelPeople::postBuild()
|
|||
// <FS:Ansariel> FIRE-4740: Friend counter in people panel
|
||||
mFriendsTabContainer = friends_tab->findChild<LLTabContainer>("friends_accordion");
|
||||
// <FS:Ansariel> Firestorm radar
|
||||
friends_tab->childSetAction("GlobalOnlineStatusToggle", boost::bind(&LLPanelPeople::onGlobalVisToggleButtonClicked, this));
|
||||
mOnlineFriendList = friends_tab->getChild<LLAvatarList>("avatars_online");
|
||||
mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all");
|
||||
mSuggestedFriends = friends_tab->getChild<LLAvatarList>("suggested_friends");
|
||||
|
|
@ -1747,47 +1746,6 @@ bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name)
|
|||
return isAccordionCollapsedByUser(getChild<LLUICtrl>(name));
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Firestorm radar
|
||||
void LLPanelPeople::onGlobalVisToggleButtonClicked()
|
||||
// Iterate through friends lists, toggling status permission on or off
|
||||
{
|
||||
bool vis = getChild<LLUICtrl>("GlobalOnlineStatusToggle")->getValue().asBoolean();
|
||||
gSavedSettings.setBOOL("GlobalOnlineStatusToggle", vis);
|
||||
|
||||
const LLAvatarTracker& av_tracker = LLAvatarTracker::instance();
|
||||
LLAvatarTracker::buddy_map_t all_buddies;
|
||||
av_tracker.copyBuddyList(all_buddies);
|
||||
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
|
||||
for (; buddy_it != all_buddies.end(); ++buddy_it)
|
||||
{
|
||||
LLUUID buddy_id = buddy_it->first;
|
||||
const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(buddy_id);
|
||||
if (relation == NULL)
|
||||
{
|
||||
// Lets have a warning log message instead of having a crash. EXT-4947.
|
||||
LL_WARNS() << "Trying to modify rights for non-friend avatar. Skipped." << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
S32 cur_rights = relation->getRightsGrantedTo();
|
||||
S32 new_rights = 0;
|
||||
if (vis)
|
||||
new_rights = LLRelationship::GRANT_ONLINE_STATUS + (cur_rights & LLRelationship::GRANT_MAP_LOCATION) + (cur_rights & LLRelationship::GRANT_MODIFY_OBJECTS);
|
||||
else
|
||||
new_rights = (cur_rights & LLRelationship::GRANT_MAP_LOCATION) + (cur_rights & LLRelationship::GRANT_MODIFY_OBJECTS);
|
||||
|
||||
LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(buddy_id,new_rights);
|
||||
}
|
||||
|
||||
mAllFriendList->showPermissions(true);
|
||||
mOnlineFriendList->showPermissions(true);
|
||||
|
||||
LLSD args;
|
||||
args["MESSAGE"] = getString("high_server_load");
|
||||
LLNotificationsUtil::add("GenericAlert", args);
|
||||
}
|
||||
// </FS:Ansariel> Firestorm radar
|
||||
|
||||
// [FS:CR] Contact sets
|
||||
void LLPanelPeople::updateContactSets(LGGContactSets::EContactSetUpdate type)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -147,10 +147,6 @@ private:
|
|||
bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
|
||||
bool isAccordionCollapsedByUser(const std::string& name);
|
||||
|
||||
// <FS:Ansariel> Firestorm callback handler
|
||||
void onGlobalVisToggleButtonClicked();
|
||||
// </FS:Ansariel> Firestorm callback handler
|
||||
|
||||
LLTabContainer* mTabContainer;
|
||||
LLAvatarList* mOnlineFriendList;
|
||||
LLAvatarList* mAllFriendList;
|
||||
|
|
|
|||
|
|
@ -368,7 +368,7 @@ F32 LLScriptFloater::getCurrentTransparency()
|
|||
{
|
||||
if (mNoTransparency)
|
||||
{
|
||||
return 1.0;
|
||||
return 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -224,6 +224,7 @@
|
|||
#include "fsregistrarutils.h"
|
||||
#include "fsscriptlibrary.h"
|
||||
#include "fswsassetblacklist.h"
|
||||
#include "lfsimfeaturehandler.h"
|
||||
#include "lggcontactsets.h"
|
||||
#include "llfloatersearch.h"
|
||||
#include "llfloatersidepanelcontainer.h"
|
||||
|
|
@ -388,13 +389,13 @@ public:
|
|||
{
|
||||
if (status == HTTP_INTERNAL_ERROR)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("SLGridStatusTimedOut"));
|
||||
report_to_nearby_chat(LLTrans::getString("SLGridStatusTimedOut"));
|
||||
}
|
||||
else
|
||||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["STATUS"] = llformat("%d", status);
|
||||
reportToNearbyChat(LLTrans::getString("SLGridStatusOtherError", args));
|
||||
report_to_nearby_chat(LLTrans::getString("SLGridStatusOtherError", args));
|
||||
}
|
||||
LL_WARNS("SLGridStatusResponder") << "Error - status " << status << LL_ENDL;
|
||||
return;
|
||||
|
|
@ -403,7 +404,7 @@ public:
|
|||
S32 outputSize = buffer->countAfter(channels.in(), NULL);
|
||||
if (outputSize <= 0)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("SLGridStatusInvalidMsg"));
|
||||
report_to_nearby_chat(LLTrans::getString("SLGridStatusInvalidMsg"));
|
||||
LL_WARNS("SLGridStatusResponder") << "Error - empty output" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
|
@ -477,17 +478,17 @@ public:
|
|||
LLStringUtil::trim(newsTitle);
|
||||
LLStringUtil::trim(newsDesc);
|
||||
LLStringUtil::trim(newsLink);
|
||||
reportToNearbyChat("[ " + newsTitle + " ] " + newsDesc + " [ " + newsLink + " ]");
|
||||
report_to_nearby_chat("[ " + newsTitle + " ] " + newsDesc + " [ " + newsLink + " ]");
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("SLGridStatusInvalidMsg"));
|
||||
report_to_nearby_chat(LLTrans::getString("SLGridStatusInvalidMsg"));
|
||||
LL_WARNS("SLGridStatusResponder") << "Error - inner tag(s) missing" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("SLGridStatusInvalidMsg"));
|
||||
report_to_nearby_chat(LLTrans::getString("SLGridStatusInvalidMsg"));
|
||||
LL_WARNS("SLGridStatusResponder") << "Error - output without </item>" << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
|
@ -604,7 +605,7 @@ bool idle_startup()
|
|||
gSavedSettings.setString("FSInternalSkinCurrent", gSavedSettings.getString("FSSkinCurrentReadableName"));
|
||||
gSavedSettings.setString("FSInternalSkinCurrentTheme", gSavedSettings.getString("FSSkinCurrentThemeReadableName"));
|
||||
// </FS:Ansariel>
|
||||
|
||||
|
||||
if (LLFeatureManager::getInstance()->isSafe())
|
||||
{
|
||||
LLNotificationsUtil::add("DisplaySetToSafe");
|
||||
|
|
@ -1787,7 +1788,7 @@ bool idle_startup()
|
|||
|
||||
// <FS:CR> Aurora Sim
|
||||
//LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim);
|
||||
LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim, first_sim_size_x, first_sim_size_y);
|
||||
LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim, first_sim_size_x, first_sim_size_y);
|
||||
// </FS:CR> Aurora Sim
|
||||
display_startup();
|
||||
|
||||
|
|
@ -1924,6 +1925,9 @@ LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim, first_sim_size_x,
|
|||
LLVoiceClient::getInstance()->updateSettings();
|
||||
display_startup();
|
||||
|
||||
// <FS:Ansariel> OpenSim support: Init with defaults - we get the OpenSimExtras later during login
|
||||
LFSimFeatureHandler::instance();
|
||||
|
||||
// create a container's instance for start a controlling conversation windows
|
||||
// by the voice's events
|
||||
// <FS:Ansariel> [FS communication UI]
|
||||
|
|
@ -2898,7 +2902,7 @@ LLWorld::getInstance()->addRegion(gFirstSimHandle, gFirstSim, first_sim_size_x,
|
|||
// <FS:Techwolf Lupindo> FIRE-6643 Display MOTD when login screens are disabled
|
||||
if (gSavedSettings.getBOOL("FSDisableLoginScreens"))
|
||||
{
|
||||
reportToNearbyChat(gAgent.mMOTD);
|
||||
report_to_nearby_chat(gAgent.mMOTD);
|
||||
}
|
||||
// </FS:Techwolf Lupindo>
|
||||
// <FS:PP>
|
||||
|
|
|
|||
|
|
@ -438,6 +438,186 @@ BOOL LLIMWellWindow::ObjectRowPanel::handleRightMouseDown(S32 x, S32 y, MASK mas
|
|||
return mChiclet->handleRightMouseDown(x, y, mask);
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Optional legacy notification well
|
||||
/************************************************************************/
|
||||
/* LLNotificationWellWindow implementation */
|
||||
/************************************************************************/
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// PUBLIC METHODS
|
||||
LLNotificationWellWindow::WellNotificationChannel::WellNotificationChannel(LLNotificationWellWindow* well_window)
|
||||
: LLNotificationChannel(LLNotificationChannel::Params().name(well_window->getPathname())),
|
||||
mWellWindow(well_window)
|
||||
{
|
||||
connectToChannel("Notifications");
|
||||
connectToChannel("Group Notifications");
|
||||
connectToChannel("Offer");
|
||||
}
|
||||
|
||||
LLNotificationWellWindow::LLNotificationWellWindow(const LLSD& key)
|
||||
: LLSysWellWindow(key)
|
||||
{
|
||||
mNotificationUpdates.reset(new WellNotificationChannel(this));
|
||||
mUpdateLocked = false;
|
||||
}
|
||||
|
||||
// static
|
||||
LLNotificationWellWindow* LLNotificationWellWindow::getInstance(const LLSD& key /*= LLSD()*/)
|
||||
{
|
||||
return LLFloaterReg::getTypedInstance<LLNotificationWellWindow>("notification_well_window", key);
|
||||
}
|
||||
|
||||
// virtual
|
||||
BOOL LLNotificationWellWindow::postBuild()
|
||||
{
|
||||
BOOL rv = LLSysWellWindow::postBuild();
|
||||
setTitle(getString("title_notification_well_window"));
|
||||
return rv;
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLNotificationWellWindow::setVisible(BOOL visible)
|
||||
{
|
||||
if (visible)
|
||||
{
|
||||
// when Notification channel is cleared, storable toasts will be added into the list.
|
||||
clearScreenChannels();
|
||||
}
|
||||
|
||||
LLSysWellWindow::setVisible(visible);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
void LLNotificationWellWindow::addItem(LLSysWellItem::Params p)
|
||||
{
|
||||
LLSD value = p.notification_id;
|
||||
// do not add clones
|
||||
if( mMessageList->getItemByValue(value))
|
||||
return;
|
||||
|
||||
LLSysWellItem* new_item = new LLSysWellItem(p);
|
||||
if (mMessageList->addItem(new_item, value, ADD_TOP, !mUpdateLocked))
|
||||
{
|
||||
if( !mUpdateLocked )
|
||||
{
|
||||
mSysWellChiclet->updateWidget(isWindowEmpty());
|
||||
reshapeWindow();
|
||||
}
|
||||
new_item->setOnItemCloseCallback(boost::bind(&LLNotificationWellWindow::onItemClose, this, _1));
|
||||
new_item->setOnItemClickCallback(boost::bind(&LLNotificationWellWindow::onItemClick, this, _1));
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Unable to add Notification into the list, notification ID: " << p.notification_id
|
||||
<< ", title: " << p.title
|
||||
<< LL_ENDL;
|
||||
|
||||
new_item->die();
|
||||
}
|
||||
}
|
||||
|
||||
void LLNotificationWellWindow::closeAll()
|
||||
{
|
||||
// Need to clear notification channel, to add storable toasts into the list.
|
||||
clearScreenChannels();
|
||||
std::vector<LLPanel*> items;
|
||||
mMessageList->getItems(items);
|
||||
|
||||
LLPersistentNotificationStorage::getInstance()->startBulkUpdate(); // <FS:ND/>
|
||||
|
||||
for (std::vector<LLPanel*>::iterator
|
||||
iter = items.begin(),
|
||||
iter_end = items.end();
|
||||
iter != iter_end; ++iter)
|
||||
{
|
||||
LLSysWellItem* sys_well_item = dynamic_cast<LLSysWellItem*>(*iter);
|
||||
if (sys_well_item)
|
||||
onItemClose(sys_well_item);
|
||||
}
|
||||
|
||||
// <FS:ND> All done, renable normal mode and save.
|
||||
LLPersistentNotificationStorage::getInstance()->endBulkUpdate();
|
||||
LLPersistentNotificationStorage::getInstance()->saveNotifications();
|
||||
// </FS:ND>
|
||||
}
|
||||
|
||||
void LLNotificationWellWindow::unlockWindowUpdate()
|
||||
{
|
||||
mUpdateLocked = false;
|
||||
mSysWellChiclet->updateWidget(isWindowEmpty());
|
||||
|
||||
// Let the list rearrange itself. This is normally called during addItem if the window is not locked.
|
||||
LLSD oNotify;
|
||||
oNotify["rearrange"] = 1;
|
||||
mMessageList->notify( oNotify );
|
||||
|
||||
reshapeWindow();
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// PRIVATE METHODS
|
||||
void LLNotificationWellWindow::initChannel()
|
||||
{
|
||||
LLSysWellWindow::initChannel();
|
||||
if(mChannel)
|
||||
{
|
||||
mChannel->addOnStoreToastCallback(boost::bind(&LLNotificationWellWindow::onStoreToast, this, _1, _2));
|
||||
}
|
||||
}
|
||||
|
||||
void LLNotificationWellWindow::clearScreenChannels()
|
||||
{
|
||||
// 1 - remove StartUp toast and channel if present
|
||||
if(!LLNotificationsUI::LLScreenChannel::getStartUpToastShown())
|
||||
{
|
||||
LLNotificationsUI::LLChannelManager::getInstance()->onStartUpToastClose();
|
||||
}
|
||||
|
||||
// 2 - remove toasts in Notification channel
|
||||
if(mChannel)
|
||||
{
|
||||
mChannel->removeAndStoreAllStorableToasts();
|
||||
}
|
||||
}
|
||||
|
||||
void LLNotificationWellWindow::onStoreToast(LLPanel* info_panel, LLUUID id)
|
||||
{
|
||||
LLSysWellItem::Params p;
|
||||
p.notification_id = id;
|
||||
p.title = static_cast<LLToastPanel*>(info_panel)->getTitle();
|
||||
addItem(p);
|
||||
}
|
||||
|
||||
void LLNotificationWellWindow::onItemClick(LLSysWellItem* item)
|
||||
{
|
||||
LLUUID id = item->getID();
|
||||
LLFloaterReg::showInstance("inspect_toast", id);
|
||||
}
|
||||
|
||||
void LLNotificationWellWindow::onItemClose(LLSysWellItem* item)
|
||||
{
|
||||
LLUUID id = item->getID();
|
||||
|
||||
if(mChannel)
|
||||
{
|
||||
// removeItemByID() is invoked from killToastByNotificationID() and item will removed;
|
||||
mChannel->killToastByNotificationID(id);
|
||||
}
|
||||
else
|
||||
{
|
||||
// removeItemByID() should be called one time for each item to remove it from notification well
|
||||
removeItemByID(id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLNotificationWellWindow::onAdd( LLNotificationPtr notify )
|
||||
{
|
||||
removeItemByID(notify->getID());
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
/************************************************************************/
|
||||
/* LLIMWellWindow implementation */
|
||||
/************************************************************************/
|
||||
|
|
|
|||
|
|
@ -102,6 +102,65 @@ protected:
|
|||
bool mIsReshapedByUser;
|
||||
};
|
||||
|
||||
// <FS:Ansariel> Optional legacy notification well
|
||||
/**
|
||||
* Class intended to manage incoming notifications.
|
||||
*
|
||||
* It contains a list of notifications that have not been responded to.
|
||||
*/
|
||||
class LLNotificationWellWindow : public LLSysWellWindow
|
||||
{
|
||||
bool mUpdateLocked;
|
||||
|
||||
public:
|
||||
LLNotificationWellWindow(const LLSD& key);
|
||||
static LLNotificationWellWindow* getInstance(const LLSD& key = LLSD());
|
||||
|
||||
/*virtual*/ BOOL postBuild();
|
||||
/*virtual*/ void setVisible(BOOL visible);
|
||||
/*virtual*/ void onAdd(LLNotificationPtr notify);
|
||||
// Operating with items
|
||||
void addItem(LLSysWellItem::Params p);
|
||||
|
||||
// Closes all notifications and removes them from the Notification Well
|
||||
void closeAll();
|
||||
|
||||
void lockWindowUpdate()
|
||||
{ mUpdateLocked = true; }
|
||||
void unlockWindowUpdate();
|
||||
|
||||
protected:
|
||||
struct WellNotificationChannel : public LLNotificationChannel
|
||||
{
|
||||
WellNotificationChannel(LLNotificationWellWindow*);
|
||||
void onDelete(LLNotificationPtr notify)
|
||||
{
|
||||
mWellWindow->removeItemByID(notify->getID());
|
||||
}
|
||||
|
||||
LLNotificationWellWindow* mWellWindow;
|
||||
};
|
||||
|
||||
LLNotificationChannelPtr mNotificationUpdates;
|
||||
/*virtual*/ const std::string& getAnchorViewName() { return NOTIFICATION_WELL_ANCHOR_NAME; }
|
||||
|
||||
private:
|
||||
// init Window's channel
|
||||
void initChannel();
|
||||
void clearScreenChannels();
|
||||
|
||||
void onStoreToast(LLPanel* info_panel, LLUUID id);
|
||||
|
||||
// Handlers
|
||||
void onItemClick(LLSysWellItem* item);
|
||||
void onItemClose(LLSysWellItem* item);
|
||||
|
||||
// ID of a toast loaded by user (by clicking notification well item)
|
||||
LLUUID mLoadedToastId;
|
||||
|
||||
};
|
||||
// </FS:Ansariel>
|
||||
|
||||
/**
|
||||
* Class intended to manage incoming messages in IM chats.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -131,17 +131,23 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(const LLNotificationPtr& notifi
|
|||
BOOL hasInventory = payload["inventory_offer"].isDefined();
|
||||
|
||||
// attachment container (if any)
|
||||
LLPanel* pAttachContainer = getChild<LLPanel>("attachment_container");
|
||||
LLPanel* pAttachContainer = findChild<LLPanel>("attachment_container");
|
||||
// attachment container label (if any)
|
||||
LLTextBox* pAttachContainerLabel = getChild<LLTextBox>("attachment_label");
|
||||
LLTextBox* pAttachContainerLabel = findChild<LLTextBox>("attachment_label");
|
||||
//attachment text
|
||||
LLTextBox * pAttachLink = getChild<LLTextBox>("attachment");
|
||||
//attachment icon
|
||||
LLIconCtrl* pAttachIcon = getChild<LLIconCtrl>("attachment_icon", TRUE);
|
||||
|
||||
//If attachment is empty let it be invisible and not take place at the panel
|
||||
pAttachContainer->setVisible(hasInventory);
|
||||
pAttachContainerLabel->setVisible(hasInventory);
|
||||
if (pAttachContainer)
|
||||
{
|
||||
pAttachContainer->setVisible(hasInventory);
|
||||
}
|
||||
if (pAttachContainerLabel)
|
||||
{
|
||||
pAttachContainerLabel->setVisible(hasInventory);
|
||||
}
|
||||
pAttachLink->setVisible(hasInventory);
|
||||
pAttachIcon->setVisible(hasInventory);
|
||||
if (hasInventory) {
|
||||
|
|
@ -260,7 +266,7 @@ F32 LLToastGroupNotifyPanel::getCurrentTransparency()
|
|||
{
|
||||
if (gSavedSettings.getBOOL("FSGroupNotifyNoTransparency"))
|
||||
{
|
||||
return 1.0;
|
||||
return 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -40,6 +40,8 @@
|
|||
#include "llviewerchat.h"
|
||||
#include "llviewercontrol.h"
|
||||
|
||||
#include "fscommon.h"
|
||||
|
||||
const S32 LLToastIMPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT = 6;
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
|
|
@ -75,8 +77,11 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif
|
|||
}
|
||||
|
||||
//Handle IRC styled /me messages.
|
||||
std::string prefix = p.message.substr(0, 4);
|
||||
if (prefix == "/me " || prefix == "/me'")
|
||||
// <FS:Ansariel> Consolidate IRC /me prefix checks
|
||||
//std::string prefix = p.message.substr(0, 4);
|
||||
//if (prefix == "/me " || prefix == "/me'")
|
||||
if (is_irc_me_prefix(p.message))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
//style_params.font.style = "UNDERLINE";
|
||||
mMessage->clear();
|
||||
|
|
|
|||
|
|
@ -81,6 +81,8 @@
|
|||
|
||||
// Firestorm inclues
|
||||
#include "fsfloatercontacts.h"
|
||||
#include "fsfloaterim.h"
|
||||
#include "fsfloaternearbychat.h"
|
||||
#include "fsfloaterposestand.h"
|
||||
#include "fsfloaterteleporthistory.h"
|
||||
#include "fslslbridge.h"
|
||||
|
|
@ -810,6 +812,44 @@ void handleKeyboardLayoutChanged(const LLSD& newvalue)
|
|||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// <FS:Ansariel> Global online status toggle
|
||||
void handleGlobalOnlineStatusChanged(const LLSD& newvalue)
|
||||
{
|
||||
bool visible = newvalue.asBoolean();
|
||||
|
||||
LLAvatarTracker::buddy_map_t all_buddies;
|
||||
LLAvatarTracker::instance().copyBuddyList(all_buddies);
|
||||
|
||||
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
|
||||
for (; buddy_it != all_buddies.end(); ++buddy_it)
|
||||
{
|
||||
LLUUID buddy_id = buddy_it->first;
|
||||
const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(buddy_id);
|
||||
if (relation == NULL)
|
||||
{
|
||||
// Lets have a warning log message instead of having a crash. EXT-4947.
|
||||
LL_WARNS() << "Trying to modify rights for non-friend avatar. Skipped." << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
S32 cur_rights = relation->getRightsGrantedTo();
|
||||
S32 new_rights = 0;
|
||||
if (visible)
|
||||
{
|
||||
new_rights = LLRelationship::GRANT_ONLINE_STATUS + (cur_rights & LLRelationship::GRANT_MAP_LOCATION) + (cur_rights & LLRelationship::GRANT_MODIFY_OBJECTS);
|
||||
}
|
||||
else
|
||||
{
|
||||
new_rights = (cur_rights & LLRelationship::GRANT_MAP_LOCATION) + (cur_rights & LLRelationship::GRANT_MODIFY_OBJECTS);
|
||||
}
|
||||
|
||||
LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(buddy_id, new_rights);
|
||||
}
|
||||
|
||||
LLNotificationsUtil::add("GlobalOnlineStatusToggle");
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void settings_setup_listeners()
|
||||
|
|
@ -1004,7 +1044,17 @@ void settings_setup_listeners()
|
|||
|
||||
gSavedSettings.getControl("FSUseAzertyKeyboardLayout")->getCommitSignal()->connect(boost::bind(&handleKeyboardLayoutChanged, _2));
|
||||
|
||||
// <FS:Ansariel> [FS communication UI]
|
||||
gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&FSFloaterIM::processChatHistoryStyleUpdate, _2));
|
||||
gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&FSFloaterNearbyChat::processChatHistoryStyleUpdate, _2));
|
||||
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&FSFloaterIM::processChatHistoryStyleUpdate, _2));
|
||||
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&FSFloaterNearbyChat::processChatHistoryStyleUpdate, _2));
|
||||
gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLViewerChat::signalChatFontChanged));
|
||||
// </FS:Ansariel> [FS communication UI]
|
||||
|
||||
gSavedSettings.getControl(RLV_SETTING_MAIN)->getSignal()->connect(boost::bind(&RlvSettings::onChangedSettingMain, _2));
|
||||
|
||||
gSavedPerAccountSettings.getControl("GlobalOnlineStatusToggle")->getSignal()->connect(boost::bind(&handleGlobalOnlineStatusChanged, _2));
|
||||
}
|
||||
|
||||
#if TEST_CACHED_CONTROL
|
||||
|
|
|
|||
|
|
@ -325,7 +325,17 @@ void LLViewerFloaterReg::registerFloaters()
|
|||
|
||||
LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);
|
||||
|
||||
LLFloaterReg::add("notification_well_window", "floater_notifications_tabbed.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationsTabbed>);
|
||||
// <FS:Ansariel> Optional legacy notification well
|
||||
//LLFloaterReg::add("notification_well_window", "floater_notifications_tabbed.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationsTabbed>);
|
||||
if (!gSavedSettings.getBOOL("FSInternalLegacyNotificationWell"))
|
||||
{
|
||||
LLFloaterReg::add("notification_well_window", "floater_notifications_tabbed.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationsTabbed>);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLFloaterReg::add("notification_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNotificationWellWindow>);
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
||||
LLFloaterReg::add("object_weights", "floater_object_weights.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterObjectWeights>);
|
||||
LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
|
||||
|
|
|
|||
|
|
@ -148,6 +148,7 @@
|
|||
#include "fsfloatercontacts.h" // <FS:Zi> Display group list in contacts floater
|
||||
#include "fspose.h" // <FS:CR> FIRE-4345: Undeform
|
||||
#include "fswsassetblacklist.h"
|
||||
#include "lfsimfeaturehandler.h"
|
||||
#include "llavatarpropertiesprocessor.h" // ## Zi: Texture Refresh
|
||||
#include "llsdserialize.h"
|
||||
#include "lltexturecache.h" // ## Zi: Texture Refresh
|
||||
|
|
@ -830,16 +831,16 @@ class LLAdvancedToggleHUDInfo : public view_listener_t
|
|||
}
|
||||
else if ("badge" == info_type)
|
||||
{
|
||||
reportToNearbyChat("Hippos!");
|
||||
report_to_nearby_chat("Hippos!");
|
||||
}
|
||||
else if ("cookies" == info_type)
|
||||
{
|
||||
reportToNearbyChat("Cookies!");
|
||||
report_to_nearby_chat("Cookies!");
|
||||
}
|
||||
// <FS:PP>
|
||||
else if ("motd" == info_type)
|
||||
{
|
||||
reportToNearbyChat(gAgent.mMOTD);
|
||||
report_to_nearby_chat(gAgent.mMOTD);
|
||||
}
|
||||
// </FS:PP>
|
||||
return true;
|
||||
|
|
@ -4448,11 +4449,11 @@ class FSSelfToggleMoveLock : public view_listener_t
|
|||
gSavedPerAccountSettings.setBOOL("UseMoveLock", new_value);
|
||||
if (new_value)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("MovelockEnabling"));
|
||||
report_to_nearby_chat(LLTrans::getString("MovelockEnabling"));
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("MovelockDisabling"));
|
||||
report_to_nearby_chat(LLTrans::getString("MovelockDisabling"));
|
||||
}
|
||||
}
|
||||
#ifdef OPENSIM
|
||||
|
|
@ -8748,7 +8749,7 @@ void handle_selected_texture_info(void*)
|
|||
//LLSD args;
|
||||
//args["MESSAGE"] = msg;
|
||||
//LLNotificationsUtil::add("SystemMessage", args);
|
||||
reportToNearbyChat(msg);
|
||||
report_to_nearby_chat(msg);
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
}
|
||||
|
|
@ -8877,7 +8878,28 @@ class LLCheckControl : public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
// <FS:Ansariel> Reset to default control
|
||||
// <FS:Ansariel> Control enhancements
|
||||
class LLTogglePerAccountControl : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
std::string control_name = userdata.asString();
|
||||
BOOL checked = gSavedPerAccountSettings.getBOOL( control_name );
|
||||
gSavedPerAccountSettings.setBOOL( control_name, !checked );
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class LLCheckPerAccountControl : public view_listener_t
|
||||
{
|
||||
bool handleEvent( const LLSD& userdata)
|
||||
{
|
||||
std::string callback_data = userdata.asString();
|
||||
bool new_value = gSavedPerAccountSettings.getBOOL(callback_data);
|
||||
return new_value;
|
||||
}
|
||||
};
|
||||
|
||||
class FSResetControl : public view_listener_t
|
||||
{
|
||||
bool handleEvent( const LLSD& userdata)
|
||||
|
|
@ -8896,7 +8918,7 @@ class FSResetPerAccountControl : public view_listener_t
|
|||
return true;
|
||||
}
|
||||
};
|
||||
// </FS:Ansariel> Reset to default control
|
||||
// </FS:Ansariel> Control enhancements
|
||||
|
||||
// not so generic
|
||||
|
||||
|
|
@ -8964,13 +8986,13 @@ class LLAdvancedToggleDoubleClickTeleport: public view_listener_t
|
|||
if (checked)
|
||||
{
|
||||
gSavedSettings.setBOOL("DoubleClickTeleport", FALSE);
|
||||
reportToNearbyChat(LLTrans::getString("DoubleClickTeleportDisabled"));
|
||||
report_to_nearby_chat(LLTrans::getString("DoubleClickTeleportDisabled"));
|
||||
}
|
||||
else
|
||||
{
|
||||
gSavedSettings.setBOOL("DoubleClickTeleport", TRUE);
|
||||
gSavedSettings.setBOOL("DoubleClickAutoPilot", FALSE);
|
||||
reportToNearbyChat(LLTrans::getString("DoubleClickTeleportEnabled"));
|
||||
report_to_nearby_chat(LLTrans::getString("DoubleClickTeleportEnabled"));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -9365,7 +9387,7 @@ class FSDumpSimulatorFeaturesToChat : public view_listener_t
|
|||
std::stringstream out_str;
|
||||
region->getSimulatorFeatures(sim_features);
|
||||
LLSDSerialize::toPrettyXML(sim_features, out_str);
|
||||
reportToNearbyChat(out_str.str());
|
||||
report_to_nearby_chat(out_str.str());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -9391,38 +9413,58 @@ class FSAddToContactSet : public view_listener_t
|
|||
// </FS:CR> Add to contact set
|
||||
|
||||
// <FS:CR> Opensim menu item visibility control
|
||||
class LLGridCheck : public view_listener_t
|
||||
bool checkIsGrid(const LLSD& userdata)
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
std::string grid_type = userdata.asString();
|
||||
if ("secondlife" == grid_type)
|
||||
{
|
||||
std::string grid_type = userdata.asString();
|
||||
if ("secondlife" == grid_type)
|
||||
{
|
||||
return LLGridManager::getInstance()->isInSecondLife();
|
||||
}
|
||||
return LLGridManager::getInstance()->isInSecondLife();
|
||||
}
|
||||
#ifdef OPENSIM
|
||||
else if ("opensim" == grid_type)
|
||||
{
|
||||
return LLGridManager::getInstance()->isInOpenSim();
|
||||
}
|
||||
else if ("aurorasim" == grid_type)
|
||||
{
|
||||
return LLGridManager::getInstance()->isInAuroraSim();
|
||||
}
|
||||
else if ("opensim" == grid_type)
|
||||
{
|
||||
return LLGridManager::getInstance()->isInOpenSim();
|
||||
}
|
||||
else if ("aurorasim" == grid_type)
|
||||
{
|
||||
return LLGridManager::getInstance()->isInAuroraSim();
|
||||
}
|
||||
#else // !OPENSIM
|
||||
else if ("opensim" == grid_type || "aurorasim" == grid_type)
|
||||
{
|
||||
LL_DEBUGS("ViewerMenu") << grid_type << "is not a supported platform on Havok builds. Disabling item." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
else if ("opensim" == grid_type || "aurorasim" == grid_type)
|
||||
{
|
||||
LL_DEBUGS("ViewerMenu") << grid_type << "is not a supported platform on Havok builds. Disabling item." << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
#endif // OPENSIM
|
||||
else
|
||||
{
|
||||
LL_WARNS("ViewerMenu") << "Unhandled or bad on_visible gridcheck parameter! (" << grid_type << ")" << LL_ENDL;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool isGridFeatureEnabled(const LLSD& userdata)
|
||||
{
|
||||
if (LFSimFeatureHandler::instanceExists())
|
||||
{
|
||||
const std::string feature = userdata.asString();
|
||||
|
||||
if (feature == "avatar_picker")
|
||||
{
|
||||
return LFSimFeatureHandler::instance().hasAvatarPicker();
|
||||
}
|
||||
else if (feature == "destination_guide")
|
||||
{
|
||||
return LFSimFeatureHandler::instance().hasDestinationGuide();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("ViewerMenu") << "Unhandled or bad on_visible gridcheck parameter! (" << grid_type << ")" << LL_ENDL;
|
||||
LL_WARNS("ViewerMenu") << "Unhandled or bad grid feature check parameter! (" << feature << ")" << LL_ENDL;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
return false;
|
||||
}
|
||||
// </FS:CR>
|
||||
|
||||
class LLToolsSelectOnlyMyObjects : public view_listener_t
|
||||
|
|
@ -10773,7 +10815,8 @@ void initialize_menus()
|
|||
// <FS:Ansariel> [FS communication UI]
|
||||
//enable.add("Conversation.IsConversationLoggingAllowed", boost::bind(&LLFloaterIMContainer::isConversationLoggingAllowed));
|
||||
|
||||
view_listener_t::addEnable(new LLGridCheck(), "GridCheck"); // <FS:CR> Opensim menu item visibility control
|
||||
enable.add("GridCheck", boost::bind(&checkIsGrid, _2)); // <FS:CR> Opensim menu item visibility control
|
||||
enable.add("GridFeatureCheck", boost::bind(&isGridFeatureEnabled, _2));
|
||||
|
||||
// Agent
|
||||
commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying));
|
||||
|
|
@ -11262,10 +11305,12 @@ void initialize_menus()
|
|||
view_listener_t::addMenu(new LLGoToObject(), "GoToObject");
|
||||
commit.add("PayObject", boost::bind(&handle_give_money_dialog));
|
||||
|
||||
// <FS:Ansariel> Reset to default control
|
||||
// <FS:Ansariel> Control enhancements
|
||||
view_listener_t::addMenu(new LLTogglePerAccountControl(), "TogglePerAccountControl");
|
||||
view_listener_t::addMenu(new LLCheckPerAccountControl(), "CheckPerAccountControl");
|
||||
view_listener_t::addMenu(new FSResetControl(), "ResetControl");
|
||||
view_listener_t::addMenu(new FSResetPerAccountControl(), "ResetPerAccountControl");
|
||||
// </FS:Ansariel> Reset to default control
|
||||
// </FS:Ansariel> Control enhancements
|
||||
|
||||
commit.add("Inventory.NewWindow", boost::bind(&LLFloaterInventory::showAgentInventory));
|
||||
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@
|
|||
#include "fswsassetblacklist.h"
|
||||
#include "llfloaterbump.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfriendcard.h"
|
||||
#include "llgiveinventory.h"
|
||||
#include "lltexturefetch.h"
|
||||
#include "rlvactions.h"
|
||||
|
|
@ -1129,6 +1130,17 @@ protected:
|
|||
LL_DEBUGS("Inventory_Move") << "Found asset UUID: " << asset_uuid << LL_ENDL;
|
||||
was_moved = true;
|
||||
}
|
||||
// <FS:Ansariel> We might end up here if LLFriendCardsManager tries to sync the friend cards at login
|
||||
// and that might pop up the inventory window for extra annoyance -> silence this!
|
||||
else if (added_item->getActualType() == LLAssetType::AT_CALLINGCARD)
|
||||
{
|
||||
if (LLFriendCardsManager::instance().isAvatarDataStored(added_item->getCreatorUUID()))
|
||||
{
|
||||
LL_DEBUGS("FriendCard") << "Skipping added calling card from friend cards sync: " << added_item->getCreatorUUID().asString() << LL_ENDL;
|
||||
was_moved = true;
|
||||
}
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3611,8 +3623,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
|
|||
args["slurl"] = location;
|
||||
|
||||
// Look for IRC-style emotes here so object name formatting is correct
|
||||
std::string prefix = message.substr(0, 4);
|
||||
if (prefix == "/me " || prefix == "/me'")
|
||||
// <FS:Ansariel> Consolidate IRC /me prefix checks
|
||||
//std::string prefix = message.substr(0, 4);
|
||||
//if (prefix == "/me " || prefix == "/me'")
|
||||
if (is_irc_me_prefix(message))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
chat.mChatStyle = CHAT_STYLE_IRC;
|
||||
}
|
||||
|
|
@ -4623,8 +4638,11 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
|
|||
BOOL ircstyle = FALSE;
|
||||
|
||||
// Look for IRC-style emotes here so chatbubbles work
|
||||
std::string prefix = mesg.substr(0, 4);
|
||||
if (prefix == "/me " || prefix == "/me'")
|
||||
// <FS:Ansariel> Consolidate IRC /me prefix checks
|
||||
//std::string prefix = mesg.substr(0, 4);
|
||||
//if (prefix == "/me " || prefix == "/me'")
|
||||
if (is_irc_me_prefix(mesg))
|
||||
// </FS:Ansariel>
|
||||
{
|
||||
ircstyle = TRUE;
|
||||
}
|
||||
|
|
@ -6293,11 +6311,11 @@ void process_sim_stats(LLMessageSystem *msg, void **user_data)
|
|||
|
||||
if (change_count > 0)
|
||||
{
|
||||
reportToNearbyChat(formatString(increase_message, args));
|
||||
report_to_nearby_chat(format_string(increase_message, args));
|
||||
}
|
||||
else if (change_count < 0)
|
||||
{
|
||||
reportToNearbyChat(formatString(decrease_message, args));
|
||||
report_to_nearby_chat(format_string(decrease_message, args));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -7568,7 +7586,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
|
|||
// </FS:Ansariel>
|
||||
|
||||
make_ui_sound("UISndRestart");
|
||||
reportToNearbyChat(LLTrans::getString("FSRegionRestartInLocalChat")); // <FS:PP> FIRE-6307: Region restart notices in local chat
|
||||
report_to_nearby_chat(LLTrans::getString("FSRegionRestartInLocalChat")); // <FS:PP> FIRE-6307: Region restart notices in local chat
|
||||
}
|
||||
|
||||
// <FS:Ansariel> FIRE-9858: Kill annoying "Autopilot canceled" toast
|
||||
|
|
@ -7793,7 +7811,7 @@ void process_alert_core(const std::string& message, BOOL modal)
|
|||
}
|
||||
|
||||
make_ui_sound("UISndRestartOpenSim");
|
||||
reportToNearbyChat(LLTrans::getString("FSRegionRestartInLocalChat")); // <FS:PP> FIRE-6307: Region restart notices in local chat
|
||||
report_to_nearby_chat(LLTrans::getString("FSRegionRestartInLocalChat")); // <FS:PP> FIRE-6307: Region restart notices in local chat
|
||||
return;
|
||||
}
|
||||
// </FS:Ansariel>
|
||||
|
|
@ -7958,7 +7976,7 @@ void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **use
|
|||
action = LLTrans::getString("Collision_UnknownType", args);
|
||||
return;
|
||||
}
|
||||
reportToNearbyChat(action);
|
||||
report_to_nearby_chat(action);
|
||||
}
|
||||
// </FS:Ansariel> Nearby Chat Collision Messages
|
||||
// <FS:Ansariel> Report Collision Messages to scripts
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@
|
|||
|
||||
#include "lltrans.h"
|
||||
#include "llvieweraudio.h"
|
||||
#include "fscommon.h" // <FS:CR> For media filter reportToNearbyChat
|
||||
#include "fscommon.h" // <FS:CR> For media filter report_to_nearby_chat
|
||||
|
||||
// Static Variables
|
||||
|
||||
|
|
@ -926,7 +926,7 @@ void LLViewerParcelMedia::filterMediaUrl(LLParcel* parcel)
|
|||
{
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterMediaContentBlocked", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterMediaContentBlocked", format_args));
|
||||
sMediaLastActionPlay = false;
|
||||
}
|
||||
else
|
||||
|
|
@ -1007,7 +1007,7 @@ void callback_media_alert2(const LLSD ¬ification, const LLSD &response, LLPar
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterMediaContentDomainAlwaysAllowed", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterMediaContentDomainAlwaysAllowed", format_args));
|
||||
LLViewerParcelMedia::sCurrentMedia = *parcel;
|
||||
if (parcel->getName() == currentparcel->getName())
|
||||
{
|
||||
|
|
@ -1024,7 +1024,7 @@ void callback_media_alert2(const LLSD ¬ification, const LLSD &response, LLPar
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterMediaContentDomainAlwaysBlocked", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterMediaContentDomainAlwaysBlocked", format_args));
|
||||
}
|
||||
else if ((option == 2) && allow) // Whitelist URL
|
||||
{
|
||||
|
|
@ -1035,7 +1035,7 @@ void callback_media_alert2(const LLSD ¬ification, const LLSD &response, LLPar
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[MEDIAURL]"] = media_url;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterMediaContentUrlAlwaysAllowed", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterMediaContentUrlAlwaysAllowed", format_args));
|
||||
LLViewerParcelMedia::sCurrentMedia = *parcel;
|
||||
if (parcel->getName() == currentparcel->getName())
|
||||
{
|
||||
|
|
@ -1052,7 +1052,7 @@ void callback_media_alert2(const LLSD ¬ification, const LLSD &response, LLPar
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[MEDIAURL]"] = media_url;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterMediaContentUrlAlwaysBlocked", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterMediaContentUrlAlwaysBlocked", format_args));
|
||||
}
|
||||
|
||||
// We've dealt with the alert, so mark it as inactive.
|
||||
|
|
@ -1132,7 +1132,7 @@ void callback_media_alert_single(const LLSD ¬ification, const LLSD &response,
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterMediaContentDomainAlwaysBlocked", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterMediaContentDomainAlwaysBlocked", format_args));
|
||||
}
|
||||
else if (option == 3) // Whitelist domain
|
||||
{
|
||||
|
|
@ -1143,7 +1143,7 @@ void callback_media_alert_single(const LLSD ¬ification, const LLSD &response,
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterMediaContentDomainAlwaysAllowed", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterMediaContentDomainAlwaysAllowed", format_args));
|
||||
LLViewerParcelMedia::sCurrentMedia = *parcel;
|
||||
if (parcel->getName() == currentparcel->getName())
|
||||
{
|
||||
|
|
@ -1347,7 +1347,7 @@ void LLViewerParcelMedia::filterAudioUrl(std::string media_url)
|
|||
{
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterAudioContentBlocked", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterAudioContentBlocked", format_args));
|
||||
LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
|
||||
sAudioLastActionPlay = false;
|
||||
}
|
||||
|
|
@ -1430,7 +1430,7 @@ void callback_audio_alert2(const LLSD ¬ification, const LLSD &response, std::
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterAudioContentDomainAlwaysAllowed", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterAudioContentDomainAlwaysAllowed", format_args));
|
||||
if (gAudiop != NULL)
|
||||
{
|
||||
LLViewerParcelMedia::sCurrentMusic = media_url;
|
||||
|
|
@ -1447,7 +1447,7 @@ void callback_audio_alert2(const LLSD ¬ification, const LLSD &response, std::
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterAudioContentDomainAlwaysBlocked", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterAudioContentDomainAlwaysBlocked", format_args));
|
||||
if (gAudiop != NULL)
|
||||
{
|
||||
LLViewerParcelMedia::sCurrentMusic = "";
|
||||
|
|
@ -1464,7 +1464,7 @@ void callback_audio_alert2(const LLSD ¬ification, const LLSD &response, std::
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[MEDIAURL]"] = media_url;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterAudioContentUrlAlwaysAllowed", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterAudioContentUrlAlwaysAllowed", format_args));
|
||||
if (gAudiop != NULL)
|
||||
{
|
||||
LLViewerParcelMedia::sCurrentMusic = media_url;
|
||||
|
|
@ -1481,7 +1481,7 @@ void callback_audio_alert2(const LLSD ¬ification, const LLSD &response, std::
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[MEDIAURL]"] = media_url;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterAudioContentUrlAlwaysBlocked", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterAudioContentUrlAlwaysBlocked", format_args));
|
||||
if (gAudiop != NULL)
|
||||
{
|
||||
LLViewerParcelMedia::sCurrentMusic = "";
|
||||
|
|
@ -1567,7 +1567,7 @@ void callback_audio_alert_single(const LLSD ¬ification, const LLSD &response,
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterAudioContentDomainAlwaysAllowed", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterAudioContentDomainAlwaysAllowed", format_args));
|
||||
if (gAudiop != NULL)
|
||||
{
|
||||
LLViewerParcelMedia::sCurrentMusic = media_url;
|
||||
|
|
@ -1584,7 +1584,7 @@ void callback_audio_alert_single(const LLSD ¬ification, const LLSD &response,
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterAudioContentDomainAlwaysBlocked", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterAudioContentDomainAlwaysBlocked", format_args));
|
||||
if (gAudiop != NULL)
|
||||
{
|
||||
LLViewerParcelMedia::sCurrentMusic = "";
|
||||
|
|
@ -1775,7 +1775,7 @@ void LLViewerParcelMedia::filterMOAPUrl(LLMediaDataClientObject *object, LLObjec
|
|||
{
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterSharedMediaContentBlocked", domain));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterSharedMediaContentBlocked", domain));
|
||||
sAudioLastActionPlay = false;
|
||||
}
|
||||
else
|
||||
|
|
@ -1849,7 +1849,7 @@ void callback_MOAP_alert2(const LLSD ¬ification, const LLSD &response, LLMedi
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterSharedMediaContentDomainAlwaysAllowed", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterSharedMediaContentDomainAlwaysAllowed", format_args));
|
||||
nav_object->doNavigate(object, texture_index, media_url);
|
||||
LLViewerParcelMedia::sCurrentMOAP = media_url;
|
||||
LLViewerParcelMedia::sMOAPLastActionPlay = true;
|
||||
|
|
@ -1863,7 +1863,7 @@ void callback_MOAP_alert2(const LLSD ¬ification, const LLSD &response, LLMedi
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[DOMAIN]"] = domain;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterSharedMediaContentDomainAlwaysBlocked", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterSharedMediaContentDomainAlwaysBlocked", format_args));
|
||||
LLViewerParcelMedia::sCurrentMOAP = "";
|
||||
LLViewerParcelMedia::sMOAPLastActionPlay = false;
|
||||
}
|
||||
|
|
@ -1876,7 +1876,7 @@ void callback_MOAP_alert2(const LLSD ¬ification, const LLSD &response, LLMedi
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[MEDIAURL]"] = media_url;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterSharedMediaContentUrlAlwaysAllowed", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterSharedMediaContentUrlAlwaysAllowed", format_args));
|
||||
nav_object->doNavigate(object, texture_index, media_url);
|
||||
LLViewerParcelMedia::sCurrentMOAP = media_url;
|
||||
LLViewerParcelMedia::sMOAPLastActionPlay = true;
|
||||
|
|
@ -1890,7 +1890,7 @@ void callback_MOAP_alert2(const LLSD ¬ification, const LLSD &response, LLMedi
|
|||
LLViewerParcelMedia::saveDomainFilterList();
|
||||
LLStringUtil::format_map_t format_args;
|
||||
format_args["[MEDIAURL]"] = media_url;
|
||||
reportToNearbyChat(LLTrans::getString("MediaFilterSharedMediaContentUrlAlwaysBlocked", format_args));
|
||||
report_to_nearby_chat(LLTrans::getString("MediaFilterSharedMediaContentUrlAlwaysBlocked", format_args));
|
||||
LLViewerParcelMedia::sCurrentMOAP = "";
|
||||
LLViewerParcelMedia::sMOAPLastActionPlay = false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@
|
|||
#include "llweb.h"
|
||||
#include "llvieweraudio.h"
|
||||
#include "kcwlinterface.h"
|
||||
#include "llviewernetwork.h"
|
||||
|
||||
const F32 PARCEL_COLLISION_DRAW_SECS = 1.f;
|
||||
|
||||
|
|
@ -1661,9 +1662,6 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
|
|||
instance->mTeleportFinishedSignal(instance->mTeleportInProgressPosition, false);
|
||||
}
|
||||
}
|
||||
|
||||
//KC: check for parcel changes for WL settings
|
||||
KCWindlightInterface::instance().ParcelChange();
|
||||
}
|
||||
else if (local_id == parcel_mgr.mAgentParcel->getLocalID())
|
||||
{
|
||||
|
|
@ -1744,7 +1742,21 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
|
|||
}
|
||||
|
||||
// Request access list information for this land
|
||||
// <FS:Ansariel> FIRE-17280: Requesting Experience access allow & block list breaks OpenSim
|
||||
//parcel_mgr.sendParcelAccessListRequest(AL_ACCESS | AL_BAN | AL_ALLOW_EXPERIENCE | AL_BLOCK_EXPERIENCE);
|
||||
#if OPENSIM
|
||||
if (LLGridManager::instance().isInSecondLife())
|
||||
{
|
||||
parcel_mgr.sendParcelAccessListRequest(AL_ACCESS | AL_BAN | AL_ALLOW_EXPERIENCE | AL_BLOCK_EXPERIENCE);
|
||||
}
|
||||
else
|
||||
{
|
||||
parcel_mgr.sendParcelAccessListRequest(AL_ACCESS | AL_BAN);
|
||||
}
|
||||
#else
|
||||
parcel_mgr.sendParcelAccessListRequest(AL_ACCESS | AL_BAN | AL_ALLOW_EXPERIENCE | AL_BLOCK_EXPERIENCE);
|
||||
#endif
|
||||
// </FS:Ansariel
|
||||
|
||||
// Request dwell for this land, if it's not public land.
|
||||
parcel_mgr.mSelectedDwell = DWELL_NAN;
|
||||
|
|
|
|||
|
|
@ -86,6 +86,7 @@
|
|||
#endif
|
||||
// </FS:CR>
|
||||
#include "llviewermenu.h"
|
||||
#include "lfsimfeaturehandler.h"
|
||||
|
||||
#ifdef LL_WINDOWS
|
||||
#pragma warning(disable:4355)
|
||||
|
|
@ -1977,7 +1978,7 @@ const LLViewerRegion::tex_matrix_t& LLViewerRegion::getWorldMapTiles() const
|
|||
for (U32 x = 0; x != totalX; ++x)
|
||||
for (U32 y = 0; y != totalY; ++y)
|
||||
{
|
||||
const std::string map_url = gSavedSettings.getString("CurrentMapServerURL") + llformat("map-1-%d-%d-objects.jpg", gridX + x, gridY + y);
|
||||
const std::string map_url = LFSimFeatureHandler::instance().mapServerURL() + llformat("map-1-%d-%d-objects.jpg", gridX + x, gridY + y);
|
||||
LLPointer<LLViewerTexture> tex(LLViewerTextureManager::getFetchedTextureFromUrl(map_url, FTT_MAP_TILE, TRUE,
|
||||
LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
|
||||
mWorldMapTiles.push_back(tex);
|
||||
|
|
|
|||
|
|
@ -4775,7 +4775,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picke
|
|||
{
|
||||
LLStringUtil::format_map_t args;
|
||||
args["FILENAME"] = filepath;
|
||||
reportToNearbyChat(LLTrans::getString("SnapshotSavedToDisk", args));
|
||||
report_to_nearby_chat(LLTrans::getString("SnapshotSavedToDisk", args));
|
||||
}
|
||||
//</FS:Kadah>
|
||||
return image->save(filepath);
|
||||
|
|
|
|||
|
|
@ -6330,19 +6330,13 @@ LLViewerJointAttachment* LLVOAvatar::getTargetAttachmentPoint(LLViewerObject* vi
|
|||
|
||||
if (!attachment)
|
||||
{
|
||||
if(attachmentID != 127 && !((attachmentID > 40) && (attachmentID <= 68)))
|
||||
if(attachmentID != 127)
|
||||
{
|
||||
LL_WARNS() << "Object attachment point invalid: " << attachmentID
|
||||
<< " trying to use 1 (chest)"
|
||||
<< LL_ENDL;
|
||||
}
|
||||
// attachment = get_if_there(mAttachmentPoints, 1, (LLViewerJointAttachment*)NULL); // Arbitrary using 1 (chest)
|
||||
// [SL:KB] - Patch: Appearance-LegacyMultiAttachment | Checked: 2010-08-28 (Catznip-2.6.0a) | Added: Catznip-2.1.2a
|
||||
S32 idxAttachPt = 1;
|
||||
if ( (!isSelf()) && (gSavedSettings.getBOOL("LegacyMultiAttachmentSupport")) && (attachmentID > 40) && (attachmentID <= 68) )
|
||||
idxAttachPt = attachmentID - 38;
|
||||
attachment = get_if_there(mAttachmentPoints, idxAttachPt, (LLViewerJointAttachment*)NULL);
|
||||
// [/SL:KB]
|
||||
attachment = get_if_there(mAttachmentPoints, 1, (LLViewerJointAttachment*)NULL); // Arbitrary using 1 (chest)
|
||||
if (attachment)
|
||||
{
|
||||
LL_WARNS() << "Object attachment point invalid: " << attachmentID
|
||||
|
|
|
|||
|
|
@ -189,19 +189,10 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32
|
|||
LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level)
|
||||
{
|
||||
// Get the grid coordinates
|
||||
// <FS:CR> HG Maps
|
||||
#ifdef OPENSIM
|
||||
std::string hg_map;
|
||||
if (LLGridManager::getInstance()->isInOpenSim())
|
||||
{
|
||||
hg_map = LFSimFeatureHandler::instance().mapServerURL();
|
||||
}
|
||||
std::string imageurl = hg_map.empty() ? gSavedSettings.getString("CurrentMapServerURL") : hg_map;
|
||||
imageurl.append(llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y));
|
||||
#else // !OPENSIM
|
||||
std::string imageurl = gSavedSettings.getString("CurrentMapServerURL") + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y);
|
||||
#endif // OPENSIM
|
||||
// </FS:CR>
|
||||
// <FS:CR> HG Maps
|
||||
//std::string imageurl = gSavedSettings.getString("CurrentMapServerURL") + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y);
|
||||
std::string imageurl = LFSimFeatureHandler::instance().mapServerURL() + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y);
|
||||
// </FS:CR>
|
||||
|
||||
// DO NOT COMMIT!! DEBUG ONLY!!!
|
||||
// Use a local jpeg for every tile to test map speed without S3 access
|
||||
|
|
|
|||
|
|
@ -298,18 +298,6 @@ CURLcode LLXMLRPCTransaction::Impl::_sslCtxFunction(CURL * curl, void *sslctx, v
|
|||
SSL_CTX_set_cert_verify_callback(ctx, _sslCertVerifyCallback, param);
|
||||
// the calls are void
|
||||
|
||||
|
||||
// <FS:ND> FIRE-11406
|
||||
// Some server at LL don't like it at all when curl/openssl try to speak TLSv1.2 to them, instead
|
||||
// of renegotiating to SSLv3 they clamp up and don't talk to us at all anywmore, not even dropping the connection.
|
||||
// This then leads to unfun timeouts and failed transactions.
|
||||
|
||||
#ifdef SSL_TXT_TLSV1_2
|
||||
SSL_CTX_set_options( ctx, SSL_OP_ALL | SSL_OP_NO_TLSv1_2 );
|
||||
#endif
|
||||
|
||||
// </FS:ND>
|
||||
|
||||
return CURLE_OK;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -429,11 +429,11 @@ void QToolAlign::align()
|
|||
{
|
||||
if(AlignThread::sInstance)
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("qtool_still_busy"));
|
||||
report_to_nearby_chat(LLTrans::getString("qtool_still_busy"));
|
||||
}
|
||||
else
|
||||
{
|
||||
reportToNearbyChat(LLTrans::getString("qtool_busy"));
|
||||
report_to_nearby_chat(LLTrans::getString("qtool_busy"));
|
||||
AlignThread::sInstance = new AlignThread();
|
||||
AlignThread::sInstance->start();
|
||||
}
|
||||
|
|
@ -458,7 +458,7 @@ public:
|
|||
delete AlignThread::sInstance;
|
||||
AlignThread::sInstance = NULL;
|
||||
LLSelectMgr::getInstance()->sendMultipleUpdate(UPD_POSITION);
|
||||
reportToNearbyChat(LLTrans::getString("qtool_done"));
|
||||
report_to_nearby_chat(LLTrans::getString("qtool_done"));
|
||||
return TRUE;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -224,15 +224,16 @@
|
|||
parameter="fs_nearby_chat" />
|
||||
</button>
|
||||
|
||||
<nearby_chat_voice_monitor layout="topleft"
|
||||
name="default_chat_bar"
|
||||
height="22"
|
||||
left_pad="4"
|
||||
top="4"
|
||||
right="-12"
|
||||
follows="left|right|bottom"
|
||||
spellcheck="true"
|
||||
visible="true" />
|
||||
<fs_nearby_chat_voice_monitor layout="topleft"
|
||||
name="default_chat_bar"
|
||||
default="true"
|
||||
height="22"
|
||||
left_pad="4"
|
||||
top="4"
|
||||
right="-12"
|
||||
follows="left|right|bottom"
|
||||
spellcheck="true"
|
||||
visible="true" />
|
||||
|
||||
<icon image_name="ChatBarHandle"
|
||||
top="2"
|
||||
|
|
|
|||
|
|
@ -109,6 +109,9 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden.
|
|||
<floater.string name="E_ST_BAD_ROOT">
|
||||
Falscher Root-Joint-Name, "hip" verwenden.
|
||||
</floater.string>
|
||||
<floater.string name="FS_report_frames">
|
||||
[F] frm. [S] s. [FPS] FPS
|
||||
</floater.string>
|
||||
<text name="name_label">
|
||||
Name:
|
||||
</text>
|
||||
|
|
@ -117,8 +120,13 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden.
|
|||
</text>
|
||||
<spinner label="Priorität" name="priority" tool_tip="Steuert, welche Animationen von dieser Animation überschrieben werden können"/>
|
||||
<check_box label="Schleife" name="loop_check" tool_tip="Erzeugt eine Animationsschleife"/>
|
||||
<text name="frames_label">
|
||||
300 frm. 30 s. 10 FPS
|
||||
</text>
|
||||
<spinner label="Ein (%)" name="loop_in_point" tool_tip="Anfang einer Animationsschleife festlegen"/>
|
||||
<spinner label="Aus (%)" name="loop_out_point" tool_tip="Ende einer Animationsschleife festlegen"/>
|
||||
<spinner label="Ein (frm)" name="loop_in_frames" tool_tip="Anfang einer Animationsschleife festlegen (in Frames)"/>
|
||||
<spinner label="Aus (frm)" name="loop_out_frames" tool_tip="Ende einer Animationsschleife festlegen (in Frames)"/>
|
||||
<text name="hand_label">
|
||||
Handhaltung
|
||||
</text>
|
||||
|
|
@ -177,9 +185,7 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden.
|
|||
<button name="pause_btn" tool_tip="Animation unterbrechen"/>
|
||||
<button name="stop_btn" tool_tip="Animation anhalten"/>
|
||||
<text name="bad_animation_text">
|
||||
Animationsdatei kann nicht gelesen werden.
|
||||
|
||||
Wir empfehlen exportierte BVH-Dateien aus Poser 4.
|
||||
Animationsdatei kann nicht gelesen werden. Wir empfehlen exportierte BVH-Dateien aus Poser 4.
|
||||
</text>
|
||||
<button label="Datei neu laden" name="reload_btn"/>
|
||||
<button label="Hochladen (L$ [AMOUNT])" name="ok_btn"/>
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
Der Anzeigename ist der Name, den Sie Ihrem Avatar geben. Sie können ihn einmal pro Woche ändern.
|
||||
</text>
|
||||
<text name="lockout_text">
|
||||
Sie können Ihren Anzeigenamen erst wieder zu diesem Zeitpunkt ändern: [TIME].
|
||||
Früheste Änderung möglich ab: [TIME].
|
||||
</text>
|
||||
<text name="set_name_label">
|
||||
Neuer Anzeigename:
|
||||
|
|
|
|||
|
|
@ -42,6 +42,9 @@
|
|||
<layout_panel name="send_sysinfo_btn_panel">
|
||||
<button name="send_sysinfo_btn" tool_tip="System-Informationen übermitteln"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="lp_options_btn">
|
||||
<button name="chat_options_btn" tool_tip="Chat-Optionen"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="support_panel">
|
||||
<check_box label="Version senden" name="FSSupportGroupChatPrefix_toggle" tool_tip="Fügt die aktuelle Viewer-Version und Oberfläche am Anfang jeder Nachricht hinzu, die an diese Gruppe gesendet werden, um die Support-Mitarbeiter dabei zu unterstützen, ein mögliches Problem besser zu diagnostizieren und die Genauigkeit der Antworten auf deine Fragen zu verbessern."/>
|
||||
</layout_panel>
|
||||
|
|
@ -54,6 +57,13 @@
|
|||
Ungelesene Nachrichten: [NUM]
|
||||
</text>
|
||||
</layout_panel>
|
||||
<layout_panel name="chat_layout_panel">
|
||||
<layout_stack name="input_panels">
|
||||
<layout_panel name="input_button_layout_panel">
|
||||
<button name="send_chat" label="Senden"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
|
|
|
|||
|
|
@ -13,6 +13,9 @@
|
|||
<layout_panel name="lp_chat_history_muted_btn">
|
||||
<button name="chat_history_muted_btn" tool_tip="Ignorierten Chat in Chat in der Nähe anzeigen"/>
|
||||
</layout_panel>
|
||||
<layout_panel name="lp_options_btn">
|
||||
<button name="chat_options_btn" tool_tip="Chat-Optionen"/>
|
||||
</layout_panel>
|
||||
</layout_stack>
|
||||
<layout_stack name="ls_chat">
|
||||
<layout_panel name="panel_im_control_lp">
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<floater name="modal container">
|
||||
<floater name="modal container" title="Taste festlegen">
|
||||
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
|
||||
<text name="Save item as:">
|
||||
Eine Taste drücken, um die Auslösetaste zum Sprechen festzulegen.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<toggleable_menu name="Chat Options Menu">
|
||||
<menu_item_check label="Radar anzeigen..." name="nearby_people"/>
|
||||
<menu_item_check label="Stimmen in der Nähe anzeigen..." name="nearby_voice"/>
|
||||
<menu_item_check label="Blockierliste anzeigen..." name="block_list"/>
|
||||
<menu_item_check label="V1-Stil für Chatverlauf verwenden" name="plain_text_chat_history"/>
|
||||
<context_menu label="Schriftgröße..." name="font_size">
|
||||
<menu_item_check label="Klein" name="font_size_small"/>
|
||||
<menu_item_check label="Mittel" name="font_size_medium"/>
|
||||
<menu_item_check label="Groß" name="font_size_large"/>
|
||||
<menu_item_check label="Riesig" name="font_size_huge"/>
|
||||
</context_menu>
|
||||
<menu_item_check label="Zusätzlichen Schreib-Indikator (>) anzeigen" name="typing_chevron"/>
|
||||
<menu_item_check label="Hinweis über neue Nachrichten anzeigen" name="new_message_notification"/>
|
||||
<menu_item_check label="Eingabezeile anzeigen" name="show_chat_bar"/>
|
||||
<menu_item_check label="Kanalauswahl anzeigen" name="show_channel_selection"/>
|
||||
<menu_item_check label="Chat-Typ/Senden-Button anzeigen" name="show_send_button"/>
|
||||
<menu_item_check label="Senden-Button in IM-Sitzungen anzeigen" name="show_im_send_button"/>
|
||||
</toggleable_menu>
|
||||
|
|
@ -23,4 +23,5 @@
|
|||
<menu_item_check label="Format vollstänger Name: Benutzername (Anzeigename)" name="format_username_displayname"/>
|
||||
<menu_item_check label="Format vollstänger Name: Anzeigename (Benutzername)" name="format_displayname_username"/>
|
||||
</menu>
|
||||
<menu_item_check label="Online-Status für Freunde sichtbar" name="GlobalOnlineStatusToggle"/>
|
||||
</context_menu>
|
||||
|
|
|
|||
|
|
@ -14,4 +14,5 @@
|
|||
<menu_item_check label="Format vollstänger Name: Benutzername (Anzeigename)" name="format_username_displayname"/>
|
||||
<menu_item_check label="Format vollstänger Name: Anzeigename (Benutzername)" name="format_displayname_username"/>
|
||||
</menu>
|
||||
<menu_item_check label="Online-Status für Freunde sichtbar" name="GlobalOnlineStatusToggle"/>
|
||||
</context_menu>
|
||||
|
|
|
|||
|
|
@ -5125,4 +5125,8 @@ Welche Bezeichnung soll für die Region
|
|||
Neue Auswahl kann nicht erstellt werden, da bereits die maximale Anzahl an Auswahlen erstellt wurde.
|
||||
<usetemplate name="okbutton" yestext="OK"/>
|
||||
</notification>
|
||||
<notification name="GlobalOnlineStatusToggle">
|
||||
Abhängig von der Serverauslastung kann es einen Moment dauern, bis das Umschalten der Sichtbarkeit des Online-Status effektiv wird.
|
||||
<usetemplate ignoretext="Weise mich darauf hin, dass das Umschalten der Sichtbarkeit des Online-Status etwas dauern kann." name="okignore" yestext="OK"/>
|
||||
</notification>
|
||||
</notifications>
|
||||
|
|
|
|||
|
|
@ -5,9 +5,9 @@
|
|||
<fs_scroll_list.column label="Benutzername" name="user_name" tool_tip="Der Benutzername dieses Freundes."/>
|
||||
<fs_scroll_list.column label="Anzeigename" name="display_name" tool_tip="Der Anzeigename dieses Freundes."/>
|
||||
<fs_scroll_list.column label="Name" name="full_name" tool_tip="Der Name dieses Freundes."/>
|
||||
<fs_scroll_list.column name="icon_visible_online" tool_tip="Dieser Freund kann sehen ob sie online sind."/>
|
||||
<fs_scroll_list.column name="icon_visible_map" tool_tip="Dieser Freund kann ihre Position auf der Karte sehen."/>
|
||||
<fs_scroll_list.column name="icon_edit_mine" tool_tip="Dieser Freund kann deine Objekte editieren, löschen oder nehmen."/>
|
||||
<fs_scroll_list.column name="icon_visible_online" tool_tip="Dieser Freund kann sehen, ob Sie online sind."/>
|
||||
<fs_scroll_list.column name="icon_visible_map" tool_tip="Dieser Freund kann Ihre Position auf der Karte sehen."/>
|
||||
<fs_scroll_list.column name="icon_edit_mine" tool_tip="Dieser Freund kann Ihre Objekte editieren, löschen oder nehmen."/>
|
||||
<fs_scroll_list.column name="icon_visible_online_theirs" tool_tip="Sie können sehen, wenn dieser Freund online ist."/>
|
||||
<fs_scroll_list.column name="icon_visible_map_theirs" tool_tip="Sie können die Position dieses Freundes auf der Karte sehen."/>
|
||||
<fs_scroll_list.column name="icon_edit_theirs" tool_tip="Sie können Objekte dieses Freundes editieren."/>
|
||||
|
|
@ -21,12 +21,12 @@
|
|||
<button
|
||||
label="Profil"
|
||||
name="profile_btn"
|
||||
tool_tip="Zeigt dir Bilder, Gruppen und andere Informationen"
|
||||
tool_tip="Zeigt Bilder, Gruppen und andere Informationen"
|
||||
width="85" />
|
||||
<button
|
||||
label="Teleport..."
|
||||
name="offer_teleport_btn"
|
||||
tool_tip="Diesem Freund einen Teleport zu deiner jetzigen Position anbieten"
|
||||
tool_tip="Diesem Freund einen Teleport zu Ihrer jetzigen Position anbieten"
|
||||
width="85" />
|
||||
<button
|
||||
label="Karte..."
|
||||
|
|
@ -41,12 +41,12 @@
|
|||
<button
|
||||
label="Entfernen..."
|
||||
name="remove_btn"
|
||||
tool_tip="Entfernt diese Person aus deiner Freundesliste"
|
||||
tool_tip="Entfernt diese Person aus Ihrer Freundesliste"
|
||||
width="85" />
|
||||
<button
|
||||
label="Hinzufügen..."
|
||||
name="add_btn"
|
||||
tool_tip="Biete diesem Einwohner deine Freundschaft an"
|
||||
tool_tip="Diesem Einwohner Ihre Freundschaft anbieten"
|
||||
width="85" />
|
||||
<text name="friend_count" width="85">
|
||||
Freunde: [COUNT]
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<!-- Side tray panel -->
|
||||
<panel label="Leute" name="people_panel">
|
||||
<string name="high_server_load" value="Abhängig von der Serverauslastung kann es einen Moment dauern, bis das Umschalten der Sichtbarkeit effektiv wird."/>
|
||||
<string name="no_recent_people" value="Hier sind keine Leute. Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/search/people Suche] oder die [secondlife:///app/worldmap Karte]."/>
|
||||
<string name="no_filtered_recent_people" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/people/[SEARCH_TERM] Suche]."/>
|
||||
<string name="no_one_near" value="Es ist niemand in der Nähe. Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/search/people Suche] oder die [secondlife:///app/worldmap Karte]."/>
|
||||
|
|
|
|||
|
|
@ -58,6 +58,10 @@
|
|||
(Erfordert Neustart)
|
||||
</text>
|
||||
<check_box label="Chiclets für IMs und Gruppenchats deaktivieren" name="FSDisableIMChiclets" tool_tip="Falls aktiviert, wird Firestorm keine Chiclets für IMs und Gruppenchats anzeigen (Icons für Gruppenmitteilungen und Anzahl an ungelesenen IMs werden weiterhin angezeigt)."/>
|
||||
<check_box label="Alte Listendarstellung für Benachrichtigungsfenster verwenden" name="FSLegacyNotificationWell" tool_tip="Falls aktiviert, verwendet Firestorm die ursprüngliche Listendarstellung, um gespeicherte Benachrichtigungen anzuzeigen." width="355"/>
|
||||
<text name="FSLegacyNotificationWellRequiresRestart">
|
||||
(Erfordert Neustart)
|
||||
</text>
|
||||
<slider label_width="230" label="Wiederholungen für blinkende IM-Reiter:" name="ButtonsFlashCount"/>
|
||||
<slider label_width="230" label="Aufblinkdauer für IM-Reiter:" tool_tip="Legt fest, wie lange in Sekunden ein einzelnes Aufblinken eines IM-Reiter dauert - verwendet für IM-Benachrichtungen" name="ButtonFlashRate"/>
|
||||
<text name="ButtonFlashRateText">
|
||||
|
|
|
|||
|
|
@ -138,15 +138,17 @@
|
|||
<button name="spellcheck_showgui" label="Rechtschreibprüfung..." width="145"/>
|
||||
<button label="Einstellungen Chat-Übersetzung" name="translation_settings_btn" width="190"/>
|
||||
<check_box label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/>
|
||||
<check_box label="Tippanimation auch bei Emotes abspielen" name="play_typing_animation_emote"/>
|
||||
<check_box label="Tipp-Klang abspielen, wenn Personen im Chat in der Nähe tippen" name="play_typing_sound"/>
|
||||
<check_box label="Andere Avatare während IM-Sitzungen benachrichtigen, wenn ich schreibe" name="FSSendTypingState"/>
|
||||
<check_box label="Auto-Vervollständigen für Gesten im Chat in der Nähe aktivieren" name="FSChatbarGestureAutoCompleteEnable"/>
|
||||
<check_box label="Automatische Namensvorhersage in „Chat in der Nähe“-Eingabezeile aktivieren" name="FSChatbarNamePrediction"/>
|
||||
<check_box name="AllowMUpose" label="„:“ als Synonym für "/me" verwenden"/>
|
||||
<check_box name="AutoCloseOOC" label="((OOC))-Klammern automatisch schließen"/>
|
||||
<check_box name="FSShowIMSendButton" label="Senden-Button in Eingabezeile für IM-Sitzungen anzeigen"/>
|
||||
<check_box name="FSNearbyChatbar" label="Eingabezeile zum Fenster Lokaler Chat hinzufügen"/>
|
||||
<check_box name="FSShowChatChannel" label="Kanalauswahl in Eingabezeile anzeigen"/>
|
||||
<check_box name="FSShowChatType" label="Chat-Typ/Sende-Button anzeigen"/>
|
||||
<check_box name="FSShowChatType" label="Chat-Typ/Senden-Button anzeigen"/>
|
||||
<check_box label="Haupteingabezeile für Chat automatisch verstecken" name="AutohideChatBar" tool_tip="Eingabezeile in der unteren Buttonleiste automatisch verstecken und nur zur Eingabe anzeigen"/>
|
||||
<check_box label="Chatleiste nach Senden deaktivieren" name="CloseChatOnReturn"/>
|
||||
<check_box label="Chatverlauf ebenfalls deaktivieren" name="FSUnfocusChatHistoryOnReturn"/>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue