diff options
| author | Dessie Linden <dessie@lindenlab.com> | 2010-06-23 10:46:05 -0700 | 
|---|---|---|
| committer | Dessie Linden <dessie@lindenlab.com> | 2010-06-23 10:46:05 -0700 | 
| commit | 6c57abb295447f2b44eb833cb77fa718dc2b1118 (patch) | |
| tree | 0d9e147ed0b6bbde05e7b9550386114a13416c10 /indra | |
| parent | 87082996e6408919591ee3d408918a4425494dc9 (diff) | |
| parent | af914e4ab666aad041aa17f6459d1ff834440b44 (diff) | |
Merged from q/viewer-release
Diffstat (limited to 'indra')
26 files changed, 580 insertions, 480 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/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/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" /> | 
