summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt6
-rw-r--r--indra/newview/app_settings/settings.xml36
-rw-r--r--indra/newview/character/avatar_lad.xml2
-rw-r--r--indra/newview/llappviewer.cpp11
-rw-r--r--indra/newview/llavataractions.cpp18
-rw-r--r--indra/newview/llavataractions.h1
-rw-r--r--indra/newview/llchiclet.cpp110
-rw-r--r--indra/newview/llchiclet.h45
-rw-r--r--indra/newview/llcolorswatch.cpp7
-rw-r--r--indra/newview/llcolorswatch.h2
-rw-r--r--indra/newview/llcommanddispatcherlistener.cpp47
-rw-r--r--indra/newview/llcommanddispatcherlistener.h30
-rw-r--r--indra/newview/llcommandhandler.cpp16
-rw-r--r--indra/newview/llfloaterchat.cpp5
-rw-r--r--indra/newview/llfloatercolorpicker.cpp10
-rw-r--r--indra/newview/llfloatercolorpicker.h1
-rw-r--r--indra/newview/llfloaterland.cpp20
-rw-r--r--indra/newview/llfloaterparcel.cpp6
-rw-r--r--indra/newview/llfloaterregioninfo.cpp33
-rw-r--r--indra/newview/llfloaterregioninfo.h3
-rw-r--r--indra/newview/llfloaterreporter.cpp32
-rw-r--r--indra/newview/llfloaterreporter.h1
-rw-r--r--indra/newview/llfloatersearch.cpp18
-rw-r--r--indra/newview/llfloatersearch.h8
-rw-r--r--indra/newview/llfloatervoicedevicesettings.cpp32
-rw-r--r--indra/newview/llfloatervoicedevicesettings.h1
-rw-r--r--indra/newview/llfolderviewitem.cpp6
-rw-r--r--indra/newview/llfolderviewitem.h4
-rw-r--r--indra/newview/llimfloater.cpp16
-rw-r--r--indra/newview/llimview.cpp149
-rw-r--r--indra/newview/llimview.h19
-rw-r--r--indra/newview/llinventorybridge.cpp20
-rw-r--r--indra/newview/llinventorybridge.h1
-rw-r--r--indra/newview/llinventorypanel.cpp9
-rw-r--r--indra/newview/llmaniptranslate.cpp18
-rw-r--r--indra/newview/llnotificationhandler.h10
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp29
-rw-r--r--indra/newview/llnotificationtiphandler.cpp11
-rw-r--r--indra/newview/llpanelavatar.cpp2
-rw-r--r--indra/newview/llpanelgroup.cpp67
-rw-r--r--indra/newview/llpanelgroup.h8
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp8
-rw-r--r--indra/newview/llpanelimcontrolpanel.h4
-rw-r--r--indra/newview/llpanellandmarks.cpp62
-rw-r--r--indra/newview/llpanellandmarks.h6
-rw-r--r--indra/newview/llpanellogin.cpp12
-rw-r--r--indra/newview/llpanellogin.h5
-rw-r--r--indra/newview/llpanelloginlistener.cpp34
-rw-r--r--indra/newview/llpanelloginlistener.h30
-rw-r--r--indra/newview/llpanelmaininventory.cpp54
-rw-r--r--indra/newview/llpanelmaininventory.h2
-rw-r--r--indra/newview/llpanelobjectinventory.cpp3
-rw-r--r--indra/newview/llpanelpeople.cpp2
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp2
-rw-r--r--indra/newview/llpanelplaces.cpp17
-rw-r--r--indra/newview/llparticipantlist.cpp86
-rw-r--r--indra/newview/llparticipantlist.h6
-rw-r--r--indra/newview/llpreviewscript.cpp1
-rw-r--r--indra/newview/llpreviewtexture.cpp32
-rw-r--r--indra/newview/llpreviewtexture.h3
-rw-r--r--indra/newview/llscreenchannel.cpp141
-rw-r--r--indra/newview/llscreenchannel.h8
-rw-r--r--indra/newview/llscriptfloater.cpp23
-rw-r--r--indra/newview/llscriptfloater.h8
-rw-r--r--indra/newview/llstartup.cpp12
-rw-r--r--indra/newview/llsyswellwindow.cpp195
-rw-r--r--indra/newview/llsyswellwindow.h42
-rw-r--r--indra/newview/lltexturefetch.cpp10
-rw-r--r--indra/newview/lltoast.cpp23
-rw-r--r--indra/newview/lltoast.h9
-rw-r--r--indra/newview/lltoastimpanel.cpp15
-rw-r--r--indra/newview/lltoastimpanel.h4
-rw-r--r--indra/newview/lltooldraganddrop.cpp3
-rw-r--r--indra/newview/llurldispatcher.cpp3
-rw-r--r--indra/newview/llurldispatcherlistener.cpp58
-rw-r--r--indra/newview/llurldispatcherlistener.h32
-rw-r--r--indra/newview/llviewerhelp.cpp30
-rw-r--r--indra/newview/llviewerhelp.h11
-rw-r--r--indra/newview/llviewerinventory.cpp19
-rw-r--r--indra/newview/llviewerinventory.h3
-rw-r--r--indra/newview/llviewermenu.cpp19
-rw-r--r--indra/newview/llviewermenufile.cpp26
-rw-r--r--indra/newview/llviewermessage.cpp4
-rw-r--r--indra/newview/llviewerparcelmgr.cpp5
-rw-r--r--indra/newview/llviewertexture.cpp3
-rw-r--r--indra/newview/llvoiceclient.cpp27
-rw-r--r--indra/newview/llvoiceclient.h4
-rw-r--r--indra/newview/llwaterparammanager.cpp8
-rw-r--r--indra/newview/llwlparammanager.cpp8
-rw-r--r--indra/newview/llworld.cpp1
-rw-r--r--indra/newview/skins/default/textures/bottomtray/WellButton_Lit.pngbin0 -> 288 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.pngbin0 -> 405 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_incoming_call.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_media_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_texture.xml11
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_participant_list.xml47
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby.xml1
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml12
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml38
-rw-r--r--indra/newview/skins/default/xui/en/panel_active_object_row.xml81
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_general.xml24
-rw-r--r--indra/newview/skins/default/xui/en/panel_notes.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml31
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_estate.xml32
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/floater.xml2
115 files changed, 1817 insertions, 565 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index be6bce8054..72630cc413 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -104,6 +104,7 @@ set(viewer_SOURCE_FILES
llclassifiedstatsresponder.cpp
llcloud.cpp
llcolorswatch.cpp
+ llcommanddispatcherlistener.cpp
llcommandhandler.cpp
llcommandlineparser.cpp
llcompilequeue.cpp
@@ -324,6 +325,7 @@ set(viewer_SOURCE_FILES
llpanellandmarks.cpp
llpanellandmedia.cpp
llpanellogin.cpp
+ llpanelloginlistener.cpp
llpanellookinfo.cpp
llpanelmaininventory.cpp
llpanelmediasettingsgeneral.cpp
@@ -444,6 +446,7 @@ set(viewer_SOURCE_FILES
lluploaddialog.cpp
llurl.cpp
llurldispatcher.cpp
+ llurldispatcherlistener.cpp
llurlhistory.cpp
llurllineeditorctrl.cpp
llurlsimstring.cpp
@@ -611,6 +614,7 @@ set(viewer_HEADER_FILES
llclassifiedstatsresponder.h
llcloud.h
llcolorswatch.h
+ llcommanddispatcherlistener.h
llcommandhandler.h
llcommandlineparser.h
llcompilequeue.h
@@ -826,6 +830,7 @@ set(viewer_HEADER_FILES
llpanellandmarks.h
llpanellandmedia.h
llpanellogin.h
+ llpanelloginlistener.h
llpanellookinfo.h
llpanelmaininventory.h
llpanelmediasettingsgeneral.h
@@ -950,6 +955,7 @@ set(viewer_HEADER_FILES
lluploaddialog.h
llurl.h
llurldispatcher.h
+ llurldispatcherlistener.h
llurlhistory.h
llurllineeditorctrl.h
llurlsimstring.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c43032a3cf..289e900eaf 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -4974,7 +4974,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>StartUpToastLifeTime</key>
<key>NearbyToastFadingTime</key>
<map>
<key>Comment</key>
@@ -5039,7 +5038,18 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>35</integer>
+ <integer>5</integer>
+ </map>
+ <key>NotificationChannelHeightRatio</key>
+ <map>
+ <key>Comment</key>
+ <string>Notification channel and World View ratio(0.0 - always show 1 notification, 1.0 - max ratio).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.5</real>
</map>
<key>OverflowToastHeight</key>
<map>
@@ -9911,6 +9921,28 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>UseCircuitCodeMaxRetries</key>
+ <map>
+ <key>Comment</key>
+ <string>Max timeout count for the initial UseCircuitCode message</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <real>3</real>
+ </map>
+ <key>UseCircuitCodeTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Timeout duration in seconds for the initial UseCircuitCode message</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>5.0</real>
+ </map>
<key>UseDebugLogin</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index d7182dfaab..ae89eb4413 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -9283,7 +9283,7 @@ render_pass="bump">
wearable="skin"
edit_group="skin_facedetail"
edit_group_order="3"
- name="wrinkles"
+ name="Wrinkles"
label_min="Less"
label_max="More"
value_min="0"
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 508badcc6f..9a1b749ba7 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -78,6 +78,8 @@
#include "lllocationhistory.h"
#include "llfasttimerview.h"
#include "llvoicechannel.h"
+#include "llsidetray.h"
+
#include "llweb.h"
#include "llsecondlifeurls.h"
@@ -2854,6 +2856,8 @@ void LLAppViewer::requestQuit()
gFloaterView->closeAllChildren(true);
}
+ LLSideTray::getInstance()->notifyChildren(LLSD().with("request","quit"));
+
send_stats();
gLogoutTimer.reset();
@@ -3758,6 +3762,13 @@ void LLAppViewer::idleShutdown()
{
return;
}
+
+ if (LLSideTray::getInstance()->notifyChildren(LLSD().with("request","wait_quit")))
+ {
+ return;
+ }
+
+
// ProductEngine: Try moving this code to where we shut down sTextureCache in cleanup()
// *TODO: ugly
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 5af023f565..5f90a7627f 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -62,9 +62,6 @@
#include "llimfloater.h"
#include "lltrans.h"
-// callback connection to auto-call when the IM floater initializes
-boost::signals2::connection gAdhocAutoCall;
-
// static
void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name)
{
@@ -250,8 +247,8 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
// always open IM window when connecting to voice
LLIMFloater::show(session_id);
- // start the call once the floater has fully initialized
- gAdhocAutoCall = LLIMModel::getInstance()->addSessionInitializedCallback(callbackAutoStartCall);
+ // start the call once the session has fully initialized
+ gIMMgr->autoStartCallOnStartup(session_id);
make_ui_sound("UISndStartIM");
}
@@ -467,17 +464,6 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re
}
// static
-void LLAvatarActions::callbackAutoStartCall(const LLSD& data)
-{
- // start the adhoc voice call now the IM panel has initialized
- LLUUID session_id = data["session_id"].asUUID();
- gIMMgr->startCall(session_id);
-
- // and deschedule this callback as its work is done now
- gAdhocAutoCall.disconnect();
-}
-
-// static
void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message)
{
const LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 4c9851a48d..2dd2a4c4b1 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -139,7 +139,6 @@ private:
static bool handleRemove(const LLSD& notification, const LLSD& response);
static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id);
static void callback_invite_to_group(LLUUID group_id, LLUUID id);
- static void callbackAutoStartCall(const LLSD& data);
// Just request friendship, no dialog.
static void requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message);
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 4b3b7a99d8..30967677e8 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -61,6 +61,7 @@ static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");
static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group");
static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");
static LLDefaultChildRegistry::Register<LLScriptChiclet> t6("chiclet_script");
+static LLDefaultChildRegistry::Register<LLInvOfferChiclet> t7("chiclet_offer");
static const LLRect CHICLET_RECT(0, 25, 25, 0);
static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);
@@ -78,29 +79,73 @@ boost::signals2::signal<LLChiclet* (const LLUUID&),
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
+/**
+ * Updates the Well's 'Lit' state to flash it when "new messages" are come.
+ *
+ * It gets callback which will be called 2*N times with passed period. See EXT-3147
+ */
+class LLSysWellChiclet::FlashToLitTimer : public LLEventTimer
+{
+public:
+ typedef boost::function<void()> callback_t;
+ FlashToLitTimer(S32 count, F32 period, callback_t cb)
+ : LLEventTimer(period)
+ , mCallback(cb)
+ , mFlashCount(2 * count)
+ , mCurrentFlashCount(0)
+ {
+ mEventTimer.stop();
+ }
+
+ BOOL tick()
+ {
+ mCallback();
+
+ if (++mCurrentFlashCount == mFlashCount) mEventTimer.stop();
+ return FALSE;
+ }
+
+ void flash()
+ {
+ mCurrentFlashCount = 0;
+ mEventTimer.start();
+ }
+
+private:
+ callback_t mCallback;
+ S32 mFlashCount;
+ S32 mCurrentFlashCount;
+};
+
LLSysWellChiclet::Params::Params()
: button("button")
, unread_notifications("unread_notifications")
+, max_displayed_count("max_displayed_count", 9)
+, flash_to_lit_count("flash_to_lit_count", 3)
+, flash_period("flash_period", 0.5F)
{
button.name("button");
button.tab_stop(FALSE);
button.label(LLStringUtil::null);
-
}
LLSysWellChiclet::LLSysWellChiclet(const Params& p)
: LLChiclet(p)
, mButton(NULL)
, mCounter(0)
+, mMaxDisplayedCount(p.max_displayed_count)
+, mFlashToLitTimer(NULL)
{
LLButton::Params button_params = p.button;
mButton = LLUICtrlFactory::create<LLButton>(button_params);
addChild(mButton);
+
+ mFlashToLitTimer = new FlashToLitTimer(p.flash_to_lit_count, p.flash_period, boost::bind(&LLSysWellChiclet::changeLitState, this));
}
LLSysWellChiclet::~LLSysWellChiclet()
{
-
+ delete mFlashToLitTimer;
}
void LLSysWellChiclet::setCounter(S32 counter)
@@ -108,11 +153,30 @@ void LLSysWellChiclet::setCounter(S32 counter)
std::string s_count;
if(counter != 0)
{
- s_count = llformat("%d", counter);
+ static std::string more_messages_exist("+");
+ std::string more_messages(counter > mMaxDisplayedCount ? more_messages_exist : "");
+ s_count = llformat("%d%s"
+ , llmin(counter, mMaxDisplayedCount)
+ , more_messages.c_str()
+ );
}
mButton->setLabel(s_count);
+ /*
+ Emulate 4 states of button by background images, see detains in EXT-3147
+ xml attribute Description
+ image_unselected "Unlit" - there are no new messages
+ image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
+ image_pressed "Lit" - there are new messages
+ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
+ */
+ mButton->setForcePressedState(counter > 0);
+
+ if (mCounter == 0 && counter > 0)
+ {
+ mFlashToLitTimer->flash();
+ }
mCounter = counter;
}
@@ -126,6 +190,14 @@ void LLSysWellChiclet::setToggleState(BOOL toggled) {
mButton->setToggleState(toggled);
}
+void LLSysWellChiclet::changeLitState()
+{
+ static bool set_lit = false;
+
+ mButton->setForcePressedState(set_lit);
+
+ set_lit ^= true;
+}
/************************************************************************/
/* LLIMWellChiclet implementation */
@@ -939,12 +1011,34 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
}
}
+void object_chiclet_callback(const LLSD& data)
+{
+ LLUUID object_id = data["object_id"];
+ bool new_message = data["new_message"];
+
+ std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(object_id);
+ std::list<LLChiclet *>::iterator iter;
+ for (iter = chiclets.begin(); iter != chiclets.end(); iter++)
+ {
+ LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*iter);
+ if (chiclet != NULL)
+ {
+ if(data.has("unread"))
+ {
+ chiclet->setCounter(data["unread"]);
+ }
+ chiclet->setShowNewMessagesIcon(new_message);
+ }
+ }
+}
BOOL LLChicletPanel::postBuild()
{
LLPanel::postBuild();
LLIMModel::instance().addNewMsgCallback(boost::bind(im_chiclet_callback, this, _1));
LLIMModel::instance().addNoUnreadMsgsCallback(boost::bind(im_chiclet_callback, this, _1));
+ LLScriptFloaterManager::getInstance()->addNewObjectCallback(boost::bind(object_chiclet_callback, _1));
+ LLScriptFloaterManager::getInstance()->addToggleObjectFloaterCallback(boost::bind(object_chiclet_callback, _1));
LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLChicletPanel::findChiclet<LLChiclet>, this, _1));
LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLChicletPanel::onCurrentVoiceChannelChanged, this, _1));
@@ -1545,6 +1639,11 @@ void LLScriptChiclet::setSessionId(const LLUUID& session_id)
}
}
+void LLScriptChiclet::setCounter(S32 counter)
+{
+ setShowNewMessagesIcon( counter > 0 );
+}
+
void LLScriptChiclet::onMouseDown()
{
LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId());
@@ -1601,6 +1700,11 @@ void LLInvOfferChiclet::setSessionId(const LLUUID& session_id)
}
}
+void LLInvOfferChiclet::setCounter(S32 counter)
+{
+ setShowNewMessagesIcon( counter > 0 );
+}
+
void LLInvOfferChiclet::onMouseDown()
{
LLScriptFloaterManager::instance().toggleScriptFloater(getSessionId());
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 609ce16713..65abcd1f5f 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -315,7 +315,7 @@ public:
{
Optional<std::string> new_messages_icon_name;
- Params() : new_messages_icon_name("new_messages_icon_name", "icn_voice-localchat.tga")
+ Params() : new_messages_icon_name("new_messages_icon_name", "Unread_IM")
{}
};
@@ -389,7 +389,7 @@ public:
* Made public so that it can be triggered from outside
* (more specifically, from the Active IM window).
*/
- void onMouseDown();
+ virtual void onMouseDown();
protected:
@@ -594,7 +594,7 @@ public:
/*virtual*/ void setSessionId(const LLUUID& session_id);
- /*virtual*/ void setCounter(S32 counter){}
+ /*virtual*/ void setCounter(S32 counter);
/*virtual*/ S32 getCounter() { return 0; }
@@ -634,7 +634,7 @@ public:
/*virtual*/ void setSessionId(const LLUUID& session_id);
- /*virtual*/ void setCounter(S32 counter){}
+ /*virtual*/ void setCounter(S32 counter);
/*virtual*/ S32 getCounter() { return 0; }
@@ -745,7 +745,7 @@ private:
/**
* Implements notification chiclet. Used to display total amount of unread messages
- * across all IM sessions, total amount of system notifications.
+ * across all IM sessions, total amount of system notifications. See EXT-3147 for details
*/
class LLSysWellChiclet : public LLChiclet
{
@@ -757,6 +757,24 @@ public:
Optional<LLChicletNotificationCounterCtrl::Params> unread_notifications;
+ /**
+ * Contains maximum displayed count of unread messages. Default value is 9.
+ *
+ * If count is less than "max_unread_count" will be displayed as is.
+ * Otherwise 9+ will be shown (for default value).
+ */
+ Optional<S32> max_displayed_count;
+
+ /**
+ * How many time chiclet should flash before set "Lit" state. Default value is 3.
+ */
+ Optional<S32> flash_to_lit_count;
+
+ /**
+ * Period of flashing while setting "Lit" state, in seconds. Default value is 0.5.
+ */
+ Optional<F32> flash_period;
+
Params();
};
@@ -778,9 +796,26 @@ protected:
LLSysWellChiclet(const Params& p);
friend class LLUICtrlFactory;
+ /**
+ * Change Well 'Lit' state from 'Lit' to 'Unlit' and vice-versa.
+ *
+ * There is an assumption that it will be called 2*N times to do not change its start state.
+ * @see FlashToLitTimer
+ */
+ void changeLitState();
+
protected:
+ class FlashToLitTimer;
LLButton* mButton;
S32 mCounter;
+ S32 mMaxDisplayedCount;
+
+ /**
+ * How many times Well will blink.
+ */
+ S32 mFlashToLitCount;
+ FlashToLitTimer* mFlashToLitTimer;
+
};
/**
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index b2399d238b..dc6847f236 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -306,13 +306,16 @@ void LLColorSwatchCtrl::onColorChanged ( void* data, EColorPickOp pick_op )
}
}
-void LLColorSwatchCtrl::onFloaterClose()
+// This is called when the main floatercustomize panel is closed.
+// Since this class has pointers up to its parents, we need to cleanup
+// this class first in order to avoid a crash.
+void LLColorSwatchCtrl::onParentFloaterClosed()
{
LLFloaterColorPicker* pickerp = (LLFloaterColorPicker*)mPickerHandle.get();
-
if (pickerp)
{
pickerp->setSwatch(NULL);
+ pickerp->closeFloater();
}
mPickerHandle.markDead();
diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h
index 2f6aec85e8..4bb7d837cb 100644
--- a/indra/newview/llcolorswatch.h
+++ b/indra/newview/llcolorswatch.h
@@ -105,7 +105,7 @@ public:
/*virtual*/ void setEnabled( BOOL enabled );
static void onColorChanged ( void* data, EColorPickOp pick_op = COLOR_CHANGE );
- void onFloaterClose();
+ void onParentFloaterClosed();
protected:
BOOL mValid;
diff --git a/indra/newview/llcommanddispatcherlistener.cpp b/indra/newview/llcommanddispatcherlistener.cpp
new file mode 100644
index 0000000000..00a20de30e
--- /dev/null
+++ b/indra/newview/llcommanddispatcherlistener.cpp
@@ -0,0 +1,47 @@
+/**
+ * @file llcommanddispatcherlistener.cpp
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief Implementation for llcommanddispatcherlistener.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "llcommanddispatcherlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llcommandhandler.h"
+
+LLCommandDispatcherListener::LLCommandDispatcherListener(/* LLCommandDispatcher* instance */):
+ LLEventAPI("LLCommandDispatcher", "Access to LLCommandHandler commands") /* ,
+ mDispatcher(instance) */
+{
+ add("dispatch",
+ "Execute a command registered as an LLCommandHandler,\n"
+ "passing any required parameters:\n"
+ "[\"cmd\"] string command name\n"
+ "[\"params\"] array of parameters, as if from components of URL path\n"
+ "[\"query\"] map of parameters, as if from ?key1=val&key2=val\n"
+ "[\"trusted\"] boolean indicating trusted browser [default true]",
+ &LLCommandDispatcherListener::dispatch);
+}
+
+void LLCommandDispatcherListener::dispatch(const LLSD& params) const
+{
+ // For most purposes, we expect callers to want to be trusted.
+ bool trusted_browser = true;
+ if (params.has("trusted"))
+ {
+ // But for testing, allow a caller to specify untrusted.
+ trusted_browser = params["trusted"].asBoolean();
+ }
+ LLCommandDispatcher::dispatch(params["cmd"], params["params"], params["query"], NULL,
+ trusted_browser);
+}
diff --git a/indra/newview/llcommanddispatcherlistener.h b/indra/newview/llcommanddispatcherlistener.h
new file mode 100644
index 0000000000..d0070ddd71
--- /dev/null
+++ b/indra/newview/llcommanddispatcherlistener.h
@@ -0,0 +1,30 @@
+/**
+ * @file llcommanddispatcherlistener.h
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief LLEventAPI for LLCommandDispatcher
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLCOMMANDDISPATCHERLISTENER_H)
+#define LL_LLCOMMANDDISPATCHERLISTENER_H
+
+#include "lleventapi.h"
+class LLCommandDispatcher;
+class LLSD;
+
+class LLCommandDispatcherListener: public LLEventAPI
+{
+public:
+ LLCommandDispatcherListener(/* LLCommandDispatcher* instance */); // all static members
+
+private:
+ void dispatch(const LLSD& params) const;
+
+ //LLCommandDispatcher* mDispatcher;
+};
+
+#endif /* ! defined(LL_LLCOMMANDDISPATCHERLISTENER_H) */
diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp
index af6488388a..8c7e7bea83 100644
--- a/indra/newview/llcommandhandler.cpp
+++ b/indra/newview/llcommandhandler.cpp
@@ -34,12 +34,16 @@
#include "llviewerprecompiledheaders.h"
#include "llcommandhandler.h"
+#include "llnotificationsutil.h"
+#include "llcommanddispatcherlistener.h"
// system includes
#include <boost/tokenizer.hpp>
#define THROTTLE_PERIOD 15 // required secs between throttled commands
+static LLCommandDispatcherListener sCommandDispatcherListener;
+
//---------------------------------------------------------------------------
// Underlying registry for command handlers, not directly accessible.
//---------------------------------------------------------------------------
@@ -93,6 +97,8 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
LLMediaCtrl* web,
bool trusted_browser)
{
+ static bool slurl_blocked = false;
+ static bool slurl_throttled = false;
static F64 last_throttle_time = 0.0;
F64 cur_time = 0.0;
std::map<std::string, LLCommandHandlerInfo>::iterator it = mMap.find(cmd);
@@ -110,6 +116,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
// block request from external browser, but report as
// "handled" because it was well formatted.
LL_WARNS_ONCE("SLURL") << "Blocked SLURL command from untrusted browser" << LL_ENDL;
+ if (! slurl_blocked)
+ {
+ LLNotificationsUtil::add("BlockedSLURL");
+ slurl_blocked = true;
+ }
return true;
case LLCommandHandler::UNTRUSTED_THROTTLE:
@@ -119,6 +130,11 @@ bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
// block request from external browser if it happened
// within THROTTLE_PERIOD secs of the last command
LL_WARNS_ONCE("SLURL") << "Throttled SLURL command from untrusted browser" << LL_ENDL;
+ if (! slurl_throttled)
+ {
+ LLNotificationsUtil::add("ThrottledSLURL");
+ slurl_throttled = true;
+ }
return true;
}
last_throttle_time = cur_time;
diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp
index 57bb93d81a..b9e0f928f1 100644
--- a/indra/newview/llfloaterchat.cpp
+++ b/indra/newview/llfloaterchat.cpp
@@ -41,6 +41,7 @@
// project include
#include "llagent.h"
+#include "llappviewer.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
@@ -142,6 +143,10 @@ BOOL LLFloaterChat::postBuild()
void LLFloaterChat::updateConsoleVisibility()
{
+ if(gDisconnected)
+ {
+ return;
+ }
// determine whether we should show console due to not being visible
gConsole->setVisible( !isInVisibleChain() // are we not in part of UI being drawn?
|| isMinimized() // are we minimized?
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 56b56dc3d2..73b79d8e13 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -241,16 +241,6 @@ BOOL LLFloaterColorPicker::postBuild()
return TRUE;
}
-/*virtual*/
-void LLFloaterColorPicker::onClose(bool app_settings)
-{
- if (mSwatch)
- {
- mSwatch->onFloaterClose();
- }
- stopUsingPipette();
-}
-
//////////////////////////////////////////////////////////////////////////////
//
void LLFloaterColorPicker::initUI ( F32 rValIn, F32 gValIn, F32 bValIn )
diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h
index b381740acd..0bbbe2051c 100644
--- a/indra/newview/llfloatercolorpicker.h
+++ b/indra/newview/llfloatercolorpicker.h
@@ -56,7 +56,6 @@ class LLFloaterColorPicker
// overrides
virtual BOOL postBuild ();
- virtual void onClose(bool app_settings);
virtual void draw ();
virtual BOOL handleMouseDown ( S32 x, S32 y, MASK mask );
virtual BOOL handleMouseUp ( S32 x, S32 y, MASK mask );
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index ed0f24d160..5b03292b22 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2300,7 +2300,7 @@ void LLPanelLandAccess::refresh()
mListBanned->deleteAllItems();
LLParcel *parcel = mParcel->getParcel();
-
+
// Display options
if (parcel)
{
@@ -2396,22 +2396,40 @@ void LLPanelLandAccess::refresh()
mListBanned->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix);
}
}
+
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if(region)
+ {
+ std::string region_access = "(";
+ region_access += region->getSimAccessString();
+ region_access += ")";
+ childSetLabelArg( "public_access", "[MATURITY]", region_access );
+ }
+ else
+ {
+ childSetLabelArg( "public_access", "[MATURITY]", std::string() );
+ }
+
if(parcel->getRegionDenyAnonymousOverride())
{
childSetValue("limit_payment", TRUE);
+ childSetLabelArg( "limit_payment", "[ESTATE_PAYMENT_LIMIT]", getString("access_estate_defined") );
}
else
{
childSetValue("limit_payment", (parcel->getParcelFlag(PF_DENY_ANONYMOUS)));
+ childSetLabelArg( "limit_payment", "[ESTATE_PAYMENT_LIMIT]", std::string() );
}
if(parcel->getRegionDenyAgeUnverifiedOverride())
{
childSetValue("limit_age_verified", TRUE);
+ childSetLabelArg( "limit_age_verified", "[ESTATE_AGE_LIMIT]", getString("access_estate_defined") );
}
else
{
childSetValue("limit_age_verified", (parcel->getParcelFlag(PF_DENY_AGEUNVERIFIED)));
+ childSetLabelArg( "limit_age_verified", "[ESTATE_AGE_LIMIT]", std::string() );
}
BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST);
diff --git a/indra/newview/llfloaterparcel.cpp b/indra/newview/llfloaterparcel.cpp
index 88a39a495f..e2be784116 100644
--- a/indra/newview/llfloaterparcel.cpp
+++ b/indra/newview/llfloaterparcel.cpp
@@ -40,6 +40,7 @@
// viewer project includes
#include "llcommandhandler.h"
#include "llpanelplace.h"
+#include "llsidetray.h"
// linden library includes
#include "lluuid.h"
@@ -70,7 +71,10 @@ public:
{
if (parcel_id.notNull())
{
- LLFloaterReg::showInstance("parcel_info", LLSD(parcel_id));
+ LLSD key;
+ key["type"] = "remote_place";
+ key["id"] = parcel_id;
+ LLSideTray::getInstance()->showPanel("panel_places", key);
return true;
}
}
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 05a46ad894..8a26078f3d 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -88,8 +88,6 @@
#include "lltrans.h"
#include "llagentui.h"
-#define ELAR_ENABLED 0 // Enable when server support is implemented
-
const S32 TERRAIN_TEXTURE_COUNT = 4;
const S32 CORNER_COUNT = 4;
@@ -1995,11 +1993,6 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region)
childSetEnabled("remove_banned_avatar_btn", god || owner || manager);
childSetEnabled("message_estate_btn", god || owner || manager);
childSetEnabled("kick_user_from_estate_btn", god || owner || manager);
-#if ELAR_ENABLED
- childSetEnabled("abuse_email_address", god || owner || manager);
-#else
- childSetEnabled("abuse_email_address", false);
-#endif
// estate managers can't add estate managers
childSetEnabled("add_estate_manager_btn", god || owner);
@@ -2065,8 +2058,6 @@ BOOL LLPanelEstateInfo::postBuild()
initCtrl("limit_payment");
initCtrl("limit_age_verified");
initCtrl("voice_chat_check");
- getChild<LLUICtrl>("abuse_email_address")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeAnything, this));
- getChild<LLLineEditor>("abuse_email_address")->setKeystrokeCallback(onChangeText, this);
// set up the use global time checkbox
getChild<LLUICtrl>("use_global_time_check")->setCommitCallback(boost::bind(&LLPanelEstateInfo::onChangeUseGlobalTime, this));
@@ -2276,8 +2267,6 @@ bool LLPanelEstateInfo::commitEstateInfoCaps()
}
body["sun_hour"] = sun_hour;
- body["owner_abuse_email"] = childGetValue("abuse_email_address").asString();
-
// we use a responder so that we can re-get the data after committing to the database
LLHTTPClient::post(url, body, new LLEstateChangeInfoResponder(this));
return true;
@@ -2436,16 +2425,6 @@ void LLPanelEstateInfo::setOwnerName(const std::string& name)
childSetValue("estate_owner", LLSD(name));
}
-const std::string LLPanelEstateInfo::getAbuseEmailAddress() const
-{
- return childGetValue("abuse_email_address").asString();
-}
-
-void LLPanelEstateInfo::setAbuseEmailAddress(const std::string& address)
-{
- childSetValue("abuse_email_address", LLSD(address));
-}
-
void LLPanelEstateInfo::setAccessAllowedEnabled(bool enable_agent,
bool enable_group,
bool enable_ban)
@@ -2954,18 +2933,6 @@ bool LLDispatchEstateUpdateInfo::operator()(
std::string estate_name = strings[0].c_str(); // preserve c_str() call!
panel->setEstateName(estate_name);
-#if ELAR_ENABLED
- if (strings.size() > 9)
- {
- std::string abuse_email = strings[9].c_str(); // preserve c_str() call!
- panel->setAbuseEmailAddress(abuse_email);
- }
- else
-#endif
- {
- panel->setAbuseEmailAddress(panel->getString("email_unsupported"));
- }
-
LLViewerRegion* regionp = gAgent.getRegion();
LLUUID owner_id(strings[1]);
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index a3b91223b7..704166d106 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -330,9 +330,6 @@ public:
const std::string getOwnerName() const;
void setOwnerName(const std::string& name);
- const std::string getAbuseEmailAddress() const;
- void setAbuseEmailAddress(const std::string& address);
-
// If visible from mainland, allowed agent and allowed groups
// are ignored, so must disable UI.
void setAccessAllowedEnabled(bool enable_agent, bool enable_group, bool enable_ban);
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 408303a1e0..932e49c79b 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -95,7 +95,6 @@ const U32 INCLUDE_SCREENSHOT = 0x01 << 0;
LLFloaterReporter::LLFloaterReporter(const LLSD& key)
: LLFloater(key),
mReportType(COMPLAINT_REPORT),
- mEmailToEstateOwner(FALSE),
mObjectID(),
mScreenID(),
mAbuserID(),
@@ -117,18 +116,7 @@ void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)
if ( LLFloaterReg::instanceVisible("reporter") )
{
- LLFloaterReporter *f = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
- BOOL email_to_estate_owner = ( region_flags & REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER );
- f->mEmailToEstateOwner = email_to_estate_owner;
-
- if ( email_to_estate_owner )
- {
- LLNotificationsUtil::add("HelpReportAbuseEmailEO");
- }
- else
- {
- LLNotificationsUtil::add("HelpReportAbuseEmailLL");
- }
+ LLNotificationsUtil::add("HelpReportAbuseEmailLL");
};
}
// virtual
@@ -218,17 +206,7 @@ LLFloaterReporter::~LLFloaterReporter()
// virtual
void LLFloaterReporter::draw()
{
- // this is set by a static callback sometime after the dialog is created.
- // Only disable screenshot for abuse reports to estate owners
- if ( mEmailToEstateOwner )
- {
- childSetValue("screen_check", FALSE );
- childSetEnabled("screen_check", FALSE );
- }
- else
- {
- childSetEnabled("screen_check", TRUE );
- }
+ childSetEnabled("screen_check", TRUE );
LLFloater::draw();
}
@@ -637,11 +615,7 @@ LLSD LLFloaterReporter::gatherReport()
LLUUID screenshot_id = LLUUID::null;
if (childGetValue("screen_check"))
{
-
- if ( mEmailToEstateOwner == FALSE )
- {
- screenshot_id = childGetValue("screenshot");
- }
+ screenshot_id = childGetValue("screenshot");
};
LLSD report = LLSD::emptyMap();
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index 917f513641..a3776f3d27 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -124,7 +124,6 @@ private:
private:
EReportType mReportType;
- BOOL mEmailToEstateOwner;
LLUUID mObjectID;
LLUUID mScreenID;
LLUUID mAbuserID;
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 2c618263ec..c658963708 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -42,7 +42,8 @@
LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
LLFloater(key),
LLViewerMediaObserver(),
- mBrowser(NULL)
+ mBrowser(NULL),
+ mSearchGodLevel(0)
{
// declare a map that transforms a category name into
// the URL suffix that is used to search that category
@@ -86,12 +87,21 @@ void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent eve
case MEDIA_EVENT_NAVIGATE_COMPLETE:
childSetText("status_text", getString("done_text"));
break;
-
+
default:
break;
}
}
+void LLFloaterSearch::godLevelChanged(U8 godlevel)
+{
+ // search results can change based upon god level - if the user
+ // changes god level, then give them a warning (we don't refresh
+ // the search as this might undo any page navigation or
+ // AJAX-driven changes since the last search).
+ childSetVisible("refresh_search", (godlevel != mSearchGodLevel));
+}
+
void LLFloaterSearch::search(const LLSD &key)
{
if (! mBrowser)
@@ -99,6 +109,10 @@ void LLFloaterSearch::search(const LLSD &key)
return;
}
+ // reset the god level warning as we're sending the latest state
+ childHide("refresh_search");
+ mSearchGodLevel = gAgent.getGodLevel();
+
// get the URL for the search page
std::string url = getString("search_url");
if (! LLStringUtil::endsWith(url, "/"))
diff --git a/indra/newview/llfloatersearch.h b/indra/newview/llfloatersearch.h
index 743107484f..ba817adf7f 100644
--- a/indra/newview/llfloatersearch.h
+++ b/indra/newview/llfloatersearch.h
@@ -66,14 +66,20 @@ public:
/// "events", "groups", "wiki", "destinations", "classifieds"
void search(const LLSD &key);
+ /// changing godmode can affect the search results that are
+ /// returned by the search website - use this method to tell the
+ /// search floater that the user has changed god level.
+ void godLevelChanged(U8 godlevel);
+
private:
/*virtual*/ BOOL postBuild();
// inherited from LLViewerMediaObserver
/*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event);
-
+
LLMediaCtrl *mBrowser;
LLSD mCategoryPaths;
+ U8 mSearchGodLevel;
};
#endif // LL_LLFLOATERSEARCH_H
diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp
index 43024a4bd0..3951f4291f 100644
--- a/indra/newview/llfloatervoicedevicesettings.cpp
+++ b/indra/newview/llfloatervoicedevicesettings.cpp
@@ -40,7 +40,6 @@
#include "llcombobox.h"
#include "llfocusmgr.h"
#include "lliconctrl.h"
-#include "llsliderctrl.h"
#include "llviewercontrol.h"
#include "llvoiceclient.h"
#include "llvoicechannel.h"
@@ -61,9 +60,6 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
mDevicesUpdated = FALSE;
- // grab "live" mic volume level
- mMicVolume = gSavedSettings.getF32("AudioLevelMic");
-
// ask for new device enumeration
// now do this in onOpen() instead...
//gVoiceClient->refreshDeviceLists();
@@ -75,10 +71,6 @@ LLPanelVoiceDeviceSettings::~LLPanelVoiceDeviceSettings()
BOOL LLPanelVoiceDeviceSettings::postBuild()
{
- LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
- // set mic volume tuning slider based on last mic volume setting
- volume_slider->setValue(mMicVolume);
-
childSetCommitCallback("voice_input_device", onCommitInputDevice, this);
childSetCommitCallback("voice_output_device", onCommitOutputDevice, this);
@@ -157,15 +149,6 @@ void LLPanelVoiceDeviceSettings::apply()
gSavedSettings.setString("VoiceOutputAudioDevice", s);
mOutputDevice = s;
}
-
- // assume we are being destroyed by closing our embedding window
- LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
- if(volume_slider)
- {
- F32 slider_value = (F32)volume_slider->getValue().asReal();
- gSavedSettings.setF32("AudioLevelMic", slider_value);
- mMicVolume = slider_value;
- }
}
void LLPanelVoiceDeviceSettings::cancel()
@@ -178,22 +161,12 @@ void LLPanelVoiceDeviceSettings::cancel()
if(mCtrlOutputDevices)
mCtrlOutputDevices->setSimple(mOutputDevice);
-
- gSavedSettings.setF32("AudioLevelMic", mMicVolume);
- LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
- if(volume_slider)
- {
- volume_slider->setValue(mMicVolume);
- }
}
void LLPanelVoiceDeviceSettings::refresh()
{
- //grab current volume
- LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
- // set mic volume tuning slider based on last mic volume setting
- F32 current_volume = (F32)volume_slider->getValue().asReal();
- gVoiceClient->tuningSetMicVolume(current_volume);
+ // update the live input level display
+ gVoiceClient->tuningSetMicVolume();
// Fill in popup menus
mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
@@ -263,7 +236,6 @@ void LLPanelVoiceDeviceSettings::initialize()
{
mInputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
mOutputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
- mMicVolume = gSavedSettings.getF32("AudioLevelMic");
mDevicesUpdated = FALSE;
// ask for new device enumeration
diff --git a/indra/newview/llfloatervoicedevicesettings.h b/indra/newview/llfloatervoicedevicesettings.h
index d67283d0a2..20958af780 100644
--- a/indra/newview/llfloatervoicedevicesettings.h
+++ b/indra/newview/llfloatervoicedevicesettings.h
@@ -56,7 +56,6 @@ protected:
static void onCommitInputDevice(LLUICtrl* ctrl, void* user_data);
static void onCommitOutputDevice(LLUICtrl* ctrl, void* user_data);
- F32 mMicVolume;
std::string mInputDevice;
std::string mOutputDevice;
class LLComboBox *mCtrlInputDevices;
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 5bef306485..fe793fbcb8 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -40,6 +40,7 @@
#include "llinventoryfilter.h"
#include "llpanel.h"
#include "llviewercontrol.h" // gSavedSettings
+#include "llviewerinventory.h"
#include "llviewerwindow.h" // Argh, only for setCursor()
// linden library includes
@@ -603,6 +604,11 @@ const std::string& LLFolderViewItem::getSearchableLabel() const
return mSearchableLabel;
}
+LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void)
+{
+ return gInventory.getItem(getListener()->getUUID());
+}
+
std::string LLFolderViewItem::getName( void ) const
{
if(mListener)
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 0ea031108b..43a5fd8de5 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -45,6 +45,7 @@ class LLFolderViewListenerFunctor;
class LLInventoryFilter;
class LLMenuGL;
class LLUIImage;
+class LLViewerInventoryItem;
// These are grouping of inventory types.
// Order matters when sorting system folders to the top.
@@ -281,6 +282,9 @@ public:
const LLFolderViewEventListener* getListener( void ) const { return mListener; }
LLFolderViewEventListener* getListener( void ) { return mListener; }
+
+ // Gets the inventory item if it exists (null otherwise)
+ LLViewerInventoryItem * getInventoryItem(void);
// just rename the object.
void rename(const std::string& new_name);
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 2bc07d0c27..47a168e354 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -90,8 +90,20 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
case IM_SESSION_CONFERENCE_START:
mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this);
break;
- default:
+ case IM_SESSION_GROUP_START:
mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this);
+ break;
+ case IM_SESSION_INVITE:
+ if (gAgent.isInGroup(mSessionID))
+ {
+ mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelGroupControl, this);
+ }
+ else
+ {
+ mFactoryMap["panel_im_control_panel"] = LLCallbackMap(createPanelAdHocControl, this);
+ }
+ break;
+ default: break;
}
}
}
@@ -415,6 +427,7 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
if(channel)
{
channel->updateShowToastsState();
+ channel->redrawToasts();
}
}
@@ -439,6 +452,7 @@ void LLIMFloater::setVisible(BOOL visible)
if(channel)
{
channel->updateShowToastsState();
+ channel->redrawToasts();
}
if (visible && mChatHistory && mInputEditor)
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 6c4af0522f..4d2ba16a4c 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -88,6 +88,9 @@ const static std::string IM_TEXT("message");
const static std::string IM_FROM("from");
const static std::string IM_FROM_ID("from_id");
+const static std::string NO_SESSION("(IM Session Doesn't Exist)");
+const static std::string ADHOC_NAME_SUFFIX(" Conference");
+
std::string LLCallDialogManager::sPreviousSessionlName = "";
std::string LLCallDialogManager::sCurrentSessionlName = "";
LLIMModel::LLIMSession* LLCallDialogManager::sSession = NULL;
@@ -116,6 +119,13 @@ void toast_callback(const LLSD& msg){
return;
}
+ // Skip toasting if we have open window of IM with this session id
+ LLIMFloater* open_im_floater = LLIMFloater::findInstance(msg["session_id"]);
+ if (open_im_floater && open_im_floater->getVisible())
+ {
+ return;
+ }
+
LLSD args;
args["MESSAGE"] = msg["message"];
args["TIME"] = msg["time"];
@@ -154,11 +164,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
mInitialTargetIDs(ids),
mVoiceChannel(NULL),
mSpeakers(NULL),
- mCallDialogManager(NULL),
mSessionInitialized(false),
mCallBackEnabled(true),
mTextIMPossible(true),
- mOtherParticipantIsAvatar(true)
+ mOtherParticipantIsAvatar(true),
+ mStartCallOnInitialize(false)
{
if (IM_NOTHING_SPECIAL == type || IM_SESSION_P2P_INVITE == type)
{
@@ -287,9 +297,6 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
LLIMModel::LLIMSession::~LLIMSession()
{
- delete mCallDialogManager;
- mCallDialogManager = NULL;
-
delete mSpeakers;
mSpeakers = NULL;
@@ -413,6 +420,12 @@ void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, con
{
im_floater->sessionInitReplyReceived(new_session_id);
}
+
+ // auto-start the call on session initialization?
+ if (session->mStartCallOnInitialize)
+ {
+ gIMMgr->startCall(new_session_id);
+ }
}
//*TODO remove this "floater" stuff when Communicate Floater is gone
@@ -448,10 +461,16 @@ void LLIMModel::testMessages()
addMessage(bot2_session_id, from, bot2_id, "Test Message: OMGWTFBBQ.");
}
-
+//session name should not be empty
bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
{
+ if (name.empty())
+ {
+ llwarns << "Attempt to create a new session with empty name; id = " << session_id << llendl;
+ return false;
+ }
+
if (findIMSession(session_id))
{
llwarns << "IM Session " << session_id << " already exists" << llendl;
@@ -608,7 +627,7 @@ const std::string& LLIMModel::getName(const LLUUID& session_id) const
if (!session)
{
llwarns << "session " << session_id << "does not exist " << llendl;
- return LLStringUtil::null;
+ return NO_SESSION;
}
return session->mName;
@@ -995,18 +1014,6 @@ bool LLIMModel::sendStartSession(
return false;
}
-// static
-void LLIMModel::sendSessionInitialized(const LLUUID &session_id)
-{
- LLIMSession* session = getInstance()->findIMSession(session_id);
- if (session)
- {
- LLSD arg;
- arg["session_id"] = session_id;
- getInstance()->mSessionInitializedSignal(arg);
- }
-}
-
//
// Helper Functions
//
@@ -1079,7 +1086,7 @@ public:
if ( 404 == statusNum )
{
std::string error_string;
- error_string = "does not exist";
+ error_string = "session_does_not_exist_error";
gIMMgr->showSessionStartError(error_string, mSessionID);
}
}
@@ -1268,6 +1275,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
{
LLSD mCallDialogPayload;
LLOutgoingCallDialog* ocd;
+ bool is_incoming;
mCallDialogPayload["session_id"] = sSession->mSessionID;
mCallDialogPayload["session_name"] = sSession->mName;
@@ -1277,8 +1285,10 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
switch(new_state)
{
case LLVoiceChannel::STATE_CALL_STARTED :
- // do not show "Calling to..." if it is incoming P2P call
- if(sSession->mSessionType == LLIMModel::LLIMSession::P2P_SESSION && static_cast<LLVoiceChannelP2P*>(sSession->mVoiceChannel)->isIncomingCall())
+ // do not show "Calling to..." if it is incoming call
+ is_incoming = LLVoiceClient::getInstance()->isSessionIncoming(sSession->mSessionID);
+ // *TODO: implement for AdHoc and Group voice chats
+ if(is_incoming)
{
return;
}
@@ -1290,6 +1300,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
ocd->getChild<LLTextBox>("leaving")->setVisible(true);
ocd->getChild<LLTextBox>("connecting")->setVisible(false);
ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
+ ocd->getChild<LLButton>("Cancel")->setVisible(true);
}
return;
@@ -1301,10 +1312,12 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
ocd->getChild<LLTextBox>("leaving")->setVisible(true);
ocd->getChild<LLTextBox>("connecting")->setVisible(true);
ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
+ ocd->getChild<LLButton>("Cancel")->setVisible(true);
}
return;
case LLVoiceChannel::STATE_ERROR :
+ mCallDialogPayload["start_timer"] = true;
ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
if (ocd)
{
@@ -1312,6 +1325,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
ocd->getChild<LLTextBox>("leaving")->setVisible(false);
ocd->getChild<LLTextBox>("connecting")->setVisible(false);
ocd->getChild<LLTextBox>("noanswer")->setVisible(true);
+ ocd->getChild<LLButton>("Cancel")->setVisible(false);
}
return;
@@ -1363,6 +1377,33 @@ LLCallDialog(payload)
instance->onCancel(instance);
}
}
+void LLOutgoingCallDialog::draw()
+{
+ if (lifetimeHasExpired())
+ {
+ onLifetimeExpired();
+ }
+ LLDockableFloater::draw();
+}
+
+bool LLOutgoingCallDialog::lifetimeHasExpired()
+{
+ if (mLifetimeTimer.getStarted())
+ {
+ F32 elapsed_time = mLifetimeTimer.getElapsedTimeF32();
+ if (elapsed_time > LIFETIME)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+void LLOutgoingCallDialog::onLifetimeExpired()
+{
+ mLifetimeTimer.stop();
+ closeFloater();
+}
void LLOutgoingCallDialog::onOpen(const LLSD& key)
{
@@ -1391,6 +1432,13 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
icon->setValue(callee_id);
+
+ // stop timer by default
+ mLifetimeTimer.stop();
+ if(mPayload.has("start_timer"))
+ {
+ mLifetimeTimer.reset();
+ }
}
@@ -1514,6 +1562,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
return;
LLUUID session_id = mPayload["session_id"].asUUID();
+ LLUUID caller_id = mPayload["caller_id"].asUUID();
+ std::string session_name = mPayload["session_name"].asString();
EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger();
bool voice = true;
@@ -1530,8 +1580,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
{
// create a normal IM session
session_id = gIMMgr->addP2PSession(
- mPayload["session_name"].asString(),
- mPayload["caller_id"].asUUID(),
+ session_name,
+ caller_id,
mPayload["session_handle"].asString(),
mPayload["session_uri"].asString());
@@ -1549,10 +1599,38 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
}
else
{
- LLUUID new_session_id = gIMMgr->addSession(
- mPayload["session_name"].asString(),
- type,
- session_id);
+ //session name should not be empty, but it can contain spaces so we don't trim
+ std::string correct_session_name = session_name;
+ if (session_name.empty())
+ {
+ llwarns << "Received an empty session name from a server" << llendl;
+
+ switch(type){
+ case IM_SESSION_CONFERENCE_START:
+ case IM_SESSION_GROUP_START:
+ case IM_SESSION_INVITE:
+ if (gAgent.isInGroup(session_id))
+ {
+ LLGroupData data;
+ if (!gAgent.getGroupData(session_id, data)) break;
+ correct_session_name = data.mName;
+ }
+ else
+ {
+ if (gCacheName->getFullName(caller_id, correct_session_name))
+ {
+ correct_session_name.append(ADHOC_NAME_SUFFIX);
+ }
+ }
+ llinfos << "Corrected session name is " << correct_session_name << llendl;
+ break;
+ default:
+ llwarning("Received an empty session name from a server and failed to generate a new proper session name", 0);
+ break;
+ }
+ }
+
+ LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id);
if (new_session_id != LLUUID::null)
{
LLIMFloater::show(new_session_id);
@@ -1929,6 +2007,15 @@ BOOL LLIMMgr::getIMReceived() const
return mIMReceived;
}
+void LLIMMgr::autoStartCallOnStartup(const LLUUID& session_id)
+{
+ LLIMModel::LLIMSession *session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (session)
+ {
+ session->mStartCallOnInitialize = true;
+ }
+}
+
LLUUID LLIMMgr::addP2PSession(const std::string& name,
const LLUUID& other_participant_id,
const std::string& voice_session_handle,
@@ -1979,6 +2066,12 @@ LLUUID LLIMMgr::addSession(
return LLUUID::null;
}
+ if (name.empty())
+ {
+ llwarning("Session name cannot be null!", 0);
+ return LLUUID::null;
+ }
+
LLUUID session_id = computeSessionID(dialog,other_participant_id);
bool new_session = !LLIMModel::getInstance()->findIMSession(session_id);
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index c002434a18..f26889ac91 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -81,7 +81,6 @@ public:
SType mSessionType;
LLUUID mOtherParticipantID;
std::vector<LLUUID> mInitialTargetIDs;
- LLCallDialogManager* mCallDialogManager;
// connection to voice channel state change signal
boost::signals2::connection mVoiceChannelStateChangeConnection;
@@ -105,6 +104,7 @@ public:
bool mTextIMPossible;
bool mOtherParticipantIsAvatar;
+ bool mStartCallOnInitialize;
};
@@ -124,7 +124,6 @@ public:
typedef boost::function<void(const LLSD&)> session_callback_t;
session_signal_t mNewMsgSignal;
session_signal_t mNoUnreadMsgsSignal;
- session_signal_t mSessionInitializedSignal;
/**
* Find an IM Session corresponding to session_id
@@ -139,10 +138,10 @@ public:
boost::signals2::connection addNewMsgCallback( session_callback_t cb ) { return mNewMsgSignal.connect(cb); }
boost::signals2::connection addNoUnreadMsgsCallback( session_callback_t cb ) { return mNoUnreadMsgsSignal.connect(cb); }
- boost::signals2::connection addSessionInitializedCallback(session_callback_t cb ) { return mSessionInitializedSignal.connect(cb); }
/**
* Create new session object in a model
+ * @param name session name should not be empty, will return false if empty
*/
bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id,
const std::vector<LLUUID>& ids = std::vector<LLUUID>());
@@ -213,7 +212,6 @@ public:
static bool sendStartSession(const LLUUID& temp_session_id, const LLUUID& other_participant_id,
const std::vector<LLUUID>& ids, EInstantMessage dialog);
static void sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing);
- static void sendSessionInitialized(const LLUUID &session_id);
static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id,
const LLUUID& other_participant_id, EInstantMessage dialog);
@@ -299,6 +297,7 @@ public:
/**
* Creates a P2P session with the requisite handle for responding to voice calls.
*
+ * @param name session name, cannot be null
* @param caller_uri - sip URI of caller. It should be always be passed into the method to avoid
* incorrect working of LLVoiceChannel instances. See EXT-2985.
*/
@@ -330,6 +329,9 @@ public:
void notifyNewIM();
void clearNewIMNotification();
+ // automatically start a call once the session has initialized
+ void autoStartCallOnStartup(const LLUUID& session_id);
+
// IM received that you haven't seen yet
BOOL getIMReceived() const;
@@ -493,7 +495,16 @@ public:
static void onCancel(void* user_data);
+ // check timer state
+ /*virtual*/ void draw();
+
private:
+ // lifetime timer for NO_ANSWER notification
+ LLTimer mLifetimeTimer;
+ // lifetime duration for NO_ANSWER notification
+ static const S32 LIFETIME = 5;
+ bool lifetimeHasExpired();
+ void onLifetimeExpired();
};
// Globals
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 3746e9cfeb..52ebefabea 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3150,6 +3150,22 @@ void LLTextureBridge::openItem()
}
}
+bool LLTextureBridge::canSaveTexture(void)
+{
+ const LLInventoryModel* model = getInventoryModel();
+ if(!model)
+ {
+ return false;
+ }
+
+ const LLViewerInventoryItem *item = model->getItem(mUUID);
+ if (item)
+ {
+ return item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+ }
+ return false;
+}
+
void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;
@@ -3174,6 +3190,10 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Texture Separator"));
items.push_back(std::string("Save As"));
+ if (!canSaveTexture())
+ {
+ disabled_items.push_back(std::string("Save As"));
+ }
}
hide_context_entries(menu, items, disabled_items);
}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 63be9dcdb8..5e4e89a71b 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -377,6 +377,7 @@ public:
protected:
LLTextureBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type) :
LLItemBridge(inventory, uuid), mInvType(type) {}
+ bool canSaveTexture(void);
LLInventoryType::EType mInvType;
};
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 4cbf27b725..92b9dc427f 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -903,13 +903,10 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
if (!auto_open) return NULL;
// D. Open the inventory side panel and use that.
- LLSideTray *side_tray = LLSideTray::getInstance();
+ LLSD key;
LLSidepanelInventory *sidepanel_inventory =
- dynamic_cast<LLSidepanelInventory *>(side_tray->getPanel("sidepanel_inventory"));
-
- // Use the inventory side panel only if it is already active.
- // Activating it may unexpectedly switch off the currently active tab in some cases.
- if (sidepanel_inventory && (LLPanel*)side_tray->getActiveTab() == (LLPanel*)sidepanel_inventory)
+ dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->showPanel("sidepanel_inventory", key));
+ if (sidepanel_inventory)
{
return sidepanel_inventory->getActivePanel();
}
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 55d60ad52a..5f30ab4e01 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -101,6 +101,16 @@ const U32 ARROW_TO_AXIS[4] =
VZ
};
+// Sort manipulator handles by their screen-space projection
+struct ClosestToCamera
+{
+ bool operator()(const LLManipTranslate::ManipulatorHandle& a,
+ const LLManipTranslate::ManipulatorHandle& b) const
+ {
+ return a.mEndPosition.mV[VZ] < b.mEndPosition.mV[VZ];
+ }
+};
+
LLManipTranslate::LLManipTranslate( LLToolComposite* composite )
: LLManip( std::string("Move"), composite ),
mLastHoverMouseX(-1),
@@ -967,16 +977,10 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
LLVector2 mousePos((F32)x - half_width, (F32)y - half_height);
LLVector2 mouse_delta;
- struct ClosestToCamera {
- bool operator()(const ManipulatorHandle& a, const ManipulatorHandle& b) const
- {
- return a.mEndPosition.mV[VZ] < b.mEndPosition.mV[VZ];
- }
- } closest_to_camera;
// Keep order consistent with insertion via stable_sort
std::stable_sort( projected_manipulators.begin(),
projected_manipulators.end(),
- closest_to_camera );
+ ClosestToCamera() );
std::vector<ManipulatorHandle>::iterator it = projected_manipulators.begin();
for ( ; it != projected_manipulators.end(); ++it)
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 5c240aa54a..83a8dcd9f0 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -266,6 +266,11 @@ public:
static bool canLogToIM(const LLNotificationPtr& notification);
/**
+ * Checks sufficient conditions to log notification message to nearby chat session.
+ */
+ static bool canLogToNearbyChat(const LLNotificationPtr& notification);
+
+ /**
* Checks sufficient conditions to spawn IM session.
*/
static bool canSpawnIMSession(const LLNotificationPtr& notification);
@@ -287,6 +292,11 @@ public:
* Writes group notice notification message to IM group session.
*/
static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification);
+
+ /**
+ * Writes notification message to nearby chat.
+ */
+ static void logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type);
};
}
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 6748bd7982..5b54092c5c 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -37,6 +37,8 @@
#include "llnotifications.h"
#include "llimview.h"
#include "llagent.h"
+#include "llfloaterreg.h"
+#include "llnearbychat.h"
using namespace LLNotificationsUI;
@@ -47,7 +49,9 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
ADD_FRIEND_WITH_MESSAGE("AddFriendWithMessage"),
USER_GIVE_ITEM("UserGiveItem"), OFFER_FRIENDSHIP("OfferFriendship"),
FRIENDSHIP_ACCEPTED("FriendshipAccepted"),
- FRIENDSHIP_OFFERED("FriendshipOffered");
+ FRIENDSHIP_OFFERED("FriendshipOffered"),
+ FRIEND_ONLINE("FriendOnline"), FRIEND_OFFLINE("FriendOffline"),
+ SERVER_OBJECT_MESSAGE("ServerObjectMessage");
// static
bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
@@ -55,7 +59,16 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
return GRANTED_MODIFY_RIGHTS == notification->getName()
|| REVOKED_MODIFY_RIGHTS == notification->getName()
|| PAYMENT_RECIVED == notification->getName()
- || FRIENDSHIP_OFFERED == notification->getName();
+ || FRIENDSHIP_OFFERED == notification->getName()
+ || SERVER_OBJECT_MESSAGE == notification->getName();
+}
+
+// static
+bool LLHandlerUtil::canLogToNearbyChat(const LLNotificationPtr& notification)
+{
+ return notification->getType() == "notifytip"
+ && FRIEND_ONLINE != notification->getName()
+ && FRIEND_OFFLINE != notification->getName();
}
// static
@@ -144,3 +157,15 @@ void LLHandlerUtil::logGroupNoticeToIMGroup(
payload["group_id"], sender_id);
}
+// static
+void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChatSourceType type)
+{
+ LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ if(nearby_chat)
+ {
+ LLChat chat_msg(notification->getMessage());
+ chat_msg.mSourceType = type;
+ nearby_chat->addMessage(chat_msg);
+ }
+}
+
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 95f5ec801c..9afaddae82 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -88,18 +88,17 @@ bool LLTipHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
// archive message in nearby chat
- LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
- if(nearby_chat)
+ if (LLHandlerUtil::canLogToNearbyChat(notification))
{
- LLChat chat_msg(notification->getMessage());
- chat_msg.mSourceType = CHAT_SOURCE_SYSTEM;
- nearby_chat->addMessage(chat_msg);
+ LLHandlerUtil::logToNearbyChat(notification, CHAT_SOURCE_SYSTEM);
// don't show toast if Nearby Chat is opened
+ LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<
+ LLNearbyChat>("nearby_chat", LLSD());
if (nearby_chat->getVisible())
{
return true;
- }
+ }
}
LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index eb9cb10d56..b9f422ca6f 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -51,6 +51,7 @@
#include "llfloaterworldmap.h"
#include "llfloaterreg.h"
#include "llnotificationsutil.h"
+#include "llvoiceclient.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLDropTarget
@@ -395,6 +396,7 @@ void LLPanelProfileTab::updateButtons()
&& gAgent.isGodlike() || is_agent_mappable(getAvatarId());
childSetEnabled("show_on_map_btn", enable_map_btn);
+ childSetEnabled("call", LLVoiceClient::voiceEnabled());
}
//////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 2cb3967685..fff2575893 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -90,6 +90,7 @@ LLPanelGroup::LLPanelGroup()
: LLPanel(),
LLGroupMgrObserver( LLUUID() ),
mAllowEdit( TRUE )
+ ,mShowingNotifyDialog(false)
{
// Set up the factory callbacks.
// Roles sub tabs
@@ -538,3 +539,69 @@ void LLPanelGroup::showNotice(const std::string& subject,
}
+bool LLPanelGroup::canClose()
+{
+ if(getVisible() == false)
+ return true;
+
+ bool need_save = false;
+ std::string mesg;
+ for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it)
+ if(need_save|=(*it)->needsApply(mesg))
+ break;
+ if(!need_save)
+ return false;
+ // If no message was provided, give a generic one.
+ if (mesg.empty())
+ {
+ mesg = mDefaultNeedsApplyMesg;
+ }
+ // Create a notify box, telling the user about the unapplied tab.
+ LLSD args;
+ args["NEEDS_APPLY_MESSAGE"] = mesg;
+ args["WANT_APPLY_MESSAGE"] = mWantApplyMesg;
+
+ LLNotificationsUtil::add("SaveChanges", args, LLSD(), boost::bind(&LLPanelGroup::handleNotifyCallback,this, _1, _2));
+
+ mShowingNotifyDialog = true;
+
+ return false;
+}
+
+bool LLPanelGroup::notifyChildren(const LLSD& info)
+{
+ if(info.has("request") && mID.isNull() )
+ {
+ std::string str_action = info["request"];
+
+ if (str_action == "quit" )
+ {
+ canClose();
+ return true;
+ }
+ if(str_action == "wait_quit")
+ return mShowingNotifyDialog;
+ }
+ return false;
+}
+bool LLPanelGroup::handleNotifyCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ mShowingNotifyDialog = false;
+ switch (option)
+ {
+ case 0: // "Apply Changes"
+ apply();
+ break;
+ case 1: // "Ignore Changes"
+ break;
+ case 2: // "Cancel"
+ default:
+ // Do nothing. The user is canceling the action.
+ // If we were quitting, we didn't really mean it.
+ LLAppViewer::instance()->abortQuit();
+ break;
+ }
+ return false;
+}
+
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 306e6575fc..f6aefdb676 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -89,7 +89,10 @@ public:
const std::string& inventory_name,
LLOfferInfo* inventory_offer);
-
+
+ bool notifyChildren (const LLSD& info);
+ bool handleNotifyCallback(const LLSD&, const LLSD&);
+
protected:
virtual void update(LLGroupChange gc);
@@ -107,6 +110,9 @@ protected:
protected:
bool apply(LLPanelGroupTab* tab);
+ bool canClose();
+
+ bool mShowingNotifyDialog;
LLTimer mRefreshTimer;
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 8c19865550..4f76d32ad5 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -101,14 +101,6 @@ void LLPanelChatControlPanel::draw()
&& callback_enabled;
childSetEnabled("call_btn", enable_connect);
- // send a signal when the floater is fully initialized
- // this lets LLAvatarActions::startAdhocCall() start the call
- if (enable_connect && !mInitialized)
- {
- LLIMModel::sendSessionInitialized(mSessionId);
- mInitialized = true;
- }
-
LLPanel::draw();
}
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 871779b273..711340efc7 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -45,8 +45,7 @@ class LLPanelChatControlPanel : public LLPanel
{
public:
LLPanelChatControlPanel() :
- mSessionId(LLUUID()),
- mInitialized(false) {};
+ mSessionId(LLUUID()) {};
~LLPanelChatControlPanel();
virtual BOOL postBuild();
@@ -63,7 +62,6 @@ public:
private:
LLUUID mSessionId;
- bool mInitialized;
// connection to voice channel state change signal
boost::signals2::connection mVoiceChannelStateChangeConnection;
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index c85fab2092..32c9faa688 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -66,6 +66,30 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn";
// helper functions
static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string);
+static void save_folder_state_if_no_filter(LLInventorySubTreePanel* inventory_list);
+
+/**
+ * Bridge to support knowing when the inventory has changed to update folder (open/close) state
+ * for landmarks panels.
+ *
+ * Due to Inventory data are loaded in background we need to save folder state each time
+ * next level is loaded. See EXT-3094.
+ */
+class LLLandmarksPanelObserver : public LLInventoryObserver
+{
+public:
+ LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {}
+ virtual ~LLLandmarksPanelObserver() {}
+ /*virtual*/ void changed(U32 mask);
+
+private:
+ LLLandmarksPanel* mLP;
+};
+
+void LLLandmarksPanelObserver::changed(U32 mask)
+{
+ mLP->saveFolderStateIfNoFilter();
+}
LLLandmarksPanel::LLLandmarksPanel()
: LLPanelPlacesTab()
@@ -78,11 +102,18 @@ LLLandmarksPanel::LLLandmarksPanel()
, mGearFolderMenu(NULL)
, mGearLandmarkMenu(NULL)
{
+ mInventoryObserver = new LLLandmarksPanelObserver(this);
+ gInventory.addObserver(mInventoryObserver);
+
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml");
}
LLLandmarksPanel::~LLLandmarksPanel()
{
+ if (gInventory.containsObserver(mInventoryObserver))
+ {
+ gInventory.removeObserver(mInventoryObserver);
+ }
}
BOOL LLLandmarksPanel::postBuild()
@@ -226,6 +257,14 @@ void LLLandmarksPanel::onSelectorButtonClicked()
}
}
+void LLLandmarksPanel::saveFolderStateIfNoFilter()
+{
+ save_folder_state_if_no_filter(mFavoritesInventoryPanel);
+ save_folder_state_if_no_filter(mLandmarksInventoryPanel);
+ save_folder_state_if_no_filter(mMyInventoryPanel);
+ save_folder_state_if_no_filter(mLibraryInventoryPanel);
+}
+
//////////////////////////////////////////////////////////////////////////
// PROTECTED METHODS
//////////////////////////////////////////////////////////////////////////
@@ -743,7 +782,7 @@ void LLLandmarksPanel::updateFilteredAccordions()
{
LLInventoryPanel* inventory_list = NULL;
LLAccordionCtrlTab* accordion_tab = NULL;
-// bool needs_arrange = false;
+ bool needs_arrange = false;
for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
{
@@ -755,7 +794,7 @@ void LLLandmarksPanel::updateFilteredAccordions()
if (NULL == inventory_list) continue;
// This doesn't seem to work correctly. Disabling for now. -Seraph
- /*
+ // Enabled to show/hide accordions with/without landmarks. See EXT-2346. (Seth PE)
LLFolderView* fv = inventory_list->getRootFolder();
// arrange folder view contents to draw its descendants if it has any
@@ -766,17 +805,17 @@ void LLLandmarksPanel::updateFilteredAccordions()
needs_arrange = true;
accordion_tab->setVisible(has_descendants);
- */
- accordion_tab->setVisible(TRUE);
+
+ //accordion_tab->setVisible(TRUE);
}
// we have to arrange accordion tabs for cases when filter string is less restrictive but
// all items are still filtered.
-// if (needs_arrange)
-// {
+ if (needs_arrange)
+ {
static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
accordion->arrange();
-// }
+ }
}
/*
@@ -1010,4 +1049,13 @@ static void filter_list(LLInventorySubTreePanel* inventory_list, const std::stri
inventory_list->setFilterSubString(string);
}
+
+static void save_folder_state_if_no_filter(LLInventorySubTreePanel* inventory_list)
+{
+ // save current folder open state if no filter currently applied
+ if (inventory_list->getRootFolder() && inventory_list->getRootFolder()->getFilterSubString().empty())
+ {
+ // inventory_list->saveFolderState(); // *TODO: commented out to fix build
+ }
+}
// EOF
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index bee141d051..b0e537f647 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -67,6 +67,11 @@ public:
mCurrentSelectedList = inventory_list;
}
+ /**
+ * Saves folder state for all Inventory Panels if there are no applied filter.
+ */
+ void saveFolderStateIfNoFilter();
+
protected:
/**
* @return true - if current selected panel is not null and selected item is a landmark
@@ -151,6 +156,7 @@ private:
LLMenuGL* mGearFolderMenu;
LLMenuGL* mMenuAdd;
LLInventorySubTreePanel* mCurrentSelectedList;
+ LLInventoryObserver* mInventoryObserver;
LLPanel* mListCommands;
bool mSortByDate;
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 5e983f41c7..063491494e 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -73,6 +73,11 @@
#include "llfloatertos.h"
#include "lltrans.h"
#include "llglheaders.h"
+#include "llpanelloginlistener.h"
+
+#if LL_WINDOWS
+#pragma warning(disable: 4355) // 'this' used in initializer list
+#endif // LL_WINDOWS
#define USE_VIEWER_AUTH 0
@@ -166,7 +171,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
mLogoImage(),
mCallback(callback),
mCallbackData(cb_data),
- mHtmlAvailable( TRUE )
+ mHtmlAvailable( TRUE ),
+ mListener(new LLPanelLoginListener(this))
{
setFocusRoot(TRUE);
@@ -452,7 +458,7 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask)
if ( KEY_F1 == key )
{
LLViewerHelp* vhelp = LLViewerHelp::getInstance();
- vhelp->showTopic(vhelp->getTopicFromFocus());
+ vhelp->showTopic(vhelp->f1HelpTopic());
return TRUE;
}
@@ -968,7 +974,7 @@ void LLPanelLogin::onClickHelp(void*)
if (sInstance)
{
LLViewerHelp* vhelp = LLViewerHelp::getInstance();
- vhelp->showTopic(vhelp->getTopicFromFocus());
+ vhelp->showTopic(vhelp->preLoginTopic());
}
}
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index e3d30d7d0c..97350ce5c7 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -36,10 +36,11 @@
#include "llpanel.h"
#include "llpointer.h" // LLPointer<>
#include "llmediactrl.h" // LLMediaCtrlObserver
+#include <boost/scoped_ptr.hpp>
class LLLineEditor;
class LLUIImage;
-
+class LLPanelLoginListener;
class LLPanelLogin:
public LLPanel,
@@ -90,6 +91,7 @@ public:
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
private:
+ friend class LLPanelLoginListener;
void reshapeBrowser();
static void onClickConnect(void*);
static void onClickNewAccount(void*);
@@ -103,6 +105,7 @@ private:
private:
LLPointer<LLUIImage> mLogoImage;
+ boost::scoped_ptr<LLPanelLoginListener> mListener;
void (*mCallback)(S32 option, void *userdata);
void* mCallbackData;
diff --git a/indra/newview/llpanelloginlistener.cpp b/indra/newview/llpanelloginlistener.cpp
new file mode 100644
index 0000000000..f7e59aaf54
--- /dev/null
+++ b/indra/newview/llpanelloginlistener.cpp
@@ -0,0 +1,34 @@
+/**
+ * @file llpanelloginlistener.cpp
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief Implementation for llpanelloginlistener.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "llpanelloginlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llpanellogin.h"
+
+LLPanelLoginListener::LLPanelLoginListener(LLPanelLogin* instance):
+ LLEventAPI("LLPanelLogin", "Access to LLPanelLogin methods"),
+ mPanel(instance)
+{
+ add("onClickConnect",
+ "Pretend user clicked the \"Log In\" button",
+ &LLPanelLoginListener::onClickConnect);
+}
+
+void LLPanelLoginListener::onClickConnect(const LLSD&) const
+{
+ mPanel->onClickConnect(NULL);
+}
diff --git a/indra/newview/llpanelloginlistener.h b/indra/newview/llpanelloginlistener.h
new file mode 100644
index 0000000000..0a56c75422
--- /dev/null
+++ b/indra/newview/llpanelloginlistener.h
@@ -0,0 +1,30 @@
+/**
+ * @file llpanelloginlistener.h
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief LLEventAPI for LLPanelLogin
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLPANELLOGINLISTENER_H)
+#define LL_LLPANELLOGINLISTENER_H
+
+#include "lleventapi.h"
+class LLPanelLogin;
+class LLSD;
+
+class LLPanelLoginListener: public LLEventAPI
+{
+public:
+ LLPanelLoginListener(LLPanelLogin* instance);
+
+private:
+ void onClickConnect(const LLSD&) const;
+
+ LLPanelLogin* mPanel;
+};
+
+#endif /* ! defined(LL_LLPANELLOGINLISTENER_H) */
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 21627e84ff..cef21e85d6 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llpanelmaininventory.h"
+#include "llagent.h"
#include "lldndbutton.h"
#include "llfilepicker.h"
#include "llfloaterinventory.h"
@@ -863,7 +864,6 @@ void LLPanelMainInventory::initListCommandsHandlers()
mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2));
mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
-
}
void LLPanelMainInventory::updateListCommands()
@@ -909,6 +909,22 @@ void LLPanelMainInventory::onClipboardAction(const LLSD& userdata)
getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
}
+void LLPanelMainInventory::saveTexture(const LLSD& userdata)
+{
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+
+ const LLUUID& item_id = current_item->getListener()->getUUID();
+ LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
+ if (preview_texture)
+ {
+ preview_texture->openToSave();
+ }
+}
+
void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
{
if (!isActionEnabled(userdata))
@@ -953,18 +969,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
}
if (command_name == "save_texture")
{
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- {
- return;
- }
-
- const LLUUID& item_id = current_item->getListener()->getUUID();
- LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
- if (preview_texture)
- {
- preview_texture->openToSave();
- }
+ saveTexture(userdata);
}
// This doesn't currently work, since the viewer can't change an assetID an item.
if (command_name == "regenerate_link")
@@ -1008,6 +1013,22 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
}
}
+bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
+{
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (current_item)
+ {
+ LLViewerInventoryItem *inv_item = current_item->getInventoryItem();
+ if(inv_item)
+ {
+ bool can_save = inv_item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
+ LLInventoryType::EType curr_type = current_item->getListener()->getInventoryType();
+ return can_save && (curr_type == LLInventoryType::IT_TEXTURE || curr_type == LLInventoryType::IT_SNAPSHOT);
+ }
+ }
+ return false;
+}
+
BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
{
const std::string command_name = userdata.asString();
@@ -1035,12 +1056,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
}
if (command_name == "save_texture")
{
- LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
- if (current_item)
- {
- return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE);
- }
- return FALSE;
+ return isSaveTextureEnabled(userdata);
}
if (command_name == "find_original")
{
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index ae78d3bec8..92443df369 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -110,6 +110,8 @@ protected:
void doCreate(const LLSD& userdata);
void resetFilters();
void setSortBy(const LLSD& userdata);
+ void saveTexture(const LLSD& userdata);
+ bool isSaveTextureEnabled(const LLSD& userdata);
private:
LLFloaterInventoryFinder* getFinder();
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 9d38dab26e..43366ef814 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -157,7 +157,7 @@ LLInventoryItem* LLTaskInvFVBridge::findItem() const
LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
if(object)
{
- return (LLInventoryItem*)(object->getInventoryObject(mUUID));
+ return dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID));
}
return NULL;
}
@@ -712,6 +712,7 @@ public:
virtual LLUIImagePtr getIcon() const;
virtual const std::string& getDisplayName() const { return getName(); }
virtual BOOL isItemRenameable() const;
+ // virtual BOOL isItemCopyable() const { return FALSE; }
virtual BOOL renameItem(const std::string& new_name);
virtual BOOL isItemRemovable();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 1e4682701e..5fb7dab7be 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -775,7 +775,7 @@ void LLPanelPeople::updateButtons()
buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
buttonSetEnabled("view_profile_btn", item_selected);
buttonSetEnabled("im_btn", multiple_selected); // allow starting the friends conference for multiple selection
- buttonSetEnabled("call_btn", multiple_selected);
+ buttonSetEnabled("call_btn", multiple_selected && LLVoiceClient::voiceEnabled());
buttonSetEnabled("share_btn", item_selected); // not implemented yet
bool none_group_selected = item_selected && selected_id.isNull();
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 57f3d86d53..04fe42de9f 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -100,7 +100,7 @@ LLContextMenu* NearbyMenu::createMenu()
registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id));
registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented
- registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented
+ registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, id));
registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, id));
registrar.add("Avatar.BlockUnblock", boost::bind(&LLAvatarActions::toggleBlock, id));
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index f7f3c5830d..e21eb01da3 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -278,12 +278,20 @@ void LLPanelPlaces::onOpen(const LLSD& key)
}
else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)
{
- mPosGlobal = LLVector3d(key["x"].asReal(),
- key["y"].asReal(),
- key["z"].asReal());
+ if (key.has("id"))
+ {
+ LLUUID parcel_id = key["id"].asUUID();
+ mPlaceProfile->setParcelID(parcel_id);
+ }
+ else
+ {
+ mPosGlobal = LLVector3d(key["x"].asReal(),
+ key["y"].asReal(),
+ key["z"].asReal());
+ mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
+ }
mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE);
- mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);
}
else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)
{
@@ -854,6 +862,7 @@ void LLPanelPlaces::updateVerbs()
mCancelBtn->setVisible(isLandmarkEditModeOn);
mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
+ mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn);
mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible);
if (is_place_info_visible)
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 13f195a1be..48a7a32a3b 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -278,6 +278,16 @@ void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_lis
//
bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
+ /**
+ * We need to filter speaking objects. These objects shouldn't appear in the list
+ * @c LLFloaterChat::addChat() in llviewermessage.cpp to get detailed call hierarchy
+ */
+ const LLUUID& speaker_id = event->getValue().asUUID();
+ LLPointer<LLSpeaker> speaker = mParent.mSpeakerMgr->findSpeaker(speaker_id);
+ if(speaker.isNull() || speaker->mType == LLSpeaker::SPEAKER_OBJECT)
+ {
+ return false;
+ }
return mParent.onAddItemEvent(event, userdata);
}
@@ -314,6 +324,8 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
registrar.add("ParticipantList.ToggleAllowTextChat", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleAllowTextChat, this, _2));
registrar.add("ParticipantList.ToggleMuteText", boost::bind(&LLParticipantList::LLParticipantListMenu::toggleMuteText, this, _2));
+ registrar.add("ParticipantList.ModerateVoice", boost::bind(&LLParticipantList::LLParticipantListMenu::moderateVoice, this, _2));
+
enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem, this, _2));
enable_registrar.add("ParticipantList.CheckItem", boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem, this, _2));
@@ -322,6 +334,28 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
"menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
}
+void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
+{
+ LLPanelPeopleMenus::ContextMenu::show(spawning_view, uuids, x, y);
+
+ if (uuids.size() == 0) return;
+
+ const LLUUID speaker_id = mUUIDs.front();
+ BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagVoiceChat);
+
+ if (is_muted)
+ {
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteSelected", false);
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteOthers", false);
+ }
+ else
+ {
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteSelected", false);
+ LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteOthers", false);
+ }
+
+}
+
void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& userdata)
{
const LLUUID speaker_id = mUUIDs.front();
@@ -379,10 +413,10 @@ void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& u
new MuteTextResponder(mParent.mSpeakerMgr->getSessionID()));
}
-void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata)
+void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata, U32 flags)
{
const LLUUID speaker_id = mUUIDs.front();
- BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, LLMute::flagTextChat);
+ BOOL is_muted = LLMuteList::getInstance()->isMuted(speaker_id, flags);
std::string name;
//fill in name using voice client's copy of name cache
@@ -398,12 +432,54 @@ void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userda
if (!is_muted)
{
- LLMuteList::getInstance()->add(mute, LLMute::flagTextChat);
+ LLMuteList::getInstance()->add(mute, flags);
}
else
{
- LLMuteList::getInstance()->remove(mute, LLMute::flagTextChat);
+ LLMuteList::getInstance()->remove(mute, flags);
+ }
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleMuteText(const LLSD& userdata)
+{
+ toggleMute(userdata, LLMute::flagTextChat);
+}
+
+void LLParticipantList::LLParticipantListMenu::toggleMuteVoice(const LLSD& userdata)
+{
+ toggleMute(userdata, LLMute::flagVoiceChat);
+}
+
+void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdata)
+{
+
+}
+void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLSD& userdata)
+{
+ LLSpeakerMgr::speaker_list_t speakers;
+ mParent.mSpeakerMgr->getSpeakerList(&speakers, true);
+
+ const LLUUID& excluded_avatar_id = mUUIDs.front();
+ bool should_mute = userdata.asString() == "mute";
+ for (LLSpeakerMgr::speaker_list_t::iterator iter = speakers.begin();
+ iter != speakers.end(); ++iter)
+ {
+ LLSpeaker* speakerp = (*iter).get();
+ LLUUID speaker_id = speakerp->mID;
+ if (excluded_avatar_id == speaker_id) continue;
+
+ LLMute mute(speaker_id, speakerp->mDisplayName, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT);
+
+ if (should_mute)
+ {
+ LLMuteList::getInstance()->add(mute, LLMute::flagVoiceChat);
+ }
+ else
+ {
+ LLMuteList::getInstance()->remove(mute, LLMute::flagVoiceChat);
+ }
}
+
}
bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata)
@@ -414,7 +490,7 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD&
return mUUIDs.front() != gAgentID;
}
else
- if (item == "can_allow_text_chat")
+ if (item == "can_allow_text_chat" || "can_moderate_voice" == item)
{
LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mParent.mSpeakerMgr->getSessionID());
return im_session->mType == IM_SESSION_GROUP_START && mParent.mSpeakerMgr->findSpeaker(gAgentID)->mIsModerator;
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 86b38f5f1e..83191a5b8d 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -117,6 +117,7 @@ class LLParticipantList
public:
LLParticipantListMenu(LLParticipantList& parent):mParent(parent){};
/*virtual*/ LLContextMenu* createMenu();
+ /*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y);
protected:
LLParticipantList& mParent;
private:
@@ -124,8 +125,13 @@ class LLParticipantList
bool checkContextMenuItem(const LLSD& userdata);
void toggleAllowTextChat(const LLSD& userdata);
+ void toggleMute(const LLSD& userdata, U32 flags);
void toggleMuteText(const LLSD& userdata);
+ void toggleMuteVoice(const LLSD& userdata);
+ // Voice moderation support
+ void moderateVoice(const LLSD& userdata);
+ void moderateVoiceOtherParticipants(const LLSD& userdata);
};
private:
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 0362fdbf56..8d80310769 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -54,6 +54,7 @@
#include "llscrolllistcell.h"
#include "llslider.h"
#include "lscript_rt_interface.h"
+#include "lscript_library.h"
#include "lscript_export.h"
#include "lltextbox.h"
#include "lltooldraganddrop.h"
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 698f6152b4..26694ac433 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -76,29 +76,12 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)
mAspectRatio(0.f),
mPreviewToSave(FALSE)
{
- const LLInventoryItem *item = getItem();
+ const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem());
if(item)
{
mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID();
mImageID = item->getAssetUUID();
- const LLPermissions& perm = item->getPermissions();
- U32 mask = PERM_NONE;
- if(perm.getOwner() == gAgent.getID())
- {
- mask = perm.getMaskBase();
- }
- else if(gAgent.isInGroup(perm.getGroup()))
- {
- mask = perm.getMaskGroup();
- }
- else
- {
- mask = perm.getMaskEveryone();
- }
- if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
- {
- mIsCopyable = TRUE;
- }
+ mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
}
else // not an item, assume it's an asset id
{
@@ -145,6 +128,9 @@ BOOL LLPreviewTexture::postBuild()
childSetVisible("Discard", false);
}
+ childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this);
+ childSetVisible("save_tex_btn", canSaveAs());
+
if (!mCopyToInv)
{
const LLInventoryItem* item = getItem();
@@ -164,6 +150,13 @@ BOOL LLPreviewTexture::postBuild()
return LLPreview::postBuild();
}
+// static
+void LLPreviewTexture::onSaveAsBtn(void* data)
+{
+ LLPreviewTexture* self = (LLPreviewTexture*)data;
+ self->saveAs();
+}
+
void LLPreviewTexture::draw()
{
if (mUpdateDimensions)
@@ -576,6 +569,7 @@ void LLPreviewTexture::loadAsset()
mImage->forceToSaveRawImage(0) ;
mAssetStatus = PREVIEW_ASSET_LOADING;
updateDimensions();
+ childSetVisible("save_tex_btn", canSaveAs());
}
LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h
index 9b3c91d831..980aecee6d 100644
--- a/indra/newview/llpreviewtexture.h
+++ b/indra/newview/llpreviewtexture.h
@@ -58,7 +58,6 @@ public:
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
virtual void onFocusReceived();
- static void saveToFile(void* userdata);
static void onFileLoadedForSave(
BOOL success,
LLViewerFetchedTexture *src_vi,
@@ -68,6 +67,8 @@ public:
BOOL final,
void* userdata );
void openToSave();
+
+ static void onSaveAsBtn(void* data);
protected:
void init();
/* virtual */ BOOL postBuild();
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 4f0c873c61..f66f725070 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -78,6 +78,22 @@ LLScreenChannelBase::~LLScreenChannelBase()
{
mWorldViewRectConnection.disconnect();
}
+
+bool LLScreenChannelBase::isHovering()
+{
+ bool res = mHoveredToast != NULL;
+ if (!res)
+ {
+ return res;
+ }
+
+ S32 x, y;
+ mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
+ gViewerWindow->getCurrentMouseY(), &x, &y);
+ res = mHoveredToast->pointInView(x, y) == TRUE;
+ return res;
+}
+
void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
{
S32 top_delta = old_world_rect.mTop - new_world_rect.mTop;
@@ -125,6 +141,8 @@ LLScreenChannelBase(id)
void LLScreenChannel::init(S32 channel_left, S32 channel_right)
{
LLScreenChannelBase::init(channel_left, channel_right);
+ LLRect world_rect = gViewerWindow->getWorldViewRectScaled();
+ updatePositionAndSize(world_rect, world_rect);
}
//--------------------------------------------------------------------------
@@ -136,7 +154,23 @@ LLScreenChannel::~LLScreenChannel()
//--------------------------------------------------------------------------
void LLScreenChannel::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
{
- LLScreenChannelBase::updatePositionAndSize(old_world_rect, new_world_rect);
+ S32 right_delta = old_world_rect.mRight - new_world_rect.mRight;
+ LLRect this_rect = getRect();
+
+ this_rect.mTop = (S32) (new_world_rect.getHeight() * getHeightRatio());
+ switch(mChannelAlignment)
+ {
+ case CA_LEFT :
+ break;
+ case CA_CENTRE :
+ this_rect.setCenterAndSize(new_world_rect.getWidth() / 2, new_world_rect.getHeight() / 2, this_rect.getWidth(), this_rect.getHeight());
+ break;
+ case CA_RIGHT :
+ this_rect.mLeft -= right_delta;
+ this_rect.mRight -= right_delta;
+ }
+ setRect(this_rect);
+ redrawToasts();
}
//--------------------------------------------------------------------------
@@ -169,6 +203,7 @@ void LLScreenChannel::addToast(const LLToast::Params& p)
if(show_toast)
{
mToastList.push_back(new_toast_elem);
+ updateShowToastsState();
redrawToasts();
}
else // store_toast
@@ -224,6 +259,7 @@ void LLScreenChannel::deleteToast(LLToast* toast)
if(mHoveredToast == toast)
{
mHoveredToast = NULL;
+ startFadingToasts();
}
// close the toast
@@ -405,26 +441,27 @@ void LLScreenChannel::showToastsBottom()
{
if( it != mToastList.rend()-1)
{
- stop_showing_toasts = ((*it).toast->getRect().mTop + gSavedSettings.getS32("OverflowToastHeight") + gSavedSettings.getS32("ToastGap")) > getRect().mTop;
+ S32 toast_top = (*it).toast->getRect().mTop + gSavedSettings.getS32("ToastGap");
+ stop_showing_toasts = toast_top > getRect().mTop;
}
}
+ // at least one toast should be visible
+ if(it == mToastList.rbegin())
+ {
+ stop_showing_toasts = false;
+ }
+
if(stop_showing_toasts)
break;
if( !(*it).toast->getVisible() )
{
- if((*it).toast->isFirstLook())
- {
- (*it).toast->setVisible(TRUE);
- }
- else
- {
- // HACK
- // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
- (*it).toast->setVisible(TRUE);
- gFloaterView->sendChildToBack((*it).toast);
- }
+ // HACK
+ // EXT-2653: it is necessary to prevent overlapping for secondary showed toasts
+ (*it).toast->setVisible(TRUE);
+ // Show toast behind floaters. (EXT-3089)
+ gFloaterView->sendChildToBack((*it).toast);
}
}
@@ -566,6 +603,21 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
mStartUpToastPanel->setVisible(TRUE);
}
+// static --------------------------------------------------------------------------
+F32 LLScreenChannel::getHeightRatio()
+{
+ F32 ratio = gSavedSettings.getF32("NotificationChannelHeightRatio");
+ if(0.0f > ratio)
+ {
+ ratio = 0.0f;
+ }
+ else if(1.0f < ratio)
+ {
+ ratio = 1.0f;
+ }
+ return ratio;
+}
+
//--------------------------------------------------------------------------
void LLScreenChannel::updateStartUpString(S32 num)
{
@@ -608,7 +660,7 @@ void LLNotificationsUI::LLScreenChannel::startFadingToasts()
if (!mToastList.size()) return;
//because onMouseLeave is processed after onMouseEnter
- if (mHoveredToast) return;
+ if (isHovering()) return;
std::vector<ToastElem>::iterator it = mToastList.begin();
while (it != mToastList.end())
@@ -685,39 +737,28 @@ void LLScreenChannel::removeToastsBySessionID(LLUUID id)
//--------------------------------------------------------------------------
void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
{
- // because of LLViewerWindow::updateUI() that ALWAYS calls onMouseEnter BEFORE onMouseLeave
- // we must check this to prevent incorrect setting for hovering in a channel
- std::map<LLToast*, bool>::iterator it_first, it_second;
- S32 stack_size = mToastEventStack.size();
- if(mouse_enter)
- {
- mHoveredToast = toast;
- }
- else
+ // because of LLViewerWindow::updateUI() that NOT ALWAYS calls onMouseEnter BEFORE onMouseLeave
+ // we must check hovering directly to prevent incorrect setting for hovering in a channel
+ S32 x,y;
+ if (mouse_enter)
{
- mHoveredToast = NULL;
- }
-
- switch(stack_size)
- {
- case 0:
- mToastEventStack.insert(std::pair<LLToast*, bool>(toast, mouse_enter));
- break;
- case 1:
- it_first = mToastEventStack.begin();
- if((*it_first).second && !mouse_enter && ((*it_first).first != toast) )
+ toast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
+ gViewerWindow->getCurrentMouseY(), &x, &y);
+ bool hover = toast->pointInView(x, y) == TRUE;
+ if (hover)
{
- mToastEventStack.clear();
mHoveredToast = toast;
}
- else
+ }
+ else if (mHoveredToast != NULL)
+ {
+ mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
+ gViewerWindow->getCurrentMouseY(), &x, &y);
+ bool hover = mHoveredToast->pointInView(x, y) == TRUE;
+ if (!hover)
{
- mToastEventStack.clear();
- mToastEventStack.insert(std::pair<LLToast*, bool>(toast, mouse_enter));
+ mHoveredToast = NULL;
}
- break;
- default:
- LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl;
}
if(!isHovering())
@@ -727,7 +768,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
//--------------------------------------------------------------------------
void LLScreenChannel::updateShowToastsState()
{
- LLFloater* floater = LLDockableFloater::getInstanceHandle().get();
+ LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get());
if(!floater)
{
@@ -735,27 +776,17 @@ void LLScreenChannel::updateShowToastsState()
return;
}
- // for IM floaters showed in a docked state - prohibit showing of ani toast
- if(dynamic_cast<LLIMFloater*>(floater)
- || dynamic_cast<LLScriptFloater*>(floater) )
- {
- setShowToasts(!(floater->getVisible() && floater->isDocked()));
- if (!getShowToasts())
- {
- removeAndStoreAllStorableToasts();
- }
- }
-
// *TODO: mantipov: what we have to do with derived classes: LLNotificationWellWindow & LLIMWelWindow?
// See EXT-3081 for details
// for Message Well floater showed in a docked state - adjust channel's height
- if(dynamic_cast<LLSysWellWindow*>(floater))
+ if(dynamic_cast<LLSysWellWindow*>(floater) || dynamic_cast<LLIMFloater*>(floater))
{
S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");;
LLRect this_rect = getRect();
if(floater->getVisible() && floater->isDocked())
{
- channel_bottom += (floater->getRect().getHeight() + gSavedSettings.getS32("ToastGap"));
+ channel_bottom += floater->getRect().getHeight();
+ channel_bottom += floater->getDockControl()->getTongueHeight();
}
if(channel_bottom != this_rect.mBottom)
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index 67f1c9bdc6..b8efbb148f 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -95,7 +95,7 @@ public:
virtual void setControlHovering(bool control) { mControlHovering = control; }
- bool isHovering() { return mHoveredToast != NULL; }
+ bool isHovering();
void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
@@ -265,6 +265,11 @@ private:
// create the StartUp Toast
void createStartUpToast(S32 notif_num, F32 timer);
+ /**
+ * Notification channel and World View ratio(0.0 - always show 1 notification, 1.0 - max ratio).
+ */
+ static F32 getHeightRatio();
+
// Channel's flags
static bool mWasStartUpToastShown;
@@ -274,7 +279,6 @@ private:
std::vector<ToastElem> mToastList;
std::vector<ToastElem> mStoredToastList;
- std::map<LLToast*, bool> mToastEventStack;
};
}
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 8de99a48aa..5c4f6e8860 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -39,6 +39,7 @@
#include "llfloaterreg.h"
#include "llnotifications.h"
#include "llscreenchannel.h"
+#include "llsyswellwindow.h"
#include "lltoastnotifypanel.h"
#include "llviewerwindow.h"
#include "llimfloater.h"
@@ -240,6 +241,14 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id);
}
+ LLIMWellWindow::getInstance()->addObjectRow(object_id, set_new_message);
+
+ LLSD data;
+ data["object_id"] = object_id;
+ data["new_message"] = set_new_message;
+ data["unread"] = 1; // each object has got only one floater
+ mNewObjectSignal(data);
+
toggleScriptFloater(object_id, set_new_message);
}
@@ -267,6 +276,8 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
// remove related chiclet
LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id);
+ LLIMWellWindow::getInstance()->removeObjectRow(object_id);
+
// close floater
LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
if(floater)
@@ -291,13 +302,6 @@ void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_i
void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id, bool set_new_message)
{
- // hide "new message" icon from chiclet
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id);
- if(chiclet)
- {
- chiclet->setShowNewMessagesIcon(set_new_message);
- }
-
// kill toast
using namespace LLNotificationsUI;
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
@@ -307,6 +311,11 @@ void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id, bool s
channel->killToastByNotificationID(findNotificationToastId(object_id));
}
+ LLSD data;
+ data["object_id"] = object_id;
+ data["new_message"] = set_new_message;
+ mToggleFloaterSignal(data);
+
// toggle floater
LLScriptFloater::toggle(object_id);
}
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index 8de7a28d0f..95ec5a4d9c 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -88,6 +88,11 @@ public:
*/
static void onToastButtonClick(const LLSD&notification, const LLSD&response);
+ typedef boost::signals2::signal<void(const LLSD&)> object_signal_t;
+
+ boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); }
+ boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); }
+
private:
struct LLNotificationData
@@ -100,6 +105,9 @@ private:
typedef std::map<LLUUID, LLNotificationData> script_notification_map_t;
script_notification_map_t mNotifications;
+
+ object_signal_t mNewObjectSignal;
+ object_signal_t mToggleFloaterSignal;
};
/**
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index f3d161ce1e..93655eb1f1 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -369,8 +369,6 @@ bool idle_startup()
LLMemType mt1(LLMemType::MTYPE_STARTUP);
const F32 PRECACHING_DELAY = gSavedSettings.getF32("PrecachingDelay");
- const F32 TIMEOUT_SECONDS = 5.f;
- const S32 MAX_TIMEOUT_COUNT = 3;
static LLTimer timeout;
static S32 timeout_count = 0;
@@ -1438,9 +1436,9 @@ bool idle_startup()
msg->addUUIDFast(_PREHASH_ID, gAgent.getID());
msg->sendReliable(
gFirstSim,
- MAX_TIMEOUT_COUNT,
+ gSavedSettings.getS32("UseCircuitCodeMaxRetries"),
FALSE,
- TIMEOUT_SECONDS,
+ gSavedSettings.getF32("UseCircuitCodeTimeout"),
use_circuit_callback,
NULL);
@@ -2697,12 +2695,15 @@ std::string LLStartUp::startupStateToString(EStartupState state)
#define RTNENUM(E) case E: return #E
switch(state){
RTNENUM( STATE_FIRST );
+ RTNENUM( STATE_BROWSER_INIT );
RTNENUM( STATE_LOGIN_SHOW );
RTNENUM( STATE_LOGIN_WAIT );
RTNENUM( STATE_LOGIN_CLEANUP );
RTNENUM( STATE_LOGIN_AUTH_INIT );
RTNENUM( STATE_LOGIN_PROCESS_RESPONSE );
RTNENUM( STATE_WORLD_INIT );
+ RTNENUM( STATE_MULTIMEDIA_INIT );
+ RTNENUM( STATE_FONT_INIT );
RTNENUM( STATE_SEED_GRANTED_WAIT );
RTNENUM( STATE_SEED_CAP_GRANTED );
RTNENUM( STATE_WORLD_WAIT );
@@ -2741,6 +2742,9 @@ void LLStartUp::postStartupState()
void reset_login()
{
+ gAgent.cleanup();
+ LLWorld::getInstance()->destroyClass();
+
LLStartUp::setStartupState( STATE_LOGIN_SHOW );
if ( gViewerWindow )
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index bef7f5d6aa..1ebf624eeb 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -34,10 +34,12 @@
#include "llflatlistview.h"
#include "llfloaterreg.h"
+#include "llnotifications.h"
#include "llsyswellwindow.h"
#include "llbottomtray.h"
+#include "llscriptfloater.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
@@ -170,6 +172,7 @@ void LLSysWellWindow::setVisible(BOOL visible)
if(mChannel)
{
mChannel->updateShowToastsState();
+ mChannel->redrawToasts();
}
}
@@ -188,6 +191,7 @@ void LLSysWellWindow::setDocked(bool docked, bool pop_on_undock)
if(mChannel)
{
mChannel->updateShowToastsState();
+ mChannel->redrawToasts();
}
}
@@ -356,7 +360,148 @@ BOOL LLIMWellWindow::RowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
return LLPanel::handleMouseDown(x, y, mask);
}
+/************************************************************************/
+/* ObjectRowPanel implementation */
+/************************************************************************/
+
+LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& object_id, bool new_message/* = false*/)
+ : LLPanel()
+ , mChiclet(NULL)
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_active_object_row.xml", NULL);
+
+ initChiclet(object_id);
+
+ LLTextBox* obj_name = getChild<LLTextBox>("object_name");
+ obj_name->setValue(getObjectName(object_id));
+
+ mCloseBtn = getChild<LLButton>("hide_btn");
+ mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::ObjectRowPanel::onClosePanel, this));
+}
+
+//---------------------------------------------------------------------------------
+LLIMWellWindow::ObjectRowPanel::~ObjectRowPanel()
+{
+}
+
+std::string LLIMWellWindow::ObjectRowPanel::getObjectName(const LLUUID& object_id)
+{
+ using namespace LLNotificationsUI;
+ LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+ if(!notification)
+ {
+ llwarns << "Invalid notification" << llendl;
+ return LLStringUtil::null;
+ }
+
+ std::string text;
+
+ switch(getObjectType(notification))
+ {
+ case OBJ_SCRIPT:
+ text = notification->getSubstitutions()["TITLE"].asString();
+ break;
+ case OBJ_LOAD_URL:
+ text = notification->getSubstitutions()["OBJECTNAME"].asString();
+ break;
+ case OBJ_GIVE_INVENTORY:
+ text = notification->getSubstitutions()["NAME"].asString();
+ break;
+ default:
+ text = getString("unknown_obj");
+ break;
+ }
+
+ return text;
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::ObjectRowPanel::onClosePanel()
+{
+ LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(mChiclet->getSessionId());
+}
+
+//static
+LLIMWellWindow::ObjectRowPanel::object_type_map LLIMWellWindow::ObjectRowPanel::initObjectTypeMap()
+{
+ object_type_map type_map;
+ type_map["ScriptDialog"] = OBJ_SCRIPT;
+ type_map["LoadWebPage"] = OBJ_LOAD_URL;
+ type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY;
+ return type_map;
+}
+
+// static
+LLIMWellWindow::ObjectRowPanel::EObjectType LLIMWellWindow::ObjectRowPanel::getObjectType(const LLNotificationPtr& notification)
+{
+ if(!notification)
+ {
+ llwarns << "Invalid notification" << llendl;
+ return OBJ_UNKNOWN;
+ }
+
+ static object_type_map type_map = initObjectTypeMap();
+ std::string name = notification->getName();
+ object_type_map::const_iterator it = type_map.find(name);
+ if(it != type_map.end())
+ {
+ return it->second;
+ }
+
+ llwarns << "Unknown object type" << llendl;
+ return OBJ_UNKNOWN;
+}
+
+void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool new_message/* = false*/)
+{
+ using namespace LLNotificationsUI;
+ LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+ if(!notification)
+ {
+ llwarns << "Invalid notification" << llendl;
+ return;
+ }
+
+ // Choose which of the pre-created chiclets to use.
+ switch(getObjectType(notification))
+ {
+ case OBJ_GIVE_INVENTORY:
+ mChiclet = getChild<LLInvOfferChiclet>("inv_offer_chiclet");
+ break;
+ default:
+ mChiclet = getChild<LLScriptChiclet>("object_chiclet");
+ break;
+ }
+
+ mChiclet->setVisible(true);
+ mChiclet->setSessionId(object_id);
+// mChiclet->setShowNewMessagesIcon(new_message);
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::ObjectRowPanel::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ setTransparentColor(LLUIColorTable::instance().getColor("SysWellItemSelected"));
+}
+
+//---------------------------------------------------------------------------------
+void LLIMWellWindow::ObjectRowPanel::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ setTransparentColor(LLUIColorTable::instance().getColor("SysWellItemUnselected"));
+}
+
+//---------------------------------------------------------------------------------
+// virtual
+BOOL LLIMWellWindow::ObjectRowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ // Pass the mouse down event to the chiclet (EXT-596).
+ if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown()
+ mChiclet->onMouseDown();
+ return LLPanel::handleMouseDown(x, y, mask);
+}
/************************************************************************/
/* LLNotificationWellWindow implementation */
@@ -503,6 +648,7 @@ LLIMWellWindow::LLIMWellWindow(const LLSD& key)
{
LLIMMgr::getInstance()->addSessionObserver(this);
LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLIMWellWindow::findIMChiclet, this, _1));
+ LLIMChiclet::sFindChicletsSignal.connect(boost::bind(&LLIMWellWindow::findObjectChiclet, this, _1));
}
LLIMWellWindow::~LLIMWellWindow()
@@ -557,6 +703,18 @@ void LLIMWellWindow::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID
}
}
+LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& object_id)
+{
+ LLChiclet* res = NULL;
+ ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(object_id);
+ if (panel != NULL)
+ {
+ res = panel->mChiclet;
+ }
+
+ return res;
+}
+
//////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
LLChiclet* LLIMWellWindow::findIMChiclet(const LLUUID& sessionId)
@@ -615,4 +773,41 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId)
}
}
+void LLIMWellWindow::addObjectRow(const LLUUID& object_id, bool new_message/* = false*/)
+{
+ if (mMessageList->getItemByValue(object_id) == NULL)
+ {
+ ObjectRowPanel* item = new ObjectRowPanel(object_id, new_message);
+ if (mMessageList->insertItemAfter(mSeparator, item, object_id))
+ {
+ handleItemAdded(IT_INSTANT_MESSAGE);
+ }
+ else
+ {
+ llwarns << "Unable to add Object Row into the list, objectID: " << object_id << llendl;
+ item->die();
+ }
+ reshapeWindow();
+ }
+}
+
+void LLIMWellWindow::removeObjectRow(const LLUUID& object_id)
+{
+ if (mMessageList->removeItemByValue(object_id))
+ {
+ handleItemRemoved(IT_INSTANT_MESSAGE);
+ }
+ else
+ {
+ llwarns << "Unable to remove Object Row from the list, objectID: " << object_id << llendl;
+ }
+
+ reshapeWindow();
+ // hide chiclet window if there are no items left
+ if(isWindowEmpty())
+ {
+ setVisible(FALSE);
+ }
+}
+
// EOF
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index adbc83677d..43b2723df0 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -46,7 +46,7 @@
class LLFlatListView;
class LLChiclet;
class LLIMChiclet;
-
+class LLScriptChiclet;
class LLSysWellWindow : public LLDockableFloater
@@ -126,14 +126,12 @@ protected:
*
* It contains a list of notifications that have not been responded to.
*/
-class LLNotificationWellWindow : public LLSysWellWindow, public LLInitClass<LLNotificationWellWindow>
+class LLNotificationWellWindow : public LLSysWellWindow
{
public:
LLNotificationWellWindow(const LLSD& key);
static LLNotificationWellWindow* getInstance(const LLSD& key = LLSD());
- static void initClass() { getInstance(); }
-
/*virtual*/ BOOL postBuild();
/*virtual*/ void setVisible(BOOL visible);
@@ -181,11 +179,16 @@ public:
/*virtual*/ void sessionRemoved(const LLUUID& session_id);
/*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
+ void addObjectRow(const LLUUID& object_id, bool new_message = false);
+ void removeObjectRow(const LLUUID& object_id);
+
protected:
/*virtual*/ const std::string& getAnchorViewName() { return IM_WELL_ANCHOR_NAME; }
private:
LLChiclet * findIMChiclet(const LLUUID& sessionId);
+ LLChiclet* findObjectChiclet(const LLUUID& object_id);
+
void addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId);
void delIMRow(const LLUUID& sessionId);
@@ -210,6 +213,37 @@ private:
LLButton* mCloseBtn;
const LLSysWellWindow* mParent;
};
+
+ class ObjectRowPanel: public LLPanel
+ {
+ typedef enum e_object_type
+ {
+ OBJ_UNKNOWN,
+
+ OBJ_SCRIPT,
+ OBJ_GIVE_INVENTORY,
+ OBJ_LOAD_URL
+ }EObjectType;
+
+ public:
+ ObjectRowPanel(const LLUUID& object_id, bool new_message = false);
+ virtual ~ObjectRowPanel();
+ /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ private:
+ void onClosePanel();
+ static EObjectType getObjectType(const LLNotificationPtr& notification);
+ void initChiclet(const LLUUID& object_id, bool new_message = false);
+ std::string getObjectName(const LLUUID& object_id);
+
+ typedef std::map<std::string, EObjectType> object_type_map;
+ static object_type_map initObjectTypeMap();
+ public:
+ LLIMChiclet* mChiclet;
+ private:
+ LLButton* mCloseBtn;
+ };
};
#endif // LL_LLSYSWELLWINDOW_H
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index ef49d7f057..67007629c0 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -1630,6 +1630,16 @@ S32 LLTextureFetch::update(U32 max_time_ms)
{
sendRequestListToSimulators();
}
+
+ if (!mThreaded)
+ {
+ // Update Curl on same thread as mCurlGetRequest was constructed
+ S32 processed = mCurlGetRequest->process();
+ if (processed > 0)
+ {
+ lldebugs << "processed: " << processed << " messages." << llendl;
+ }
+ }
return res;
}
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index fc7c029a17..4131e2755a 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -67,7 +67,8 @@ LLToast::LLToast(const LLToast::Params& p)
mHideBtn(NULL),
mNotification(p.notification),
mIsHidden(false),
- mHideBtnPressed(false)
+ mHideBtnPressed(false),
+ mIsTip(p.is_tip)
{
LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);
@@ -98,10 +99,30 @@ BOOL LLToast::postBuild()
mTimer.stop();
}
+ if (mIsTip)
+ {
+ mTextEditor = mPanel->getChild<LLTextEditor>("text_editor_box");
+
+ if (mTextEditor)
+ {
+ mTextEditor->setMouseUpCallback(boost::bind(&LLToast::hide,this));
+ mPanel->setMouseUpCallback(boost::bind(&LLToast::handleTipToastClick, this, _2, _3, _4));
+ }
+ }
+
return TRUE;
}
//--------------------------------------------------------------------------
+void LLToast::handleTipToastClick(S32 x, S32 y, MASK mask)
+{
+ if (!mTextEditor->getRect().pointInRect(x, y))
+ {
+ hide();
+ }
+}
+
+//--------------------------------------------------------------------------
void LLToast::setHideButtonEnabled(bool enabled)
{
if(mHideBtn)
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index d08e46e160..0c3c598704 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -40,6 +40,7 @@
#include "llnotificationptr.h"
#include "llviewercontrol.h"
+#include "lltexteditor.h"
#define MOUSE_LEAVE false
#define MOUSE_ENTER true
@@ -155,6 +156,8 @@ public:
private:
+ void handleTipToastClick(S32 x, S32 y, MASK mask);
+
// check timer
bool lifetimeHasExpired();
// on timer finished function
@@ -169,8 +172,9 @@ private:
F32 mToastLifetime; // in seconds
F32 mToastFadingTime; // in seconds
- LLPanel* mPanel;
- LLButton* mHideBtn;
+ LLPanel* mPanel;
+ LLButton* mHideBtn;
+ LLTextEditor* mTextEditor;
LLColor4 mBgColor;
bool mCanFade;
@@ -178,6 +182,7 @@ private:
bool mHideBtnEnabled;
bool mHideBtnPressed;
bool mIsHidden; // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)
+ bool mIsTip;
};
}
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 7beba59c83..ed9e2e8818 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -85,7 +85,6 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif
sys_msg_icon->setVisible(FALSE);
mAvatar->setValue(p.avatar_id);
- setMouseDownCallback(boost::bind(&LLToastIMPanel::onClickToastIM, this));
}
S32 maxLinesCount;
@@ -102,11 +101,13 @@ LLToastIMPanel::~LLToastIMPanel()
{
}
-//--------------------------------------------------------------------------
-void LLToastIMPanel::onClickToastIM()
+//virtual
+BOOL LLToastIMPanel::handleMouseDown(S32 x, S32 y, MASK mask)
{
- mNotification->respond(mNotification->getResponseTemplate());
-}
-
-//--------------------------------------------------------------------------
+ if (LLPanel::handleMouseDown(x,y,mask) == FALSE)
+ {
+ mNotification->respond(mNotification->getResponseTemplate());
+ }
+ return TRUE;
+}
diff --git a/indra/newview/lltoastimpanel.h b/indra/newview/lltoastimpanel.h
index 23f08ef610..53661f2cf6 100644
--- a/indra/newview/lltoastimpanel.h
+++ b/indra/newview/lltoastimpanel.h
@@ -57,12 +57,10 @@ public:
LLToastIMPanel(LLToastIMPanel::Params &p);
virtual ~LLToastIMPanel();
-
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
private:
static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT;
- void onClickToastIM();
-
LLNotificationPtr mNotification;
LLUUID mSessionID;
LLAvatarIconCtrl* mAvatar;
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 2d0a14dc70..aa35f22930 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -772,6 +772,9 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
{
LLInventoryObject* cargo = locateInventory(item, cat);
+ // fix for EXT-3191
+ if (NULL == cargo) return;
+
EAcceptance item_acceptance = ACCEPT_NO;
handled = handled && root_view->handleDragAndDrop(x, y, mask, FALSE,
mCargoTypes[mCurItemIndex],
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index 46618d4026..f8c82f8b22 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -47,11 +47,14 @@
#include "llurlsimstring.h"
#include "llweb.h"
#include "llworldmapmessage.h"
+#include "llurldispatcherlistener.h"
// library includes
#include "llnotificationsutil.h"
#include "llsd.h"
+static LLURLDispatcherListener sURLDispatcherListener;
+
class LLURLDispatcherImpl
{
public:
diff --git a/indra/newview/llurldispatcherlistener.cpp b/indra/newview/llurldispatcherlistener.cpp
new file mode 100644
index 0000000000..fea6a769c5
--- /dev/null
+++ b/indra/newview/llurldispatcherlistener.cpp
@@ -0,0 +1,58 @@
+/**
+ * @file llurldispatcherlistener.cpp
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief Implementation for llurldispatcherlistener.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "llviewerprecompiledheaders.h"
+// associated header
+#include "llurldispatcherlistener.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+#include "llurldispatcher.h"
+
+LLURLDispatcherListener::LLURLDispatcherListener(/* LLURLDispatcher* instance */):
+ LLEventAPI("LLURLDispatcher", "Internal URL handling") /* ,
+ mDispatcher(instance) */
+{
+ add("dispatch",
+ "At startup time or on clicks in internal web browsers,\n"
+ "teleport, open map, or run requested command.\n"
+ "[\"url\"] string url to dispatch\n"
+ "[\"trusted\"] boolean indicating trusted browser [default true]",
+ &LLURLDispatcherListener::dispatch);
+ add("dispatchRightClick", "Dispatch [\"url\"] as if from a right-click on a hot link.",
+ &LLURLDispatcherListener::dispatchRightClick);
+ add("dispatchFromTextEditor", "Dispatch [\"url\"] as if from an edit field.",
+ &LLURLDispatcherListener::dispatchFromTextEditor);
+}
+
+void LLURLDispatcherListener::dispatch(const LLSD& params) const
+{
+ // For most purposes, we expect callers to want to be trusted.
+ bool trusted_browser = true;
+ if (params.has("trusted"))
+ {
+ // But for testing, allow a caller to specify untrusted.
+ trusted_browser = params["trusted"].asBoolean();
+ }
+ LLURLDispatcher::dispatch(params["url"], NULL, trusted_browser);
+}
+
+void LLURLDispatcherListener::dispatchRightClick(const LLSD& params) const
+{
+ LLURLDispatcher::dispatchRightClick(params["url"]);
+}
+
+void LLURLDispatcherListener::dispatchFromTextEditor(const LLSD& params) const
+{
+ LLURLDispatcher::dispatchFromTextEditor(params["url"]);
+}
diff --git a/indra/newview/llurldispatcherlistener.h b/indra/newview/llurldispatcherlistener.h
new file mode 100644
index 0000000000..894afcbb51
--- /dev/null
+++ b/indra/newview/llurldispatcherlistener.h
@@ -0,0 +1,32 @@
+/**
+ * @file llurldispatcherlistener.h
+ * @author Nat Goodspeed
+ * @date 2009-12-10
+ * @brief LLEventAPI for LLURLDispatcher
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLURLDISPATCHERLISTENER_H)
+#define LL_LLURLDISPATCHERLISTENER_H
+
+#include "lleventapi.h"
+class LLURLDispatcher;
+class LLSD;
+
+class LLURLDispatcherListener: public LLEventAPI
+{
+public:
+ LLURLDispatcherListener(/* LLURLDispatcher* instance */); // all static members
+
+private:
+ void dispatch(const LLSD& params) const;
+ void dispatchRightClick(const LLSD& params) const;
+ void dispatchFromTextEditor(const LLSD& params) const;
+
+ //LLURLDispatcher* mDispatcher;
+};
+
+#endif /* ! defined(LL_LLURLDISPATCHERLISTENER_H) */
diff --git a/indra/newview/llviewerhelp.cpp b/indra/newview/llviewerhelp.cpp
index 297c0cc111..b8f91697e5 100644
--- a/indra/newview/llviewerhelp.cpp
+++ b/indra/newview/llviewerhelp.cpp
@@ -49,24 +49,38 @@
void LLViewerHelp::showTopic(const std::string &topic)
{
- showHelp();
-
// allow overriding the help server with a local help file
if( gSavedSettings.getBOOL("HelpUseLocal") )
{
+ showHelp();
LLFloaterHelpBrowser* helpbrowser = dynamic_cast<LLFloaterHelpBrowser*>(LLFloaterReg::getInstance("help_browser"));
helpbrowser->navigateToLocalPage( "help-offline" , "index.html" );
return;
}
- // use a special login topic before the user logs in
+ // if the help topic is empty, use the default topic
std::string help_topic = topic;
- if (! LLLoginInstance::getInstance()->authSuccess())
+ if (help_topic.empty())
{
- help_topic = preLoginTopic();
+ help_topic = defaultTopic();
+ }
+
+ // f1 help topic means: if user not logged in yet, show the
+ // pre-login topic, otherwise show help for the focused item
+ if (help_topic == f1HelpTopic())
+ {
+ if (! LLLoginInstance::getInstance()->authSuccess())
+ {
+ help_topic = preLoginTopic();
+ }
+ else
+ {
+ help_topic = getTopicFromFocus();
+ }
}
// work out the URL for this topic and display it
+ showHelp();
const LLOSInfo& osinfo = LLAppViewer::instance()->getOSInfo();
std::string helpURL = LLViewerHelpUtil::buildHelpURL( help_topic, gSavedSettings, osinfo );
setRawURL( helpURL );
@@ -84,6 +98,12 @@ std::string LLViewerHelp::preLoginTopic()
return "pre_login_help";
}
+std::string LLViewerHelp::f1HelpTopic()
+{
+ // *hack: to be done properly
+ return "f1_help";
+}
+
//////////////////////////////
// our own interfaces
diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h
index dcb5ae32c9..07971a593e 100644
--- a/indra/newview/llviewerhelp.h
+++ b/indra/newview/llviewerhelp.h
@@ -51,14 +51,17 @@ class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>
/// display the specified help topic in the help viewer
/*virtual*/ void showTopic(const std::string &topic);
- /// return default (fallback) topic name suitable for showTopic()
- /*virtual*/ std::string defaultTopic();
-
// return topic derived from viewer UI focus, else default topic
std::string getTopicFromFocus();
+ /// return default (fallback) topic name suitable for showTopic()
+ /*virtual*/ std::string defaultTopic();
+
// return topic to use before the user logs in
- std::string preLoginTopic();
+ /*virtual*/ std::string preLoginTopic();
+
+ // return topic to use for the top-level help, invoked by F1
+ /*virtual*/ std::string f1HelpTopic();
private:
static void showHelp(); // make sure help UI is visible & raised
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 9856cb2b7f..78cee15384 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1379,6 +1379,25 @@ LLViewerInventoryCategory *LLViewerInventoryItem::getLinkedCategory() const
return NULL;
}
+bool LLViewerInventoryItem::checkPermissionsSet(PermissionMask mask) const
+{
+ const LLPermissions& perm = getPermissions();
+ PermissionMask curr_mask = PERM_NONE;
+ if(perm.getOwner() == gAgent.getID())
+ {
+ curr_mask = perm.getMaskBase();
+ }
+ else if(gAgent.isInGroup(perm.getGroup()))
+ {
+ curr_mask = perm.getMaskGroup();
+ }
+ else
+ {
+ curr_mask = perm.getMaskEveryone();
+ }
+ return ((curr_mask & mask) == mask);
+}
+
//----------
void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name)
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 0156e7dab1..412a2c66e6 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -158,6 +158,9 @@ public:
bool getIsBrokenLink() const; // true if the baseitem this points to doesn't exist in memory.
LLViewerInventoryItem *getLinkedItem() const;
LLViewerInventoryCategory *getLinkedCategory() const;
+
+ // Checks the items permissions (for owner, group, or everyone) and returns true if all mask bits are set.
+ bool checkPermissionsSet(PermissionMask mask) const;
// callback
void onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index e1143adcb6..0be0b56bc3 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -59,6 +59,7 @@
#include "llfloaterland.h"
#include "llfloaterpay.h"
#include "llfloaterreporter.h"
+#include "llfloatersearch.h"
#include "llfloaterscriptdebug.h"
#include "llfloatertools.h"
#include "llfloaterworldmap.h"
@@ -3418,6 +3419,13 @@ void set_god_level(U8 god_level)
// changing god-level can affect which menus we see
show_debug_menus();
+
+ // changing god-level can invalidate search results
+ LLFloaterSearch *search = dynamic_cast<LLFloaterSearch*>(LLFloaterReg::getInstance("search"));
+ if (search)
+ {
+ search->godLevelChanged(god_level);
+ }
}
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
@@ -5577,17 +5585,8 @@ class LLShowHelp : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
std::string help_topic = userdata.asString();
-
LLViewerHelp* vhelp = LLViewerHelp::getInstance();
- if (help_topic.empty())
- {
- vhelp->showTopic(vhelp->getTopicFromFocus());
- }
- else
- {
- vhelp->showTopic(help_topic);
- }
-
+ vhelp->showTopic(help_topic);
return true;
}
};
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 4b0dc8f668..a1c3806b27 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -71,15 +71,6 @@
// system libraries
#include <boost/tokenizer.hpp>
-class LLFileEnableSaveAs : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- bool new_value = gFloaterView->getFrontmost() && gFloaterView->getFrontmost()->canSaveAs();
- return new_value;
- }
-};
-
class LLFileEnableUpload : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -386,19 +377,6 @@ class LLFileCloseAllWindows : public view_listener_t
}
};
-class LLFileSaveTexture : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- LLFloater* top = gFloaterView->getFrontmost();
- if (top)
- {
- top->saveAs();
- }
- return true;
- }
-};
-
class LLFileTakeSnapshotToDisk : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -1050,10 +1028,10 @@ void init_menu_file()
view_listener_t::addCommit(new LLFileCloseAllWindows(), "File.CloseAllWindows");
view_listener_t::addEnable(new LLFileEnableCloseWindow(), "File.EnableCloseWindow");
view_listener_t::addEnable(new LLFileEnableCloseAllWindows(), "File.EnableCloseAllWindows");
- view_listener_t::addCommit(new LLFileSaveTexture(), "File.SaveTexture");
view_listener_t::addCommit(new LLFileTakeSnapshotToDisk(), "File.TakeSnapshotToDisk");
view_listener_t::addCommit(new LLFileQuit(), "File.Quit");
view_listener_t::addEnable(new LLFileEnableUpload(), "File.EnableUpload");
- view_listener_t::addEnable(new LLFileEnableSaveAs(), "File.EnableSaveAs");
+
+ // "File.SaveTexture" moved to llpanelmaininventory so that it can be properly handled.
}
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 8c0529e344..31bd264e3a 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2096,8 +2096,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLSD payload;
payload["object_id"] = session_id;
payload["owner_id"] = from_id;
+ payload["from_id"] = from_id;
payload["slurl"] = location;
payload["name"] = name;
+ std::string session_name;
+ gCacheName->getFullName(from_id, session_name);
+ payload["SESSION_NAME"] = session_name;
if (from_group)
{
payload["groupowned"] = "true";
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 2fae78cdfb..7a1abfd4e8 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -2525,7 +2525,8 @@ boost::signals2::connection LLViewerParcelMgr::setTeleportFailedCallback(parcel_
*/
void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos)
{
- if (local)
+ // Treat only teleports within the same parcel as local (EXT-3139).
+ if (local && LLViewerParcelMgr::getInstance()->inAgentParcel(new_pos))
{
// Local teleport. We already have the agent parcel data.
// Emit the signal immediately.
@@ -2533,7 +2534,7 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos
}
else
{
- // Non-local teleport.
+ // Non-local teleport (inter-region or between different parcels of the same region).
// The agent parcel data has not been updated yet.
// Let's wait for the update and then emit the signal.
mTeleportInProgress = TRUE;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 0d29efaedf..a5a40e9c2c 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -2879,7 +2879,8 @@ BOOL LLViewerMediaTexture::findFaces()
}
S32 face_id = -1 ;
- while((face_id = obj->getFaceIndexWithMediaImpl(mMediaImplp, face_id)) > -1)
+ S32 num_faces = obj->mDrawable->getNumFaces() ;
+ while((face_id = obj->getFaceIndexWithMediaImpl(mMediaImplp, face_id)) > -1 && face_id < num_faces)
{
LLFace* facep = obj->mDrawable->getFace(face_id) ;
if(facep)
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 7e1e7c940f..aa69b46857 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -128,16 +128,8 @@ static int scale_mic_volume(float volume)
static int scale_speaker_volume(float volume)
{
// incoming volume has the range [0.0 ... 1.0], with 0.5 as the default.
- // Map it as follows: 0.0 -> 0, 0.5 -> 62, 1.0 -> 75
-
- volume -= 0.5f; // offset volume to the range [-0.5 ... 0.5], with 0 at the default.
- int scaled_volume = 62; // offset scaled_volume by its default level
- if(volume < 0.0f)
- scaled_volume += ((int)(volume * 124.0f)); // (62 - 0) * 2
- else
- scaled_volume += ((int)(volume * 26.0f)); // (75 - 62) * 2
-
- return scaled_volume;
+ // Map it as follows: 0.0 -> 0, 0.5 -> 50, 1.0 -> 100
+ return (int)(volume * 100.0f);
}
class LLViewerVoiceAccountProvisionResponder :
@@ -4279,6 +4271,7 @@ void LLVoiceClient::mediaStreamUpdatedEvent(
{
// Send the voice chat invite to the GUI layer
// *TODO: Question: Should we correlate with the mute list here?
+ session->mIncoming = true;
session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID);
session->mVoiceInvitePending = true;
if(session->mName.empty())
@@ -6353,6 +6346,20 @@ LLVoiceClient::sessionState *LLVoiceClient::findSession(const LLUUID &participan
return result;
}
+bool LLVoiceClient::isSessionIncoming(const LLUUID &session_id)
+{
+ for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
+ {
+ sessionState *session = *iter;
+ if(session->mIMSessionID == session_id)
+ {
+ return session->mIncoming;
+ break;
+ }
+ }
+ return false;
+}
+
LLVoiceClient::sessionState *LLVoiceClient::addSession(const std::string &uri, const std::string &handle)
{
sessionState *result = NULL;
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index 347fae6156..92e79a004d 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -125,7 +125,7 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient>
void tuningCaptureStartSendMessage(int duration);
void tuningCaptureStopSendMessage();
- void tuningSetMicVolume(float volume);
+ void tuningSetMicVolume(float volume=0.5f);
void tuningSetSpeakerVolume(float volume);
float tuningGetEnergy(void);
@@ -527,6 +527,8 @@ static void updatePosition(void);
// Currently this will be false only for PSTN P2P calls.
// NOTE: this will return true if the session can't be found.
bool isSessionTextIMPossible(const LLUUID &session_id);
+
+ bool isSessionIncoming(const LLUUID &session_id);
private:
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index c8cc6a3d8e..697fefee3a 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -91,7 +91,7 @@ LLWaterParamManager::~LLWaterParamManager()
void LLWaterParamManager::loadAllPresets(const std::string& file_name)
{
std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", ""));
- LL_INFOS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading Default water settings from " << path_name << LL_ENDL;
bool found = true;
while(found)
@@ -117,7 +117,7 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name)
// And repeat for user presets, note the user presets will modify any system presets already loaded
std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", ""));
- LL_INFOS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading User water settings from " << path_name2 << LL_ENDL;
found = true;
while(found)
@@ -152,7 +152,7 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
escaped_filename += ".xml";
std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/water", escaped_filename));
- llinfos << "Loading water settings from " << pathName << llendl;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading water settings from " << pathName << LL_ENDL;
llifstream presetsXML;
presetsXML.open(pathName.c_str());
@@ -161,7 +161,7 @@ void LLWaterParamManager::loadPreset(const std::string & name,bool propagate)
if(!presetsXML)
{
pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/water", escaped_filename);
- llinfos << "Loading User water setting from " << pathName << llendl;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading User water setting from " << pathName << LL_ENDL;
presetsXML.clear();
presetsXML.open(pathName.c_str());
}
diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp
index c6fd35c142..c3a70705cf 100644
--- a/indra/newview/llwlparammanager.cpp
+++ b/indra/newview/llwlparammanager.cpp
@@ -109,7 +109,7 @@ LLWLParamManager::~LLWLParamManager()
void LLWLParamManager::loadPresets(const std::string& file_name)
{
std::string path_name(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", ""));
- LL_INFOS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading Default WindLight settings from " << path_name << LL_ENDL;
bool found = true;
while(found)
@@ -135,7 +135,7 @@ void LLWLParamManager::loadPresets(const std::string& file_name)
// And repeat for user presets, note the user presets will modify any system presets already loaded
std::string path_name2(gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", ""));
- LL_INFOS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight settings from " << path_name2 << LL_ENDL;
found = true;
while(found)
@@ -196,7 +196,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
escaped_filename += ".xml";
std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/skies", escaped_filename));
- //llinfos << "Loading WindLight sky setting from " << pathName << llendl;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading WindLight sky setting from " << pathName << LL_ENDL;
llifstream presetsXML;
presetsXML.open(pathName.c_str());
@@ -205,7 +205,7 @@ void LLWLParamManager::loadPreset(const std::string & name,bool propagate)
if(!presetsXML)
{
pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/skies", escaped_filename);
- llinfos << "Loading User WindLight sky setting from " << pathName << llendl;
+ LL_DEBUGS2("AppInit", "Shaders") << "Loading User WindLight sky setting from " << pathName << LL_ENDL;
presetsXML.clear();
presetsXML.open(pathName.c_str());
}
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 5c6fc2cf21..118d7f8d08 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -118,6 +118,7 @@ LLWorld::LLWorld() :
void LLWorld::destroyClass()
{
+ mHoleWaterObjects.clear();
gObjectList.destroy();
for(region_list_t::iterator region_it = mRegionList.begin(); region_it != mRegionList.end(); )
{
diff --git a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png
new file mode 100644
index 0000000000..60676b43fd
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png
new file mode 100644
index 0000000000..98cde96aff
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/WellButton_Lit_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 39adb42369..bab39b10ab 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -376,7 +376,7 @@ with the same filename but different name
<texture name="Parcel_PushNo_Light" file_name="icons/Parcel_PushNo_Light.png" preload="false" />
<texture name="Parcel_R_Light" file_name="icons/Parcel_R_Light.png" preload="false" />
<texture name="Parcel_Scripts_Light" file_name="icons/Parcel_Scripts_Light.png" preload="false" />
- <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Light.png" preload="false" />
+ <texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
<texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" />
<texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" />
@@ -593,6 +593,9 @@ with the same filename but different name
<texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" />
<texture name="Unread_Msg" file_name="bottomtray/Unread_Msg.png" preload="false" />
+
+ <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" />
+ <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" />
<texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
<texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index d1fd42bdd9..52fda97860 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1857,6 +1857,10 @@ Select the thumbnail to choose a different texture.
top="0"
help_topic="land_access_tab"
name="land_access_panel">
+ <panel.string
+ name="access_estate_defined">
+ (Defined by the Estate)
+ </panel.string>
<panel.string
name="estate_override">
One or more of these options is set at the estate level
@@ -1877,7 +1881,7 @@ Select the thumbnail to choose a different texture.
<check_box
follows="top|left"
height="16"
- label="Allow Public Access"
+ label="Allow Public Access [MATURITY]"
layout="topleft"
left_delta="0"
name="public_access"
@@ -1893,12 +1897,12 @@ Select the thumbnail to choose a different texture.
name="Only Allow"
top="49"
width="278">
- Block Access By:
+ Restrict Access to Residents verified by:
</text>
<check_box
follows="top|left"
height="16"
- label="Residents who have not given payment info to Linden Lab"
+ label="Payment Information on File [ESTATE_PAYMENT_LIMIT]"
layout="topleft"
left_delta="0"
name="limit_payment"
@@ -1908,7 +1912,7 @@ Select the thumbnail to choose a different texture.
<check_box
follows="top|left"
height="16"
- label="Residents who are not age verified adults"
+ label="Age Verification [ESTATE_AGE_LIMIT]"
layout="topleft"
left_delta="0"
name="limit_age_verified"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index 75711cdf89..26b003cafe 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -222,7 +222,7 @@
width="300"
height="30"
name="currency_links">
- [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com exchange rate]
+ [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
</text>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
index 526fda90d1..acd59b6f09 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -36,21 +36,25 @@
top="35"
width="36" />
<text
+ clip_partial="true"
font="SansSerifLarge"
- height="20"
+ height="37"
layout="topleft"
left="77"
name="caller name"
- top="27"
+ top="20"
+ use_ellipses="true"
width="315"
word_wrap="true" />
<text
+ clip_partial="true"
font="SansSerif"
- height="50"
+ height="30"
layout="topleft"
left="77"
name="question"
- top="52"
+ top_pad="5"
+ use_ellipses="true"
width="315"
word_wrap="true">
Do you want to leave [CURRENT_CHAT] and join this voice chat?
diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml
index 8122386fae..681731b0da 100644
--- a/indra/newview/skins/default/xui/en/floater_media_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- bottom="666"
can_close="true"
can_drag_on_left="false"
can_minimize="true"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index 52a19ac6b3..602a18ea56 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -61,7 +61,16 @@
name="Discard"
top_delta="0"
width="100" />
- <text
+ <button
+ follows="left|bottom"
+ height="22"
+ label="Save As"
+ layout="topleft"
+ left_pad="5"
+ name="save_tex_btn"
+ top_delta="0"
+ width="100" />
+ <text
type="string"
length="1"
follows="left|bottom"
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index 82e4d87b28..e6bdcdf78e 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -55,8 +55,20 @@
layout="topleft"
left_delta="0"
name="status_text"
- top_pad="5"
+ top_pad="7"
width="150" />
+ <text
+ visible="false"
+ follows="bottom|right"
+ height="16"
+ left_delta="0"
+ name="refresh_search"
+ left_pad="0"
+ right="-10"
+ halign="right"
+ width="450">
+ Redo search to reflect current God level
+ </text>
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
index 1ebc51f504..c1a211967c 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -106,26 +106,6 @@
width="24" />
</layout_panel>
<layout_panel
- layout="topleft"
- name="volume_slider_panel"
- top="0"
- user_resize="false"
- width="138">
- <slider_bar
- control_name="AudioLevelMic"
- follows="left|right|top"
- height="24"
- increment="0.05"
- layout="topleft"
- left="0"
- max_val="2"
- name="volume_slider_bar"
- tool_tip="Master Volume"
- top="0"
- value="0.75"
- width="138" />
- </layout_panel>
- <layout_panel
auto_resize="false"
layout="topleft"
min_width="100"
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 9b439c16e0..53be40d7fd 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -45,7 +45,8 @@
name="Second Life Help"
shortcut="F1">
<menu_item_call.on_click
- function="ShowHelp" />
+ function="ShowHelp"
+ parameter="f1_help" />
</menu_item_call>
<menu_item_separator />
<menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml
index 5ab327a182..0422972cd4 100644
--- a/indra/newview/skins/default/xui/en/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml
@@ -89,4 +89,51 @@
function="ParticipantList.EnableItem"
parameter="can_allow_text_chat" />
</menu_item_check>
+ <menu_item_separator
+ layout="topleft"
+ name="moderate_voice_separator" />
+ <menu_item_call
+ label="Mute this participant"
+ layout="topleft"
+ name="ModerateVoiceMuteSelected">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="selected" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Mute everyone else"
+ layout="topleft"
+ name="ModerateVoiceMuteOthers">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="others" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unmute this participant"
+ layout="topleft"
+ name="ModerateVoiceUnMuteSelected">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="selected" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unmute everyone else"
+ layout="topleft"
+ name="ModerateVoiceUnMuteOthers">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="others" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index c3a2540b2e..39469f7101 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -34,7 +34,6 @@
function="Avatar.Call" />
</menu_item_call>
<menu_item_call
- enabled="false"
label="Share"
layout="topleft"
name="Share">
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 861b0de2cf..0891afaf76 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1064,7 +1064,8 @@
name="Second Life Help"
shortcut="F1">
<menu_item_call.on_click
- function="ShowHelp" />
+ function="ShowHelp"
+ parameter="f1_help" />
</menu_item_call>
<menu_item_call
label="Tutorial"
@@ -1200,15 +1201,6 @@
function="ToggleControl"
parameter="CompressSnapshotsToDisk" />
</menu_item_check>
- <menu_item_call
- label="Save Texture As"
- layout="topleft"
- name="Save Texture As">
- <menu_item_call.on_click
- function="File.SaveTexture" />
- <menu_item_call.on_enable
- function="File.EnableSaveAs" />
- </menu_item_call>
<menu_item_separator
layout="topleft" />
<menu
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 3659db230c..3e9cbe91e0 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -3539,6 +3539,8 @@ Type a short announcement which will be sent to everyone in this region.
type="alertmodal">
The maturity rating for this region has been updated.
It may take some time for the change to be reflected on the map.
+
+To enter Adult regions, residents must be Account Verified, either by age-verification or payment-verification.
</notification>
<notification
@@ -3799,21 +3801,6 @@ All reported abuses are investigated and resolved. You can view the resolution b
<notification
icon="alertmodal.tga"
- name="HelpReportAbuseEmailEO"
- type="alertmodal">
-IMPORTANT: This report will go to the owner of the region you are currently in and not to Linden Lab.
-
-As a service to residents and visitors, the owner of the region you are in has elected to receive and resolve all reports originating in this region. Linden Lab will not investigate reports you file from this location.
-
-The region owner will resolve reports based on the local rules of this region as outlined in the estate Covenant.
-(View covenants by going to the World menu and selecting About Land.)
-
-The resolution of this report applies only to this Region. Residents&apos; access to other areas of [SECOND_LIFE] will not be affected by the outcome of this report. Only Linden Lab can restrict access to the entirety of [SECOND_LIFE].
- <unique/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="HelpReportAbuseSelectCategory"
type="alertmodal">
Please select a category for this abuse report.
@@ -4719,10 +4706,6 @@ The objects on the selected parcel that are NOT owned by you have been returned
type="notify">
Message from [NAME]:
[MSG]
- <usetemplate
- name="okcancelbuttons"
- notext="OK"
- yestext="Inspect"/>
</notification>
<notification
@@ -5754,6 +5737,23 @@ You just entered a region using a different server version, which may affect per
The SLurl you clicked on is not supported.
</notification>
+ <notification
+ icon="notifytip.tga"
+ name="BlockedSLURL"
+ priority="high"
+ type="notifytip">
+A SLurl was received from an untrusted browser and has been blocked for your security.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="ThrottledSLURL"
+ priority="high"
+ type="notifytip">
+Multiple SLurls were received from an untrusted browser within a short period.
+They will be blocked for a few seconds for your security.
+ </notification>
+
<notification name="IMToast" type="notifytoast">
[MESSAGE]
<form name="form">
diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
new file mode 100644
index 0000000000..7657fb8055
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ name="panel_activeim_row"
+ layout="topleft"
+ follows="left|right"
+ top="0"
+ left="0"
+ height="35"
+ width="318"
+ background_opaque="false"
+ background_visible="true"
+ bg_alpha_color="0.0 0.0 0.0 0.0" >
+ <string
+ name="unknown_obj">
+ Unknown Object
+ </string>
+ <chiclet_script
+ name="object_chiclet"
+ layout="topleft"
+ follows="left"
+ top="3"
+ left="5"
+ height="25"
+ width="25"
+ visible="false"
+ speaker.name="speaker_p2p"
+ speaker.width="20"
+ speaker.height="25"
+ speaker.left="25"
+ speaker.top="25"
+ speaker.auto_update="true"
+ speaker.draw_border="false"
+ speaker.visible="false">
+ </chiclet_script>
+ <chiclet_offer
+ name="inv_offer_chiclet"
+ layout="topleft"
+ follows="left"
+ top="3"
+ left="5"
+ height="25"
+ width="25"
+ visible="false"
+ speaker.name="speaker_p2p"
+ speaker.width="20"
+ speaker.height="25"
+ speaker.left="25"
+ speaker.top="25"
+ speaker.auto_update="true"
+ speaker.draw_border="false"
+ speaker.visible="false">
+ </chiclet_offer>
+ <text
+ type="string"
+ name="object_name"
+ layout="topleft"
+ top="10"
+ left_pad="20"
+ height="14"
+ width="245"
+ length="1"
+ follows="right|left"
+ use_ellipses="true"
+ font="SansSerifBold">
+ Unnamed Object
+ </text>
+ <button
+ top="10"
+ right="-5"
+ width="17"
+ height="17"
+ layout="topleft"
+ follows="right"
+ name="hide_btn"
+ mouse_opaque="true"
+ label=""
+ tab_stop="false"
+ image_unselected="Toast_CloseBtn"
+ image_selected="Toast_CloseBtn"
+ />
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 7f847237ce..a41d492624 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -324,6 +324,7 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
min_width="34"
user_resize="false">
<chiclet_im_well
+ flash_period="0.3"
follows="right"
height="23"
layout="topleft"
@@ -331,6 +332,14 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
name="im_well"
top="4"
width="34">
+ <!--
+Emulate 4 states of button by background images, see detains in EXT-3147. The same should be for notification_well button
+xml attribute Description
+image_unselected "Unlit" - there are no new messages
+image_selected "Unlit" + "Selected" - there are no new messages and the Well is open
+image_pressed "Lit" - there are new messages
+image_pressed_selected "Lit" + "Selected" - there are new messages and the Well is open
+ -->
<button
auto_resize="true"
flash_color="EmphasisColor"
@@ -339,10 +348,11 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
height="23"
image_overlay="Notices_Unread"
image_overlay_alignment="center"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
image_selected="PushButton_Selected_Press"
left="0"
+ max_displayed_count="99"
name="Unread IM messages"
pad_left="0"
pad_right="0"
@@ -365,17 +375,19 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
min_width="34"
user_resize="false">
<chiclet_notification
+ flash_period="0.25"
follows="right"
height="23"
layout="topleft"
left="0"
+ max_displayed_count="99"
name="notification_well"
top="4"
width="34">
<button
image_selected="PushButton_Selected_Press"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
auto_resize="true"
halign="center"
height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index e5dc4df0f8..af73faf9a1 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -23,7 +23,7 @@ Hover your mouse over the options for more help.
</panel.string>
<text_editor
type="string"
- follows="left|top"
+ follows="left|top|right"
left="5"
height="60"
layout="topleft"
@@ -37,7 +37,7 @@ Hover your mouse over the options for more help.
<name_list
column_padding="0"
draw_heading="true"
- follows="left|top"
+ follows="left|top|right"
heading_height="20"
height="156"
layout="topleft"
@@ -55,10 +55,10 @@ Hover your mouse over the options for more help.
relative_width="0.4" />
</name_list>
<text
- follows="left|top"
+ follows="left|top|right"
type="string"
height="12"
- layout="topleft"
+ layout="left|top|right"
left="5"
name="active_title_label"
top_pad="5"
@@ -66,7 +66,7 @@ Hover your mouse over the options for more help.
My Title
</text>
<combo_box
- follows="left|top"
+ follows="left|top|right"
height="20"
layout="topleft"
left="5"
@@ -98,7 +98,7 @@ Hover your mouse over the options for more help.
bevel_style="in"
border="true"
bg_alpha_color="FloaterUnfocusBorderColor"
- follows="left|top"
+ follows="left|top|right"
height="88"
layout="topleft"
left="2"
@@ -106,7 +106,7 @@ Hover your mouse over the options for more help.
name="preferences_container"
top_pad="2">
<check_box
- follows="right|top"
+ follows="right|top|left"
height="16"
label="Open enrollment"
layout="topleft"
@@ -126,21 +126,21 @@ Hover your mouse over the options for more help.
width="300" />
<spinner
decimal_digits="0"
- follows="left|top"
+ follows="left|top|right"
halign="left"
height="16"
increment="1"
label_width="15"
label="L$"
layout="topleft"
- right="-10"
+ right="-30"
max_val="99999"
left_pad="0"
name="spin_enrollment_fee"
tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."
- width="100" />
+ width="80" />
<combo_box
- follows="left|top"
+ follows="left|top|right"
height="20"
layout="topleft"
left="10"
@@ -158,7 +158,7 @@ Hover your mouse over the options for more help.
value="Mature" />
</combo_box>
<check_box
- follows="left|top"
+ follows="left|top|right"
height="16"
initial_value="true"
label="Show in search"
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
index c02dabed2c..9e7c9477d4 100644
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ b/indra/newview/skins/default/xui/en/panel_notes.xml
@@ -120,6 +120,7 @@
left="0"
mouse_opaque="false"
name="add_friend"
+ tool_tip="Offer friendship to the resident"
top="5"
width="55" />
<button
@@ -128,6 +129,7 @@
label="IM"
layout="topleft"
name="im"
+ tool_tip="Open instant message session"
top="5"
left_pad="5"
width="40" />
@@ -137,6 +139,7 @@
label="Call"
layout="topleft"
name="call"
+ tool_tip="Call this resident"
left_pad="5"
top="5"
width="55" />
@@ -147,6 +150,7 @@
label="Map"
layout="topleft"
name="show_on_map_btn"
+ tool_tip="Show the resident on the map"
top="5"
left_pad="5"
width="50" />
@@ -156,6 +160,7 @@
label="Teleport"
layout="topleft"
name="teleport"
+ tool_tip="Offer teleport"
left_pad="5"
top="5"
width="90" />
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index 8aba8b9dd1..b5c6b637e5 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -92,11 +92,7 @@
name="(Japanese)"
value="ja" />
- <combo_box.item
- enabled="true"
- label="Test Language"
- name="TestLanguage"
- value="test" />
+
</combo_box>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index d8e3f4ccfb..f19e98692d 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -400,31 +400,6 @@
name="voice_input_device"
top_pad="-2"
width="200" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="165"
- name="My volume label"
- top_pad="5"
- width="200">
- My volume:
- </text>
- <slider_bar
- control_name="AudioLevelMic"
- follows="left|top"
- height="17"
- increment="0.05"
- initial_value="1.0"
- layout="topleft"
- left="160"
- max_val="2"
- name="mic_volume_slider"
- tool_tip="Change the volume using this slider"
- top_pad="-2"
- width="220" />
<text
type="string"
text_color="EmphasisColor"
@@ -434,7 +409,7 @@
layout="topleft"
left_pad="5"
name="wait_text"
- top_delta="0"
+ top_delta="5"
width="110">
Please wait
</text>
@@ -443,7 +418,7 @@
layout="topleft"
left_delta="0"
name="bar0"
- top_delta="0"
+ top_delta="-5"
width="20" />
<locate
height="20"
@@ -479,7 +454,7 @@
left="80"
name="speaker_icon"
mouse_opaque="false"
- top_pad="-8"
+ top_pad="4"
visible="true"
width="22" />
<text
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 6be203ef9c..638bc3cabd 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -286,6 +286,7 @@
left="0"
mouse_opaque="false"
name="add_friend"
+ tool_tip="Offer friendship to the resident"
top="5"
width="77" />
<button
@@ -294,6 +295,7 @@
label="IM"
layout="topleft"
name="im"
+ tool_tip="Open instant message session"
top="5"
left_pad="5"
width="33" />
@@ -303,6 +305,7 @@
label="Call"
layout="topleft"
name="call"
+ tool_tip="Call this resident"
left_pad="5"
top="5"
width="40" />
@@ -313,6 +316,7 @@
label="Map"
layout="topleft"
name="show_on_map_btn"
+ tool_tip="Show the resident on the map"
top="5"
left_pad="5"
width="44" />
@@ -322,6 +326,7 @@
label="Teleport"
layout="topleft"
name="teleport"
+ tool_tip="Offer teleport"
left_pad="5"
top="5"
width="67" />
@@ -331,6 +336,7 @@
label="▼"
layout="topleft"
name="overflow_btn"
+ tool_tip="Pay money to or share inventory with the resident"
right="-1"
top="5"
width="21" />
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index e25ff0d548..f381c5c213 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -9,10 +9,6 @@
name="Estate"
top="320"
width="480">
- <panel.string
- name="email_unsupported">
- Feature unsupported
- </panel.string>
<text
type="string"
length="1"
@@ -81,7 +77,7 @@ regions in the estate.
<view_border
bevel_style="in"
follows="top|left"
- height="310"
+ height="270"
layout="topleft"
left_delta="-4"
top_pad="5"
@@ -141,12 +137,12 @@ regions in the estate.
name="Only Allow"
top="250"
width="278">
- Restrict Access To:
+ Restrict Access to Accounts Verified by:
</text>
<check_box
follows="top|left"
height="16"
- label="Residents with payment info on file"
+ label="Payment Information on File"
layout="topleft"
left_delta="0"
name="limit_payment"
@@ -156,7 +152,7 @@ regions in the estate.
<check_box
follows="top|left"
height="16"
- label="Age-verified adults"
+ label="Age Verification"
layout="topleft"
left_delta="0"
name="limit_age_verified"
@@ -179,26 +175,6 @@ regions in the estate.
name="allow_direct_teleport"
top_pad="4"
width="80" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left="15"
- name="abuse_email_text"
- top_pad="10"
- width="180">
- Abuse email address:
- </text>
- <line_editor
- follows="top|left"
- height="23"
- layout="topleft"
- left="15"
- name="abuse_email_address"
- top_pad="-5"
- width="230" />
<button
enabled="false"
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 4d507a4a61..773506b635 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2860,6 +2860,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="inventory_item_offered-im">
Inventory item offered
</string>
+ <string name="share_alert">
+ Drag items from inventory here
+ </string>
+
<string name="only_user_message">
You are the only user in this session.
diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml
index 19fb520b44..85d0c633af 100644
--- a/indra/newview/skins/default/xui/en/widgets/floater.xml
+++ b/indra/newview/skins/default/xui/en/widgets/floater.xml
@@ -9,8 +9,6 @@
background_visible="true"
background_opaque="false"
header_height="25"
- top="0"
- left="0"
close_image="Icon_Close_Foreground"
restore_image="Icon_Restore_Foreground"
minimize_image="Icon_Minimize_Foreground"