summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDessie Linden <dessie@lindenlab.com>2010-06-23 10:55:32 -0700
committerDessie Linden <dessie@lindenlab.com>2010-06-23 10:55:32 -0700
commit15909a45757252b98b4e8fdb098f08df1248ed4b (patch)
tree5108f22422673308bbb705ad92becec254deee5c
parentf2bda4b2d75501815fddffac9b84ce0336bedab1 (diff)
parent6c57abb295447f2b44eb833cb77fa718dc2b1118 (diff)
Merged from viewer-release
-rw-r--r--indra/llcommon/llstring.cpp9
-rw-r--r--indra/llcommon/lluuid.cpp116
-rw-r--r--indra/llui/llbutton.cpp7
-rw-r--r--indra/llui/llbutton.h1
-rw-r--r--indra/llui/llspinctrl.cpp5
-rw-r--r--indra/llui/llspinctrl.h1
-rw-r--r--indra/llui/lltextbase.cpp4
-rw-r--r--indra/llui/lltextbase.h6
-rw-r--r--indra/llwindow/llwindowmacosx-objc.mm5
-rw-r--r--indra/newview/Info-SecondLife.plist48
-rw-r--r--indra/newview/llagentwearablesfetch.cpp28
-rw-r--r--indra/newview/llchathistory.cpp4
-rw-r--r--indra/newview/llfloaterland.cpp5
-rw-r--r--indra/newview/llfloatermap.cpp13
-rw-r--r--indra/newview/llfloatermap.h2
-rw-r--r--indra/newview/llinspectremoteobject.cpp11
-rw-r--r--indra/newview/lllogininstance.cpp4
-rw-r--r--indra/newview/lloutfitslist.cpp10
-rw-r--r--indra/newview/lloutfitslist.h5
-rw-r--r--indra/newview/llpaneleditwearable.cpp1
-rw-r--r--indra/newview/llpaneloutfitedit.cpp70
-rw-r--r--indra/newview/llpaneloutfitedit.h5
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp16
-rw-r--r--indra/newview/skins/default/xui/en/floater_map.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_gear.xml13
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_wearable.xml781
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_scrolling_param.xml4
28 files changed, 617 insertions, 563 deletions
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index f14d947734..1561bda201 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -994,7 +994,14 @@ void LLStringUtil::formatNumber(std::string& numStr, std::string decimals)
convertToS32 (decimals, intDecimals);
if (!sLocale.empty())
{
- strStream.imbue (std::locale(sLocale.c_str()));
+ // std::locale() throws if the locale is unknown! (EXT-7926)
+ try
+ {
+ strStream.imbue(std::locale(sLocale.c_str()));
+ } catch (const std::exception &)
+ {
+ LL_WARNS_ONCE("Locale") << "Cannot set locale to " << sLocale << LL_ENDL;
+ }
}
if (!intDecimals)
diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp
index 583c1e589b..3bab01715a 100644
--- a/indra/llcommon/lluuid.cpp
+++ b/indra/llcommon/lluuid.cpp
@@ -456,101 +456,53 @@ static void get_random_bytes(void *buf, int nbytes)
}
#if LL_WINDOWS
-// Code copied from http://msdn.microsoft.com/en-us/library/aa365939(VS.85).aspx
-// This code grabs the first hardware address, rather than the first interface.
-// Using a VPN can cause the first returned interface to be changed.
-
-const S32 MAC_ADDRESS_BYTES=6;
+typedef struct _ASTAT_
+{
+ ADAPTER_STATUS adapt;
+ NAME_BUFFER NameBuff [30];
+}ASTAT, * PASTAT;
// static
S32 LLUUID::getNodeID(unsigned char *node_id)
{
+ ASTAT Adapter;
+ NCB Ncb;
+ UCHAR uRetCode;
+ LANA_ENUM lenum;
+ int i;
+ int retval = 0;
- // Declare and initialize variables.
- DWORD dwSize = 0;
- DWORD dwRetVal = 0;
- int i;
-
-/* variables used for GetIfTable and GetIfEntry */
- MIB_IFTABLE *pIfTable;
- MIB_IFROW *pIfRow;
+ memset( &Ncb, 0, sizeof(Ncb) );
+ Ncb.ncb_command = NCBENUM;
+ Ncb.ncb_buffer = (UCHAR *)&lenum;
+ Ncb.ncb_length = sizeof(lenum);
+ uRetCode = Netbios( &Ncb );
- // Allocate memory for our pointers.
- pIfTable = (MIB_IFTABLE *) malloc(sizeof (MIB_IFTABLE));
- if (pIfTable == NULL)
+ for(i=0; i < lenum.length ;i++)
{
- printf("Error allocating memory needed to call GetIfTable\n");
- return 0;
- }
+ memset( &Ncb, 0, sizeof(Ncb) );
+ Ncb.ncb_command = NCBRESET;
+ Ncb.ncb_lana_num = lenum.lana[i];
- // Before calling GetIfEntry, we call GetIfTable to make
- // sure there are entries to get and retrieve the interface index.
+ uRetCode = Netbios( &Ncb );
- // Make an initial call to GetIfTable to get the
- // necessary size into dwSize
- if (GetIfTable(pIfTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
- free(pIfTable);
- pIfTable = (MIB_IFTABLE *) malloc(dwSize);
- if (pIfTable == NULL)
- {
- printf("Error allocating memory\n");
- return 0;
- }
- }
- // Make a second call to GetIfTable to get the actual
- // data we want.
- if ((dwRetVal = GetIfTable(pIfTable, &dwSize, 0)) == NO_ERROR)
- {
- if (pIfTable->dwNumEntries > 0)
- {
- pIfRow = (MIB_IFROW *) malloc(sizeof (MIB_IFROW));
- if (pIfRow == NULL)
- {
- printf("Error allocating memory\n");
- if (pIfTable != NULL)
- {
- free(pIfTable);
- pIfTable = NULL;
- }
- return 0;
- }
+ memset( &Ncb, 0, sizeof (Ncb) );
+ Ncb.ncb_command = NCBASTAT;
+ Ncb.ncb_lana_num = lenum.lana[i];
- int limit = MAC_ADDRESS_BYTES;
- memcpy(node_id, "\0\0\0\0\0\0", limit); // zero out array of bytes
- for (i = 0; i < (int) pIfTable->dwNumEntries; i++)
- {
- pIfRow->dwIndex = pIfTable->table[i].dwIndex;
- if ((dwRetVal = GetIfEntry(pIfRow)) == NO_ERROR)
- {
- switch (pIfRow->dwType)
- {
- case IF_TYPE_ETHERNET_CSMACD:
- case IF_TYPE_IEEE80211:
- limit = min((int) pIfRow->dwPhysAddrLen, limit);
- if (pIfRow->dwPhysAddrLen == 0)
- break;
- memcpy(node_id, (UCHAR *)&pIfRow->bPhysAddr[0], limit); // just incase the PhysAddr is not the expected MAC_Address size
- free(pIfTable);
- return 1; //return first hardware device found.
- break;
-
- case IF_TYPE_OTHER:
- case IF_TYPE_PPP:
- case IF_TYPE_SOFTWARE_LOOPBACK:
- case IF_TYPE_ISO88025_TOKENRING:
- case IF_TYPE_IEEE1394:
- case IF_TYPE_ATM:
- case IF_TYPE_TUNNEL:
- default:
- break;
- }
- }
- }
+ strcpy( (char *)Ncb.ncb_callname, "* " ); /* Flawfinder: ignore */
+ Ncb.ncb_buffer = (unsigned char *)&Adapter;
+ Ncb.ncb_length = sizeof(Adapter);
+
+ uRetCode = Netbios( &Ncb );
+ if ( uRetCode == 0 )
+ {
+ memcpy(node_id,Adapter.adapt.adapter_address,6); /* Flawfinder: ignore */
+ retval = 1;
}
}
- free(pIfTable);
- return 0;
+ return retval;
}
#elif LL_DARWIN
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 34f3049f2e..39e46a7ccb 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -1162,3 +1162,10 @@ void LLButton::resetMouseDownTimer()
mMouseDownTimer.stop();
mMouseDownTimer.reset();
}
+
+
+BOOL LLButton::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ // just treat a double click as a second click
+ return handleMouseDown(x, y, mask);
+}
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 9bd566d3c9..d7ab030a47 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -152,6 +152,7 @@ public:
virtual BOOL handleHover(S32 x, S32 y, MASK mask);
virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleRightMouseUp(S32 x, S32 y, MASK mask);
+ virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
virtual void draw();
/*virtual*/ BOOL postBuild();
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index c0d02fa8e9..ac0c9c3e45 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -466,8 +466,3 @@ BOOL LLSpinCtrl::handleKeyHere(KEY key, MASK mask)
return FALSE;
}
-BOOL LLSpinCtrl::handleDoubleClick(S32 x, S32 y, MASK mask)
-{
- // just treat a double click as a second click
- return handleMouseDown(x, y, mask);
-}
diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h
index 06201255d2..00d6f86f83 100644
--- a/indra/llui/llspinctrl.h
+++ b/indra/llui/llspinctrl.h
@@ -94,7 +94,6 @@ public:
virtual BOOL handleScrollWheel(S32 x,S32 y,S32 clicks);
virtual BOOL handleKeyHere(KEY key, MASK mask);
- virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
void onEditorCommit(const LLSD& data);
static void onEditorGainFocus(LLFocusableElement* caller, void *userdata);
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 2d0d5c12cb..17e41d9e24 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1630,7 +1630,7 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para
// Text will be replaced during rendering with the icon,
// but string cannot be empty or the segment won't be
// added (or drawn).
- appendImageSegment(part, icon);
+ appendImageSegment(icon);
}
}
@@ -1702,7 +1702,7 @@ void LLTextBase::appendLineBreakSegment(const LLStyle::Params& style_params)
insertStringNoUndo(getLength(), utf8str_to_wstring("\n"), &segments);
}
-void LLTextBase::appendImageSegment(S32 highlight_part, const LLStyle::Params& style_params)
+void LLTextBase::appendImageSegment(const LLStyle::Params& style_params)
{
if(getPlainText())
{
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 92876e20d6..fe8ebb1b80 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -196,6 +196,9 @@ public:
const LLFontGL* getDefaultFont() const { return mDefaultFont; }
+ void appendLineBreakSegment(const LLStyle::Params& style_params);
+ void appendImageSegment(const LLStyle::Params& style_params);
+
public:
// Fired when a URL link is clicked
commit_signal_t mURLClickSignal;
@@ -319,9 +322,6 @@ protected:
void updateRects();
void needsScroll() { mScrollNeeded = TRUE; }
void replaceUrlLabel(const std::string &url, const std::string &label);
-
- void appendLineBreakSegment(const LLStyle::Params& style_params);
- void appendImageSegment(S32 highlight_part, const LLStyle::Params& style_params);
void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params());
void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params);
diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm
index 59b25e1726..3a822a93a6 100644
--- a/indra/llwindow/llwindowmacosx-objc.mm
+++ b/indra/llwindow/llwindowmacosx-objc.mm
@@ -49,6 +49,11 @@ void setupCocoa()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ // The following prevents the Cocoa command line parser from trying to open 'unknown' arguements as documents.
+ // ie. running './secondlife -set Language fr' would cause a pop-up saying can't open document 'fr'
+ // when init'ing the Cocoa App window.
+ [[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"];
+
// This is a bit of voodoo taken from the Apple sample code "CarbonCocoa_PictureCursor":
// http://developer.apple.com/samplecode/CarbonCocoa_PictureCursor/index.html
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 97e24a0bd5..9bc95f9b95 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
@@ -18,33 +18,33 @@
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
- <key>CFBundleDocumentTypes</key>
- <array>
- <dict>
- <key>CFBundleTypeExtensions</key>
- <array>
- <string>slurl</string>
- </array>
- <key>CFBundleTypeIconFile</key>
- <string>seconlife</string>
- <key>CFBundleTypeMIMETypes</key>
- <array>
- <string>application/x-grid-location-info</string>
- </array>
- <key>CFBundleTypeName</key>
- <string>Secondlife SLURL</string>
+ <key>CFBundleDocumentTypes</key>
+ <array>
+ <dict>
+ <key>CFBundleTypeExtensions</key>
+ <array>
+ <string>slurl</string>
+ </array>
+ <key>CFBundleTypeIconFile</key>
+ <string>seconlife</string>
+ <key>CFBundleTypeMIMETypes</key>
+ <array>
+ <string>application/x-grid-location-info</string>
+ </array>
+ <key>CFBundleTypeName</key>
+ <string>Secondlife SLURL</string>
<key>CFBundleTypeOSTypes</key>
<array>
- <string>SLRL</string>
+ <string>SLRL</string>
</array>
- <key>CFBundleTypeRole</key>
- <string>Viewer</string>
- <key>LSTypeIsPackage</key>
+ <key>CFBundleTypeRole</key>
+ <string>Viewer</string>
+ <key>LSTypeIsPackage</key>
<true/>
- <key>NSDocumentClass</key>
- <string>SecondLifeSLURL</string>
- </dict>
- </array>
+ <key>NSDocumentClass</key>
+ <string>SecondLifeSLURL</string>
+ </dict>
+ </array>
<key>CFBundleURLTypes</key>
<array>
<dict>
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
index 931aba1d41..0a2f0e9399 100644
--- a/indra/newview/llagentwearablesfetch.cpp
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -48,6 +48,12 @@ public:
virtual ~LLOrderMyOutfitsOnDestroy()
{
+ if (LLApp::isExiting())
+ {
+ llwarns << "called during shutdown, skipping" << llendl;
+ return;
+ }
+
const LLUUID& my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
if (my_outfits_id.isNull()) return;
@@ -241,6 +247,8 @@ LLLibraryOutfitsFetch::LLLibraryOutfitsFetch(const LLUUID& my_outfits_id) :
mCurrFetchStep(LOFS_FOLDER),
mOutfitsPopulated(false)
{
+ llinfos << "created" << llendl;
+
mMyOutfitsID = LLUUID::null;
mClothingID = LLUUID::null;
mLibraryClothingID = LLUUID::null;
@@ -250,10 +258,13 @@ LLLibraryOutfitsFetch::LLLibraryOutfitsFetch(const LLUUID& my_outfits_id) :
LLLibraryOutfitsFetch::~LLLibraryOutfitsFetch()
{
+ llinfos << "destroyed" << llendl;
}
void LLLibraryOutfitsFetch::done()
{
+ llinfos << "start" << llendl;
+
// Delay this until idle() routine, since it's a heavy operation and
// we also can't have it run within notifyObservers.
doOnIdleOneTime(boost::bind(&LLLibraryOutfitsFetch::doneIdle,this));
@@ -262,6 +273,8 @@ void LLLibraryOutfitsFetch::done()
void LLLibraryOutfitsFetch::doneIdle()
{
+ llinfos << "start" << llendl;
+
gInventory.addObserver(this); // Add this back in since it was taken out during ::done()
switch (mCurrFetchStep)
@@ -302,6 +315,8 @@ void LLLibraryOutfitsFetch::doneIdle()
void LLLibraryOutfitsFetch::folderDone()
{
+ llinfos << "start" << llendl;
+
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
gInventory.collectDescendents(mMyOutfitsID, cat_array, wearable_array,
@@ -309,8 +324,7 @@ void LLLibraryOutfitsFetch::folderDone()
// Early out if we already have items in My Outfits
// except the case when My Outfits contains just initial outfit
- if (cat_array.count() > 1 ||
- cat_array.count() == 1 && cat_array[0]->getUUID() != LLAppearanceMgr::getInstance()->getBaseOutfitUUID())
+ if (cat_array.count() > 1)
{
mOutfitsPopulated = true;
return;
@@ -348,6 +362,8 @@ void LLLibraryOutfitsFetch::folderDone()
void LLLibraryOutfitsFetch::outfitsDone()
{
+ llinfos << "start" << llendl;
+
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
uuid_vec_t folders;
@@ -425,6 +441,8 @@ private:
// Copy the clothing folders from the library into the imported clothing folder
void LLLibraryOutfitsFetch::libraryDone()
{
+ llinfos << "start" << llendl;
+
if (mImportedClothingID != LLUUID::null)
{
// Skip straight to fetching the contents of the imported folder
@@ -480,6 +498,8 @@ void LLLibraryOutfitsFetch::libraryDone()
void LLLibraryOutfitsFetch::importedFolderFetch()
{
+ llinfos << "start" << llendl;
+
// Fetch the contents of the Imported Clothing Folder
uuid_vec_t folders;
folders.push_back(mImportedClothingID);
@@ -495,6 +515,8 @@ void LLLibraryOutfitsFetch::importedFolderFetch()
void LLLibraryOutfitsFetch::importedFolderDone()
{
+ llinfos << "start" << llendl;
+
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
uuid_vec_t folders;
@@ -525,6 +547,8 @@ void LLLibraryOutfitsFetch::importedFolderDone()
void LLLibraryOutfitsFetch::contentsDone()
{
+ llinfos << "start" << llendl;
+
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index ab97dbb695..ac12bffdfb 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -666,13 +666,13 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
slurl = region_slurl.getLocationString();
}
}
- url += "&slurl=" + slurl;
+ url += "&slurl=" + LLURI::escape(slurl);
// set the link for the object name to be the objectim SLapp
// (don't let object names with hyperlinks override our objectim Url)
LLStyle::Params link_params(style_params);
link_params.color.control = "HTMLLinkColor";
- link_params.link_href = LLURI::escape(url);
+ link_params.link_href = url;
mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter,
false, link_params);
}
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 7c5586ec96..76263a4307 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -3022,8 +3022,9 @@ void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_fl
std::string text_after_rating = str_to_parse.substr(maturity_pos + MATURITY.length());
target_textbox->setText(text_before_rating);
- // any text may be here instead of "icon" except ""
- target_textbox->appendText(std::string("icon"), false, style);
+
+ target_textbox->appendImageSegment(style);
+
target_textbox->appendText(LLViewerParcelMgr::getInstance()->getSelectionRegion()->getSimAccessString(), false);
target_textbox->appendText(text_after_rating, false);
}
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index e74bfae026..df176a1f6d 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -284,4 +284,15 @@ void LLFloaterMap::handleStopTracking (const LLSD& userdata)
LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
}
}
-
+void LLFloaterMap::setMinimized(BOOL b)
+{
+ LLFloater::setMinimized(b);
+ if(b)
+ {
+ setTitle(getString("mini_map_caption"));
+ }
+ else
+ {
+ setTitle("");
+ }
+}
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 3c063adfb8..f7e46bf868 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -55,6 +55,8 @@ public:
/*virtual*/ void draw();
/*virtual*/ void onFocusLost();
/*virtual*/ void onFocusReceived();
+
+ /*virtual*/ void setMinimized(BOOL b);
private:
void handleZoom(const LLSD& userdata);
diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp
index 97ff771658..be021df363 100644
--- a/indra/newview/llinspectremoteobject.cpp
+++ b/indra/newview/llinspectremoteobject.cpp
@@ -128,7 +128,16 @@ void LLInspectRemoteObject::onOpen(const LLSD& data)
update();
// Position the inspector relative to the mouse cursor
- LLUI::positionViewNearMouse(this);
+ // Similar to how tooltips are positioned
+ // See LLToolTipMgr::createToolTip
+ if (data.has("pos"))
+ {
+ LLUI::positionViewNearMouse(this, data["pos"]["x"].asInteger(), data["pos"]["y"].asInteger());
+ }
+ else
+ {
+ LLUI::positionViewNearMouse(this);
+ }
}
void LLInspectRemoteObject::onClickMap()
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 71604291e1..06f490e8e3 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -168,7 +168,9 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia
char hashed_mac_string[MD5HEX_STR_SIZE]; /* Flawfinder: ignore */
LLMD5 hashed_mac;
unsigned char MACAddress[MAC_ADDRESS_BYTES];
- LLUUID::getNodeID(MACAddress);
+ if(LLUUID::getNodeID(MACAddress) == 0) {
+ llerrs << "Failed to get node id; cannot uniquely identify this machine." << llendl;
+ }
hashed_mac.update( MACAddress, MAC_ADDRESS_BYTES );
hashed_mac.finalize();
hashed_mac.hex_digest(hashed_mac_string);
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index c5043e1c3d..6542afc366 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -288,6 +288,9 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
// Setting tab focus callback to monitor currently selected outfit.
tab->setFocusReceivedCallback(boost::bind(&LLOutfitsList::changeOutfitSelection, this, list, cat_id));
+ // Setting callback to reset items selection inside outfit on accordion collapsing and expanding (EXT-7875)
+ tab->setDropDownStateChangedCallback(boost::bind(&LLOutfitsList::resetItemSelection, this, list, cat_id));
+
// Setting list commit callback to monitor currently selected wearable item.
list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1));
@@ -486,6 +489,13 @@ void LLOutfitsList::updateOutfitTab(const LLUUID& category_id)
}
}
+void LLOutfitsList::resetItemSelection(LLWearableItemsList* list, const LLUUID& category_id)
+{
+ list->resetSelection();
+ mItemSelected = false;
+ setSelectedOutfitUUID(category_id);
+}
+
void LLOutfitsList::changeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id)
{
MASK mask = gKeyboard->currentMask(TRUE);
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index df65f7187b..a6b9a66836 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -123,6 +123,11 @@ private:
void changeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id);
/**
+ *Resets items selection inside outfit
+ */
+ void resetItemSelection(LLWearableItemsList* list, const LLUUID& category_id);
+
+ /**
* Saves newly selected outfit ID.
*/
void setSelectedOutfitUUID(const LLUUID& category_id);
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index 4402b2130f..71edd39348 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -977,6 +977,7 @@ void LLPanelEditWearable::revertChanges()
mWearablePtr->revertValues();
mNameEditor->setText(mWearablePtr->getName());
+ updatePanelPickerControls(mWearablePtr->getType());
}
void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index 6b5eb23a9b..aac020087b 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -252,7 +252,8 @@ LLPanelOutfitEdit::LLPanelOutfitEdit()
mInitialized(false),
mAddWearablesPanel(NULL),
mFolderViewFilterCmbBox(NULL),
- mListViewFilterCmbBox(NULL)
+ mListViewFilterCmbBox(NULL),
+ mPlusBtn(NULL)
{
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(FALSE);
@@ -343,9 +344,9 @@ BOOL LLPanelOutfitEdit::postBuild()
mInventoryItemsPanel = getChild<LLInventoryPanel>("folder_view");
mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK);
mInventoryItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
- mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
-
+ mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this));
+ mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this));
+
mCOFDragAndDropObserver = new LLCOFDragAndDropObserver(mInventoryItemsPanel->getModel());
mFolderViewFilterCmbBox = getChild<LLComboBox>("folder_view_filter_combobox");
@@ -371,7 +372,8 @@ BOOL LLPanelOutfitEdit::postBuild()
childSetAction("show_add_wearables_btn", boost::bind(&LLPanelOutfitEdit::onAddMoreButtonClicked, this));
- childSetAction("plus_btn", boost::bind(&LLPanelOutfitEdit::onPlusBtnClicked, this));
+ mPlusBtn = getChild<LLButton>("plus_btn");
+ mPlusBtn->setClickedCallback(boost::bind(&LLPanelOutfitEdit::onPlusBtnClicked, this));
mEditWearableBtn = getChild<LLButton>("edit_wearable_btn");
mEditWearableBtn->setEnabled(FALSE);
@@ -382,6 +384,8 @@ BOOL LLPanelOutfitEdit::postBuild()
mWearablesListViewPanel = getChild<LLPanel>("filtered_wearables_panel");
mWearableItemsList = getChild<LLInventoryItemsList>("list_view");
+ mWearableItemsList->setCommitOnSelectionChange(true);
+ mWearableItemsList->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this));
mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this));
return TRUE;
@@ -559,21 +563,7 @@ void LLPanelOutfitEdit::onSearchEdit(const std::string& string)
void LLPanelOutfitEdit::onPlusBtnClicked(void)
{
- LLUUID selected_id;
- if (mInventoryItemsPanel->getVisible())
- {
- LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
- if (!curr_item) return;
-
- LLFolderViewEventListener* listenerp = curr_item->getListener();
- if (!listenerp) return;
-
- selected_id = listenerp->getUUID();
- }
- else if (mWearablesListViewPanel->getVisible())
- {
- selected_id = mWearableItemsList->getSelectedUUID();
- }
+ LLUUID selected_id = getSelectedItemUUID();
if (selected_id.isNull()) return;
@@ -658,22 +648,28 @@ void LLPanelOutfitEdit::onEditWearableClicked(void)
}
}
-void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+void LLPanelOutfitEdit::onInventorySelectionChange()
{
- LLFolderViewItem* current_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
- if (!current_item)
+ LLUUID item_uuid = getSelectedItemUUID();
+ if (item_uuid.isNull())
{
return;
}
- LLViewerInventoryItem* item = current_item->getInventoryItem();
- if (!item) return;
+ LLViewerInventoryItem* item(gInventory.getItem(item_uuid));
+ if (!item)
+ {
+ return;
+ }
switch (item->getType())
{
- case LLAssetType::AT_CLOTHING:
case LLAssetType::AT_BODYPART:
+ mPlusBtn->setToolTip(getString("replace_body_part"));
+ break;
+ case LLAssetType::AT_CLOTHING:
case LLAssetType::AT_OBJECT:
+ mPlusBtn->setToolTip(LLStringUtil::null);
default:
break;
}
@@ -934,4 +930,26 @@ void LLPanelOutfitEdit::onOutfitChanging(bool started)
indicator->setVisible(started);
}
+LLUUID LLPanelOutfitEdit::getSelectedItemUUID()
+{
+ LLUUID selected_id;
+ if (mInventoryItemsPanel->getVisible())
+ {
+ LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
+ if (!curr_item) return selected_id;
+
+ LLFolderViewEventListener* listenerp = curr_item->getListener();
+ if (!listenerp) return selected_id;
+
+ selected_id = listenerp->getUUID();
+ }
+ else if (mWearablesListViewPanel->getVisible())
+ {
+ selected_id = mWearableItemsList->getSelectedUUID();
+ }
+
+ return selected_id;
+}
+
+
// EOF
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index f449fbca27..aa5d00903a 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -145,7 +145,7 @@ public:
void onFolderViewFilterCommitted(LLUICtrl* ctrl);
void onListViewFilterCommitted(LLUICtrl* ctrl);
void onSearchEdit(const std::string& string);
- void onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ void onInventorySelectionChange();
void onPlusBtnClicked(void);
void applyFolderViewFilter(EFolderViewItemType type);
@@ -192,7 +192,7 @@ private:
void onAddMoreButtonClicked();
void showFilteredWearablesListView(LLWearableType::EType type);
void onOutfitChanging(bool started);
-
+ LLUUID getSelectedItemUUID();
LLTextBox* mCurrentOutfitName;
LLTextBox* mStatus;
@@ -203,6 +203,7 @@ private:
LLButton* mEditWearableBtn;
LLButton* mFolderViewBtn;
LLButton* mListViewBtn;
+ LLButton* mPlusBtn;
LLPanel* mAddWearablesPanel;
LLComboBox* mFolderViewFilterCmbBox;
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 714d9cd4c5..d382c77430 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -86,6 +86,7 @@ public:
registrar.add("Gear.Wear", boost::bind(&LLOutfitListGearMenu::onWear, this));
registrar.add("Gear.TakeOff", boost::bind(&LLOutfitListGearMenu::onTakeOff, this));
+ registrar.add("Gear.Rename", boost::bind(&LLOutfitListGearMenu::onRename, this));
registrar.add("Gear.Delete", boost::bind(&LLOutfitListGearMenu::onDelete, this));
registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2));
@@ -158,6 +159,15 @@ private:
}
}
+ void onRename()
+ {
+ const LLUUID& selected_outfit_id = getSelectedOutfitID();
+ if (selected_outfit_id.notNull())
+ {
+ LLAppearanceMgr::instance().renameOutfit(selected_outfit_id);
+ }
+ }
+
void onDelete()
{
const LLUUID& selected_outfit_id = getSelectedOutfitID();
@@ -187,7 +197,11 @@ private:
return false;
}
- if ("delete" == param)
+ if ("rename" == param)
+ {
+ return get_is_category_renameable(&gInventory, selected_outfit_id);
+ }
+ else if ("delete" == param)
{
return LLAppearanceMgr::instance().getCanRemoveOutfit(selected_outfit_id);
}
diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index a0e28f7a42..efd96624ab 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -54,6 +54,9 @@
name="ToolTipMsg">
[AGENT][REGION](Double-click to open Map)
</floater.string>
+ <floater.string name="mini_map_caption">
+ MINIMAP
+ </floater.string>
<net_map
bg_color="NetMapBackgroundColor"
follows="top|left|bottom|right"
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
index 16b33eff89..8e7ef7f0b5 100644
--- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -176,6 +176,19 @@
<menu_item_separator name="sepatator2" />
<menu_item_call
+ label="Rename Outfit"
+ layout="topleft"
+ name="rename">
+ <on_click
+ function="Gear.Rename" />
+ <on_enable
+ function="Gear.OnEnable"
+ parameter="rename" />
+ <on_visible
+ function="Gear.OnVisible"
+ parameter="rename" />
+ </menu_item_call>
+ <menu_item_call
label="Delete Outfit"
layout="topleft"
name="delete_outfit">
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 00c5325039..1ab9f722d0 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -1,428 +1,399 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
- bevel_style="in"
+ bevel_style="in"
follows="all"
height="570"
+ help_topic="edit_wearable"
label="Wearable"
layout="topleft"
-left="0"
- help_topic="edit_wearable"
+ left="0"
name="panel_edit_wearable"
- top="0"
+ top="0"
width="333">
- <string
- name="edit_shape_title">
- Editing Shape
- </string>
- <string
- name="edit_skin_title">
- Editing Skin
- </string>
- <string
- name="edit_hair_title">
- Editing Hair
- </string>
- <string
- name="edit_eyes_title">
- Editing Eyes
- </string>
- <string
- name="edit_shirt_title">
- Editing Shirt
- </string>
- <string
- name="edit_pants_title">
- Editing Pants
- </string>
- <string
- name="edit_shoes_title">
- Editing Shoes
- </string>
- <string
- name="edit_socks_title">
- Editing Socks
- </string>
- <string
- name="edit_jacket_title">
- Editing Jacket
- </string>
- <string
- name="edit_skirt_title">
- Editing Skirt
- </string>
- <string
- name="edit_gloves_title">
- Editing Gloves
- </string>
- <string
- name="edit_undershirt_title">
- Editing Undershirt
- </string>
- <string
- name="edit_underpants_title">
- Editing Underpants
- </string>
- <string
- name="edit_alpha_title">
- Editing Alpha Mask
- </string>
- <string
- name="edit_tattoo_title">
- Editing Tattoo
- </string>
- <string
- name="shape_desc_text">
- Shape:
- </string>
- <string
- name="skin_desc_text">
- Skin:
- </string>
- <string
- name="hair_desc_text">
- Hair:
- </string>
- <string
- name="eyes_desc_text">
- Eyes:
- </string>
- <string
- name="shirt_desc_text">
- Shirt:
- </string>
- <string
- name="pants_desc_text">
- Pants:
- </string>
- <string
- name="shoes_desc_text">
- Shoes:
- </string>
- <string
- name="socks_desc_text">
- Socks:
- </string>
- <string
- name="jacket_desc_text">
- Jacket:
- </string>
- <string
- name="skirt_desc_text">
- Skirt:
- </string>
- <string
- name="gloves_desc_text">
- Gloves:
- </string>
- <string
- name="undershirt_desc_text">
- Undershirt:
- </string>
- <string
- name="underpants_desc_text">
- Underpants:
- </string>
- <string
- name="alpha_desc_text">
- Alpha Mask:
- </string>
- <string
- name="tattoo_desc_text">
- Tattoo:
- </string>
+ <string
+ name="edit_shape_title"
+ value="Editing Shape" />
+ <string
+ name="edit_skin_title"
+ value="Editing Skin" />
+ <string
+ name="edit_hair_title"
+ value="Editing Hair" />
+ <string
+ name="edit_eyes_title"
+ value="Editing Eyes" />
+ <string
+ name="edit_shirt_title"
+ value="Editing Shirt" />
+ <string
+ name="edit_pants_title"
+ value="Editing Pants" />
+ <string
+ name="edit_shoes_title"
+ value="Editing Shoes" />
+ <string
+ name="edit_socks_title"
+ value="Editing Socks" />
+ <string
+ name="edit_jacket_title"
+ value="Editing Jacket" />
+ <string
+ name="edit_skirt_title"
+ value="Editing Skirt" />
+ <string
+ name="edit_gloves_title"
+ value="Editing Gloves" />
+ <string
+ name="edit_undershirt_title"
+ value="Editing Undershirt" />
+ <string
+ name="edit_underpants_title"
+ value="Editing Underpants" />
+ <string
+ name="edit_alpha_title"
+ value="Editing Alpha Mask" />
+ <string
+ name="edit_tattoo_title"
+ value="Editing Tattoo" />
+ <string
+ name="shape_desc_text"
+ value="Shape:" />
+ <string
+ name="skin_desc_text"
+ value="Skin:" />
+ <string
+ name="hair_desc_text"
+ value="Hair:" />
+ <string
+ name="eyes_desc_text"
+ value="Eyes:" />
+ <string
+ name="shirt_desc_text"
+ value="Shirt:" />
+ <string
+ name="pants_desc_text"
+ value="Pants:" />
+ <string
+ name="shoes_desc_text"
+ value="Shoes:" />
+ <string
+ name="socks_desc_text"
+ value="Socks:" />
+ <string
+ name="jacket_desc_text"
+ value="Jacket:" />
+ <string
+ name="skirt_desc_text"
+ value="Skirt:" />
+ <string
+ name="gloves_desc_text"
+ value="Gloves:" />
+ <string
+ name="undershirt_desc_text"
+ value="Undershirt:" />
+ <string
+ name="underpants_desc_text"
+ value="Underpants:" />
+ <string
+ name="alpha_desc_text"
+ value="Alpha Mask:" />
+ <string
+ name="tattoo_desc_text"
+ value="Tattoo:" />
<button
follows="top|left"
height="24"
- width="30"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
image_unselected="BackButton_Off"
layout="topleft"
- name="back_btn"
left="11"
- top="3" />
- <text
- follows="top|left"
- font="SansSerifHugeBold"
- height="22"
- layout="topleft"
- left_pad="8"
- name="edit_wearable_title"
- text_color="white"
- top="3"
- value="Editing Shape"
- width="270" />
- <panel
- border="false"
- bg_alpha_color="DkGray2"
- bg_opaque_color="DkGray2"
- background_visible="true"
- background_opaque="true"
+ name="back_btn"
+ top="3"
+ width="30" />
+ <text
+ follows="top|left"
+ font="SansSerifHugeBold"
+ height="22"
+ layout="topleft"
+ left_pad="8"
+ name="edit_wearable_title"
+ text_color="white"
+ top="3"
+ value="Editing Shape"
+ width="270" />
+ <panel
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ border="false"
+ follows="top|left|right"
+ height="60"
+ label="Shirt"
+ layout="topleft"
+ left="10"
+ name="wearable_type_panel"
+ top_pad="10"
+ width="313">
+ <text
follows="top|left|right"
- height="60"
- label="Shirt"
+ font="SansSerifSmallBold"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="description_text"
+ text_color="white"
+ top="10"
+ value="Shape:"
+ width="150" />
+ <radio_group
+ control_name="AvatarSex"
+ follows="left|top|right"
+ height="20"
layout="topleft"
- left="10"
- name="wearable_type_panel"
- top_pad="10"
- width="313">
- <text
- follows="top|left|right"
- font="SansSerifSmallBold"
- height="16"
- layout="topleft"
- left="10"
- name="description_text"
- text_color="white"
- top="10"
- value="Shape:"
- width="150" />
- <radio_group
- control_name="AvatarSex"
- follows="left|top|right"
- left="210"
- height="20"
- layout="topleft"
- name="sex_radio"
- top="5"
- width="110">
- <radio_item
- follows="all"
- height="16"
- label=""
- layout="topleft"
- left="0"
- name="sex_male"
- tool_tip="Male"
- value="1"
- width="40" />
- <radio_item
- follows="all"
- height="16"
- label=""
- layout="topleft"
- left_pad="10"
- name="sex_female"
- tool_tip="Female"
- value="0"
- width="40" />
- </radio_group>
- <!-- graphical labels for the radio buttons above -->
- <icon
- height="16"
- image_name="icons/Male.png"
- left="230"
- name="male_icon"
- tool_tip="Male"
- top="7"
- width="16" />
- <icon
- height="16"
- image_name="icons/Female.png"
- name="female_icon"
- left="280"
- tool_tip="Female"
- top="7"
- width="16" />
- <line_editor
+ left="210"
+ name="sex_radio"
+ top="5"
+ width="110">
+ <radio_item
follows="all"
- height="23"
+ height="16"
+ label=""
layout="topleft"
- left="10"
- max_length="63"
- name="description"
- prevalidate_callback="ascii"
- text_color="black"
- top_pad="3"
- width="290" />
- </panel>
- <panel
- follows="all"
- height="433"
- layout="topleft"
- left="0"
- name="edit_subpanel_container"
- top_pad="2"
- width="333">
- <!-- the shape editing panel is taller than the others
+ left="0"
+ name="sex_male"
+ tool_tip="Male"
+ value="1"
+ width="40" />
+ <radio_item
+ follows="all"
+ height="16"
+ label=""
+ layout="topleft"
+ left_pad="10"
+ name="sex_female"
+ tool_tip="Female"
+ value="0"
+ width="40"/>
+ </radio_group>
+ <!-- graphical labels for the radio buttons above -->
+ <icon
+ height="16"
+ image_name="icons/Male.png"
+ layout="topleft"
+ left="230"
+ name="male_icon"
+ tool_tip="Male"
+ top="7"
+ width="16" />
+ <icon
+ height="16"
+ image_name="icons/Female.png"
+ layout="topleft"
+ left="280"
+ name="female_icon"
+ tool_tip="Female"
+ top="7"
+ width="16" />
+ <line_editor
+ follows="all"
+ height="23"
+ layout="topleft"
+ left="10"
+ max_length="63"
+ name="description"
+ prevalidate_callback="ascii"
+ text_color="black"
+ top_pad="3"
+ width="290" />
+ </panel>
+ <panel
+ follows="all"
+ height="433"
+ layout="topleft"
+ left="0"
+ name="edit_subpanel_container"
+ top_pad="2"
+ width="333">
+ <!-- the shape editing panel is taller than the others
because it also displays avatar height -->
- <panel
- filename="panel_edit_shape.xml"
- follows="all"
- height="433"
- layout="topleft"
- left="0"
- name="edit_shape_panel"
- top="0"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_skin.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_skin_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_hair.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_hair_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_eyes.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_eyes_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_shirt.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_shirt_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_pants.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_pants_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_shoes.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_shoes_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_socks.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_socks_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_jacket.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_jacket_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_skirt.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_skirt_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_gloves.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_gloves_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_undershirt.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_undershirt_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_underpants.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_underpants_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_alpha.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_alpha_panel"
- top="8"
- visible="false"
- width="333" />
- <panel
- filename="panel_edit_tattoo.xml"
- follows="all"
- height="425"
- layout="topleft"
- left="0"
- name="edit_tattoo_panel"
- top="8"
- visible="false"
- width="333" />
- </panel>
-
- <panel
- follows="bottom|left|right"
- height="23"
- layout="topleft"
- left="2"
- name="button_panel"
- top_pad="6"
- width="333" >
- <button
- follows="bottomleft"
- layout="topleft"
- height="23"
- label="Save As"
- left="8"
- name="save_as_button"
- top="0"
- width="153" />
- <button
- follows="bottomleft"
- layout="topleft"
- height="23"
- label="Revert"
- left_pad="7"
- name="revert_button"
- width="152" />
- </panel>
+ <panel
+ filename="panel_edit_shape.xml"
+ follows="all"
+ height="433"
+ layout="topleft"
+ left="0"
+ name="edit_shape_panel"
+ top="0"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_skin.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_skin_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_hair.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_hair_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_eyes.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_eyes_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_shirt.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_shirt_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_pants.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_pants_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_shoes.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_shoes_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_socks.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_socks_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_jacket.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_jacket_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_skirt.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_skirt_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_gloves.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_gloves_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_undershirt.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_undershirt_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_underpants.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_underpants_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_alpha.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_alpha_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ <panel
+ filename="panel_edit_tattoo.xml"
+ follows="all"
+ height="425"
+ layout="topleft"
+ left="0"
+ name="edit_tattoo_panel"
+ top="8"
+ visible="false"
+ width="333" />
+ </panel>
+ <panel
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ left="2"
+ name="button_panel"
+ top_pad="6"
+ width="333">
+ <button
+ follows="bottomleft"
+ height="23"
+ label="Save As"
+ layout="topleft"
+ left="8"
+ name="save_as_button"
+ top="0"
+ width="153" />
+ <button
+ follows="bottomleft"
+ height="23"
+ label="Revert"
+ layout="topleft"
+ left_pad="7"
+ name="revert_button"
+ width="152" />
+ </panel>
</panel>
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 819ba7f878..d6549adfef 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -54,6 +54,9 @@
<string name="Filter.Clothing" value="Clothing"/>
<string name="Filter.Bodyparts" value="Body parts"/>
+ <string
+ name="replace_body_part"
+ value="Click to replace your existing shape"/>
<button
follows="top|left"
diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
index 78d64620a5..a8cd380f20 100644
--- a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
+++ b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
@@ -12,7 +12,7 @@
layout="topleft"
left="12"
name="min param text"
- text_color="EmphasisColor"
+ text_color="White"
font_shadow="hard"
top="120"
width="120" />
@@ -22,7 +22,7 @@
layout="topleft"
left="155"
name="max param text"
- text_color="EmphasisColor"
+ text_color="White"
font_shadow="hard"
top_delta="0"
width="120" />