diff options
author | Dessie Linden <dessie@lindenlab.com> | 2010-06-23 10:55:32 -0700 |
---|---|---|
committer | Dessie Linden <dessie@lindenlab.com> | 2010-06-23 10:55:32 -0700 |
commit | 70cf100f747dd3511c5e1dda668ddb97487b98ab (patch) | |
tree | 5108f22422673308bbb705ad92becec254deee5c | |
parent | 63be74f57c5a520e308a90d44e58ae5e5ba2e6bf (diff) | |
parent | 6c57abb295447f2b44eb833cb77fa718dc2b1118 (diff) |
Merged from viewer-release
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" /> |