summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llagentwearables.cpp9
-rw-r--r--indra/newview/llagentwearables.h9
-rw-r--r--indra/newview/llagentwearablesfetch.cpp1
-rw-r--r--indra/newview/llappearancemgr.cpp19
-rw-r--r--indra/newview/llavataractions.cpp5
-rw-r--r--indra/newview/llgiveinventory.cpp4
-rw-r--r--indra/newview/llimview.cpp12
-rw-r--r--indra/newview/llinventoryobserver.cpp8
-rw-r--r--indra/newview/llnotificationtiphandler.cpp7
-rw-r--r--indra/newview/llpaneleditwearable.cpp16
-rw-r--r--indra/newview/llpaneleditwearable.h4
-rw-r--r--indra/newview/llpaneloutfitedit.cpp25
-rw-r--r--indra/newview/llpaneloutfitedit.h1
-rw-r--r--indra/newview/llpaneltopinfobar.cpp35
-rw-r--r--indra/newview/llpaneltopinfobar.h5
-rw-r--r--indra/newview/llviewercontrol.cpp12
-rw-r--r--indra/newview/llviewermenu.cpp25
-rw-r--r--indra/newview/llviewermenu.h1
-rw-r--r--indra/newview/llviewermessage.cpp23
-rw-r--r--indra/newview/skins/default/xui/en/menu_topinfobar.xml51
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_wearable.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml16
23 files changed, 267 insertions, 43 deletions
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 3923749e64..66866618e1 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -47,6 +47,7 @@
#include "llinventorypanel.h"
#include "llmd5.h"
#include "llnotificationsutil.h"
+#include "lloutfitobserver.h"
#include "llpaneloutfitsinventory.h"
#include "llsidepanelappearance.h"
#include "llsidetray.h"
@@ -179,6 +180,13 @@ void LLAgentWearables::cleanup()
{
}
+// static
+void LLAgentWearables::initClass()
+{
+ // this can not be called from constructor because its instance is global and is created too early.
+ LLOutfitObserver::instance().addCOFSavedCallback(boost::bind(&LLAgentWearables::notifyLoadingFinished, &gAgentWearables));
+}
+
void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar)
{
if (avatar)
@@ -931,6 +939,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
// notify subscribers that wearables started loading. See EXT-7777
// *TODO: find more proper place to not be called from deprecated method.
+ // Seems such place is found: LLInitialWearablesFetch::processContents()
gAgentWearables.notifyLoadingStarted();
mInitialWearablesUpdateReceived = true;
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 05913825dd..8122971db6 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -33,9 +33,13 @@
#ifndef LL_LLAGENTWEARABLES_H
#define LL_LLAGENTWEARABLES_H
+// libraries
#include "llmemory.h"
+#include "llui.h"
#include "lluuid.h"
#include "llinventory.h"
+
+// newview
#include "llinventorymodel.h"
#include "llviewerinventory.h"
#include "llvoavatardefines.h"
@@ -47,7 +51,7 @@ class LLInitialWearablesFetch;
class LLViewerObject;
class LLTexLayerTemplate;
-class LLAgentWearables
+class LLAgentWearables : public LLInitClass<LLAgentWearables>
{
//--------------------------------------------------------------------
// Constructors / destructors / Initializers
@@ -61,6 +65,9 @@ public:
void createStandardWearables(BOOL female);
void cleanup();
void dump();
+
+ // LLInitClass interface
+ static void initClass();
protected:
void createStandardWearablesDone(S32 type, U32 index/* = 0*/);
void createStandardWearablesAllDone();
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
index ef0b97d376..931aba1d41 100644
--- a/indra/newview/llagentwearablesfetch.cpp
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -121,6 +121,7 @@ void LLInitialWearablesFetch::processContents()
LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
if (wearable_array.count() > 0)
{
+ gAgentWearables.notifyLoadingStarted();
LLAppearanceMgr::instance().updateAppearanceFromCOF();
}
else
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 4e96372da9..405cc5b282 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -177,7 +177,13 @@ class LLUpdateDirtyState: public LLInventoryCallback
{
public:
LLUpdateDirtyState() {}
- virtual ~LLUpdateDirtyState(){ LLAppearanceMgr::getInstance()->updateIsDirty(); }
+ virtual ~LLUpdateDirtyState()
+ {
+ if (LLAppearanceMgr::instanceExists())
+ {
+ LLAppearanceMgr::getInstance()->updateIsDirty();
+ }
+ }
virtual void fire(const LLUUID&) {}
};
@@ -2150,6 +2156,8 @@ bool LLAppearanceMgr::updateBaseOutfit()
}
setOutfitLocked(true);
+ gAgentWearables.notifyLoadingStarted();
+
const LLUUID base_outfit_id = getBaseOutfitUUID();
if (base_outfit_id.isNull()) return false;
@@ -2309,6 +2317,7 @@ public:
}
LLAppearanceMgr::getInstance()->updateIsDirty();
+ gAgentWearables.notifyLoadingFinished(); // New outfit is saved.
LLAppearanceMgr::getInstance()->updatePanelOutfitName("");
}
@@ -2324,6 +2333,8 @@ LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, b
{
if (!isAgentAvatarValid()) return LLUUID::null;
+ gAgentWearables.notifyLoadingStarted();
+
// First, make a folder in the My Outfits directory.
const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
LLUUID folder_id = gInventory.createNewCategory(
@@ -2530,7 +2541,9 @@ void LLAppearanceMgr::registerAttachment(const LLUUID& item_id)
if (mAttachmentInvLinkEnabled)
{
- LLAppearanceMgr::addCOFItemLink(item_id, false); // Add COF link for item.
+ // we have to pass do_update = true to call LLAppearanceMgr::updateAppearanceFromCOF.
+ // it will trigger gAgentWariables.notifyLoadingFinished()
+ LLAppearanceMgr::addCOFItemLink(item_id, true); // Add COF link for item.
}
else
{
@@ -2560,7 +2573,7 @@ void LLAppearanceMgr::linkRegisteredAttachments()
++it)
{
LLUUID item_id = *it;
- addCOFItemLink(item_id, false);
+ addCOFItemLink(item_id, true);
}
mRegisteredAttachments.clear();
}
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 2dafe295fe..5bc3b3ac8d 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -550,11 +550,10 @@ namespace action_give_inventory
// iterate through avatars
for(S32 i = 0; i < count; ++i)
{
- const std::string& avatar_name = LLShareInfo::instance().mAvatarNames[i];
const LLUUID& avatar_uuid = LLShareInfo::instance().mAvatarUuids[i];
- // Start up IM before give the item
- const LLUUID session_id = gIMMgr->addSession(avatar_name, IM_NOTHING_SPECIAL, avatar_uuid);
+ // We souldn't open IM session, just calculate session ID for logging purpose. See EXT-6710
+ const LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, avatar_uuid);
uuid_set_t::const_iterator it = inventory_selected_uuids.begin();
const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end();
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
index aebf1b4c26..6470e9d6fe 100644
--- a/indra/newview/llgiveinventory.cpp
+++ b/indra/newview/llgiveinventory.cpp
@@ -300,15 +300,15 @@ void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im
// compute id of possible IM session with agent that has "to_agent" id
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, to_agent);
// If this item was given by drag-and-drop into an IM panel, log this action in the IM panel chat.
+ LLSD args;
+ args["user_id"] = to_agent;
if (im_session_id.notNull())
{
- LLSD args;
gIMMgr->addSystemMessage(im_session_id, "inventory_item_offered", args);
}
// If this item was given by drag-and-drop on avatar while IM panel was open, log this action in the IM panel chat.
else if (LLIMModel::getInstance()->findIMSession(session_id))
{
- LLSD args;
gIMMgr->addSystemMessage(session_id, "inventory_item_offered", args);
}
// If this item was given by drag-and-drop on avatar while IM panel wasn't open, log this action to IM history.
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 2c1983b6d2..ddfcd68e38 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -2311,12 +2311,20 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
}
else // going to IM session
{
+ message = LLTrans::getString(message_name + "-im");
+ message.setArgs(args);
if (hasSession(session_id))
{
- message = LLTrans::getString(message_name + "-im");
- message.setArgs(args);
gIMMgr->addMessage(session_id, LLUUID::null, SYSTEM_FROM, message.getString());
}
+ // log message to file
+ else
+ {
+ std::string session_name;
+ // since we select user to share item with - his name is already in cache
+ gCacheName->getFullName(args["user_id"], session_name);
+ LLIMModel::instance().logToFile(session_name, SYSTEM_FROM, LLUUID::null, message.getString());
+ }
}
}
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 0ac8fbcb15..8cb263d9a7 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -523,8 +523,14 @@ void LLInventoryAddItemByAssetObserver::changed(U32 mask)
return;
}
- LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem;
LLMessageSystem* msg = gMessageSystem;
+ if (!(msg->getMessageName() && (0 == strcmp(msg->getMessageName(), "UpdateCreateInventoryItem"))))
+ {
+ // this is not our message
+ return; // to prevent a crash. EXT-7921;
+ }
+
+ LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem;
S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
for(S32 i = 0; i < num_blocks; ++i)
{
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index df6f04b6ea..a06a5770a2 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -106,11 +106,16 @@ bool LLTipHandler::processNotification(const LLSD& notify)
}
}
+ std::string session_name = notification->getPayload()["SESSION_NAME"];
const std::string name = notification->getSubstitutions()["NAME"];
+ if (session_name.empty())
+ {
+ session_name = name;
+ }
LLUUID from_id = notification->getPayload()["from_id"];
if (LLHandlerUtil::canLogToIM(notification))
{
- LLHandlerUtil::logToIM(IM_NOTHING_SPECIAL, name, name,
+ LLHandlerUtil::logToIM(IM_NOTHING_SPECIAL, session_name, name,
notification->getMessage(), from_id, from_id);
}
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 1aedfec86f..4402b2130f 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -652,7 +652,7 @@ BOOL LLPanelEditWearable::postBuild()
// handled at appearance panel level?
//mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this));
- mTextEditor = getChild<LLTextEditor>("description");
+ mNameEditor = getChild<LLLineEditor>("description");
mPanelTitle = getChild<LLTextBox>("edit_wearable_title");
mDescTitle = getChild<LLTextBox>("description_text");
@@ -758,7 +758,7 @@ BOOL LLPanelEditWearable::isDirty() const
if (mWearablePtr)
{
if (mWearablePtr->isDirty() ||
- mWearablePtr->getName().compare(mTextEditor->getText()) != 0)
+ mWearablePtr->getName().compare(mNameEditor->getText()) != 0)
{
isDirty = TRUE;
}
@@ -796,7 +796,7 @@ void LLPanelEditWearable::onRevertButtonClicked(void* userdata)
void LLPanelEditWearable::onSaveAsButtonClicked()
{
LLSD args;
- args["DESC"] = mTextEditor->getText();
+ args["DESC"] = mNameEditor->getText();
LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2));
}
@@ -810,7 +810,7 @@ void LLPanelEditWearable::saveAsCallback(const LLSD& notification, const LLSD& r
LLStringUtil::trim(wearable_name);
if( !wearable_name.empty() )
{
- mTextEditor->setText(wearable_name);
+ mNameEditor->setText(wearable_name);
saveChanges();
}
}
@@ -956,10 +956,10 @@ void LLPanelEditWearable::saveChanges()
U32 index = gAgentWearables.getWearableIndex(mWearablePtr);
- if (mWearablePtr->getName().compare(mTextEditor->getText()) != 0)
+ if (mWearablePtr->getName().compare(mNameEditor->getText()) != 0)
{
// the name of the wearable has changed, re-save wearable with new name
- gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, mTextEditor->getText(), FALSE);
+ gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, mNameEditor->getText(), FALSE);
}
else
{
@@ -976,7 +976,7 @@ void LLPanelEditWearable::revertChanges()
}
mWearablePtr->revertValues();
- mTextEditor->setText(mWearablePtr->getName());
+ mNameEditor->setText(mWearablePtr->getName());
}
void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
@@ -1018,7 +1018,7 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
mDescTitle->setText(description_title);
// set name
- mTextEditor->setText(wearable->getName());
+ mNameEditor->setText(wearable->getName());
updatePanelPickerControls(type);
updateTypeSpecificControls(type);
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index c63671fcc9..61441435cd 100644
--- a/indra/newview/llpaneleditwearable.h
+++ b/indra/newview/llpaneleditwearable.h
@@ -41,7 +41,6 @@
class LLCheckBoxCtrl;
class LLWearable;
-class LLTextEditor;
class LLTextBox;
class LLViewerInventoryItem;
class LLViewerVisualParam;
@@ -49,6 +48,7 @@ class LLVisualParamHint;
class LLViewerJointMesh;
class LLAccordionCtrlTab;
class LLJoint;
+class LLLineEditor;
class LLPanelEditWearable : public LLPanel
{
@@ -140,7 +140,7 @@ private:
// This text editor reference will change each time we edit a new wearable -
// it will be grabbed from the currently visible panel
- LLTextEditor *mTextEditor;
+ LLLineEditor *mNameEditor;
// The following panels will be shown/hidden based on what wearable we're editing
// body parts
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 8da7432e0a..5fac7efb84 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -60,6 +60,7 @@
#include "llinventorybridge.h"
#include "llinventorymodel.h"
#include "llinventorymodelbackgroundfetch.h"
+#include "llloadingindicator.h"
#include "llpaneloutfitsinventory.h"
#include "lluiconstants.h"
#include "llsaveoutfitcombobtn.h"
@@ -262,6 +263,9 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this));
observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this));
observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::update, this));
+
+ gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, true));
+ gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, false));
mFolderViewItemTypes.reserve(NUM_FOLDER_VIEW_ITEM_TYPES);
for (U32 i = 0; i < NUM_FOLDER_VIEW_ITEM_TYPES; i++)
@@ -902,6 +906,27 @@ void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type
applyListViewFilter((EListViewItemType) (LVIT_SHAPE + type));
}
+static void update_status_widget_rect(LLView * widget, S32 right_border)
+{
+ LLRect rect = widget->getRect();
+ rect.mRight = right_border;
+ widget->setShape(rect);
+}
+
+void LLPanelOutfitEdit::onOutfitChanging(bool started)
+{
+ static LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("edit_outfit_loading_indicator");
+ static LLView* status_panel = getChild<LLView>("outfit_name_and_status");
+ static S32 indicator_delta = status_panel->getRect().getWidth() - indicator->getRect().mLeft;
+
+ S32 delta = started ? indicator_delta : 0;
+ S32 right_border = status_panel->getRect().getWidth() - delta;
+
+ update_status_widget_rect(mCurrentOutfitName, right_border);
+ update_status_widget_rect(mStatus, right_border);
+
+ indicator->setVisible(started);
+}
// EOF
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index 1705e3043b..484f3fcb9f 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -191,6 +191,7 @@ private:
void onGearButtonClick(LLUICtrl* clicked_button);
void onAddMoreButtonClicked();
void showFilteredWearablesListView(LLWearableType::EType type);
+ void onOutfitChanging(bool started);
LLTextBox* mCurrentOutfitName;
diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp
index 7cf574b6e5..68dc1cdf71 100644
--- a/indra/newview/llpaneltopinfobar.cpp
+++ b/indra/newview/llpaneltopinfobar.cpp
@@ -36,12 +36,16 @@
#include "llagent.h"
#include "llagentui.h"
+#include "llclipboard.h"
+#include "lllandmarkactions.h"
#include "lllocationinputctrl.h"
#include "llnotificationsutil.h"
#include "llparcel.h"
#include "llsidetray.h"
+#include "llslurl.h"
#include "llstatusbar.h"
#include "llviewercontrol.h"
+#include "llviewerinventory.h"
#include "llviewermenu.h"
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
@@ -65,6 +69,9 @@ private:
LLPanelTopInfoBar::LLPanelTopInfoBar(): mParcelChangedObserver(0)
{
+ LLUICtrl::CommitCallbackRegistry::currentRegistrar()
+ .add("TopInfoBar.Action", boost::bind(&LLPanelTopInfoBar::onContextMenuItemClicked, this, _2));
+
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_topinfo_bar.xml");
}
@@ -120,7 +127,7 @@ void LLPanelTopInfoBar::handleLoginComplete()
BOOL LLPanelTopInfoBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
- show_navbar_context_menu(this, x, y);
+ show_topinfobar_context_menu(this, x, y);
return TRUE;
}
@@ -387,6 +394,32 @@ void LLPanelTopInfoBar::onAgentParcelChange()
update();
}
+void LLPanelTopInfoBar::onContextMenuItemClicked(const LLSD::String& item)
+{
+ if (item == "landmark")
+ {
+ LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos();
+
+ if(landmark == NULL)
+ {
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ }
+ else
+ {
+ LLSideTray::getInstance()->showPanel("panel_places",
+ LLSD().with("type", "landmark").with("id",landmark->getUUID()));
+ }
+ }
+ else if (item == "copy")
+ {
+ LLSLURL slurl;
+ LLAgentUI::buildSLURL(slurl, false);
+ LLUIString location_str(slurl.getSLURLString());
+
+ gClipboard.copyFromString(location_str);
+ }
+}
+
void LLPanelTopInfoBar::onInfoButtonClicked()
{
LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
diff --git a/indra/newview/llpaneltopinfobar.h b/indra/newview/llpaneltopinfobar.h
index 4a85bbcd76..e417a06a64 100644
--- a/indra/newview/llpaneltopinfobar.h
+++ b/indra/newview/llpaneltopinfobar.h
@@ -95,6 +95,11 @@ private:
void onAgentParcelChange();
/**
+ * Called when context menu item is clicked.
+ */
+ void onContextMenuItemClicked(const LLSD::String& userdata);
+
+ /**
* Called when user checks/unchecks Show Coordinates menu item.
*/
void onNavBarShowParcelPropertiesCtrlChanged();
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index f4b4954cbd..f2c9fbf78d 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -462,7 +462,11 @@ bool toggle_agent_pause(const LLSD& newvalue)
bool toggle_show_navigation_panel(const LLSD& newvalue)
{
- LLNavigationBar::getInstance()->showNavigationPanel(newvalue.asBoolean());
+ bool value = newvalue.asBoolean();
+
+ LLNavigationBar::getInstance()->showNavigationPanel(value);
+ gSavedSettings.setBOOL("ShowMiniLocationPanel", !value);
+
return true;
}
@@ -474,7 +478,11 @@ bool toggle_show_favorites_panel(const LLSD& newvalue)
bool toggle_show_mini_location_panel(const LLSD& newvalue)
{
- LLPanelTopInfoBar::getInstance()->setVisible(newvalue.asBoolean());
+ bool value = newvalue.asBoolean();
+
+ LLPanelTopInfoBar::getInstance()->setVisible(value);
+ gSavedSettings.setBOOL("ShowNavbarNavigationPanel", !value);
+
return true;
}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 36650af6cb..635cc361f3 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -7693,6 +7693,31 @@ void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y)
LLMenuGL::showPopup(ctrl, show_navbar_context_menu, x, y);
}
+void show_topinfobar_context_menu(LLView* ctrl, S32 x, S32 y)
+{
+ static LLMenuGL* show_topbarinfo_context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_topinfobar.xml",
+ gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+
+ LLMenuItemGL* landmark_item = show_topbarinfo_context_menu->getChild<LLMenuItemGL>("Landmark");
+ if (!LLLandmarkActions::landmarkAlreadyExists())
+ {
+ landmark_item->setLabel(LLTrans::getString("AddLandmarkNavBarMenu"));
+ }
+ else
+ {
+ landmark_item->setLabel(LLTrans::getString("EditLandmarkNavBarMenu"));
+ }
+
+ if(gMenuHolder->hasVisibleMenu())
+ {
+ gMenuHolder->hideMenus();
+ }
+
+ show_topbarinfo_context_menu->buildDrawLabels();
+ show_topbarinfo_context_menu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(ctrl, show_topbarinfo_context_menu, x, y);
+}
+
void initialize_edit_menu()
{
view_listener_t::addMenu(new LLEditUndo(), "Edit.Undo");
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index ad88fcea9a..e0497139a5 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -53,6 +53,7 @@ void toggle_debug_menus(void*);
void show_context_menu( S32 x, S32 y, MASK mask );
void show_build_mode_context_menu(S32 x, S32 y, MASK mask);
void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y);
+void show_topinfobar_context_menu(LLView* ctrl, S32 x, S32 y);
BOOL enable_save_into_inventory(void*);
void handle_reset_view();
void handle_cut(void*);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index d81fa5ee1c..bf4eb6ec33 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1980,6 +1980,18 @@ static bool parse_lure_bucket(const std::string& bucket,
return true;
}
+class LLPostponedIMSystemTipNotification: public LLPostponedNotification
+{
+protected:
+ /* virtual */
+ void modifyNotificationParams()
+ {
+ LLSD payload = mParams.payload;
+ payload["SESSION_NAME"] = mName;
+ mParams.payload = payload;
+ }
+};
+
void process_improved_im(LLMessageSystem *msg, void **user_data)
{
if (gNoRender)
@@ -2050,14 +2062,19 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLSD args;
LLSD payload;
+ LLNotification::Params params;
+
switch(dialog)
{
case IM_CONSOLE_AND_CHAT_HISTORY:
- // *TODO: Translate
args["MESSAGE"] = message;
- payload["SESSION_NAME"] = name;
+ args["NAME"] = name;
payload["from_id"] = from_id;
- LLNotificationsUtil::add("IMSystemMessageTip",args, payload);
+
+ params.name = "IMSystemMessageTip";
+ params.substitutions = args;
+ params.payload = payload;
+ LLPostponedNotification::add<LLPostponedIMSystemTipNotification>(params, from_id, false);
break;
case IM_NOTHING_SPECIAL:
diff --git a/indra/newview/skins/default/xui/en/menu_topinfobar.xml b/indra/newview/skins/default/xui/en/menu_topinfobar.xml
new file mode 100644
index 0000000000..cbe249ed4d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_topinfobar.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ height="201"
+ layout="topleft"
+ left="100"
+ mouse_opaque="false"
+ name="menu_topinfobar"
+ top="624"
+ visible="false"
+ width="128">
+ <menu_item_check
+ label="Show Coordinates"
+ name="Show Coordinates">
+ <on_click
+ function="ToggleControl"
+ parameter="NavBarShowCoordinates" />
+ <on_check
+ function="CheckControl"
+ parameter="NavBarShowCoordinates" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show Parcel Properties"
+ name="Show Parcel Properties">
+ <on_click
+ function="ToggleControl"
+ parameter="NavBarShowParcelProperties" />
+ <on_check
+ function="CheckControl"
+ parameter="NavBarShowParcelProperties" />
+ </menu_item_check>
+ <menu_item_separator
+ name="Separator" />
+ <!-- Label of 'Landmark' item is changing in runtime,
+ see AddLandmarkNavBarMenu/EditLandmarkNavBarMenu in strings.xml -->
+ <menu_item_call
+ label="Landmark"
+ name="Landmark">
+ <on_click
+ function="TopInfoBar.Action"
+ parameter="landmark" />
+ </menu_item_call>
+ <menu_item_separator
+ name="Separator" />
+ <menu_item_call
+ label="Copy"
+ name="Copy">
+ <on_click
+ function="TopInfoBar.Action"
+ parameter="copy" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 673c095826..88732fee7d 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6209,7 +6209,7 @@ With the following Residents:
icon="notifytip.tga"
name="ItemsShared"
type="notifytip">
-Items are successfully shared.
+Items successfully shared.
</notification>
<notification
icon="notifytip.tga"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
index 950c4a5fdb..3106ed34ff 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -225,15 +225,17 @@ left="0"
tool_tip="Female"
top="7"
width="16" />
- <text_editor
- follows="all"
- height="23"
- left="10"
- layout="topleft"
- max_length="300"
- name="description"
- top_pad="3"
- width="290" />
+ <line_editor
+ follows="all"
+ height="23"
+ layout="topleft"
+ left="10"
+ max_length="300"
+ name="description"
+ prevalidate_callback="ascii"
+ text_color="black"
+ top_pad="3"
+ width="290" />
</panel>
<panel
follows="all"
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index 03a0c464d2..1ed73e6c15 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -106,7 +106,7 @@
<panel
bevel_style="none"
follows="top|right"
- height="38"
+ height="37"
layout="topleft"
left_pad="5"
name="outfit_name_and_status"
@@ -122,18 +122,26 @@
top="2"
value="Now editing..."
use_ellipses="true"
- width="270" />
+ width="245" />
<text
follows="bottom|left|right"
font="SansSerifLargeBold"
- height="26"
+ height="18"
layout="topleft"
name="curr_outfit_name"
text_color="LtGray"
top_pad="2"
value="[Current Outfit]"
use_ellipses="true"
- width="270" />
+ width="245" />
+ <loading_indicator
+ follows="right|top"
+ height="24"
+ layout="topleft"
+ right="-2"
+ name="edit_outfit_loading_indicator"
+ top="6"
+ width="24" />
</panel>
</panel>