diff options
Diffstat (limited to 'indra/newview')
143 files changed, 3804 insertions, 1075 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index efb16d1e42..835a9aacd5 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -104,6 +104,7 @@ set(viewer_SOURCE_FILES      llclassifiedinfo.cpp      llclassifiedstatsresponder.cpp      llcloud.cpp +    llcofwearables.cpp      llcolorswatch.cpp      llcommanddispatcherlistener.cpp      llcommandhandler.cpp @@ -142,6 +143,7 @@ set(viewer_SOURCE_FILES      llfavoritesbar.cpp      llfeaturemanager.cpp      llfilepicker.cpp +    llfilteredwearablelist.cpp      llfirstuse.cpp      llflexibleobject.cpp      llfloaterabout.cpp @@ -252,6 +254,7 @@ set(viewer_SOURCE_FILES      llinventoryclipboard.cpp      llinventoryfilter.cpp      llinventoryfunctions.cpp +    llinventoryitemslist.cpp      llinventorymodel.cpp      llinventorymodelbackgroundfetch.cpp      llinventoryobserver.cpp @@ -294,7 +297,9 @@ set(viewer_SOURCE_FILES      llnotificationmanager.cpp      llnotificationofferhandler.cpp      llnotificationscripthandler.cpp +    llnotificationstorage.cpp      llnotificationtiphandler.cpp +    lloutfitslist.cpp      lloutputmonitorctrl.cpp      llpanelavatar.cpp      llpanelavatartag.cpp @@ -327,6 +332,7 @@ set(viewer_SOURCE_FILES      llpanelnearbymedia.cpp      llpanelobject.cpp      llpanelobjectinventory.cpp +    llpanelonlinestatus.cpp      llpaneloutfitedit.cpp      llpaneloutfitsinventory.cpp      llpanelpeople.cpp @@ -528,6 +534,7 @@ set(viewer_SOURCE_FILES      llwaterparamset.cpp      llwearable.cpp      llwearabledictionary.cpp +    llwearableitemslist.cpp      llwearablelist.cpp      llweb.cpp      llwind.cpp @@ -608,6 +615,7 @@ set(viewer_HEADER_FILES      llclassifiedinfo.h      llclassifiedstatsresponder.h      llcloud.h +    llcofwearables.h      llcolorswatch.h      llcommanddispatcherlistener.h      llcommandhandler.h @@ -647,6 +655,7 @@ set(viewer_HEADER_FILES      llfavoritesbar.h      llfeaturemanager.h      llfilepicker.h +    llfilteredwearablelist.h      llfirstuse.h      llflexibleobject.h      llfloaterabout.h @@ -756,6 +765,7 @@ set(viewer_HEADER_FILES      llinventoryclipboard.h      llinventoryfilter.h      llinventoryfunctions.h +    llinventoryitemslist.h      llinventorymodel.h      llinventorymodelbackgroundfetch.h      llinventoryobserver.h @@ -795,6 +805,8 @@ set(viewer_HEADER_FILES      llnetmap.h      llnotificationhandler.h      llnotificationmanager.h +    llnotificationstorage.h +    lloutfitslist.h      lloutputmonitorctrl.h      llpanelavatar.h      llpanelavatartag.h @@ -827,6 +839,7 @@ set(viewer_HEADER_FILES      llpanelnearbymedia.h      llpanelobject.h      llpanelobjectinventory.h +    llpanelonlinestatus.h      llpaneloutfitedit.h      llpaneloutfitsinventory.h      llpanelpeople.h @@ -1030,6 +1043,7 @@ set(viewer_HEADER_FILES      llwaterparamset.h      llwearable.h      llwearabledictionary.h +    llwearableitemslist.h      llwearablelist.h      llweb.h      llwind.h @@ -1390,7 +1404,7 @@ if (WINDOWS)      # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency      # here. -    # *NOTE:Mani - This is a crappy hack to have important dependecies for the viewer_manifest copy action +    # *NOTE:Mani - This is a crappy hack to have important dependencies for the viewer_manifest copy action      # be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing.      # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py      # and have the build deps get tracked *please* tell me about it. @@ -1411,7 +1425,7 @@ if (WINDOWS)      endif(USE_GOOGLE_PERFTOOLS) -    set(COPY_INPUT_DEPENDECIES +    set(COPY_INPUT_DEPENDENCIES        # The following commented dependencies are determined at variably at build time. Can't do this here.        #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll        ${CMAKE_SOURCE_DIR}/../etc/message.xml @@ -1445,8 +1459,6 @@ if (WINDOWS)        ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt        ${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll        ${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll -      ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_quicktime.dll -      ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_webkit.dll        ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll        ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll        ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll @@ -1486,6 +1498,7 @@ if (WINDOWS)        SLPlugin        media_plugin_quicktime        media_plugin_webkit +      winmm_shim        windows-crash-logger        windows-updater        ) @@ -1507,7 +1520,7 @@ if (WINDOWS)        DEPENDS           ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py          stage_third_party_libs -        ${COPY_INPUT_DEPENDECIES} +        ${COPY_INPUT_DEPENDENCIES}        COMMENT "Performing viewer_manifest copy"        ) @@ -1526,8 +1539,6 @@ if (WINDOWS)      add_dependencies(${VIEWER_BINARY_NAME}         SLPlugin  -      media_plugin_quicktime  -      media_plugin_webkit        windows-updater         windows-crash-logger        ) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5014ba3349..600c548212 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -11038,5 +11038,16 @@        <integer>2048</integer>      </map>      <!-- End of back compatibility settings --> +    <key>teleport_offer_invitation_max_length</key> +    <map> +      <key>Comment</key> +      <string>Maximum length of teleport offer invitation line editor. 254 - max_location_url_length(76) = 178</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>S32</string> +      <key>Value</key> +      <integer>178</integer> +    </map>  </map>  </llsd> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 8bcf680876..ddcaeb113d 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1226,7 +1226,10 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s  	if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))  	{  		setFlying(TRUE); -		mAutoPilotFlyOnStop = TRUE; +		// Do not force flying for "Sit" behavior to prevent flying after pressing "Stand" +		// from an object. See EXT-1655. +		if ("Sit" != mAutoPilotBehaviorName) +			mAutoPilotFlyOnStop = TRUE;  	}  	mAutoPilot = TRUE; diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 7f248eee30..8a880e5ace 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1338,7 +1338,8 @@ public:  		LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);  		LLPanelOutfitsInventory *outfit_panel =  			dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); -		if (outfit_panel) +		// TODO: add handling "My Outfits" tab. +		if (outfit_panel && outfit_panel->isCOFPanelActive())  		{  			outfit_panel->getRootFolder()->clearSelection();  			outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); @@ -1361,24 +1362,6 @@ private:  	LLUUID mFolderID;  }; -LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name) -{ -	if (!isAgentAvatarValid()) return LLUUID::null; - -	// First, make a folder in the My Outfits directory. -	const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); -	LLUUID folder_id = gInventory.createNewCategory( -		parent_id, -		LLFolderType::FT_OUTFIT, -		new_folder_name); - -	LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id); -	LLAppearanceMgr::instance().shallowCopyCategoryContents(LLAppearanceMgr::instance().getCOF(),folder_id, cb); -	LLAppearanceMgr::instance().createBaseOutfitLink(folder_id, cb); - -	return folder_id; -} -  void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index)  {  	LLUUID first_item_id = getWearableItemID((EWearableType)type, index); @@ -2048,6 +2031,39 @@ void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake)  	}  } +bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool closer_to_body) +{ +	if (!item) return false; +	if (!item->isWearableType()) return false; + +	wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(item->getWearableType()); +	if (wearable_iter == mWearableDatas.end()) return false; + +	wearableentry_vec_t& wearable_vec = wearable_iter->second; +	if (wearable_vec.empty()) return false; + +	const LLUUID& asset_id = item->getAssetUUID(); + +	//nowhere to move if the wearable is already on any boundary (closest to the body/furthest from the body) +	if (closer_to_body && asset_id == wearable_vec.front()->getAssetID()) return false; +	if (!closer_to_body && asset_id == wearable_vec.back()->getAssetID()) return false; + +	for (U32 i = 0; i < wearable_vec.size(); ++i) +	{ +		LLWearable* wearable = wearable_vec[i]; +		if (!wearable) continue; +		if (wearable->getAssetID() != asset_id) continue; +		 +		//swapping wearables +		U32 swap_i = closer_to_body ? i-1 : i+1; +		wearable_vec[i] = wearable_vec[swap_i]; +		wearable_vec[swap_i] = wearable; +		return true; +	} + +	return false; +} +  void LLAgentWearables::updateServer()  {  	sendAgentWearablesUpdate(); diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h index b76367324c..d3b18f68f1 100644 --- a/indra/newview/llagentwearables.h +++ b/indra/newview/llagentwearables.h @@ -82,6 +82,8 @@ public:  	void			animateAllWearableParams(F32 delta, BOOL upload_bake); +	bool			moveWearable(const LLViewerInventoryItem* item, bool closer_to_body); +  	//--------------------------------------------------------------------  	// Accessors  	//-------------------------------------------------------------------- @@ -169,8 +171,7 @@ public:  								  const LLDynamicArray<S32>& wearables_to_include,  								  const LLDynamicArray<S32>& attachments_to_include,  								  BOOL rename_clothing); -	 -	LLUUID			makeNewOutfitLinks(const std::string& new_folder_name); +  	// Should only be called if we *know* we've never done so before, since users may  	// not want the Library outfits to stay in their quick outfit selector and can delete them. diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp index 08d8ccfd23..03d09a3798 100644 --- a/indra/newview/llagentwearablesfetch.cpp +++ b/indra/newview/llagentwearablesfetch.cpp @@ -119,6 +119,7 @@ public:  								item->getLinkedUUID(),  								LLAppearanceMgr::instance().getCOF(),  								item->getName(), +								item->getDescription(),  								LLAssetType::AT_LINK,  								link_waiter);  		} @@ -507,6 +508,7 @@ void LLLibraryOutfitsFetch::contentsDone()  								item->getLinkedUUID(),  								new_outfit_folder_id,  								item->getName(), +								item->getDescription(),  								LLAssetType::AT_LINK,  								NULL);  		} diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4d18ff57fe..5586b3cd4d 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -32,6 +32,7 @@  #include "llviewerprecompiledheaders.h" +#include "llaccordionctrltab.h"  #include "llagent.h"  #include "llagentwearables.h"  #include "llappearancemgr.h" @@ -42,6 +43,7 @@  #include "llinventoryfunctions.h"  #include "llinventoryobserver.h"  #include "llnotificationsutil.h" +#include "llpaneloutfitsinventory.h"  #include "llselectmgr.h"  #include "llsidepanelappearance.h"  #include "llsidetray.h" @@ -51,6 +53,8 @@  #include "llviewerregion.h"  #include "llwearablelist.h" +char ORDER_NUMBER_SEPARATOR('@'); +  LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string& name)  {  	LLInventoryModel::cat_array_t cat_array; @@ -118,6 +122,38 @@ private:  	bool mAppend;  }; + +//Inventory callback updating "dirty" state when destroyed +class LLUpdateDirtyState: public LLInventoryCallback +{ +public: +	LLUpdateDirtyState() {} +	virtual ~LLUpdateDirtyState(){ LLAppearanceMgr::getInstance()->updateIsDirty(); } +	virtual void fire(const LLUUID&) {} +}; + + +//Inventory collect functor collecting wearables of a specific wearable type +class LLFindClothesOfType : public LLInventoryCollectFunctor +{ +public: +	LLFindClothesOfType(EWearableType type) : mWearableType(type) {} +	virtual ~LLFindClothesOfType() {} +	virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) +	{ +		if (!item) return false; +		if (item->getType() != LLAssetType::AT_CLOTHING) return false; +		 +		LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item); +		if (!vitem || vitem->getWearableType() != mWearableType) return false; + +		return true; +	} + +	const EWearableType mWearableType; +}; + +  LLUpdateAppearanceOnDestroy::LLUpdateAppearanceOnDestroy():  	mFireCount(0)  { @@ -400,6 +436,7 @@ public:  					     item_id,  					     LLAppearanceMgr::instance().getCOF(),  					     itemp->getName(), +						 itemp->getDescription(),  					     LLAssetType::AT_LINK,  					     cb);  		} @@ -691,10 +728,13 @@ void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LL  		{  			case LLAssetType::AT_LINK:  			{ +				//LLInventoryItem::getDescription() is used for a new description  +				//to propagate ordering information saved in descriptions of links  				link_inventory_item(gAgent.getID(),  									item->getLinkedUUID(),  									dst_id,  									item->getName(), +									item->LLInventoryItem::getDescription(),  									LLAssetType::AT_LINK, cb);  				break;  			} @@ -708,6 +748,7 @@ void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LL  										item->getLinkedUUID(),  										dst_id,  										item->getName(), +										item->getDescription(),  										LLAssetType::AT_LINK_FOLDER, cb);  				}  				break; @@ -811,20 +852,7 @@ void LLAppearanceMgr::filterWearableItems(  {  	// Divvy items into arrays by wearable type.  	std::vector<LLInventoryModel::item_array_t> items_by_type(WT_COUNT); -	for (S32 i=0; i<items.count(); i++) -	{ -		LLViewerInventoryItem *item = items.get(i); -		// Ignore non-wearables. -		if (!item->isWearableType()) -			continue; -		EWearableType type = item->getWearableType(); -		if(type < 0 || type >= WT_COUNT) -		{ -			LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL; -			continue; -		} -		items_by_type[type].push_back(item); -	} +	divvyWearablesByType(items, items_by_type);  	// rebuild items list, retaining the last max_per_type of each array  	items.clear(); @@ -853,6 +881,7 @@ void LLAppearanceMgr::linkAll(const LLUUID& category,  							item->getLinkedUUID(),  							category,  							item->getName(), +							item->LLInventoryItem::getDescription(),  							LLAssetType::AT_LINK,  							cb);  	} @@ -956,7 +985,7 @@ void LLAppearanceMgr::createBaseOutfitLink(const LLUUID& category, LLPointer<LLI  	if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)  	{ -		link_inventory_item(gAgent.getID(), category, cof, catp->getName(), +		link_inventory_item(gAgent.getID(), category, cof, catp->getName(), "",  							LLAssetType::AT_LINK_FOLDER, link_waiter);  		new_outfit_name = catp->getName();  	} @@ -1016,8 +1045,24 @@ static void remove_non_link_items(LLInventoryModel::item_array_t &items)  	items = pruned_items;  } +//a predicate for sorting inventory items by actual descriptions +bool sort_by_description(const LLInventoryItem* item1, const LLInventoryItem* item2) +{ +	if (!item1 || !item2)  +	{ +		llwarning("either item1 or item2 is NULL", 0); +		return true; +	} + +	return item1->LLInventoryItem::getDescription() < item2->LLInventoryItem::getDescription(); +} +  void LLAppearanceMgr::updateAppearanceFromCOF()  { +	//checking integrity of the COF in terms of ordering of wearables,  +	//checking and updating links' descriptions of wearables in the COF (before analyzed for "dirty" state) +	updateClothingOrderingInfo(); +  	// update dirty flag to see if the state of the COF matches  	// the saved outfit stored as a folder link  	llinfos << "starting" << llendl; @@ -1046,6 +1091,9 @@ void LLAppearanceMgr::updateAppearanceFromCOF()  		return;  	} +	//preparing the list of wearables in the correct order for LLAgentWearables +	std::sort(wear_items.begin(), wear_items.end(), sort_by_description); +  	LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;  	holder->mObjItems = obj_items; @@ -1079,8 +1127,8 @@ void LLAppearanceMgr::updateAppearanceFromCOF()  			}  #endif - -			holder->mFoundList.push_front(found); +			//pushing back, not front, to preserve order of wearables for LLAgentWearables +			holder->mFoundList.push_back(found);  		}  		else  		{ @@ -1407,7 +1455,7 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update  		// Are these links to different items of the same wearable  		// type? If so, new item will replace old.  		// MULTI-WEARABLES: revisit if more than one per type is allowed. -		else if (areMatchingWearables(vitem,inv_item)) +		else if (FALSE/*areMatchingWearables(vitem,inv_item)*/)  		{  			if (inv_item->getIsLinkType())  			{ @@ -1430,6 +1478,7 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update  							 vitem->getLinkedUUID(),  							 getCOF(),  							 vitem->getName(), +							 vitem->getDescription(),  							 LLAssetType::AT_LINK,  							 cb);  	} @@ -1446,6 +1495,7 @@ void LLAppearanceMgr::addEnsembleLink( LLInventoryCategory* cat, bool do_update  						 cat->getLinkedUUID(),  						 getCOF(),  						 cat->getName(), +						 cat->getDescription(),  						 LLAssetType::AT_LINK_FOLDER,  						 cb);  #endif @@ -1475,6 +1525,17 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update)  	}  } +bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2) +{ +	if (!item1 || !item2) +	{ +		llwarning("item1, item2 cannot be null, something is very wrong", 0); +		return true; +	} + +	return item1->getLinkedUUID() < item2->getLinkedUUID(); +} +  void LLAppearanceMgr::updateIsDirty()  {  	LLUUID cof = getCOF(); @@ -1514,33 +1575,37 @@ void LLAppearanceMgr::updateIsDirty()  			// Current outfit folder should have one more item than the outfit folder.  			// this one item is the link back to the outfit folder itself.  			mOutfitIsDirty = true; +			return;  		} -		else -		{ -			typedef std::set<LLUUID> item_set_t; -			item_set_t cof_set; -			item_set_t outfit_set; -			// sort COF items by UUID -			for (S32 i = 0; i < cof_items.count(); ++i) +		//getting rid of base outfit folder link to simplify comparison +		for (LLInventoryModel::item_array_t::iterator it = cof_items.begin(); it != cof_items.end(); ++it) +		{ +			if (*it == base_outfit_item)  			{ -				LLViewerInventoryItem *item = cof_items.get(i); -				// don't add the base outfit link to the list of objects we're comparing -				if(item != base_outfit_item) -				{ -					cof_set.insert(item->getLinkedUUID()); -				} +				cof_items.erase(it); +				break;  			} +		} -			// sort outfit folder by UUID -			for (S32 i = 0; i < outfit_items.count(); ++i) +		//"dirty" - also means a difference in linked UUIDs and/or a difference in wearables order (links' descriptions) +		std::sort(cof_items.begin(), cof_items.end(), sort_by_linked_uuid); +		std::sort(outfit_items.begin(), outfit_items.end(), sort_by_linked_uuid); + +		for (U32 i = 0; i < cof_items.size(); ++i) +		{ +			LLViewerInventoryItem *item1 = cof_items.get(i); +			LLViewerInventoryItem *item2 = outfit_items.get(i); + +			if (item1->getLinkedUUID() != item2->getLinkedUUID() ||  +				item1->LLInventoryItem::getDescription() != item2->LLInventoryItem::getDescription())  			{ -				LLViewerInventoryItem *item = outfit_items.get(i); -				outfit_set.insert(item->getLinkedUUID()); +				mOutfitIsDirty = true; +				return;  			} - -			mOutfitIsDirty = (outfit_set != cof_set);  		} + +		mOutfitIsDirty = false;  	}  } @@ -1572,15 +1637,182 @@ bool LLAppearanceMgr::updateBaseOutfit()  	const LLUUID base_outfit_id = getBaseOutfitUUID();  	if (base_outfit_id.isNull()) return false; +	updateClothingOrderingInfo(); +  	// in a Base Outfit we do not remove items, only links  	purgeCategory(base_outfit_id, false); + +	LLPointer<LLInventoryCallback> dirty_state_updater = new LLUpdateDirtyState(); +  	//COF contains only links so we copy to the Base Outfit only links -	shallowCopyCategoryContents(getCOF(), base_outfit_id, NULL); +	shallowCopyCategoryContents(getCOF(), base_outfit_id, dirty_state_updater);  	return true;  } +void LLAppearanceMgr::divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type) +{ +	items_by_type.reserve(WT_COUNT); +	if (items.empty()) return; + +	for (S32 i=0; i<items.count(); i++) +	{ +		LLViewerInventoryItem *item = items.get(i); +		// Ignore non-wearables. +		if (!item->isWearableType()) +			continue; +		EWearableType type = item->getWearableType(); +		if(type < 0 || type >= WT_COUNT) +		{ +			LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL; +			continue; +		} +		items_by_type[type].push_back(item); +	} +} + +std::string build_order_string(EWearableType type, U32 i) +{ +		std::ostringstream order_num; +		order_num << ORDER_NUMBER_SEPARATOR << type * 100 + i; +		return order_num.str(); +} + +struct WearablesOrderComparator +{ +	WearablesOrderComparator(const EWearableType type) +	{ +		mControlSize = build_order_string(type, 0).size(); +	}; + +	bool operator()(const LLInventoryItem* item1, const LLInventoryItem* item2) +	{ +		if (!item1 || !item2) +		{ +			llwarning("either item1 or item2 is NULL", 0); +			return true; +		} +		 +		const std::string& desc1 = item1->LLInventoryItem::getDescription(); +		const std::string& desc2 = item2->LLInventoryItem::getDescription(); +		 +		bool item1_valid = (desc1.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc1[0]); +		bool item2_valid = (desc2.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc2[0]); + +		if (item1_valid && item2_valid) +			return desc1 < desc2; + +		//we need to sink down invalid items: items with empty descriptions, items with "Broken link" descriptions, +		//items with ordering information but not for the associated wearables type +		if (!item1_valid && item2_valid)  +			return false; + +		return true; +	} + +	U32 mControlSize; +}; + +void LLAppearanceMgr::updateClothingOrderingInfo() +{ +	LLInventoryModel::item_array_t wear_items; +	getDescendentsOfAssetType(getCOF(), wear_items, LLAssetType::AT_CLOTHING, false); + +	wearables_by_type_t items_by_type(WT_COUNT); +	divvyWearablesByType(wear_items, items_by_type); + +	bool inventory_changed = false; +	for (U32 type = WT_SHIRT; type < WT_COUNT; type++) +	{ +		 +		U32 size = items_by_type[type].size(); +		if (!size) continue; + +		//sinking down invalid items which need reordering +		std::sort(items_by_type[type].begin(), items_by_type[type].end(), WearablesOrderComparator((EWearableType) type)); + +		//requesting updates only for those links which don't have "valid" descriptions +		for (U32 i = 0; i < size; i++) +		{ +			LLViewerInventoryItem* item = items_by_type[type][i]; +			if (!item) continue; + +			std::string new_order_str = build_order_string((EWearableType)type, i); +			if (new_order_str == item->LLInventoryItem::getDescription()) continue; + +			item->setDescription(new_order_str); +			item->setComplete(TRUE); + 			item->updateServer(FALSE); +			gInventory.updateItem(item); +			inventory_changed = true; +		} +	} + +	//*TODO do we really need to notify observers? +	if (inventory_changed) gInventory.notifyObservers(); +} + + + + +class LLShowCreatedOutfit: public LLInventoryCallback +{ +public: +	LLShowCreatedOutfit(LLUUID& folder_id): mFolderID(folder_id) +	{} + +	virtual ~LLShowCreatedOutfit() +	{ +		LLSD key; +		LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); +		LLPanelOutfitsInventory *outfit_panel = +			dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); +		if (outfit_panel) +		{ +			outfit_panel->getRootFolder()->clearSelection(); +			outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); +		} +		 +		LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0; +		if (tab_outfits && !tab_outfits->getDisplayChildren()) +		{ +			tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren()); +		} + +		LLAppearanceMgr::getInstance()->updateIsDirty(); +		LLAppearanceMgr::getInstance()->updatePanelOutfitName(""); +	} + +	virtual void fire(const LLUUID&) +	{} + +private: +	LLUUID mFolderID; +}; + +LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name) +{ +	if (!isAgentAvatarValid()) return LLUUID::null; + +	// First, make a folder in the My Outfits directory. +	const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +	LLUUID folder_id = gInventory.createNewCategory( +		parent_id, +		LLFolderType::FT_OUTFIT, +		new_folder_name); + +	updateClothingOrderingInfo(); + +	LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id); +	shallowCopyCategoryContents(getCOF(),folder_id, cb); +	createBaseOutfitLink(folder_id, cb); + +	dumpCat(folder_id,"COF, new outfit"); + +	return folder_id; +} +  void LLAppearanceMgr::wearBaseOutfit()  {  	const LLUUID& base_outfit_id = getBaseOutfitUUID(); @@ -1622,6 +1854,63 @@ void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove)  	}  } + +bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_body) +{ +	if (!item || !item->isWearableType()) return false; +	if (item->getType() != LLAssetType::AT_CLOTHING) return false; +	if (!gInventory.isObjectDescendentOf(item->getUUID(), getCOF())) return false; + +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	LLFindClothesOfType filter_wearables_of_type(item->getWearableType()); +	gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type); +	if (items.empty()) return false; + +	//*TODO all items are not guarantied to have valid descriptions (check?) +	std::sort(items.begin(), items.end(), WearablesOrderComparator(item->getWearableType())); + +	if (closer_to_body && items.front() == item) return false; +	if (!closer_to_body && items.back() == item) return false; +	 +	LLInventoryModel::item_array_t::iterator it = std::find(items.begin(), items.end(), item); +	if (items.end() == it) return false; + + +	//swapping descriptions +	closer_to_body ? --it : ++it; +	LLViewerInventoryItem* swap_item = *it; +	if (!swap_item) return false; +	std::string tmp = swap_item->LLInventoryItem::getDescription(); +	swap_item->setDescription(item->LLInventoryItem::getDescription()); +	item->setDescription(tmp); + + +	//items need to be updated on a dataserver +	item->setComplete(TRUE); +	item->updateServer(FALSE); +	gInventory.updateItem(item); + +	swap_item->setComplete(TRUE); +	swap_item->updateServer(FALSE); +	gInventory.updateItem(swap_item); + +	//to cause appearance of the agent to be updated +	bool result = false; +	if (result = gAgentWearables.moveWearable(item, closer_to_body)) +	{ +		gAgentAvatarp->wearableUpdated(item->getWearableType(), TRUE); +	} + +	setOutfitDirty(true); + +	//*TODO do we need to notify observers here in such a way? +	gInventory.notifyObservers(); + +	return result; +} + +  //#define DUMP_CAT_VERBOSE  void LLAppearanceMgr::dumpCat(const LLUUID& cat_id, const std::string& msg) diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 7e35919892..a308a3efa9 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -138,12 +138,25 @@ public:  	//Remove clothing or detach an object from the agent (a bodypart cannot be removed)  	void removeItemFromAvatar(const LLUUID& item_id); + +	LLUUID makeNewOutfitLinks(const std::string& new_folder_name); + +	bool moveWearable(LLViewerInventoryItem* item, bool closer_to_body); +  protected:  	LLAppearanceMgr();  	~LLAppearanceMgr();  private: +	typedef std::vector<LLInventoryModel::item_array_t> wearables_by_type_t; + +	//Divvy items into arrays by wearable type +	static void divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type); + +	//Check ordering information on wearables stored in links' descriptions and update if it is invalid +	void updateClothingOrderingInfo(); +  	void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);  	void getDescendentsOfAssetType(const LLUUID& category,  diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 80d9b14345..44ef39fb7d 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -291,6 +291,7 @@ static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef,  		if(os_result >= 0 && matching_psn)  		{  			sCrashReporterIsRunning = false; +			QuitApplicationEventLoop();  		}      }      return noErr; @@ -326,7 +327,7 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)  			// *NOTE:Mani A better way - make a copy of the data that the crash reporter will send  			// and let SL go about its business. This way makes the mac work like windows and linux  			// and is the smallest patch for the issue.  -			sCrashReporterIsRunning = true; +			sCrashReporterIsRunning = false;  			ProcessSerialNumber o_psn;  			static EventHandlerRef sCarbonEventsRef = NULL; @@ -356,15 +357,13 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)  			if(os_result >= 0)  			{	 -				EventRecord evt; -				while(sCrashReporterIsRunning) -				{ -					while(WaitNextEvent(osMask, &evt, 0, NULL)) -					{ -						// null op!?! -					} -				} -			}	 +				sCrashReporterIsRunning = true; +			} + +			while(sCrashReporterIsRunning) +			{ +				RunApplicationEventLoop(); +			}  			// Re-install the apps quit handler.  			AEInstallEventHandler(kCoreEventClass,  @@ -453,16 +452,17 @@ std::string LLAppViewerMacOSX::generateSerialNumber()  static AudioDeviceID get_default_audio_output_device(void)  {  	AudioDeviceID device = 0; -	UInt32 size; -	OSStatus err; -	 -	size = sizeof(device); -	err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &device); +	UInt32 size = sizeof(device); +	AudioObjectPropertyAddress device_address = { kAudioHardwarePropertyDefaultOutputDevice, +												  kAudioObjectPropertyScopeGlobal, +												  kAudioObjectPropertyElementMaster }; + +	OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &device_address, 0, NULL, &size, &device);  	if(err != noErr)  	{  		LL_DEBUGS("SystemMute") << "Couldn't get default audio output device (0x" << std::hex << err << ")" << LL_ENDL;  	} -	 +  	return device;  } @@ -470,11 +470,15 @@ static AudioDeviceID get_default_audio_output_device(void)  void LLAppViewerMacOSX::setMasterSystemAudioMute(bool new_mute)  {  	AudioDeviceID device = get_default_audio_output_device(); -	 +  	if(device != 0)  	{  		UInt32 mute = new_mute; -		OSStatus err = AudioDeviceSetProperty(device, NULL, 0, false, kAudioDevicePropertyMute, sizeof(mute), &mute); +		AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute, +													  kAudioDevicePropertyScopeOutput, +													  kAudioObjectPropertyElementMaster }; + +		OSStatus err = AudioObjectSetPropertyData(device, &device_address, 0, NULL, sizeof(mute), &mute);  		if(err != noErr)  		{  			LL_INFOS("SystemMute") << "Couldn't set audio mute property (0x" << std::hex << err << ")" << LL_ENDL; @@ -487,13 +491,17 @@ bool LLAppViewerMacOSX::getMasterSystemAudioMute()  {  	// Assume the system isn't muted   	UInt32 mute = 0; -	 +  	AudioDeviceID device = get_default_audio_output_device(); -	 +  	if(device != 0)  	{  		UInt32 size = sizeof(mute); -		OSStatus err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyMute, &size, &mute); +		AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute, +													  kAudioDevicePropertyScopeOutput, +													  kAudioObjectPropertyElementMaster }; + +		OSStatus err = AudioObjectGetPropertyData(device, &device_address, 0, NULL, &size, &mute);  		if(err != noErr)  		{  			LL_DEBUGS("SystemMute") << "Couldn't get audio mute property (0x" << std::hex << err << ")" << LL_ENDL; diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 8ba47b5198..dfb213716c 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -34,6 +34,7 @@  // common  #include "lltrans.h" +#include "llcommonutils.h"  #include "llavatarlist.h"  #include "llagentdata.h" // for comparator @@ -176,13 +177,15 @@ void LLAvatarList::clear()  void LLAvatarList::setNameFilter(const std::string& filter)  { -	if (mNameFilter != filter) +	std::string filter_upper = filter; +	LLStringUtil::toUpper(filter_upper); +	if (mNameFilter != filter_upper)  	{ -		mNameFilter = filter; +		mNameFilter = filter_upper;  		// update message for empty state here instead of refresh() to avoid blinking when switch  		// between tabs. -		updateNoItemsMessage(!mNameFilter.empty()); +		updateNoItemsMessage(filter);  		setDirty();  	}  } @@ -404,7 +407,6 @@ void LLAvatarList::computeDifference(  	uuid_vec_t& vremoved)  {  	uuid_vec_t vcur; -	uuid_vec_t vnew = vnew_unsorted;  	// Convert LLSDs to LLUUIDs.  	{ @@ -415,21 +417,7 @@ void LLAvatarList::computeDifference(  			vcur.push_back(vcur_values[i].asUUID());  	} -	std::sort(vcur.begin(), vcur.end()); -	std::sort(vnew.begin(), vnew.end()); - -	uuid_vec_t::iterator it; -	size_t maxsize = llmax(vcur.size(), vnew.size()); -	vadded.resize(maxsize); -	vremoved.resize(maxsize); - -	// what to remove -	it = set_difference(vcur.begin(), vcur.end(), vnew.begin(), vnew.end(), vremoved.begin()); -	vremoved.erase(it, vremoved.end()); - -	// what to add -	it = set_difference(vnew.begin(), vnew.end(), vcur.begin(), vcur.end(), vadded.begin()); -	vadded.erase(it, vadded.end()); +	LLCommonUtils::computeDifference(vnew_unsorted, vcur, vadded, vremoved);  }  // Refresh shown time of our last interaction with all listed avatars. diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index 769387c26c..4f9434030f 100644 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -35,6 +35,7 @@  #include "llchannelmanager.h"  #include "llappviewer.h" +#include "llnotificationstorage.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h"  #include "llrootview.h" @@ -107,31 +108,35 @@ void LLChannelManager::onLoginCompleted()  	if(!away_notifications)  	{  		onStartUpToastClose(); -		return;  	} -	 -	// create a channel for the StartUp Toast -	LLChannelManager::Params p; -	p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID")); -	p.channel_align = CA_RIGHT; -	mStartUpChannel = createChannel(p); - -	if(!mStartUpChannel) +	else  	{ -		onStartUpToastClose(); -		return; -	} +		// create a channel for the StartUp Toast +		LLChannelManager::Params p; +		p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID")); +		p.channel_align = CA_RIGHT; +		mStartUpChannel = createChannel(p); -	gViewerWindow->getRootView()->addChild(mStartUpChannel); +		if(!mStartUpChannel) +		{ +			onStartUpToastClose(); +		} +		else +		{ +			gViewerWindow->getRootView()->addChild(mStartUpChannel); -	// init channel's position and size -	S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");  -	S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); -	mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); -	mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); +			// init channel's position and size +			S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");  +			S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); +			mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); +			mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); + +			mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); +			mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); +		} +	} -	mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); -	mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); +	LLPersistentNotificationStorage::getInstance()->loadNotifications();  }  //-------------------------------------------------------------------------- diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index aef36b677c..6ee14e8ba9 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -44,6 +44,8 @@  #include "llviewercontrol.h"  #include "llagentdata.h" +#include "llslurl.h" +  static const S32 msg_left_offset = 10;  static const S32 msg_right_offset = 10;  static const S32 msg_height_pad = 5; @@ -190,6 +192,8 @@ void LLNearbyChatToastPanel::init(LLSD& notification)  			style_params_name.font.name(font_name);  			style_params_name.font.size(font_style_size); +			style_params_name.link_href = LLSLURL::buildCommand("agent",mFromID,"about"); +  			msg_text->appendText(str_sender, FALSE, style_params_name);  		} diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h index 489c66be71..9d421b4f0b 100644 --- a/indra/newview/llchiclet.h +++ b/indra/newview/llchiclet.h @@ -921,6 +921,9 @@ protected:  class LLNotificationChiclet : public LLSysWellChiclet  {  	friend class LLUICtrlFactory; +public: +	struct Params : public LLInitParam::Block<Params, LLSysWellChiclet::Params>{}; +  protected:  	LLNotificationChiclet(const Params& p); diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp new file mode 100644 index 0000000000..f0442ee3f6 --- /dev/null +++ b/indra/newview/llcofwearables.cpp @@ -0,0 +1,153 @@ +/**  + * @file llcofwearables.cpp + * @brief LLCOFWearables displayes wearables from the current outfit split into three lists (attachments, clothing and body parts) + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + *  + * Copyright (c) 2010, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llcofwearables.h" + +#include "llappearancemgr.h" +#include "llinventory.h" +#include "llinventoryitemslist.h" +#include "llinventoryfunctions.h" + +static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearables"); + +const LLSD REARRANGE = LLSD().with("rearrange", LLSD()); + + +LLCOFWearables::LLCOFWearables() : LLPanel(), +	mAttachments(NULL), +	mClothing(NULL), +	mBodyParts(NULL), +	mLastSelectedList(NULL) +{ +}; + + +// virtual +BOOL LLCOFWearables::postBuild() +{ +	mAttachments = getChild<LLFlatListView>("list_attachments"); +	mClothing = getChild<LLFlatListView>("list_clothing"); +	mBodyParts = getChild<LLFlatListView>("list_body_parts"); + + +	//selection across different list/tabs is not supported +	mAttachments->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mAttachments)); +	mClothing->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mClothing)); +	mBodyParts->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mBodyParts)); +	 +	mAttachments->setCommitOnSelectionChange(true); +	mClothing->setCommitOnSelectionChange(true); +	mBodyParts->setCommitOnSelectionChange(true); + +	return LLPanel::postBuild(); +} + +void LLCOFWearables::onSelectionChange(LLFlatListView* selected_list) +{ +	if (!selected_list) return; + +	if (selected_list != mLastSelectedList) +	{ +		if (selected_list != mAttachments) mAttachments->resetSelection(true); +		if (selected_list != mClothing) mClothing->resetSelection(true); +		if (selected_list != mBodyParts) mBodyParts->resetSelection(true); + +		mLastSelectedList = selected_list; +	} + +	onCommit(); +} + +void LLCOFWearables::refresh() +{ +	clear(); + +	LLInventoryModel::cat_array_t cats; +	LLInventoryModel::item_array_t items; +	 +	gInventory.collectDescendents(LLAppearanceMgr::getInstance()->getCOF(), cats, items, LLInventoryModel::EXCLUDE_TRASH); +	if (items.empty()) return; + +	for (U32 i = 0; i < items.size(); ++i) +	{ +		LLViewerInventoryItem* item = items.get(i); +		if (!item) continue; + +		LLPanelInventoryListItem* item_panel = LLPanelInventoryListItem::createItemPanel(item); +		if (!item_panel) continue; + +		switch (item->getType()) +		{ +			case LLAssetType::AT_OBJECT: +				mAttachments->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false); +				break; + +			case LLAssetType::AT_BODYPART: +				mBodyParts->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false); +				break; + +			case LLAssetType::AT_CLOTHING: +				mClothing->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false); +				break; + +			default: break; +		} +	} + +	mAttachments->sort(); //*TODO by Name +	mAttachments->notify(REARRANGE); //notifying the parent about the list's size change (cause items were added with rearrange=false) +	 +	mClothing->sort(); //*TODO by actual inventory item description +	mClothing->notify(REARRANGE); +	 +	mBodyParts->sort(); //*TODO by name +	mBodyParts->notify(REARRANGE); +} + + +LLUUID LLCOFWearables::getSelectedUUID() +{ +	if (!mLastSelectedList) return LLUUID::null; +	 +	return mLastSelectedList->getSelectedUUID(); +} + +void LLCOFWearables::clear() +{ +	mAttachments->clear(); +	mClothing->clear(); +	mBodyParts->clear(); +} + +//EOF diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h new file mode 100644 index 0000000000..58d67ed32f --- /dev/null +++ b/indra/newview/llcofwearables.h @@ -0,0 +1,66 @@ +/**  + * @file llcofwearables.h + * @brief LLCOFWearables displayes wearables from the current outfit split into three lists (attachments, clothing and body parts) + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + *  + * Copyright (c) 2010, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLCOFWEARABLES_H +#define LL_LLCOFWEARABLES_H + +#include "llpanel.h" + +class LLFlatListView; + +class LLCOFWearables : public LLPanel +{ +public: +	LLCOFWearables(); +	virtual ~LLCOFWearables() {}; + +	/*virtual*/ BOOL postBuild(); +	 +	LLUUID getSelectedUUID(); + +	void refresh(); +	void clear(); + +protected: + +	void onSelectionChange(LLFlatListView* selected_list); + +	LLFlatListView* mAttachments; +	LLFlatListView* mClothing; +	LLFlatListView* mBodyParts; + +	LLFlatListView* mLastSelectedList; + +}; + + +#endif diff --git a/indra/newview/llfilteredwearablelist.cpp b/indra/newview/llfilteredwearablelist.cpp new file mode 100644 index 0000000000..01d3c3f22e --- /dev/null +++ b/indra/newview/llfilteredwearablelist.cpp @@ -0,0 +1,113 @@ +/** + * @file llfilteredwearablelist.cpp + * @brief Functionality for showing filtered wearable flat list + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llfilteredwearablelist.h" + +// newview +#include "llinventoryfunctions.h" +#include "llinventoryitemslist.h" +#include "llinventorymodel.h" + +class LLFindItemsByMask : public LLInventoryCollectFunctor +{ +public: +	LLFindItemsByMask(U64 mask) +		: mFilterMask(mask) +	{} + +	virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) +	{ +		if(item) +		{ +			if( mFilterMask & (1LL << item->getInventoryType()) ) +			{ +				return TRUE; +			} +		} +		return FALSE; +	} + +private: +	U64 mFilterMask; +}; + +////////////////////////////////////////////////////////////////////////// + +LLFilteredWearableListManager::LLFilteredWearableListManager(LLInventoryItemsList* list, U64 filter_mask) +: mWearableList(list) +, mFilterMask(filter_mask) +{ +	llassert(mWearableList); +	gInventory.addObserver(this); +	gInventory.fetchDescendentsOf(gInventory.getRootFolderID()); +} + +LLFilteredWearableListManager::~LLFilteredWearableListManager() +{ +	gInventory.removeObserver(this); +} + +void LLFilteredWearableListManager::changed(U32 mask) +{ +	if(!gInventory.isInventoryUsable()) +	{ +		return; +	} + +	populateList(); +} + +void LLFilteredWearableListManager::setFilterMask(U64 mask) +{ +	mFilterMask = mask; +	populateList(); +} + +void LLFilteredWearableListManager::populateList() +{ +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t item_array; +	LLFindItemsByMask collector(mFilterMask); + +	gInventory.collectDescendentsIf( +		gInventory.getRootFolderID(), +		cat_array, +		item_array, +		LLInventoryModel::EXCLUDE_TRASH, +		collector); + +	// Probably will also need to get items from Library (waiting for reply in EXT-6724). + +	mWearableList->refreshList(item_array); +} + +// EOF diff --git a/indra/newview/llfilteredwearablelist.h b/indra/newview/llfilteredwearablelist.h new file mode 100644 index 0000000000..3f42833bb4 --- /dev/null +++ b/indra/newview/llfilteredwearablelist.h @@ -0,0 +1,70 @@ +/** + * @file llfilteredwearablelist.h + * @brief Functionality for showing filtered wearable flat list + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLFILTEREDWEARABLELIST_H +#define LL_LLFILTEREDWEARABLELIST_H + +#include "llinventoryobserver.h" + +class LLInventoryItemsList; + +// Class that fills LLInventoryItemsList with filtered data. +class LLFilteredWearableListManager : public LLInventoryObserver +{ +	LOG_CLASS(LLFilteredWearableListManager); +public: + +	LLFilteredWearableListManager(LLInventoryItemsList* list, U64 filter_mask); +	~LLFilteredWearableListManager(); + +	/** LLInventoryObserver implementation +	 * +	 */ +	/*virtual*/ void changed(U32 mask); + +	/** +	 * Sets new filter and applies it immediately +	 */ +	void setFilterMask(U64 mask); + +	/** +	 * Populates wearable list with filtered data. +	 */ +	void populateList(); + +private: +	LLInventoryItemsList* mWearableList; +	U64 mFilterMask; +}; + +#endif //LL_LLFILTEREDWEARABLELIST_H + +// EOF diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index d37bc01885..76a61db5fd 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -54,6 +54,7 @@  #include "llstatusbar.h"  #include "lltextbox.h"  #include "lltexturectrl.h" +#include "lltrans.h"  #include "llviewchildren.h"  #include "llviewercontrol.h"  #include "lluictrlfactory.h" @@ -1172,13 +1173,13 @@ void LLFloaterBuyLandUI::refreshUI()  		if (!mParcelValid)  		{ -			message += getString("no_parcel_selected"); +			message += LLTrans::getString("sentences_separator") + getString("no_parcel_selected");  		}  		else if (mParcelBillableArea == mParcelActualArea)  		{  			LLStringUtil::format_map_t string_args;  			string_args["[AMOUNT]"] = llformat("%d ", mParcelActualArea); -			message += getString("parcel_meters", string_args); +			message += LLTrans::getString("sentences_separator") + getString("parcel_meters", string_args);  		}  		else  		{ @@ -1187,13 +1188,13 @@ void LLFloaterBuyLandUI::refreshUI()  			{	  				LLStringUtil::format_map_t string_args;  				string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea); -				message += getString("premium_land", string_args); +				message += LLTrans::getString("sentences_separator") + getString("premium_land", string_args);  			}  			else  			{  				LLStringUtil::format_map_t string_args;  				string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea); -				message += getString("discounted_land", string_args); +				message += LLTrans::getString("sentences_separator") + getString("discounted_land", string_args);  			}  		} diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index c492bfcef1..eba4cdfa31 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -946,7 +946,9 @@ void LLFolderView::draw()  		}  		else  		{ -			mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage()); +			LLStringUtil::format_map_t args; +			args["[SEARCH_TERM]"] = LLURI::escape(getFilter()->getFilterSubStringOrig()); +			mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage(), args);  			//font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL,  LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );  		}  		mStatusTextBox->setValue(mStatusText); diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index f21b6e1085..252c34cf9c 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -131,9 +131,15 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask)  void LLGroupList::setNameFilter(const std::string& filter)  { -	if (mNameFilter != filter) +	std::string filter_upper = filter; +	LLStringUtil::toUpper(filter_upper); +	if (mNameFilter != filter_upper)  	{ -		mNameFilter = filter; +		mNameFilter = filter_upper; + +		// set no items message depend on filter state +		updateNoItemsMessage(filter); +  		setDirty();  	}  } @@ -151,9 +157,6 @@ void LLGroupList::refresh()  	LLUUID				id;  	bool				have_filter		= !mNameFilter.empty(); -	// set no items message depend on filter state & total count of groups -	updateNoItemsMessage(have_filter); -  	clear();  	for(S32 i = 0; i < count; ++i) diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 909878207c..f03026715d 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -1767,6 +1767,8 @@ void LLOutgoingCallDialog::show(const LLSD& key)  			getChild<LLTextBox>("leaving")->setVisible(true);  		}  		break; +	// STATE_READY is here to show appropriate text for ad-hoc and group calls when floater is shown(EXT-6893) +	case LLVoiceChannel::STATE_READY :  	case LLVoiceChannel::STATE_RINGING :  		if(show_oldchannel)  		{ diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index b85bf0d518..b4a1bf2758 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2520,6 +2520,7 @@ void LLFolderBridge::pasteLinkFromClipboard()  						item->getLinkedUUID(),  						parent_id,  						item->getName(), +						item->getDescription(),  						LLAssetType::AT_LINK,  						LLPointer<LLInventoryCallback>(NULL));  				} @@ -3166,6 +3167,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  						inv_item->getLinkedUUID(),  						mUUID,  						inv_item->getName(), +						inv_item->getDescription(),  						LLAssetType::AT_LINK,  						cb);  				} diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 1a488175ac..901a570487 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -329,9 +329,10 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)  		// appending new characters  		const BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString); -		mFilterSubString = string; +		mFilterSubStringOrig = string; +		LLStringUtil::trimHead(mFilterSubStringOrig); +		mFilterSubString = mFilterSubStringOrig;  		LLStringUtil::toUpper(mFilterSubString); -		LLStringUtil::trimHead(mFilterSubString);  		if (less_restrictive)  		{  			setModified(FILTER_LESS_RESTRICTIVE); diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index b01554edc8..2376ba5d22 100644 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -84,6 +84,7 @@ public:  	void 				setFilterSubString(const std::string& string);  	const std::string& 	getFilterSubString(BOOL trim = FALSE) const; +	const std::string& 	getFilterSubStringOrig() const { return mFilterSubStringOrig; }   	BOOL 				hasFilterString() const;  	void 				setFilterPermissions(PermissionMask perms); @@ -181,6 +182,7 @@ private:  	std::string::size_type	mSubStringMatchOffset;  	std::string				mFilterSubString; +	std::string				mFilterSubStringOrig;  	const std::string		mName;  	S32						mFilterGeneration; diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp new file mode 100644 index 0000000000..dca130c672 --- /dev/null +++ b/indra/newview/llinventoryitemslist.cpp @@ -0,0 +1,237 @@ +/** + * @file llinventoryitemslist.cpp + * @brief A list of inventory items represented by LLFlatListView. + * + * Class LLInventoryItemsList implements a flat list of inventory items. + * Class LLPanelInventoryListItem displays inventory item as an element + * of LLInventoryItemsList. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llinventoryitemslist.h" + +// llcommon +#include "llcommonutils.h" + +#include "lliconctrl.h" + +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "lltextutil.h" + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +// static +LLPanelInventoryListItem* LLPanelInventoryListItem::createItemPanel(const LLViewerInventoryItem* item) +{ +	if (item) +	{ +		return new LLPanelInventoryListItem(item); +	} +	else +	{ +		return NULL; +	} +} + +LLPanelInventoryListItem::~LLPanelInventoryListItem() +{} + +//virtual +BOOL LLPanelInventoryListItem::postBuild() +{ +	mIcon = getChild<LLIconCtrl>("item_icon"); +	mTitle = getChild<LLTextBox>("item_name"); + +	updateItem(); + +	return TRUE; +} + +//virtual +void LLPanelInventoryListItem::setValue(const LLSD& value) +{ +	if (!value.isMap()) return; +	if (!value.has("selected")) return; +	childSetVisible("selected_icon", value["selected"]); +} + +void LLPanelInventoryListItem::updateItem() +{ +	if (mItemIcon.notNull()) +		mIcon->setImage(mItemIcon); + +	LLTextUtil::textboxSetHighlightedVal( +		mTitle, +		LLStyle::Params(), +		mItemName, +		mHighlightedText); +} + +void LLPanelInventoryListItem::onMouseEnter(S32 x, S32 y, MASK mask) +{ +	childSetVisible("hovered_icon", true); + +	LLPanel::onMouseEnter(x, y, mask); +} + +void LLPanelInventoryListItem::onMouseLeave(S32 x, S32 y, MASK mask) +{ +	childSetVisible("hovered_icon", false); + +	LLPanel::onMouseLeave(x, y, mask); +} + +LLPanelInventoryListItem::LLPanelInventoryListItem(const LLViewerInventoryItem* item) +:	 LLPanel() +	,mIcon(NULL) +	,mTitle(NULL) +{ +	mItemName = item->getName(); +	mItemIcon = get_item_icon(item->getType(), item->getInventoryType(), item->getFlags(), FALSE); + +	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory_item.xml"); +} + +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// + +LLInventoryItemsList::Params::Params() +{} + +LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p) +:	LLFlatListView(p) +,	mNeedsRefresh(false) +{ +	// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView +	// but reset to true in all derived classes. This settings might need to +	// be added to LLFlatListView::Params() and/or set to "true" by default. +	setCommitOnSelectionChange(true); +} + +// virtual +LLInventoryItemsList::~LLInventoryItemsList() +{} + +void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array) +{ +	getIDs().clear(); +	LLInventoryModel::item_array_t::const_iterator it = item_array.begin(); +	for( ; item_array.end() != it; ++it) +	{ +		getIDs().push_back((*it)->getUUID()); +	} +	mNeedsRefresh = true; +} + +void LLInventoryItemsList::draw() +{ +	LLFlatListView::draw(); +	if(mNeedsRefresh) +	{ +		refresh(); +	} +} + +void LLInventoryItemsList::refresh() +{ +	static const unsigned ADD_LIMIT = 50; + +	uuid_vec_t added_items; +	uuid_vec_t removed_items; + +	computeDifference(getIDs(), added_items, removed_items); + +	bool add_limit_exceeded = false; +	unsigned nadded = 0; + +	uuid_vec_t::const_iterator it = added_items.begin(); +	for( ; added_items.end() != it; ++it) +	{ +		if(nadded >= ADD_LIMIT) +		{ +			add_limit_exceeded = true; +			break; +		} +		LLViewerInventoryItem* item = gInventory.getItem(*it); +		addNewItem(item); +		++nadded; +	} + +	it = removed_items.begin(); +	for( ; removed_items.end() != it; ++it) +	{ +		removeItemByUUID(*it); +	} + +	bool needs_refresh = add_limit_exceeded; +	setNeedsRefresh(needs_refresh); +} + +void LLInventoryItemsList::computeDifference( +	const uuid_vec_t& vnew, +	uuid_vec_t& vadded, +	uuid_vec_t& vremoved) +{ +	uuid_vec_t vcur; +	{ +		std::vector<LLSD> vcur_values; +		getValues(vcur_values); + +		for (size_t i=0; i<vcur_values.size(); i++) +			vcur.push_back(vcur_values[i].asUUID()); +	} + +	LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved); +} + +void LLInventoryItemsList::addNewItem(LLViewerInventoryItem* item) +{ +	if (!item) +	{ +		llwarns << "No inventory item. Couldn't create flat list item." << llendl; +		llassert(!"No inventory item. Couldn't create flat list item."); +	} + +	LLPanelInventoryListItem *list_item = LLPanelInventoryListItem::createItemPanel(item); +	if (!list_item) +		return; + +	if (!addItem(list_item, item->getUUID())) +	{ +		llwarns << "Couldn't add flat list item." << llendl; +		llassert(!"Couldn't add flat list item."); +	} +} + +// EOF diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h new file mode 100644 index 0000000000..b496f4b9e9 --- /dev/null +++ b/indra/newview/llinventoryitemslist.h @@ -0,0 +1,128 @@ +/** + * @file llinventoryitemslist.h + * @brief A list of inventory items represented by LLFlatListView. + * + * Class LLInventoryItemsList implements a flat list of inventory items. + * Class LLPanelInventoryListItem displays inventory item as an element + * of LLInventoryItemsList. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLINVENTORYITEMSLIST_H +#define LL_LLINVENTORYITEMSLIST_H + +#include "lldarray.h" + +#include "llpanel.h" + +// newview +#include "llflatlistview.h" + +class LLIconCtrl; +class LLTextBox; +class LLViewerInventoryItem; + +class LLPanelInventoryListItem : public LLPanel +{ +public: +	static LLPanelInventoryListItem* createItemPanel(const LLViewerInventoryItem* item); + +	virtual ~LLPanelInventoryListItem(); + +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void setValue(const LLSD& value); + +	void updateItem(); + +	void onMouseEnter(S32 x, S32 y, MASK mask); +	void onMouseLeave(S32 x, S32 y, MASK mask); + +protected: +	LLPanelInventoryListItem(const LLViewerInventoryItem* item); + +private: +	LLIconCtrl*		mIcon; +	LLTextBox*		mTitle; + +	LLUIImagePtr	mItemIcon; +	std::string		mItemName; +	std::string		mHighlightedText; +}; + +class LLInventoryItemsList : public LLFlatListView +{ +public: +	struct Params : public LLInitParam::Block<Params, LLFlatListView::Params> +	{ +		Params(); +	}; + +	virtual ~LLInventoryItemsList(); + +	void refreshList(const LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array); + +	/** +	 * Let list know items need to be refreshed in next draw() +	 */ +	void setNeedsRefresh(bool needs_refresh){ mNeedsRefresh = needs_refresh; } + +	bool getNeedsRefresh(){ return mNeedsRefresh; } + +	/*virtual*/ void draw(); + +protected: +	friend class LLUICtrlFactory; +	LLInventoryItemsList(const LLInventoryItemsList::Params& p); + +	uuid_vec_t& getIDs() { return mIDs; } + +	/** +	 * Refreshes list items, adds new items and removes deleted items.  +	 * Called from draw() until all new items are added, , +	 * maximum 50 items can be added during single call. +	 */ +	void refresh(); + +	/** +	 * Compute difference between new items and current items, fills 'vadded' with added items, +	 * 'vremoved' with removed items. See LLCommonUtils::computeDifference +	 */ +	void computeDifference(const uuid_vec_t& vnew, uuid_vec_t& vadded, uuid_vec_t& vremoved); + +	/** +	 * Add an item to the list +	 */ +	void addNewItem(LLViewerInventoryItem* item); + +private: +	uuid_vec_t mIDs; // IDs of items that were added in refreshList(). +					 // Will be used in refresh() to determine added and removed ids +	bool mNeedsRefresh; +}; + +#endif //LL_LLINVENTORYITEMSLIST_H diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 29d99d328a..214b5d317a 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -650,3 +650,53 @@ void LLInventoryTransactionObserver::changed(U32 mask)  		}  	}  } + +void LLInventoryCategoriesObserver::changed(U32 mask) +{ +	if (!mCategoryMap.size()) +		return; + +	for (category_map_t::iterator iter = mCategoryMap.begin(); +		 iter != mCategoryMap.end(); +		 ++iter) +	{ +		LLViewerInventoryCategory* category = gInventory.getCategory((*iter).first); +		if (!category) +			continue; + +		S32 version = category->getVersion(); +		if (version != (*iter).second.mVersion) +		{ +			// Update category version in map. +			(*iter).second.mVersion = version; +			(*iter).second.mCallback(); +		} +	} +} + +void LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t cb) +{ +	S32 version; +	LLViewerInventoryCategory* category = gInventory.getCategory(cat_id); +	if (category) +	{ +		// Inventory category version is used to find out if some changes +		// to a category have been made. +		version = category->getVersion(); +	} +	else +	{ +		// If category could not be retrieved it might mean that +		// inventory is unusable at the moment so the category is +		// stored with VERSION_UNKNOWN and it may be updated later. +		version = LLViewerInventoryCategory::VERSION_UNKNOWN; +	} + +	version = category->getVersion(); +	mCategoryMap.insert(category_map_value_t(cat_id, LLCategoryData(cb, version))); +} + +void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id) +{ +	mCategoryMap.erase(cat_id); +} diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index 8d60df7e8d..e63b67d2ad 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -261,5 +261,40 @@ protected:  	uuid_vec_t mIncomplete;  }; -#endif // LL_LLINVENTORYOBSERVERS_H +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// Class LLInventoryCategoriesObserver +// +// This class is used for monitoring a list of inventory categories +// and firing a callback when there are changes in any of them. +// Categories are identified by their UUIDs. +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +class LLInventoryCategoriesObserver : public LLInventoryObserver +{ +public: +	typedef boost::function<void()> callback_t; + +	LLInventoryCategoriesObserver() {}; +	virtual void changed(U32 mask); + +	void addCategory(const LLUUID& cat_id, callback_t cb); +	void removeCategory(const LLUUID& cat_id); +protected: +	struct LLCategoryData +	{ +		LLCategoryData(callback_t cb, S32 version) +		: mCallback(cb) +		, mVersion(version) +		{} + +		callback_t	mCallback; +		S32			mVersion; +	}; + +	typedef	std::map<LLUUID, LLCategoryData>	category_map_t; +	typedef category_map_t::value_type			category_map_value_t; + +	category_map_t				mCategoryMap; +}; + +#endif // LL_LLINVENTORYOBSERVERS_H diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 4e0be81f62..7abb4f4f16 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -38,6 +38,7 @@  // common includes  #include "llbutton.h"  #include "llfocusmgr.h" +#include "llhelp.h"  #include "llmenugl.h"  #include "llparcel.h"  #include "llstring.h" @@ -177,6 +178,7 @@ static LLDefaultChildRegistry::Register<LLLocationInputCtrl> r("location_input")  LLLocationInputCtrl::Params::Params()  :	icon_maturity_general("icon_maturity_general"),  	icon_maturity_adult("icon_maturity_adult"), +	icon_maturity_moderate("icon_maturity_moderate"),  	add_landmark_image_enabled("add_landmark_image_enabled"),  	add_landmark_image_disabled("add_landmark_image_disabled"),  	add_landmark_image_hover("add_landmark_image_hover"), @@ -186,14 +188,15 @@ LLLocationInputCtrl::Params::Params()  	add_landmark_button("add_landmark_button"),  	for_sale_button("for_sale_button"),  	info_button("info_button"), -	maturity_icon("maturity_icon"), +	maturity_button("maturity_button"),  	voice_icon("voice_icon"),  	fly_icon("fly_icon"),  	push_icon("push_icon"),  	build_icon("build_icon"),  	scripts_icon("scripts_icon"),  	damage_icon("damage_icon"), -	damage_text("damage_text") +	damage_text("damage_text"), +	maturity_help_topic("maturity_help_topic")  {  } @@ -208,7 +211,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)  	mLandmarkImageOn(NULL),  	mLandmarkImageOff(NULL),  	mIconMaturityGeneral(NULL), -	mIconMaturityAdult(NULL) +	mIconMaturityAdult(NULL), +	mIconMaturityModerate(NULL), +	mMaturityHelpTopic(p.maturity_help_topic)  {  	// Lets replace default LLLineEditor with LLLocationLineEditor  	// to make needed escaping while copying and cutting url @@ -276,10 +281,15 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)  	{  		mIconMaturityAdult = p.icon_maturity_adult;  	} +	if(p.icon_maturity_moderate()) +	{ +		mIconMaturityModerate = p.icon_maturity_moderate; +	} -	LLIconCtrl::Params maturity_icon = p.maturity_icon; -	mMaturityIcon = LLUICtrlFactory::create<LLIconCtrl>(maturity_icon); -	addChild(mMaturityIcon); +	LLButton::Params maturity_button = p.maturity_button; +	mMaturityButton = LLUICtrlFactory::create<LLButton>(maturity_button); +	addChild(mMaturityButton); +	mMaturityButton->setClickedCallback(boost::bind(&LLLocationInputCtrl::onMaturityButtonClicked, this));  	LLButton::Params for_sale_button = p.for_sale_button;  	for_sale_button.tool_tip = LLTrans::getString("LocationCtrlForSaleTooltip"); @@ -576,7 +586,7 @@ void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent  	if (isHumanReadableLocationVisible)  	{ -		refreshMaturityIcon(); +		refreshMaturityButton();  	}  } @@ -613,6 +623,11 @@ void LLLocationInputCtrl::onAgentParcelChange()  	refresh();  } +void LLLocationInputCtrl::onMaturityButtonClicked() +{ +	LLUI::sHelpImpl->showTopic(mMaturityHelpTopic); +} +  void LLLocationInputCtrl::onLandmarkLoaded(LLLandmark* lm)  {  	(void) lm; @@ -736,7 +751,7 @@ void LLLocationInputCtrl::refreshLocation()  	setText(location_name);  	isHumanReadableLocationVisible = true; -	refreshMaturityIcon(); +	refreshMaturityButton();  }  // returns new right edge @@ -852,37 +867,54 @@ void LLLocationInputCtrl::refreshHealth()  	}  } -void LLLocationInputCtrl::refreshMaturityIcon() +void LLLocationInputCtrl::refreshMaturityButton()  {  	// Updating maturity rating icon.  	LLViewerRegion* region = gAgent.getRegion();  	if (!region)  		return; +	bool button_visible = true; +	LLPointer<LLUIImage> rating_image = NULL; +	std::string rating_tooltip; +  	U8 sim_access = region->getSimAccess();  	switch(sim_access)  	{  	case SIM_ACCESS_PG: -		mMaturityIcon->setValue(mIconMaturityGeneral->getName()); -		mMaturityIcon->setVisible(TRUE); +		rating_image = mIconMaturityGeneral; +		rating_tooltip = LLTrans::getString("LocationCtrlGeneralIconTooltip");  		break;  	case SIM_ACCESS_ADULT: -		mMaturityIcon->setValue(mIconMaturityAdult->getName()); -		mMaturityIcon->setVisible(TRUE); +		rating_image = mIconMaturityAdult; +		rating_tooltip = LLTrans::getString("LocationCtrlAdultIconTooltip"); +		break; + +	case SIM_ACCESS_MATURE: +		rating_image = mIconMaturityModerate; +		rating_tooltip = LLTrans::getString("LocationCtrlModerateIconTooltip");  		break;  	default: -		mMaturityIcon->setVisible(FALSE); +		button_visible = false; +		break;  	} -	if (mMaturityIcon->getVisible()) +	mMaturityButton->setVisible(button_visible); +	mMaturityButton->setToolTip(rating_tooltip); +	if(rating_image) +	{ +		mMaturityButton->setImageUnselected(rating_image); +		mMaturityButton->setImagePressed(rating_image); +	} +	if (mMaturityButton->getVisible())  	{ -		positionMaturityIcon(); +		positionMaturityButton();  	}  } -void LLLocationInputCtrl::positionMaturityIcon() +void LLLocationInputCtrl::positionMaturityButton()  {  	const LLFontGL* font = mTextEntry->getFont();  	if (!font) @@ -894,11 +926,11 @@ void LLLocationInputCtrl::positionMaturityIcon()  	// Calculate the right edge of rendered text + a whitespace.  	left_pad = left_pad + font->getWidth(mTextEntry->getText()) + font->getWidth(" "); -	LLRect rect = mMaturityIcon->getRect(); -	mMaturityIcon->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight())); +	LLRect rect = mMaturityButton->getRect(); +	mMaturityButton->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));  	// Hide icon if it text area is not width enough to display it, show otherwise. -	mMaturityIcon->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad); +	mMaturityButton->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad);  }  void LLLocationInputCtrl::rebuildLocationHistory(const std::string& filter) @@ -1014,7 +1046,7 @@ void LLLocationInputCtrl::changeLocationPresentation()  		mTextEntry->setText(LLAgentUI::buildSLURL(false));  		mTextEntry->selectAll(); -		mMaturityIcon->setVisible(FALSE); +		mMaturityButton->setVisible(FALSE);  		isHumanReadableLocationVisible = false;  	} diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index f790140f07..fc7adf60b0 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -66,17 +66,19 @@ public:  	{  		Optional<LLUIImage*>				icon_maturity_general,  											icon_maturity_adult, +											icon_maturity_moderate,  											add_landmark_image_enabled,  											add_landmark_image_disabled,  											add_landmark_image_hover,  											add_landmark_image_selected; +		Optional<std::string>				maturity_help_topic;  		Optional<S32>						icon_hpad,  											add_landmark_hpad; -		Optional<LLButton::Params>			add_landmark_button, +		Optional<LLButton::Params>			maturity_button, +											add_landmark_button,  											for_sale_button,  											info_button; -		Optional<LLIconCtrl::Params>		maturity_icon, -											voice_icon, +		Optional<LLIconCtrl::Params>		voice_icon,  											fly_icon,  											push_icon,  											build_icon, @@ -136,8 +138,8 @@ private:  	void					refreshParcelIcons();  	// Refresh the value in the health percentage text field  	void					refreshHealth(); -	void					refreshMaturityIcon(); -	void					positionMaturityIcon(); +	void					refreshMaturityButton(); +	void					positionMaturityButton();  	void					rebuildLocationHistory(const std::string& filter = LLStringUtil::null);  	bool 					findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter); @@ -156,6 +158,7 @@ private:  	void					onForSaleButtonClicked();  	void					onAddLandmarkButtonClicked();  	void					onAgentParcelChange(); +	void					onMaturityButtonClicked();  	// callbacks  	bool					onLocationContextMenuItemEnabled(const LLSD& userdata);  	void 					onLocationContextMenuItemClicked(const LLSD& userdata); @@ -168,7 +171,7 @@ private:  	S32						mIconHPad;			// pad between all icons  	S32						mAddLandmarkHPad;	// pad to left of landmark star -	LLIconCtrl*	mMaturityIcon; +	LLButton*	mMaturityButton;  	LLIconCtrl*	mParcelIcon[ICON_COUNT];  	LLTextBox* mDamageText; @@ -182,14 +185,16 @@ private:  	boost::signals2::connection	mLocationHistoryConnection;  	LLUIImage* mLandmarkImageOn;  	LLUIImage* mLandmarkImageOff; -	LLUIImage* mIconMaturityGeneral; -	LLUIImage* mIconMaturityAdult; +	LLPointer<LLUIImage> mIconMaturityGeneral; +	LLPointer<LLUIImage> mIconMaturityAdult; +	LLPointer<LLUIImage> mIconMaturityModerate;  	std::string mAddLandmarkTooltip;  	std::string mEditLandmarkTooltip;  	// this field holds a human-readable form of the location string, it is needed to be able to compare copy-pated value and real location  	std::string mHumanReadableLocation;  	bool isHumanReadableLocationVisible; +	std::string mMaturityHelpTopic;  };  #endif diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index 9611c286eb..d605d4430e 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -81,7 +81,7 @@ void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,  	item.enabled = enabled;  	item.target = INDIVIDUAL; -	addNameItemRow(item, pos); +	addNameItemRow(item, pos, suffix);  }  // virtual, public diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index e11df06d86..0341f2c693 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -375,7 +375,6 @@ void LLNavigationBar::draw()  	if(mPurgeTPHistoryItems)  	{  		LLTeleportHistory::getInstance()->purgeItems(); -		onTeleportHistoryChanged();  		mPurgeTPHistoryItems = false;  	} diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index 3d7f3233ac..eb53d295b2 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -46,10 +46,6 @@ class LLImageRaw;  class LLTextBox;  class LLViewerTexture; -const F32 MAP_SCALE_MIN = 64.f; -const F32 MAP_SCALE_MID = 172.f; -const F32 MAP_SCALE_MAX = 512.f; -  class LLNetMap : public LLUICtrl  {  public: diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp new file mode 100644 index 0000000000..316ff4324c --- /dev/null +++ b/indra/newview/llnotificationstorage.cpp @@ -0,0 +1,228 @@ +/** +* @file llnotificationstorage.cpp +* @brief LLPersistentNotificationStorage class implementation +* +* $LicenseInfo:firstyear=2010&license=viewergpl$ +* +* Copyright (c) 2010, Linden Research, Inc. +* +* Second Life Viewer Source Code +* The source code in this file ("Source Code") is provided by Linden Lab +* to you under the terms of the GNU General Public License, version 2.0 +* ("GPL"), unless you have obtained a separate licensing agreement +* ("Other License"), formally executed by you and Linden Lab.  Terms of +* the GPL can be found in doc/GPL-license.txt in this distribution, or +* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +* +* There are special exceptions to the terms and conditions of the GPL as +* it is applied to this Source Code. View the full text of the exception +* in the file doc/FLOSS-exception.txt in this software distribution, or +* online at +* http://secondlifegrid.net/programs/open_source/licensing/flossexception +* +* By copying, modifying or distributing this software, you acknowledge +* that you have read and understood your obligations described above, +* and agree to abide by those obligations. +* +* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +* COMPLETENESS OR PERFORMANCE. +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" // must be first include +#include "llnotificationstorage.h" + +#include "llxmlnode.h" // for linux compilers + +#include "llchannelmanager.h" +#include "llscreenchannel.h" +#include "llscriptfloater.h" +#include "llsdserialize.h" +#include "llviewermessage.h" + +////////////////////////////////////////////////////////////////////////// + +class LLResponderRegistry +{ +public: + +	static void registerResponders(); + +	static LLNotificationResponderInterface* createResponder(const std::string& notification_name, const LLSD& params); + +private: + +	template<typename RESPONDER_TYPE> +	static LLNotificationResponderInterface* create(const LLSD& params) +	{ +		RESPONDER_TYPE* responder = new RESPONDER_TYPE(); +		responder->fromLLSD(params); +		return responder; +	} + +	typedef boost::function<LLNotificationResponderInterface* (const LLSD& params)> responder_constructor_t; + +	static void add(const std::string& notification_name, const responder_constructor_t& ctr); + +private: + +	typedef std::map<std::string, responder_constructor_t> build_map_t; + +	static build_map_t sBuildMap; +}; + +////////////////////////////////////////////////////////////////////////// + +LLPersistentNotificationStorage::LLPersistentNotificationStorage() +{ +	mFileName = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml" ); +} + +bool LLPersistentNotificationStorage::onPersistentChannelChanged(const LLSD& payload) +{ +	// we ignore "load" messages, but rewrite the persistence file on any other +	const std::string sigtype = payload["sigtype"].asString(); +	if ("load" != sigtype) +	{ +		saveNotifications(); +	} +	return false; +} + +void LLPersistentNotificationStorage::saveNotifications() +{ +	// TODO - think about save optimization. + +	llofstream notify_file(mFileName.c_str()); +	if (!notify_file.is_open()) +	{ +		llwarns << "Failed to open " << mFileName << llendl; +		return; +	} + +	LLSD output; +	LLSD& data = output["data"]; + +	LLNotificationChannelPtr history_channel = LLNotifications::instance().getChannel("Persistent"); +	LLNotificationSet::iterator it = history_channel->begin(); + +	for ( ; history_channel->end() != it; ++it) +	{ +		LLNotificationPtr notification = *it; + +		// After a notification was placed in Persist channel, it can become +		// responded, expired - in this case we are should not save it +		if(notification->isRespondedTo() +			|| notification->isExpired()) +		{ +			continue; +		} + +		data.append(notification->asLLSD()); +	} + +	LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter(); +	formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY); +} + +void LLPersistentNotificationStorage::loadNotifications() +{ +	LLResponderRegistry::registerResponders(); + +	LLNotifications::instance().getChannel("Persistent")-> +		connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1)); + +	llifstream notify_file(mFileName.c_str()); +	if (!notify_file.is_open()) +	{ +		llwarns << "Failed to open " << mFileName << llendl; +		return; +	} + +	LLSD input; +	LLPointer<LLSDParser> parser = new LLSDXMLParser(); +	if (parser->parse(notify_file, input, LLSDSerialize::SIZE_UNLIMITED) < 0) +	{ +		llwarns << "Failed to parse open notifications" << llendl; +		return; +	} + +	if (input.isUndefined()) +	{ +		return; +	} + +	LLSD& data = input["data"]; +	if (data.isUndefined()) +	{ +		return; +	} + +	using namespace LLNotificationsUI; +	LLScreenChannel* notification_channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()-> +		findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); + +	LLNotifications& instance = LLNotifications::instance(); + +	for (LLSD::array_const_iterator notification_it = data.beginArray(); +		notification_it != data.endArray(); +		++notification_it) +	{ +		LLSD notification_params = *notification_it; +		LLNotificationPtr notification(new LLNotification(notification_params)); + +		LLNotificationResponderPtr responder(LLResponderRegistry:: +			createResponder(notification_params["name"], notification_params["responder"])); +		notification->setResponseFunctor(responder); + +		instance.add(notification); + +		// hide script floaters so they don't confuse the user and don't overlap startup toast +		LLScriptFloaterManager::getInstance()->setFloaterVisible(notification->getID(), false); + +		if(notification_channel) +		{ +			// hide saved toasts so they don't confuse the user +			notification_channel->hideToast(notification->getID()); +		} +	} +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +LLResponderRegistry::build_map_t LLResponderRegistry::sBuildMap; + +void LLResponderRegistry::registerResponders() +{ +	sBuildMap.clear(); + +	add("ObjectGiveItem", &create<LLOfferInfo>); +	add("UserGiveItem", &create<LLOfferInfo>); +} + +LLNotificationResponderInterface* LLResponderRegistry::createResponder(const std::string& notification_name, const LLSD& params) +{ +	build_map_t::const_iterator it = sBuildMap.find(notification_name); +	if(sBuildMap.end() == it) +	{ +		llwarns << "Responder for notification \'" << notification_name << "\' is not registered" << llendl; +		return NULL; +	} +	responder_constructor_t ctr = it->second; +	return ctr(params); +} + +void LLResponderRegistry::add(const std::string& notification_name, const responder_constructor_t& ctr) +{ +	if(sBuildMap.find(notification_name) != sBuildMap.end()) +	{ +		llwarns << "Responder is already registered : " << notification_name << llendl; +		llassert(!"Responder already registered"); +	} +	sBuildMap[notification_name] = ctr; +} + +// EOF diff --git a/indra/newview/llnotificationstorage.h b/indra/newview/llnotificationstorage.h new file mode 100644 index 0000000000..5050781a85 --- /dev/null +++ b/indra/newview/llnotificationstorage.h @@ -0,0 +1,65 @@ +/** +* @file llnotificationstorage.h +* @brief LLNotificationStorage class declaration +* +* $LicenseInfo:firstyear=2010&license=viewergpl$ +* +* Copyright (c) 2010, Linden Research, Inc. +* +* Second Life Viewer Source Code +* The source code in this file ("Source Code") is provided by Linden Lab +* to you under the terms of the GNU General Public License, version 2.0 +* ("GPL"), unless you have obtained a separate licensing agreement +* ("Other License"), formally executed by you and Linden Lab.  Terms of +* the GPL can be found in doc/GPL-license.txt in this distribution, or +* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +* +* There are special exceptions to the terms and conditions of the GPL as +* it is applied to this Source Code. View the full text of the exception +* in the file doc/FLOSS-exception.txt in this software distribution, or +* online at +* http://secondlifegrid.net/programs/open_source/licensing/flossexception +* +* By copying, modifying or distributing this software, you acknowledge +* that you have read and understood your obligations described above, +* and agree to abide by those obligations. +* +* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +* COMPLETENESS OR PERFORMANCE. +* $/LicenseInfo$ +*/ + +#ifndef LL_NOTIFICATIONSTORAGE_H +#define LL_NOTIFICATIONSTORAGE_H + +#include "llnotifications.h" + +// Class that saves not responded(unread) notifications. +// Unread notifications are saved in open_notifications.xml in SL account folder +// +// Notifications that should be saved(if unread) are marked with persist="true" in notifications.xml +// Notifications using functor responders are saved automatically (see llviewermessage.cpp +// lure_callback_reg for example). +// Notifications using object responders(LLOfferInfo) need additional tuning. Responder object should +// be a) serializable(implement LLNotificationResponderInterface), +// b) registered with LLResponderRegistry (found in llnotificationstorage.cpp). +class LLPersistentNotificationStorage : public LLSingleton<LLPersistentNotificationStorage> +{ +	LOG_CLASS(LLPersistentNotificationStorage); +public: + +	LLPersistentNotificationStorage(); + +	void saveNotifications(); + +	void loadNotifications(); + +private: + +	bool onPersistentChannelChanged(const LLSD& payload); + +	std::string mFileName; +}; + +#endif // LL_NOTIFICATIONSTORAGE_H diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index e528f871af..df6f04b6ea 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -45,38 +45,6 @@  using namespace LLNotificationsUI; -class LLOnlineStatusToast : public LLPanelTipToast -{ -public: - -	struct Params -	{ -		LLNotificationPtr	notification; -		LLUUID				avatar_id; -		std::string			message; - -		Params() {} -	}; - -	LLOnlineStatusToast(Params& p) : LLPanelTipToast(p.notification) -	{ -		LLUICtrlFactory::getInstance()->buildPanel(this, "panel_online_status_toast.xml"); - -		childSetValue("avatar_icon", p.avatar_id); -		childSetValue("message", p.message); - -		if (p.notification->getPayload().has("respond_on_mousedown")  -			&& p.notification->getPayload()["respond_on_mousedown"] ) -		{ -			setMouseDownCallback(boost::bind(&LLNotification::respond, p.notification,  -				p.notification->getResponseTemplate())); -		} - -		// set line max count to 3 in case of a very long name -		snapToMessageHeight(getChild<LLTextBox>("message"), 3); -	} -}; -  //--------------------------------------------------------------------------  LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id)  { @@ -157,28 +125,7 @@ bool LLTipHandler::processNotification(const LLSD& notify)  			return true;  		} -		LLToastPanel* notify_box = NULL; -		// TODO: this should be implemented in LLToastPanel::buidPanelFromNotification -		if("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName()) -		{ -			LLOnlineStatusToast::Params p; -			p.notification = notification; -			p.message = notification->getMessage(); -			p.avatar_id = notification->getPayload()["FROM_ID"]; -			notify_box = new LLOnlineStatusToast(p); -		} -		else -		{ -			notify_box = LLToastPanel::buidPanelFromNotification(notification); -		} - -		// TODO: this if statement should be removed  after modification of -		// LLToastPanel::buidPanelFromNotification() to allow create generic tip panel -		// for all tip notifications except FriendOnline and FriendOffline -		if (notify_box == NULL) -		{ -			notify_box = new LLToastNotifyPanel(notification); -		} +		LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification);  		LLToast::Params p;  		p.notif_id = notification->getID(); diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp new file mode 100644 index 0000000000..1215272685 --- /dev/null +++ b/indra/newview/lloutfitslist.cpp @@ -0,0 +1,286 @@ +/** + * @file lloutfitslist.cpp + * @brief List of agent's outfits for My Appearance side panel. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "lloutfitslist.h" + +// llcommon +#include "llcommonutils.h" + +// llcommon +#include "llcommonutils.h" + +#include "llaccordionctrl.h" +#include "llaccordionctrltab.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "llwearableitemslist.h" + +static LLRegisterPanelClassWrapper<LLOutfitsList> t_outfits_list("outfits_list"); + +LLOutfitsList::LLOutfitsList() +	:	LLPanel() +	,	mAccordion(NULL) +	,	mListCommands(NULL) +{ +	mCategoriesObserver = new LLInventoryCategoriesObserver(); +	gInventory.addObserver(mCategoriesObserver); + +	gInventory.addObserver(this); +} + +LLOutfitsList::~LLOutfitsList() +{ +	if (gInventory.containsObserver(mCategoriesObserver)) +	{ +		gInventory.removeObserver(mCategoriesObserver); +		delete mCategoriesObserver; +	} + +	if (gInventory.containsObserver(this)) +	{ +		gInventory.removeObserver(this); +	} +} + +BOOL LLOutfitsList::postBuild() +{ +	mAccordion = getChild<LLAccordionCtrl>("outfits_accordion"); + +	return TRUE; +} + +//virtual +void LLOutfitsList::changed(U32 mask) +{ +	if (!gInventory.isInventoryUsable()) +		return; + +	const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); +	LLViewerInventoryCategory* category = gInventory.getCategory(outfits); +	if (!category) +		return; + +	// Start observing changes in "My Outfits" category. +	mCategoriesObserver->addCategory(outfits, +			boost::bind(&LLOutfitsList::refreshList, this, outfits)); + +	// Fetch "My Outfits" contents and refresh the list to display +	// initially fetched items. If not all items are fetched now +	// the observer will refresh the list as soon as the new items +	// arrive. +	category->fetch(); +	refreshList(outfits); + +	// This observer is used to start the initial outfits fetch +	// when inventory becomes usable. It is no longer needed because +	// "My Outfits" category is now observed by +	// LLInventoryCategoriesObserver. +	gInventory.removeObserver(this); +} + +void LLOutfitsList::refreshList(const LLUUID& category_id) +{ +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t item_array; + +	// Collect all sub-categories of a given category. +	LLIsType is_category(LLAssetType::AT_CATEGORY); +	gInventory.collectDescendentsIf( +		category_id, +		cat_array, +		item_array, +		LLInventoryModel::EXCLUDE_TRASH, +		is_category); + +	uuid_vec_t vadded; +	uuid_vec_t vremoved; + +	// Create added and removed items vectors. +	computeDifference(cat_array, vadded, vremoved); + +	// Handle added tabs. +	for (uuid_vec_t::const_iterator iter = vadded.begin(); +		 iter != vadded.end(); +		 ++iter) +	{ +		const LLUUID cat_id = (*iter); +		LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id); +		if (!cat) +			continue; + +		std::string name = cat->getName(); + +		static LLXMLNodePtr accordionXmlNode = getAccordionTabXMLNode(); + +		accordionXmlNode->setAttributeString("name", name); +		accordionXmlNode->setAttributeString("title", name); +		LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL); + +		// *TODO: LLUICtrlFactory::defaultBuilder does not use "display_children" from xml. Should be investigated. +		tab->setDisplayChildren(false); +		mAccordion->addCollapsibleCtrl(tab); + +		// Map the new tab with outfit category UUID. +		mOutfitsMap.insert(LLOutfitsList::outfits_map_value_t(cat_id, tab)); + +		// Start observing the new outfit category. +		LLWearableItemsList* list  = tab->getChild<LLWearableItemsList>("wearable_items_list"); +		mCategoriesObserver->addCategory(cat_id, boost::bind(&LLWearableItemsList::updateList, list, cat_id)); + +		// Setting drop down callback to monitor currently selected outfit. +		tab->setDropDownStateChangedCallback(boost::bind(&LLOutfitsList::onTabExpandedCollapsed, this, list)); + +		// Fetch the new outfit contents. +		cat->fetch(); + +		// Refresh the list of outfit items after fetch(). +		// Further list updates will be triggered by the category observer. +		list->updateList(cat_id); +	} + +	// Handle removed tabs. +	for (uuid_vec_t::const_iterator iter=vremoved.begin(); iter != vremoved.end(); iter++) +	{ +		outfits_map_t::iterator outfits_iter = mOutfitsMap.find((*iter)); +		if (outfits_iter != mOutfitsMap.end()) +		{ +			// An outfit is removed from the list. Do the following: +			// 1. Remove outfit accordion tab from accordion. +			mAccordion->removeCollapsibleCtrl(outfits_iter->second); + +			// 2. Remove outfit category from observer to stop monitoring its changes. +			mCategoriesObserver->removeCategory(outfits_iter->first); + +			// 3. Remove category UUID to accordion tab mapping. +			mOutfitsMap.erase(outfits_iter); +		} +	} + +	// Get changed items from inventory model and update outfit tabs +	// which might have been renamed. +	const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs(); +	for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin(); +		 items_iter != changed_items.end(); +		 ++items_iter) +	{ +		updateOutfitTab(*items_iter); +	} + +	mAccordion->arrange(); +} + +void LLOutfitsList::updateOutfitTab(const LLUUID& category_id) +{ +	outfits_map_t::iterator outfits_iter = mOutfitsMap.find(category_id); +	if (outfits_iter != mOutfitsMap.end()) +	{ +		LLViewerInventoryCategory *cat = gInventory.getCategory(category_id); +		if (!cat) +			return; + +		std::string name = cat->getName(); + +		// Update tab name with the new category name. +		LLAccordionCtrlTab* tab = outfits_iter->second; +		if (tab) +		{ +			tab->setName(name); +		} + +		// Update tab title with the new category name using textbox +		// in accordion tab header. +		LLTextBox* tab_title = tab->findChild<LLTextBox>("dd_textbox"); +		if (tab_title) +		{ +			tab_title->setText(name); +		} +	} +} + +void LLOutfitsList::onTabExpandedCollapsed(LLWearableItemsList* list) +{ +	if (!list) +		return; + +	// TODO: Add outfit selection handling. +} + +void LLOutfitsList::setFilterSubString(const std::string& string) +{ +	mFilterSubString = string; +} + + +////////////////////////////////////////////////////////////////////////// +// Private methods +////////////////////////////////////////////////////////////////////////// +LLXMLNodePtr LLOutfitsList::getAccordionTabXMLNode() +{ +	LLXMLNodePtr xmlNode = NULL; +	bool success = LLUICtrlFactory::getLayeredXMLNode("outfit_accordion_tab.xml", xmlNode); +	if (!success) +	{ +		llwarns << "Failed to read xml of Outfit's Accordion Tab from outfit_accordion_tab.xml" << llendl; +		return NULL; +	} + +	return xmlNode; +} + +void LLOutfitsList::computeDifference( +	const LLInventoryModel::cat_array_t& vcats,  +	uuid_vec_t& vadded,  +	uuid_vec_t& vremoved) +{ +	uuid_vec_t vnew; +	// Creating a vector of newly collected sub-categories UUIDs. +	for (LLInventoryModel::cat_array_t::const_iterator iter = vcats.begin(); +		iter != vcats.end(); +		iter++) +	{ +		vnew.push_back((*iter)->getUUID()); +	} + +	uuid_vec_t vcur; +	// Creating a vector of currently displayed sub-categories UUIDs. +	for (outfits_map_t::const_iterator iter = mOutfitsMap.begin(); +		iter != mOutfitsMap.end(); +		iter++) +	{ +		vcur.push_back((*iter).first); +	} + +	LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved); +} + +// EOF diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h new file mode 100644 index 0000000000..2d103ea356 --- /dev/null +++ b/indra/newview/lloutfitslist.h @@ -0,0 +1,101 @@ +/** + * @file lloutfitslist.h + * @brief List of agent's outfits for My Appearance side panel. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLOUTFITSLIST_H +#define LL_LLOUTFITSLIST_H + +#include "llpanel.h" + +// newview +#include "llinventorymodel.h" +#include "llinventoryobserver.h" + +class LLAccordionCtrl; +class LLAccordionCtrlTab; +class LLWearableItemsList; + +/** + * @class LLOutfitsList + * + * A list of agents's outfits from "My Outfits" inventory category + * which displays each outfit in an accordion tab with a flat list + * of items inside it. + * Uses LLInventoryCategoriesObserver to monitor changes to "My Outfits" + * inventory category and refresh the outfits listed in it. + * This class is derived from LLInventoryObserver to know when inventory + * becomes usable and it is safe to request data from inventory model. + */ +class LLOutfitsList : public LLPanel, public LLInventoryObserver +{ +public: +	LLOutfitsList(); +	virtual ~LLOutfitsList(); + +	/*virtual*/ BOOL postBuild(); + +	/*virtual*/ void changed(U32 mask); + +	void refreshList(const LLUUID& category_id); + +	// Update tab displaying outfit identified by category_id. +	void updateOutfitTab(const LLUUID& category_id); + +	void onTabExpandedCollapsed(LLWearableItemsList* list); + +	void setFilterSubString(const std::string& string); + +private: +	/** +	 * Reads xml with accordion tab and Flat list from xml file. +	 * +	 * @return LLPointer to XMLNode with accordion tab and flat list. +	 */ +	LLXMLNodePtr getAccordionTabXMLNode(); + +	/** +	 * Wrapper for LLCommonUtils::computeDifference. @see LLCommonUtils::computeDifference +	 */ +	void computeDifference(const LLInventoryModel::cat_array_t& vcats, uuid_vec_t& vadded, uuid_vec_t& vremoved); + + +	LLInventoryCategoriesObserver* 	mCategoriesObserver; + +	LLAccordionCtrl*				mAccordion; +	LLPanel*						mListCommands; + +	std::string 					mFilterSubString; + +	typedef	std::map<LLUUID, LLAccordionCtrlTab*>		outfits_map_t; +	typedef outfits_map_t::value_type					outfits_map_value_t; +	outfits_map_t					mOutfitsMap; +}; + +#endif //LL_LLOUTFITSLIST_H diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h index 136868a60d..359f252383 100644 --- a/indra/newview/llpanelgroup.h +++ b/indra/newview/llpanelgroup.h @@ -37,7 +37,7 @@  #include "lltimer.h"  #include "llvoiceclient.h" -struct LLOfferInfo; +class LLOfferInfo;  const S32 UPDATE_MEMBERS_PER_FRAME = 500; diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index 9ac3a07041..65fe7165c2 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -236,6 +236,7 @@ public:  	std::string mCantViewParcelsText;  	std::string mCantViewAccountsText; +	std::string mEmptyParcelsText;  };  //******************************************* @@ -452,6 +453,7 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)  		// This power was removed to make group roles simpler  		//if ( !gAgent.hasPowerInGroup(mGroupID, GP_LAND_VIEW_OWNED) ) return;  		if (!gAgent.isInGroup(mPanel.mGroupID)) return; +		mGroupParcelsp->setCommentText(mEmptyParcelsText);  		std::string name;  		std::string desc; @@ -696,6 +698,7 @@ BOOL LLPanelGroupLandMoney::postBuild()  	mImplementationp->mCantViewParcelsText = getString("cant_view_group_land_text");  	mImplementationp->mCantViewAccountsText = getString("cant_view_group_accounting_text"); +	mImplementationp->mEmptyParcelsText = getString("epmty_view_group_land_text");  	if ( mImplementationp->mMapButtonp )  	{ diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 8da19d1574..230e484fad 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -517,6 +517,11 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)  	mNoticesList->setEnabled(TRUE); +	//save sort state and set unsorted state to prevent unnecessary  +	//sorting while adding notices +	bool save_sort = mNoticesList->isSorted(); +	mNoticesList->setNeedsSort(false); +  	for (;i<count;++i)  	{  		msg->getUUID("Data","NoticeID",id,i); @@ -527,6 +532,13 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)  			mNoticesList->setEnabled(FALSE);  			return;  		} + +		//with some network delays we can receive notice list more then once... +		//so add only unique notices +		S32 pos = mNoticesList->getItemIndex(id); + +		if(pos!=-1)//if items with this ID already in the list - skip it +			continue;  		msg->getString("Data","Subject",subj,i);  		msg->getString("Data","FromName",name,i); @@ -562,6 +574,7 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)  		mNoticesList->addElement(row, ADD_BOTTOM);  	} +	mNoticesList->setNeedsSort(save_sort);  	mNoticesList->updateSort();  } @@ -656,6 +669,9 @@ void LLPanelGroupNotices::setGroupID(const LLUUID& id)  	if(mViewMessage)   		mViewMessage->clear(); + +	if(mViewInventoryName) +		mViewInventoryName->clear();  	activate();  } diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 67d40a39b1..0a978d1b26 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -583,6 +583,7 @@ void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list  	if (!inventory_list->getFilter())  		return; +	inventory_list->getFilter()->setEmptyLookupMessage("PlacesNoMatchingItems");  	inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK);  	inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2)); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index ee4dcc44fe..529a368dc3 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -1007,7 +1007,7 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)  {  	if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)  	{ -		LLNotificationsUtil::add("CapsKeyOn"); +// *TODO: use another way to notify user about enabled caps lock, see EXT-6858  		sCapslockDidNotification = TRUE;  	}  } diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index 35acf8edcc..3f620869e0 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -63,7 +63,6 @@ BOOL LLPanelMe::postBuild()  	LLPanelProfile::postBuild();  	getTabContainer()[PANEL_PROFILE]->childSetAction("edit_profile_btn", boost::bind(&LLPanelMe::onEditProfileClicked, this), this); -	getTabContainer()[PANEL_PROFILE]->childSetAction("edit_appearance_btn", boost::bind(&LLPanelMe::onEditAppearanceClicked, this), this);  	return TRUE;  } @@ -141,14 +140,6 @@ void LLPanelMe::onEditProfileClicked()  	togglePanel(mEditPanel, getAvatarId()); // open  } -void LLPanelMe::onEditAppearanceClicked() -{ -	if (gAgentWearables.areWearablesLoaded()) -	{ -		gAgentCamera.changeCameraToCustomizeAvatar(); -	} -} -  void LLPanelMe::onSaveChangesClicked()  {  	LLAvatarData data = LLAvatarData(); diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h index 1325192bbf..f2b38de3d6 100644 --- a/indra/newview/llpanelme.h +++ b/indra/newview/llpanelme.h @@ -63,7 +63,6 @@ private:  	void buildEditPanel();  	void onEditProfileClicked(); -	void onEditAppearanceClicked();  	void onSaveChangesClicked();  	void onCancelClicked(); diff --git a/indra/newview/llpanelonlinestatus.cpp b/indra/newview/llpanelonlinestatus.cpp new file mode 100644 index 0000000000..6ba015b11c --- /dev/null +++ b/indra/newview/llpanelonlinestatus.cpp @@ -0,0 +1,60 @@ +/** + * @file llpanelonlinestatus.cpp + * @brief Represents a class of online status tip toast panels. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llnotifications.h" +#include "llpanelonlinestatus.h" + +LLPanelOnlineStatus::LLPanelOnlineStatus( +		const LLNotificationPtr& notification) : +	LLPanelTipToast(notification) +{ + +	LLUICtrlFactory::getInstance()->buildPanel(this, +			"panel_online_status_toast.xml"); + + +	childSetValue("avatar_icon", notification->getPayload()["FROM_ID"]); +	childSetValue("message", notification->getMessage()); + +	if (notification->getPayload().has("respond_on_mousedown") +			&& notification->getPayload()["respond_on_mousedown"]) +	{ +		setMouseDownCallback(boost::bind(&LLNotification::respond, +				notification, notification->getResponseTemplate())); +	} + +	// set line max count to 3 in case of a very long name +	snapToMessageHeight(getChild<LLTextBox> ("message"), 3); + +} diff --git a/indra/newview/llpanelonlinestatus.h b/indra/newview/llpanelonlinestatus.h new file mode 100644 index 0000000000..b47050c3a2 --- /dev/null +++ b/indra/newview/llpanelonlinestatus.h @@ -0,0 +1,53 @@ +/** + * @file llpanelonlinestatus.h + * @brief Represents a class of online status tip toast panels. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + + +#include "llpaneltiptoast.h" + +#ifndef LL_PANELONLINESTATUS_H +#define LL_PANELONLINESTATUS_H + +/** + * Represents online tip toast panel. + */ +class LLPanelOnlineStatus : public LLPanelTipToast +{ +	// disallow instantiation of this class +private: +	// grant privileges to instantiate this class to LLToastPanel +	friend class LLToastPanel; + +	LLPanelOnlineStatus(const LLNotificationPtr& notification); +	virtual ~LLPanelOnlineStatus() {} +}; + +#endif /* LL_PANELONLINESTATUS_H */ diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index ce17e1d624..dbccd243da 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -38,7 +38,10 @@  #include "llagent.h"  #include "llagentwearables.h"  #include "llappearancemgr.h" +#include "llcofwearables.h" +#include "llfilteredwearablelist.h"  #include "llinventory.h" +#include "llinventoryitemslist.h"  #include "llviewercontrol.h"  #include "llui.h"  #include "llfloater.h" @@ -71,6 +74,9 @@ const U64 WEARABLE_MASK = (1LL << LLInventoryType::IT_WEARABLE);  const U64 ATTACHMENT_MASK = (1LL << LLInventoryType::IT_ATTACHMENT) | (1LL << LLInventoryType::IT_OBJECT);  const U64 ALL_ITEMS_MASK = WEARABLE_MASK | ATTACHMENT_MASK; +static const std::string SAVE_BTN("save_btn"); +static const std::string REVERT_BTN("revert_btn"); +  class LLInventoryLookObserver : public LLInventoryObserver  {  public: @@ -116,9 +122,15 @@ private:  LLPanelOutfitEdit::LLPanelOutfitEdit() -:	LLPanel(), mCurrentOutfitID(), mFetchLook(NULL), mSearchFilter(NULL), -mLookContents(NULL), mInventoryItemsPanel(NULL), mAddToOutfitBtn(NULL), -mRemoveFromOutfitBtn(NULL), mLookObserver(NULL) +:	LLPanel(),  +	mCurrentOutfitID(), +	mFetchLook(NULL), +	mSearchFilter(NULL), +	mCOFWearables(NULL), +	mInventoryItemsPanel(NULL), +	mAddToOutfitBtn(NULL), +	mRemoveFromOutfitBtn(NULL), +	mLookObserver(NULL)  {  	mSavedFolderState = new LLSaveFolderState();  	mSavedFolderState->setApply(FALSE); @@ -164,10 +176,10 @@ BOOL LLPanelOutfitEdit::postBuild()  	childSetCommitCallback("add_btn", boost::bind(&LLPanelOutfitEdit::showAddWearablesPanel, this), NULL);  	childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL); +	childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showFilteredWearablesPanel, this), NULL); -	mLookContents = getChild<LLScrollListCtrl>("look_items_list"); -	mLookContents->sortByColumn("look_item_sort", TRUE); -	mLookContents->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onOutfitItemSelectionChange, this)); +	mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list"); +	mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onOutfitItemSelectionChange, this));  	mInventoryItemsPanel = getChild<LLInventoryPanel>("inventory_items");  	mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK); @@ -200,15 +212,6 @@ BOOL LLPanelOutfitEdit::postBuild()  	childSetAction("add_to_outfit_btn", boost::bind(&LLPanelOutfitEdit::onAddToOutfitClicked, this));  	childSetEnabled("add_to_outfit_btn", false); -	mUpBtn = getChild<LLButton>("up_btn"); -	mUpBtn->setEnabled(TRUE); -	mUpBtn->setClickedCallback(boost::bind(&LLPanelOutfitEdit::onUpClicked, this)); -	 -	//*TODO rename mLookContents to mOutfitContents -	mLookContents = getChild<LLScrollListCtrl>("look_items_list"); -	mLookContents->sortByColumn("look_item_sort", TRUE); -	mLookContents->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onOutfitItemSelectionChange, this)); -  	mRemoveFromOutfitBtn = getChild<LLButton>("remove_from_outfit_btn");  	mRemoveFromOutfitBtn->setEnabled(FALSE);  	mRemoveFromOutfitBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onRemoveFromOutfitClicked, this)); @@ -218,10 +221,9 @@ BOOL LLPanelOutfitEdit::postBuild()  	mEditWearableBtn->setVisible(FALSE);  	mEditWearableBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onEditWearableClicked, this)); -	childSetAction("revert_btn", boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance())); +	childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance())); -	childSetAction("save_btn", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false)); -	childSetAction("save_as_btn", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true)); +	childSetAction(SAVE_BTN, boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false));  	childSetAction("save_flyout_btn", boost::bind(&LLPanelOutfitEdit::showSaveMenu, this));  	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar save_registar; @@ -229,9 +231,27 @@ BOOL LLPanelOutfitEdit::postBuild()  	save_registar.add("Outfit.SaveAsNew.Action", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true));  	mSaveMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_save_outfit.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); +	mWearableListManager = new LLFilteredWearableListManager( +		getChild<LLInventoryItemsList>("filtered_wearables_list"), ALL_ITEMS_MASK); +		 +	childSetAction("move_closer_btn", boost::bind(&LLPanelOutfitEdit::moveWearable, this, true)); +	childSetAction("move_further_btn", boost::bind(&LLPanelOutfitEdit::moveWearable, this, false)); +  	return TRUE;  } +void LLPanelOutfitEdit::moveWearable(bool closer_to_body) +{ +	LLUUID item_id = mCOFWearables->getSelectedUUID(); +	if (item_id.isNull()) return; +	 +	LLViewerInventoryItem* wearable_to_move = gInventory.getItem(item_id); +	LLAppearanceMgr::getInstance()->moveWearable(wearable_to_move, closer_to_body); + +	//*TODO why not to listen to inventory? +	updateLookInfo(); +} +  void LLPanelOutfitEdit::showAddWearablesPanel()  {  	childSetVisible("add_wearables_panel", childGetValue("add_btn")); @@ -242,6 +262,11 @@ void LLPanelOutfitEdit::showWearablesFilter()  	childSetVisible("filter_combobox_panel", childGetValue("filter_button"));  } +void LLPanelOutfitEdit::showFilteredWearablesPanel() +{ +	childSetVisible("filtered_wearables_panel", !childIsVisible("filtered_wearables_panel")); +} +  void LLPanelOutfitEdit::saveOutfit(bool as_new)  {  	if (!as_new && LLAppearanceMgr::getInstance()->updateBaseOutfit()) @@ -256,6 +281,8 @@ void LLPanelOutfitEdit::saveOutfit(bool as_new)  	{  		panel_outfits_inventory->onSave();  	} + +	//*TODO how to get to know when base outfit is updated or new outfit is created?  }  void LLPanelOutfitEdit::showSaveMenu() @@ -275,6 +302,7 @@ void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl)  	{  		U32 curr_filter_type = type_filter->getCurrentIndex();  		mInventoryItemsPanel->setFilterTypes(mLookItemTypes[curr_filter_type].inventoryMask); +		mWearableListManager->setFilterMask(mLookItemTypes[curr_filter_type].inventoryMask);  	}  	mSavedFolderState->setApply(TRUE); @@ -346,7 +374,7 @@ void LLPanelOutfitEdit::onAddToOutfitClicked(void)  void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void)  { -	LLUUID id_to_remove = mLookContents->getSelectionInterface()->getCurrentID(); +	LLUUID id_to_remove = mCOFWearables->getSelectedUUID();  	LLAppearanceMgr::getInstance()->removeItemFromAvatar(id_to_remove); @@ -356,41 +384,9 @@ void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void)  } -void LLPanelOutfitEdit::onUpClicked(void) -{ -	LLUUID inv_id = mLookContents->getSelectionInterface()->getCurrentID(); -	if (inv_id.isNull()) -	{ -		//nothing selected, do nothing -		return; -	} - -	LLViewerInventoryItem *link_item = gInventory.getItem(inv_id); -	if (!link_item) -	{ -		llwarns << "could not find inventory item based on currently worn link." << llendl; -		return; -	} - - -	LLUUID asset_id = link_item->getAssetUUID(); -	if (asset_id.isNull()) -	{ -		llwarns << "inventory link has null Asset ID. could not get object reference" << llendl; -	} - -	static const std::string empty = ""; -	LLWearableList::instance().getAsset(asset_id, -										empty,	// don't care about wearable name -										link_item->getActualType(), -										LLSidepanelAppearance::editWearable, -										(void*)getParentUICtrl()); -} - -  void LLPanelOutfitEdit::onEditWearableClicked(void)  { -	LLUUID id_to_edit = mLookContents->getSelectionInterface()->getCurrentID(); +	LLUUID id_to_edit = mCOFWearables->getSelectedUUID();  	LLViewerInventoryItem * item_to_edit = gInventory.getItem(id_to_edit);  	if (item_to_edit) @@ -463,29 +459,11 @@ void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderView  void LLPanelOutfitEdit::onOutfitItemSelectionChange(void)  {	 -	LLScrollListItem* item = mLookContents->getLastSelectedItem(); -	if (!item) -		return; - -	LLRect item_rect; -	mLookContents->localRectToOtherView(item->getRect(), &item_rect, this); - -	// TODO button(and item list) should be removed (when new widget is ready) -	LLRect btn_rect = mEditWearableBtn->getRect(); -	btn_rect.set(item_rect.mRight - btn_rect.getWidth(), item_rect.mTop, item_rect.mRight, item_rect.mBottom); -	 -	mEditWearableBtn->setShape(btn_rect); -	sendChildToFront(mEditWearableBtn); -	 -	mEditWearableBtn->setEnabled(TRUE); -	if (!mEditWearableBtn->getVisible()) -	{ -		mEditWearableBtn->setVisible(TRUE); -	} +	LLUUID item_id = mCOFWearables->getSelectedUUID(); +	//*TODO show Edit Wearable Button -	const LLUUID& id_item_to_remove = item->getUUID(); -	LLViewerInventoryItem* item_to_remove = gInventory.getItem(id_item_to_remove); +	LLViewerInventoryItem* item_to_remove = gInventory.getItem(item_id);  	if (!item_to_remove) return;  	switch (item_to_remove->getType()) @@ -506,42 +484,15 @@ void LLPanelOutfitEdit::changed(U32 mask)  void LLPanelOutfitEdit::lookFetched(void)  { -	LLInventoryModel::cat_array_t cat_array; -	LLInventoryModel::item_array_t item_array; - -	// collectDescendentsIf takes non-const reference: -	LLFindCOFValidItems is_cof_valid; -	gInventory.collectDescendentsIf(mCurrentOutfitID, -									cat_array, -									item_array, -									LLInventoryModel::EXCLUDE_TRASH, -									is_cof_valid); -	for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin(); -		 iter != item_array.end(); -		 iter++) -	{ -		const LLViewerInventoryItem *item = (*iter); -		 -		LLSD row; -		row["id"] = item->getUUID(); -		LLSD& columns = row["columns"]; -		columns[0]["column"] = "look_item"; -		columns[0]["type"] = "text"; -		columns[0]["value"] = item->getName(); -		columns[1]["column"] = "look_item_sort"; -		columns[1]["type"] = "text"; // TODO: multi-wearable sort "type" should go here. -		columns[1]["value"] = "BAR"; // TODO: Multi-wearable sort index should go here -		 -		mLookContents->addElement(row); -	} +	mCOFWearables->refresh(); + +	updateVerbs();  }  void LLPanelOutfitEdit::updateLookInfo()  {	  	if (getVisible())  	{ -		mLookContents->clearRows(); -  		mFetchLook->setFetchID(mCurrentOutfitID);  		mFetchLook->startFetch();  		if (mFetchLook->isFinished()) @@ -577,4 +528,15 @@ void LLPanelOutfitEdit::displayCurrentOutfit()  	updateLookInfo();  } +//private +void LLPanelOutfitEdit::updateVerbs() +{ +	bool outfit_is_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty(); +	 +	childSetEnabled(SAVE_BTN, outfit_is_dirty); +	childSetEnabled(REVERT_BTN, outfit_is_dirty); + +	mSaveMenu->setItemEnabled("save_outfit", outfit_is_dirty); +} +// EOF diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 69e8016534..21fa849289 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -45,6 +45,7 @@  #include "llinventorymodel.h"  class LLButton; +class LLCOFWearables;  class LLTextBox;  class LLInventoryCategory;  class LLInventoryLookObserver; @@ -55,6 +56,7 @@ class LLScrollListCtrl;  class LLToggleableMenu;  class LLLookFetchObserver;  class LLFilterEditor; +class LLFilteredWearableListManager;  class LLPanelOutfitEdit : public LLPanel  { @@ -86,8 +88,11 @@ public:  		// Sends a request for data about the given parcel, which will  		// only update the location if there is none already available. +	void moveWearable(bool closer_to_body); +  	void showAddWearablesPanel();  	void showWearablesFilter(); +	void showFilteredWearablesPanel();  	void saveOutfit(bool as_new = false);  	void showSaveMenu(); @@ -98,7 +103,6 @@ public:  	void onOutfitItemSelectionChange(void);  	void onRemoveFromOutfitClicked(void);  	void onEditWearableClicked(void); -	void onUpClicked(void);  	void displayCurrentOutfit(); @@ -108,24 +112,28 @@ public:  private: +	void updateVerbs(); +  	//*TODO got rid of mCurrentOutfitID  	LLUUID				mCurrentOutfitID;  	LLTextBox*			mCurrentOutfitName; -	LLScrollListCtrl*	mLookContents;  	LLInventoryPanel*	mInventoryItemsPanel;  	LLFilterEditor*		mSearchFilter;  	LLSaveFolderState*	mSavedFolderState;  	std::string			mSearchString;  	LLButton*			mAddToOutfitBtn;  	LLButton*			mRemoveFromOutfitBtn; -	LLButton*			mUpBtn;  	LLButton*			mEditWearableBtn;  	LLToggleableMenu*	mSaveMenu; -	 + +	LLFilteredWearableListManager* mWearableListManager; +  	LLLookFetchObserver*		mFetchLook;  	LLInventoryLookObserver*	mLookObserver;  	std::vector<LLLookItemType> mLookItemTypes; + +	LLCOFWearables*		mCOFWearables;  };  #endif // LL_LLPANELOUTFITEDIT_H diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index b78268da7b..789e85b46f 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -49,6 +49,7 @@  #include "lllineeditor.h"  #include "llmodaldialog.h"  #include "llnotificationsutil.h" +#include "lloutfitslist.h"  #include "llsidepanelappearance.h"  #include "llsidetray.h"  #include "lltabcontainer.h" @@ -71,7 +72,8 @@ bool LLPanelOutfitsInventory::sShowDebugEditor = false;  LLPanelOutfitsInventory::LLPanelOutfitsInventory() : -	mActivePanel(NULL), +	mMyOutfitsPanel(NULL), +	mCurrentOutfitPanel(NULL),  	mParent(NULL)  {  	mSavedFolderState = new LLSaveFolderState(); @@ -145,9 +147,17 @@ void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)  void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)  {  	mFilterSubString = string; + +	// TODO: add handling "My Outfits" tab. +	if (!isCOFPanelActive()) +	{ +		mMyOutfitsPanel->setFilterSubString(string); +		return; +	} +  	if (string == "")  	{ -		mActivePanel->setFilterSubString(LLStringUtil::null); +		getActivePanel()->setFilterSubString(LLStringUtil::null);  		// re-open folders that were initially open  		mSavedFolderState->setApply(TRUE); @@ -159,7 +169,7 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)  	LLInventoryModelBackgroundFetch::instance().start(); -	if (mActivePanel->getFilterSubString().empty() && string.empty()) +	if (getActivePanel()->getFilterSubString().empty() && string.empty())  	{  		// current filter and new filter empty, do nothing  		return; @@ -173,7 +183,7 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)  	}  	// set new filter string -	mActivePanel->setFilterSubString(string); +	getActivePanel()->setFilterSubString(string);  }  void LLPanelOutfitsInventory::onWearButtonClick() @@ -216,7 +226,7 @@ bool LLPanelOutfitsInventory::onSaveCommit(const LLSD& notification, const LLSD&  		LLStringUtil::trim(outfit_name);  		if( !outfit_name.empty() )  		{ -			LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name); +			LLUUID outfit_folder = LLAppearanceMgr::getInstance()->makeNewOutfitLinks(outfit_name);  			LLSidepanelAppearance* panel_appearance =  				dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance")); @@ -267,6 +277,11 @@ void LLPanelOutfitsInventory::onSave()  void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)  {  	updateVerbs(); + +	// TODO: add handling "My Outfits" tab. +	if (!isCOFPanelActive()) +		return; +  	if (getRootFolder()->needsAutoRename() && items.size())  	{  		getRootFolder()->startRenamingSelectedItem(); @@ -284,6 +299,10 @@ void LLPanelOutfitsInventory::showEditOutfitPanel()  LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction()  { +	// TODO: add handling "My Outfits" tab. +	if (!isCOFPanelActive()) +		return NULL; +  	LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();  	if (!current_item)  		return NULL; @@ -311,7 +330,7 @@ bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *  LLFolderView *LLPanelOutfitsInventory::getRootFolder()  { -	return mActivePanel->getRootFolder(); +	return getActivePanel()->getRootFolder();  }  //static @@ -393,7 +412,11 @@ void LLPanelOutfitsInventory::onTrashButtonClick()  void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata)  {  	std::string command_name = userdata.asString(); -	getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); +	// TODO: add handling "My Outfits" tab. +	if (isCOFPanelActive()) +	{ +		getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name); +	}  	updateListCommands();  	updateVerbs();  } @@ -447,21 +470,26 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)  	if (command_name == "delete" || command_name == "remove")  	{  		BOOL can_delete = FALSE; -		LLFolderView* root = getActivePanel()->getRootFolder(); -		if (root) + +		// TODO: add handling "My Outfits" tab. +		if (isCOFPanelActive())  		{ -			std::set<LLUUID> selection_set; -			root->getSelectionList(selection_set); -			can_delete = (selection_set.size() > 0); -			for (std::set<LLUUID>::iterator iter = selection_set.begin(); -				 iter != selection_set.end(); -				 ++iter) +			LLFolderView* root = getActivePanel()->getRootFolder(); +			if (root)  			{ -				const LLUUID &item_id = (*iter); -				LLFolderViewItem *item = root->getItemByID(item_id); -				can_delete &= item->getListener()->isItemRemovable(); +				std::set<LLUUID> selection_set; +				root->getSelectionList(selection_set); +				can_delete = (selection_set.size() > 0); +				for (std::set<LLUUID>::iterator iter = selection_set.begin(); +					 iter != selection_set.end(); +					 ++iter) +				{ +					const LLUUID &item_id = (*iter); +					LLFolderViewItem *item = root->getItemByID(item_id); +					can_delete &= item->getListener()->isItemRemovable(); +				} +				return can_delete;  			} -			return can_delete;  		}  		return FALSE;  	} @@ -517,12 +545,17 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)  bool LLPanelOutfitsInventory::hasItemsSelected()  {  	bool has_items_selected = false; -	LLFolderView* root = getActivePanel()->getRootFolder(); -	if (root) + +	// TODO: add handling "My Outfits" tab. +	if (isCOFPanelActive())  	{ -		std::set<LLUUID> selection_set; -		root->getSelectionList(selection_set); -		has_items_selected = (selection_set.size() > 0); +		LLFolderView* root = getActivePanel()->getRootFolder(); +		if (root) +		{ +			std::set<LLUUID> selection_set; +			root->getSelectionList(selection_set); +			has_items_selected = (selection_set.size() > 0); +		}  	}  	return has_items_selected;  } @@ -549,74 +582,58 @@ bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropTy  void LLPanelOutfitsInventory::initTabPanels()  { -	LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>(COF_TAB_NAME); -	cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); -	mTabPanels.push_back(cof_panel); +	mCurrentOutfitPanel = getChild<LLInventoryPanel>(COF_TAB_NAME); +	mCurrentOutfitPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); +	mCurrentOutfitPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, mCurrentOutfitPanel, _1, _2)); -	LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME); -	myoutfits_panel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, LLInventoryFilter::FILTERTYPE_CATEGORY); -	myoutfits_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); -	mTabPanels.push_back(myoutfits_panel); -	 -	for (tabpanels_vec_t::iterator iter = mTabPanels.begin(); -		 iter != mTabPanels.end(); -		 ++iter) -	{ -		LLInventoryPanel *panel = (*iter); -		panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, panel, _1, _2)); -	} +	mMyOutfitsPanel = getChild<LLOutfitsList>(OUTFITS_TAB_NAME);  	mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs");  	mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this)); -	mActivePanel = (LLInventoryPanel*)mAppearanceTabs->getCurrentPanel();  }  void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action)  {  	if (user_action && items.size() > 0)  	{ -		for (tabpanels_vec_t::iterator iter = mTabPanels.begin(); -			 iter != mTabPanels.end(); -			 ++iter) +		// TODO: add handling "My Outfits" tab. +		if (isCOFPanelActive())  		{ -			LLInventoryPanel *panel = (*iter); -			if (panel == tab_panel) -			{ -				mActivePanel = panel; -			} -			else -			{ -				panel->getRootFolder()->clearSelection(); -			} +			onSelectionChange(items, user_action); +		} +		else +		{ +			mCurrentOutfitPanel->getRootFolder()->clearSelection();  		}  	} -	onSelectionChange(items, user_action);  }  void LLPanelOutfitsInventory::onTabChange()  { -	mActivePanel = (LLInventoryPanel*)childGetVisibleTab("appearance_tabs"); -	if (!mActivePanel) +	// TODO: add handling "My Outfits" tab. +	if (isCOFPanelActive())  	{ -		return; +		mCurrentOutfitPanel->setFilterSubString(mFilterSubString); +	} +	else +	{ +		mMyOutfitsPanel->setFilterSubString(mFilterSubString);  	} -	mActivePanel->setFilterSubString(mFilterSubString); +  	updateVerbs();  }  BOOL LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel) const  { -	for(tabpanels_vec_t::const_iterator it = mTabPanels.begin(); -		it != mTabPanels.end(); -		++it) +	// TODO: add handling "My Outfits" tab. +	if (mCurrentOutfitPanel == panel)  	{ -		if (*it == panel) -			return TRUE; +		return TRUE;  	}  	return FALSE;  }  BOOL LLPanelOutfitsInventory::isCOFPanelActive() const  { -	return (getActivePanel()->getName() == COF_TAB_NAME); +	return (childGetVisibleTab("appearance_tabs")->getName() == COF_TAB_NAME);  } diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index 5d0d27ee4f..4234cc45c5 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -40,6 +40,7 @@ class LLFolderView;  class LLFolderViewItem;  class LLFolderViewEventListener;  class LLInventoryPanel; +class LLOutfitsList;  class LLSaveFolderState;  class LLButton;  class LLMenuGL; @@ -88,20 +89,21 @@ private:  public:  	//////////////////////////////////////////////////////////////////////////////////  	// tab panels -	LLInventoryPanel* 		getActivePanel() { return mActivePanel; } -	const LLInventoryPanel* getActivePanel() const { return mActivePanel; } +	// TODO: change getActivePanel() to return the active tab instead of returning +	// a pointer to "Wearing" inventory panel. +	LLInventoryPanel* 		getActivePanel() { return mCurrentOutfitPanel; } +  	BOOL 					isTabPanel(LLInventoryPanel *panel) const; -	 +	BOOL 					isCOFPanelActive() const; +  protected:  	void 					initTabPanels();  	void 					onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action);  	void 					onTabChange(); -	BOOL 					isCOFPanelActive() const;  private: -	LLInventoryPanel* 		mActivePanel; -	typedef std::vector<LLInventoryPanel *> tabpanels_vec_t; -	tabpanels_vec_t 		mTabPanels; +	LLOutfitsList*			mMyOutfitsPanel; +	LLInventoryPanel*		mCurrentOutfitPanel;  	// tab panels                                                               //  	//////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index daa2a04f65..f2c0f92f9b 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -443,6 +443,7 @@ public:  LLPanelPeople::LLPanelPeople()  	:	LLPanel(),  		mFilterSubString(LLStringUtil::null), +		mFilterSubStringOrig(LLStringUtil::null),  		mFilterEditor(NULL),  		mTabContainer(NULL),  		mOnlineFriendList(NULL), @@ -645,6 +646,25 @@ void LLPanelPeople::onChange(EStatusType status, const std::string &channelURI,  	updateButtons();  } +void LLPanelPeople::updateFriendListHelpText() +{ +	// show special help text for just created account to help finding friends. EXT-4836 +	static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_help_text"); + +	// Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...) +	// So, lets check all lists to avoid overlapping the text with online list. See EXT-6448. +	bool any_friend_exists = mAllFriendList->filterHasMatches() || mOnlineFriendList->filterHasMatches(); +	no_friends_text->setVisible(!any_friend_exists); +	if (no_friends_text->getVisible()) +	{ +		//update help text for empty lists +		std::string message_name = mFilterSubString.empty() ? "no_friends_msg" : "no_filtered_friends_msg"; +		LLStringUtil::format_map_t args; +		args["[SEARCH_TERM]"] = LLURI::escape(mFilterSubStringOrig); +		no_friends_text->setText(getString(message_name, args)); +	} +} +  void LLPanelPeople::updateFriendList()  {  	if (!mOnlineFriendList || !mAllFriendList) @@ -684,14 +704,6 @@ void LLPanelPeople::updateFriendList()  			online_friendsp.push_back(buddy_id);  	} -	// show special help text for just created account to help found friends. EXT-4836 -	static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg"); - -	// Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...) -	// So, lets check all lists to avoid overlapping the text with online list. See EXT-6448. -	bool any_friend_exists = (all_friendsp.size() > 0) || (online_friendsp.size() > 0); -	no_friends_text->setVisible(!any_friend_exists); -  	/*  	 * Avatarlists  will be hidden by showFriendsAccordionsIfNeeded(), if they do not have items.  	 * But avatarlist can be updated only if it is visible @see LLAvatarList::draw();    @@ -972,10 +984,11 @@ bool LLPanelPeople::isRealGroup()  void LLPanelPeople::onFilterEdit(const std::string& search_string)  { -	std::string search_upper = search_string; +	mFilterSubStringOrig = search_string; +	LLStringUtil::trimHead(mFilterSubStringOrig);  	// Searches are case-insensitive +	std::string search_upper = mFilterSubStringOrig;  	LLStringUtil::toUpper(search_upper); -	LLStringUtil::trimHead(search_upper);  	if (mFilterSubString == search_upper)  		return; @@ -990,11 +1003,11 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)  	// Apply new filter. -	mNearbyList->setNameFilter(mFilterSubString); -	mOnlineFriendList->setNameFilter(mFilterSubString); -	mAllFriendList->setNameFilter(mFilterSubString); -	mRecentList->setNameFilter(mFilterSubString); -	mGroupList->setNameFilter(mFilterSubString); +	mNearbyList->setNameFilter(mFilterSubStringOrig); +	mOnlineFriendList->setNameFilter(mFilterSubStringOrig); +	mAllFriendList->setNameFilter(mFilterSubStringOrig); +	mRecentList->setNameFilter(mFilterSubStringOrig); +	mGroupList->setNameFilter(mFilterSubStringOrig);  	setAccordionCollapsedByUser("tab_online", false);  	setAccordionCollapsedByUser("tab_all", false); @@ -1436,6 +1449,9 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded()  		// Rearrange accordions  		LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");  		accordion->arrange(); + +		// keep help text in a synchronization with accordions visibility. +		updateFriendListHelpText();  	}  } diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index 891381e2de..17c45a034b 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -73,6 +73,7 @@ private:  	} ESortOrder;  	// methods indirectly called by the updaters +	void					updateFriendListHelpText();  	void					updateFriendList();  	void					updateNearbyList();  	void					updateRecentList(); @@ -168,6 +169,7 @@ private:  	Updater*				mRecentListUpdater;  	std::string				mFilterSubString; +	std::string				mFilterSubStringOrig;  };  #endif //LL_LLPANELPEOPLE_H diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 17784c31e3..51a11e97e4 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -528,8 +528,7 @@ void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_fi  		std::string string = search_string;  		// Searches are case-insensitive -		LLStringUtil::toUpper(string); -		LLStringUtil::trimHead(string); +		// but we don't convert the typed string to upper-case so that it can be fed to the web search as-is.  		mActivePanel->onSearchEdit(string);  	} @@ -1071,8 +1070,7 @@ void LLPanelPlaces::updateVerbs()  	mSaveBtn->setVisible(isLandmarkEditModeOn);  	mCancelBtn->setVisible(isLandmarkEditModeOn);  	mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); -	mPlaceInfoBtn->setVisible(mPlaceInfoType != LANDMARK_INFO_TYPE && mPlaceInfoType != TELEPORT_HISTORY_INFO_TYPE -			&& !is_create_landmark_visible && !isLandmarkEditModeOn); +	mPlaceInfoBtn->setVisible(!is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn);  	mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos);  	mPlaceInfoBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos); diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index f35cb3516a..11b6c0a3ae 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -539,4 +539,14 @@ bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, Floater  	return false;  } +void LLScriptFloaterManager::setFloaterVisible(const LLUUID& notification_id, bool visible) +{ +	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>( +		"script_floater", notification_id); +	if(floater) +	{ +		floater->setVisible(visible); +	} +} +  // EOF diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index ec3ec4b540..dc0cfc2400 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -99,6 +99,8 @@ public:  	bool getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi); +	void setFloaterVisible(const LLUUID& notification_id, bool visible); +  protected:  	typedef std::map<std::string, EObjectType> object_type_map; diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index abef47d4be..f38df19de0 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -197,8 +197,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)  		mFilterSubString = search_string;  		// Searches are case-insensitive -		LLStringUtil::toUpper(mFilterSubString); -		LLStringUtil::trimHead(mFilterSubString); +		// but we don't convert the typed string to upper-case so that it can be fed to the web search as-is.  		mPanelOutfitsInventory->onSearchEdit(mFilterSubString);  	} @@ -329,8 +328,8 @@ void LLSidepanelAppearance::updateVerbs()  	if (mPanelOutfitsInventory && !is_look_info_visible)  	{ -		const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL); -		mEditBtn->setEnabled(is_correct_type); +//		const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL); +//		mEditBtn->setEnabled(is_correct_type);  	}  	else  	{ diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp index dcc85392f7..15684337f4 100644 --- a/indra/newview/llteleporthistory.cpp +++ b/indra/newview/llteleporthistory.cpp @@ -136,6 +136,7 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)  		if (mCurrentItem < 0 || mCurrentItem >= (int) mItems.size()) // sanity check  		{  			llwarns << "Invalid current item. (this should not happen)" << llendl; +			llassert(!"Invalid current teleport histiry item");  			return;  		}  		LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos); @@ -166,6 +167,17 @@ void LLTeleportHistory::onHistoryChanged()  void LLTeleportHistory::purgeItems()  { +	if (mItems.size() == 0) // no entries yet (we're called before login) +	{ +		// If we don't return here the history will get into inconsistent state, hence: +		// 1) updateCurrentLocation() will malfunction, +		//    so further teleports will not properly update the history; +		// 2) mHistoryChangedSignal subscribers will be notified +		//    of such an invalid change. (EXT-6798) +		// Both should not happen. +		return; +	} +  	if (mItems.size() > 0)  	{  		mItems.erase(mItems.begin(), mItems.end()-1); diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp index c635f91423..430d62e15e 100644 --- a/indra/newview/llteleporthistorystorage.cpp +++ b/indra/newview/llteleporthistorystorage.cpp @@ -89,6 +89,13 @@ void LLTeleportHistoryStorage::onTeleportHistoryChange()  	if (!th)  		return; +	// Hacky sanity check. (EXT-6798) +	if (th->getItems().size() == 0) +	{ +		llassert(!"Inconsistent teleport history state"); +		return; +	} +  	const LLTeleportHistoryItem &item = th->getItems()[th->getCurrentItemIndex()];  	addItem(item.mTitle, item.mGlobalPos); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 2ea6e5936d..e64696b120 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -850,6 +850,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  				mState = WAIT_HTTP_REQ;	  				mFetcher->addToHTTPQueue(mID); +				mSentRequest = QUEUED;  				// Will call callbackHttpGet when curl request completes  				std::vector<std::string> headers;  				headers.push_back("Accept: image/x-j2c"); @@ -936,6 +937,11 @@ bool LLTextureFetchWorker::doWork(S32 param)  			{  				mFileSize = mBufferSize;  			} +			else //the file size is unknown +			{ +				mFileSize = S32_MAX ; //flag the file is not fully loaded. +			} +  			U8* buffer = new U8[mBufferSize];  			if (cur_size > 0)  			{ diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 22b12ee132..568cd4cb19 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -67,6 +67,7 @@ LLToast::Params::Params()  LLToast::LLToast(const LLToast::Params& p)   :	LLModalDialog(LLSD(), p.is_modal),  	mPanel(p.panel),  +	mToastLifetime(p.lifetime_secs),  	mToastFadingTime(p.fading_time_secs),  	mNotificationID(p.notif_id),    	mSessionID(p.session_id), @@ -241,6 +242,13 @@ void LLToast::draw()  			drawChild(mHideBtn);  		}  	} + +	// if timer started and remaining time <= fading time +	if (mTimer->getStarted() && (mToastLifetime +			- mTimer->getEventTimer().getElapsedTimeF32()) <= mToastFadingTime) +	{ +		setBackgroundOpaque(FALSE); +	}  }  //-------------------------------------------------------------------------- diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index 4a213580da..4211f21ef1 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -209,6 +209,7 @@ private:  	// timer counts a lifetime of a toast  	std::auto_ptr<LLToastLifeTimer> mTimer; +	F32			mToastLifetime; // in seconds  	F32			mToastFadingTime; // in seconds  	LLPanel*		mPanel; diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 986ccdf19b..2b529a4e50 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -50,6 +50,7 @@  #include "llnotifications.h"  #include "llfunctorregistry.h"  #include "llrootview.h" +#include "llviewercontrol.h" // for gSavedSettings  const S32 MAX_ALLOWED_MSG_WIDTH = 400;  const F32 DEFAULT_BUTTON_DELAY = 0.5f; @@ -279,7 +280,18 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal  			mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight());  			mLineEditor->setRect(leditor_rect);  			mLineEditor->setText(edit_text_contents); -			mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1); + +			// decrease limit of line editor of teleport offer dialog to avoid truncation of +			// location URL in invitation message, see EXT-6891 +			if ("OfferTeleport" == mNotification->getName()) +			{ +				mLineEditor->setMaxTextLength(gSavedSettings.getS32( +						"teleport_offer_invitation_max_length")); +			} +			else +			{ +				mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1); +			}  			LLToastPanel::addChild(mLineEditor); diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index c9d2d404c0..089163929e 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -493,7 +493,7 @@ void LLToastNotifyPanel::onClickButton(void* data)  	{  		sButtonClickSignal(self->mNotification->getID(), button_name); -		if(new_info) +		if(new_info && !self->mNotification->isPersistent())  		{  			self->mNotification->setResponseFunctor(  				boost::bind(&LLOfferInfo::inventory_offer_callback, new_info, _1, _2)); diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp index d142a0665b..71598b3169 100644 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -33,6 +33,7 @@  #include "llviewerprecompiledheaders.h"  #include "llpanelgenerictip.h" +#include "llpanelonlinestatus.h"  #include "llnotifications.h"  #include "lltoastpanel.h" @@ -97,9 +98,19 @@ LLToastPanel* LLToastPanel::buidPanelFromNotification(  {  	LLToastPanel* res = NULL; -	if (notification->getName() == "SystemMessageTip") +	//process tip toast panels +	if ("notifytip" == notification->getType())  	{ -		res = new LLPanelGenericTip(notification); +		// if it is online/offline notification +		if ("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName()) +		{ +			res = new LLPanelOnlineStatus(notification); +		} +		// in all other case we use generic tip panel +		else +		{ +			res = new LLPanelGenericTip(notification); +		}  	}  	/*  	 else if(...) diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 2661c9f32b..9559311e3c 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -145,7 +145,7 @@ void audio_update_volume(bool force_update)  	{		  		F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");  		BOOL music_muted = gSavedSettings.getBOOL("MuteMusic"); -		music_volume = mute_volume * master_volume * (music_volume*music_volume); +		music_volume = mute_volume * master_volume * music_volume;  		gAudiop->setInternetStreamGain ( music_muted ? 0.f : music_volume );  	} @@ -153,7 +153,7 @@ void audio_update_volume(bool force_update)  	// Streaming Media  	F32 media_volume = gSavedSettings.getF32("AudioLevelMedia");  	BOOL media_muted = gSavedSettings.getBOOL("MuteMedia"); -	media_volume = mute_volume * master_volume * (media_volume*media_volume); +	media_volume = mute_volume * master_volume * media_volume;  	LLViewerMedia::setVolume( media_muted ? 0.0f : media_volume );  	// Voice diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 8a891b1462..b39ee8b2e0 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -67,6 +67,40 @@  #include "llviewermessage.h"  ///---------------------------------------------------------------------------- +/// Helper class to store special inventory item names  +///---------------------------------------------------------------------------- +class LLLocalizedInventoryItemsDictionary : public LLSingleton<LLLocalizedInventoryItemsDictionary> +{ +public: +	std::map<std::string, std::string> mInventoryItemsDict; + +	LLLocalizedInventoryItemsDictionary() +	{ +		mInventoryItemsDict["New Shape"]		= LLTrans::getString("New Shape"); +		mInventoryItemsDict["New Skin"]			= LLTrans::getString("New Skin"); +		mInventoryItemsDict["New Hair"]			= LLTrans::getString("New Hair"); +		mInventoryItemsDict["New Eyes"]			= LLTrans::getString("New Eyes"); +		mInventoryItemsDict["New Shirt"]		= LLTrans::getString("New Shirt"); +		mInventoryItemsDict["New Pants"]		= LLTrans::getString("New Pants"); +		mInventoryItemsDict["New Shoes"]		= LLTrans::getString("New Shoes"); +		mInventoryItemsDict["New Socks"]		= LLTrans::getString("New Socks"); +		mInventoryItemsDict["New Jacket"]		= LLTrans::getString("New Jacket"); +		mInventoryItemsDict["New Gloves"]		= LLTrans::getString("New Gloves"); +		mInventoryItemsDict["New Undershirt"]	= LLTrans::getString("New Undershirt"); +		mInventoryItemsDict["New Underpants"]	= LLTrans::getString("New Underpants"); +		mInventoryItemsDict["New Skirt"]		= LLTrans::getString("New Skirt"); +		mInventoryItemsDict["New Alpha"]		= LLTrans::getString("New Alpha"); +		mInventoryItemsDict["New Tattoo"]		= LLTrans::getString("New Tattoo"); +		mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable"); + +		mInventoryItemsDict["New Script"]		= LLTrans::getString("New Script"); +		mInventoryItemsDict["New Folder"]		= LLTrans::getString("New Folder"); +		mInventoryItemsDict["Contents"]			= LLTrans::getString("Contents"); +	} +}; + + +///----------------------------------------------------------------------------  /// Local function declarations, constants, enums, and typedefs  ///---------------------------------------------------------------------------- @@ -316,6 +350,18 @@ BOOL LLViewerInventoryItem::unpackMessage(LLSD item)  BOOL LLViewerInventoryItem::unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num)  {  	BOOL rv = LLInventoryItem::unpackMessage(msg, block, block_num); + +	std::string localized_str; + +	std::map<std::string, std::string>::const_iterator dictionary_iter; + +	dictionary_iter = LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.find(mName); + +	if(dictionary_iter != LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.end()) +	{ +		mName = dictionary_iter->second; +	} +  	mIsComplete = TRUE;  	return rv;  } @@ -867,6 +913,25 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,  						   U32 next_owner_perm,  						   LLPointer<LLInventoryCallback> cb)  { +	//check if name is equal to one of special inventory items names +	//EXT-5839 +	std::string server_name = name; + +	{ +		std::map<std::string, std::string>::const_iterator dictionary_iter; + +		for (dictionary_iter = LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.begin(); +			 dictionary_iter != LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.end(); +			 dictionary_iter++) +		{ +			const std::string& localized_name = dictionary_iter->second; +			if(localized_name == name) +			{ +				server_name = dictionary_iter->first; +			} +		} +	} +  	LLMessageSystem* msg = gMessageSystem;  	msg->newMessageFast(_PREHASH_CreateInventoryItem);  	msg->nextBlock(_PREHASH_AgentData); @@ -880,7 +945,7 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,  	msg->addS8Fast(_PREHASH_Type, (S8)asset_type);  	msg->addS8Fast(_PREHASH_InvType, (S8)inv_type);  	msg->addU8Fast(_PREHASH_WearableType, (U8)wtype); -	msg->addStringFast(_PREHASH_Name, name); +	msg->addStringFast(_PREHASH_Name, server_name);  	msg->addStringFast(_PREHASH_Description, desc);  	gAgent.sendReliableMessage(); @@ -923,6 +988,7 @@ void link_inventory_item(  	const LLUUID& item_id,  	const LLUUID& parent_id,  	const std::string& new_name, +	const std::string& new_description,  	const LLAssetType::EType asset_type,  	LLPointer<LLInventoryCallback> cb)  { @@ -948,7 +1014,6 @@ void link_inventory_item(  	}  	LLUUID transaction_id; -	std::string desc = "Broken link"; // This should only show if the object can't find its baseobj.  	LLInventoryType::EType inv_type = LLInventoryType::IT_NONE;  	if (dynamic_cast<const LLInventoryCategory *>(baseobj))  	{ @@ -979,7 +1044,7 @@ void link_inventory_item(  		msg->addS8Fast(_PREHASH_Type, (S8)asset_type);  		msg->addS8Fast(_PREHASH_InvType, (S8)inv_type);  		msg->addStringFast(_PREHASH_Name, new_name); -		msg->addStringFast(_PREHASH_Description, desc); +		msg->addStringFast(_PREHASH_Description, new_description);  	}  	gAgent.sendReliableMessage();  } diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 9d449399e8..f296ce35ff 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -339,6 +339,7 @@ void link_inventory_item(  	const LLUUID& item_id,  	const LLUUID& parent_id,  	const std::string& new_name, +	const std::string& new_description,  	const LLAssetType::EType asset_type,  	LLPointer<LLInventoryCallback> cb); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index bc4e20d706..78be6bdfd0 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1035,21 +1035,26 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)  			{  				// Use the name of the last item giver, who is probably the person  				// spamming you. -				std::ostringstream message; -				message << LLAppViewer::instance()->getSecondLifeTitle(); + +				LLStringUtil::format_map_t arg; +				std::string log_msg; +				std::ostringstream time ; +				time<<OFFER_THROTTLE_TIME; + +				arg["APP_NAME"] = LLAppViewer::instance()->getSecondLifeTitle(); +				arg["TIME"] = time.str(); +  				if (!from_name.empty())  				{ -					message << ": Items coming in too fast from " << from_name; +					arg["FROM_NAME"] = from_name; +					log_msg = LLTrans::getString("ItemsComingInTooFastFrom", arg);  				}  				else  				{ -					message << ": Items coming in too fast"; +					log_msg = LLTrans::getString("ItemsComingInTooFast", arg);  				} -				message << ", automatic preview disabled for " -					<< OFFER_THROTTLE_TIME << " seconds.";  				//this is kinda important, so actually put it on screen -				std::string log_msg = message.str();  				LLSD args;  				args["MESSAGE"] = log_msg;  				LLNotificationsUtil::add("SystemMessage", args); @@ -1247,6 +1252,16 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,  			gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(blocked_id));  } +LLOfferInfo::LLOfferInfo() + : LLNotificationResponderInterface() + , mFromGroup(FALSE) + , mFromObject(FALSE) + , mIM(IM_NOTHING_SPECIAL) + , mType(LLAssetType::AT_NONE) + , mPersist(false) +{ +} +  LLOfferInfo::LLOfferInfo(const LLSD& sd)  {  	mIM = (EInstantMessage)sd["im_type"].asInteger(); @@ -1260,6 +1275,7 @@ LLOfferInfo::LLOfferInfo(const LLSD& sd)  	mFromName = sd["from_name"].asString();  	mDesc = sd["description"].asString();  	mHost = LLHost(sd["sender"].asString()); +	mPersist = sd["persist"].asBoolean();  }  LLOfferInfo::LLOfferInfo(const LLOfferInfo& info) @@ -1275,6 +1291,7 @@ LLOfferInfo::LLOfferInfo(const LLOfferInfo& info)  	mFromName = info.mFromName;  	mDesc = info.mDesc;  	mHost = info.mHost; +	mPersist = info.mPersist;  }  LLSD LLOfferInfo::asLLSD() @@ -1291,9 +1308,15 @@ LLSD LLOfferInfo::asLLSD()  	sd["from_name"] = mFromName;  	sd["description"] = mDesc;  	sd["sender"] = mHost.getIPandPort(); +	sd["persist"] = mPersist;  	return sd;  } +void LLOfferInfo::fromLLSD(const LLSD& params) +{ +	*this = params; +} +  void LLOfferInfo::send_auto_receive_response(void)  {	  	LLMessageSystem* msg = gMessageSystem; @@ -1333,6 +1356,21 @@ void LLOfferInfo::send_auto_receive_response(void)  	}  } +void LLOfferInfo::handleRespond(const LLSD& notification, const LLSD& response) +{ +	initRespondFunctionMap(); + +	const std::string name = notification["name"].asString(); +	if(mRespondFunctions.find(name) == mRespondFunctions.end()) +	{ +		llwarns << "Unexpected notification name : " << name << llendl; +		llassert(!"Unexpected notification name"); +		return; +	} + +	mRespondFunctions[name](notification, response); +} +  bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response)  {  	LLChat chat; @@ -1469,7 +1507,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&  		gInventory.addObserver(opener);  	} -	delete this; +	if(!mPersist) +	{ +		delete this; +	}  	return false;  } @@ -1635,7 +1676,10 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const  		gInventory.addObserver(opener);  	} -	delete this; +	if(!mPersist) +	{ +		delete this; +	}  	return false;  } @@ -1651,6 +1695,16 @@ protected:  	}  }; +void LLOfferInfo::initRespondFunctionMap() +{ +	if(mRespondFunctions.empty()) +	{ +		mRespondFunctions["ObjectGiveItem"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2); +		mRespondFunctions["ObjectGiveItemUnknownUser"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2); +		mRespondFunctions["UserGiveItem"] = boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2); +	} +} +  void inventory_offer_handler(LLOfferInfo* info)  {  	//Until throttling is implmented, busy mode should reject inventory instead of silently @@ -1767,7 +1821,8 @@ void inventory_offer_handler(LLOfferInfo* info)  		// Inventory Slurls don't currently work for non agent transfers, so only display the object name.  		args["ITEM_SLURL"] = msg;  		// Note: sets inventory_task_offer_callback as the callback -		p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_task_offer_callback, info, _1, _2)); +		p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info)); +		info->mPersist = true;  		p.name = name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser";  		// Pop up inv offer chiclet and let the user accept (keep), or reject (and silently delete) the inventory.  		LLNotifications::instance().add(p); @@ -1779,7 +1834,8 @@ void inventory_offer_handler(LLOfferInfo* info)  		// *TODO fix memory leak  		// inventory_offer_callback() is not invoked if user received notification and   		// closes viewer(without responding the notification) -		p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2)); +		p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info)); +		info->mPersist = true;  		p.name = "UserGiveItem";  		// Prefetch the item into your local inventory. @@ -1800,10 +1856,8 @@ void inventory_offer_handler(LLOfferInfo* info)  		// Inform user that there is a script floater via toast system  		{  			payload["give_inventory_notification"] = TRUE; -		    LLNotification::Params params(p.name); -		    params.substitutions = p.substitutions; -		    params.payload = payload; -		    LLPostponedNotification::add<LLPostponedOfferNotification>(	params, info->mFromID, false); +		    p.payload = payload; +		    LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, false);  		}  	}  } @@ -1880,7 +1934,7 @@ protected:  	}  }; -static void parse_lure_bucket(const std::string& bucket, +static bool parse_lure_bucket(const std::string& bucket,  							  U64& region_handle,  							  LLVector3& pos,  							  LLVector3& look_at, @@ -1892,15 +1946,25 @@ static void parse_lure_bucket(const std::string& bucket,  	tokenizer tokens(bucket, sep);  	tokenizer::iterator iter = tokens.begin(); -	S32 gx = boost::lexical_cast<S32>((*(iter)).c_str()); -	S32 gy = boost::lexical_cast<S32>((*(++iter)).c_str()); -	S32 rx = boost::lexical_cast<S32>((*(++iter)).c_str()); -	S32 ry = boost::lexical_cast<S32>((*(++iter)).c_str()); -	S32 rz = boost::lexical_cast<S32>((*(++iter)).c_str()); -	S32 lx = boost::lexical_cast<S32>((*(++iter)).c_str()); -	S32 ly = boost::lexical_cast<S32>((*(++iter)).c_str()); -	S32 lz = boost::lexical_cast<S32>((*(++iter)).c_str()); - +	S32 gx,gy,rx,ry,rz,lx,ly,lz; +	try +	{ +		gx = boost::lexical_cast<S32>((*(iter)).c_str()); +		gy = boost::lexical_cast<S32>((*(++iter)).c_str()); +		rx = boost::lexical_cast<S32>((*(++iter)).c_str()); +		ry = boost::lexical_cast<S32>((*(++iter)).c_str()); +		rz = boost::lexical_cast<S32>((*(++iter)).c_str()); +		lx = boost::lexical_cast<S32>((*(++iter)).c_str()); +		ly = boost::lexical_cast<S32>((*(++iter)).c_str()); +		lz = boost::lexical_cast<S32>((*(++iter)).c_str()); +	} +	catch( boost::bad_lexical_cast& ) +	{ +		LL_WARNS("parse_lure_bucket") +			<< "Couldn't parse lure bucket." +			<< LL_ENDL; +		return false; +	}  	// Grab region access  	region_access = SIM_ACCESS_MIN;  	if (++iter != tokens.end()) @@ -1925,6 +1989,7 @@ static void parse_lure_bucket(const std::string& bucket,  	look_at.setVec((F32)lx, (F32)ly, (F32)lz);  	region_handle = to_region_handle(gx, gy); +	return true;  }  void process_improved_im(LLMessageSystem *msg, void **user_data) @@ -2484,7 +2549,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			// Note: lie to Nearby Chat, pretending that this is NOT an IM, because  			// IMs from obejcts don't open IM sessions.  			LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); -			if(nearby_chat) +			if(SYSTEM_FROM != name && nearby_chat)  			{  				LLSD args;  				args["owner_id"] = from_id; @@ -2562,15 +2627,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				U64 region_handle;  				U8 region_access;  				std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size); -				parse_lure_bucket(region_info, region_handle, pos, look_at, region_access); +				std::string region_access_str = LLStringUtil::null; +				std::string region_access_icn = LLStringUtil::null; -				std::string region_access_str = LLViewerRegion::accessToString(region_access); +				if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access)) +				{ +					region_access_str = LLViewerRegion::accessToString(region_access); +					region_access_icn = LLViewerRegion::getAccessIcon(region_access); +				}  				LLSD args;  				// *TODO: Translate -> [FIRST] [LAST] (maybe)  				args["NAME_SLURL"] = LLSLURL::buildCommand("agent", from_id, "about");  				args["MESSAGE"] = message; -				args["MATURITY"] = region_access_str; +				args["MATURITY_STR"] = region_access_str; +				args["MATURITY_ICON"] = region_access_icn;  				LLSD payload;  				payload["from_id"] = from_id;  				payload["lure_id"] = session_id; diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index 7c021dc05f..72ad3c8926 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -40,6 +40,7 @@  #include "lluuid.h"  #include "message.h"  #include "stdenums.h" +#include "llnotifications.h"  //  // Forward declarations @@ -210,11 +211,10 @@ bool highlight_offered_item(const LLUUID& item_id);  void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid); -struct LLOfferInfo +class LLOfferInfo : public LLNotificationResponderInterface  { -        LLOfferInfo() -	:	mFromGroup(FALSE), mFromObject(FALSE), -		mIM(IM_NOTHING_SPECIAL), mType(LLAssetType::AT_NONE) {}; +public: +	LLOfferInfo();  	LLOfferInfo(const LLSD& sd);  	LLOfferInfo(const LLOfferInfo& info); @@ -232,12 +232,27 @@ struct LLOfferInfo  	std::string mFromName;  	std::string mDesc;  	LLHost mHost; +	bool mPersist; + +	// LLNotificationResponderInterface implementation +	/*virtual*/ LLSD asLLSD(); +	/*virtual*/ void fromLLSD(const LLSD& params); +	/*virtual*/ void handleRespond(const LLSD& notification, const LLSD& response); -	LLSD asLLSD();  	void send_auto_receive_response(void); + +	// TODO - replace all references with handleRespond()  	bool inventory_offer_callback(const LLSD& notification, const LLSD& response);  	bool inventory_task_offer_callback(const LLSD& notification, const LLSD& response); +private: + +	void initRespondFunctionMap(); + +	typedef boost::function<bool (const LLSD&, const LLSD&)> respond_function_t; +	typedef std::map<std::string, respond_function_t> respond_function_map_t; + +	respond_function_map_t mRespondFunctions;  };  void process_feature_disabled_message(LLMessageSystem* msg, void**); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 07d4ac664f..c48668df9a 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -627,6 +627,26 @@ std::string LLViewerRegion::accessToString(U8 sim_access)  }  // static +std::string LLViewerRegion::getAccessIcon(U8 sim_access) +{ +	switch(sim_access) +	{ +	case SIM_ACCESS_MATURE: +		return "Parcel_M_Dark"; + +	case SIM_ACCESS_ADULT: +		return "Parcel_R_Light"; + +	case SIM_ACCESS_PG: +		return "Parcel_PG_Light"; + +	case SIM_ACCESS_MIN: +	default: +		return ""; +	} +} + +// static  std::string LLViewerRegion::accessToShortString(U8 sim_access)  {  	switch(sim_access)		/* Flawfinder: ignore */ diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 49d0900f2a..5c4d5a61fd 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -203,6 +203,9 @@ public:  	// Returns "M", "PG", "A" etc.  	static std::string accessToShortString(U8 sim_access); + +	// Return access icon name +	static std::string getAccessIcon(U8 sim_access);  	// helper function which just makes sure all interested parties  	// can process the message. diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index a5adb11c53..c883087cf2 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1564,10 +1564,6 @@ F32 LLViewerFetchedTexture::calcDecodePriority()  		// larger mips are corrupted  		priority = -3.0f;  	} -	else if (cur_discard <= mDesiredDiscardLevel) -	{ -		priority = -4.0f; -	}  	else  	{  		// priority range = 100,000 - 500,000 diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 7473adda1f..63f060b58a 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -2238,7 +2238,6 @@ LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, S32& components, U3  	{  		case GL_LUMINANCE:			components = 1; internal_format = GL_LUMINANCE8;		break;  		case GL_ALPHA:				components = 1; internal_format = GL_ALPHA8;			break; -		case GL_COLOR_INDEX:		components = 1; internal_format = GL_COLOR_INDEX8_EXT;	break;  		case GL_LUMINANCE_ALPHA:	components = 2; internal_format = GL_LUMINANCE8_ALPHA8;	break;  		case GL_RGB:				components = 3; internal_format = GL_RGB8;				break;  		case GL_RGBA:				components = 4; internal_format = GL_RGBA8;				break; diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp new file mode 100644 index 0000000000..3d110dcc78 --- /dev/null +++ b/indra/newview/llwearableitemslist.cpp @@ -0,0 +1,91 @@ +/** + * @file llwearableitemslist.cpp + * @brief A flat list of wearable items. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llwearableitemslist.h" + +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" + +class LLFindOutfitItems : public LLInventoryCollectFunctor +{ +public: +	LLFindOutfitItems() {} +	virtual ~LLFindOutfitItems() {} +	virtual bool operator()(LLInventoryCategory* cat, +							LLInventoryItem* item); +}; + +bool LLFindOutfitItems::operator()(LLInventoryCategory* cat, +								   LLInventoryItem* item) +{ +	if(item) +	{ +		if((item->getType() == LLAssetType::AT_CLOTHING) +		   || (item->getType() == LLAssetType::AT_BODYPART) +		   || (item->getType() == LLAssetType::AT_OBJECT)) +		{ +			return TRUE; +		} +	} +	return FALSE; +} + +static const LLDefaultChildRegistry::Register<LLWearableItemsList> r("wearable_items_list"); + +LLWearableItemsList::Params::Params() +{} + +LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p) +:	LLInventoryItemsList(p) +{} + +// virtual +LLWearableItemsList::~LLWearableItemsList() +{} + +void LLWearableItemsList::updateList(const LLUUID& category_id) +{ +	LLInventoryModel::cat_array_t cat_array; +	LLInventoryModel::item_array_t item_array; + +	LLFindOutfitItems collector = LLFindOutfitItems(); +	// collectDescendentsIf takes non-const reference: +	gInventory.collectDescendentsIf( +		category_id, +		cat_array, +		item_array, +		LLInventoryModel::EXCLUDE_TRASH, +		collector); + +	refreshList(item_array); +} diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h new file mode 100644 index 0000000000..e7ccba8e6c --- /dev/null +++ b/indra/newview/llwearableitemslist.h @@ -0,0 +1,65 @@ +/** + * @file llwearableitemslist.h + * @brief A flat list of wearable items. + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLWEARABLEITEMSLIST_H +#define LL_LLWEARABLEITEMSLIST_H + +#include "llpanel.h" + +// newview +#include "llinventoryitemslist.h" + +/** + * @class LLWearableItemsList + * + * A flat list of wearable inventory items. + * Collects all items that can be a part of an outfit from + * an inventory category specified by UUID and displays them + * as a flat list. + */ +class LLWearableItemsList : public LLInventoryItemsList +{ +public: +	struct Params : public LLInitParam::Block<Params, LLInventoryItemsList::Params> +	{ +		Params(); +	}; + +	virtual ~LLWearableItemsList(); + +	void updateList(const LLUUID& category_id); + +protected: +	friend class LLUICtrlFactory; +	LLWearableItemsList(const LLWearableItemsList::Params& p); +}; + +#endif //LL_LLWEARABLEITEMSLIST_H diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp index b2de31218b..20266706da 100644 --- a/indra/newview/llwearablelist.cpp +++ b/indra/newview/llwearablelist.cpp @@ -235,9 +235,7 @@ LLWearable* LLWearableList::createNewWearable( EWearableType type )  	LLWearable *wearable = generateNewWearable();  	wearable->setType( type ); -	LLSD item_name = LLSD().with("[WEARABLE_ITEM]", wearable->getTypeLabel()); -	std::string name = LLTrans::getString("NewWearable"); -	LLStringUtil::format(name, item_name); +	std::string name = LLTrans::getString( LLWearableDictionary::getTypeDefaultNewName(wearable->getType()) );  	wearable->setName( name );  	LLPermissions perm; diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 151180aae7..081a3721b1 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1072,18 +1072,10 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask )  			// zoomed out, so don't display anything about the count. JC  			if (agent_count > 0)  			{ -				// Merov: i18n horror!!! Even using gettext(), concatenating strings is not localizable.  -				// The singular/plural switch form here under might make no sense in some languages. Don't do that. -				message += llformat("\n%d ", agent_count); - -				if (agent_count == 1) -				{ -					message += "person"; -				} -				else -				{ -					message += "people"; -				} +				LLStringUtil::format_map_t string_args; +				string_args["[NUMBER]"] = llformat("%d", agent_count); +				message += '\n'; +				message += getString((agent_count == 1 ? "world_map_person" : "world_map_people") , string_args);  			}  		}  		tooltip_msg.assign( message ); diff --git a/indra/newview/skins/default/textures/icons/Progress_1.png b/indra/newview/skins/default/textures/icons/Progress_1.png Binary files differnew file mode 100644 index 0000000000..5d6efbfa2a --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_1.png diff --git a/indra/newview/skins/default/textures/icons/Progress_10.png b/indra/newview/skins/default/textures/icons/Progress_10.png Binary files differnew file mode 100644 index 0000000000..28203324f1 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_10.png diff --git a/indra/newview/skins/default/textures/icons/Progress_11.png b/indra/newview/skins/default/textures/icons/Progress_11.png Binary files differnew file mode 100644 index 0000000000..6b87be0c3f --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_11.png diff --git a/indra/newview/skins/default/textures/icons/Progress_12.png b/indra/newview/skins/default/textures/icons/Progress_12.png Binary files differnew file mode 100644 index 0000000000..089d58b090 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_12.png diff --git a/indra/newview/skins/default/textures/icons/Progress_2.png b/indra/newview/skins/default/textures/icons/Progress_2.png Binary files differnew file mode 100644 index 0000000000..94cb73b1f7 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_2.png diff --git a/indra/newview/skins/default/textures/icons/Progress_3.png b/indra/newview/skins/default/textures/icons/Progress_3.png Binary files differnew file mode 100644 index 0000000000..a04a5b5263 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_3.png diff --git a/indra/newview/skins/default/textures/icons/Progress_4.png b/indra/newview/skins/default/textures/icons/Progress_4.png Binary files differnew file mode 100644 index 0000000000..a467098d82 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_4.png diff --git a/indra/newview/skins/default/textures/icons/Progress_5.png b/indra/newview/skins/default/textures/icons/Progress_5.png Binary files differnew file mode 100644 index 0000000000..ea64f1d907 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_5.png diff --git a/indra/newview/skins/default/textures/icons/Progress_6.png b/indra/newview/skins/default/textures/icons/Progress_6.png Binary files differnew file mode 100644 index 0000000000..fe4447935f --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_6.png diff --git a/indra/newview/skins/default/textures/icons/Progress_7.png b/indra/newview/skins/default/textures/icons/Progress_7.png Binary files differnew file mode 100644 index 0000000000..64fa294771 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_7.png diff --git a/indra/newview/skins/default/textures/icons/Progress_8.png b/indra/newview/skins/default/textures/icons/Progress_8.png Binary files differnew file mode 100644 index 0000000000..a1c9a7f2eb --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_8.png diff --git a/indra/newview/skins/default/textures/icons/Progress_9.png b/indra/newview/skins/default/textures/icons/Progress_9.png Binary files differnew file mode 100644 index 0000000000..f3e9723184 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Progress_9.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 84a99ba92a..bbb82d86b1 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -580,4 +580,17 @@ with the same filename but different name    <texture name="default_profile_picture.j2c" />    <texture name="locked_image.j2c" /> +  <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" /> +  <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" /> +  <texture name="Progress_3" file_name="icons/Progress_3.png" preload="true" /> +  <texture name="Progress_4" file_name="icons/Progress_4.png" preload="true" /> +  <texture name="Progress_5" file_name="icons/Progress_5.png" preload="true" /> +  <texture name="Progress_6" file_name="icons/Progress_6.png" preload="true" /> +  <texture name="Progress_7" file_name="icons/Progress_7.png" preload="true" /> +  <texture name="Progress_8" file_name="icons/Progress_8.png" preload="true" /> +  <texture name="Progress_9" file_name="icons/Progress_9.png" preload="true" /> +  <texture name="Progress_10" file_name="icons/Progress_10.png" preload="true" /> +  <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" /> +  <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" /> +  </textures> diff --git a/indra/newview/skins/default/xui/da/floater_customize.xml b/indra/newview/skins/default/xui/da/floater_customize.xml index b8b4b03277..a47e0d33df 100644 --- a/indra/newview/skins/default/xui/da/floater_customize.xml +++ b/indra/newview/skins/default/xui/da/floater_customize.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="UDSEENDE" width="509"> -	<tab_container name="customize tab container" width="507"> +<floater name="floater customize" title="UDSEENDE"> +	<tab_container name="customize tab container">  		<text label="Krops Dele" name="body_parts_placeholder">  			Kropsdele  		</text> @@ -522,7 +522,7 @@  			<button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/>  		</panel>  	</tab_container> -	<scroll_container left="212" name="panel_container"/> +	<scroll_container name="panel_container"/>  	<button label="Script info" label_selected="Script info" name="script_info" tool_tip="Vis scripts vedhæftet på din avatar"/>  	<button label="Lav sæt" label_selected="Lav sæt" name="make_outfit_btn"/>  	<button label="Annullér" label_selected="Annullér" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml index 5322febe27..38e72dbadf 100644 --- a/indra/newview/skins/default/xui/de/floater_about_land.xml +++ b/indra/newview/skins/default/xui/de/floater_about_land.xml @@ -264,7 +264,7 @@ werden.  			<text left="204" name="selected_objects_text" width="48">  				[COUNT]  			</text> -			<text left="4" name="Autoreturn" width="410"> +			<text name="Autoreturn">  				Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus):  			</text>  			<line_editor name="clean other time" right="-10" width="56"/> diff --git a/indra/newview/skins/default/xui/de/floater_buy_object.xml b/indra/newview/skins/default/xui/de/floater_buy_object.xml index b23163b4a3..c697014b04 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_object.xml @@ -6,7 +6,7 @@  	<text name="buy_text">  		[AMOUNT] L$ von [NAME] kaufen?  	</text> -	<button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/> +	<button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>  	<button label="Kaufen" label_selected="Kaufen" name="buy_btn"/>  	<text name="title_buy_text">  		Kaufen diff --git a/indra/newview/skins/default/xui/de/floater_customize.xml b/indra/newview/skins/default/xui/de/floater_customize.xml index f284d7cd6b..3651577797 100644 --- a/indra/newview/skins/default/xui/de/floater_customize.xml +++ b/indra/newview/skins/default/xui/de/floater_customize.xml @@ -81,7 +81,7 @@  			<texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>  			<button label="Neue Haut" label_selected="Neue Haut" name="Create New"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  		</panel>  		<panel label="Haar" name="Hair"> @@ -116,7 +116,7 @@  			<texture_picker label="Textur" name="Texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>  			<button label="Neue Haare" label_selected="Neue Haare" name="Create New"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  		</panel>  		<panel label="Augen" name="Eyes"> @@ -147,7 +147,7 @@  			<texture_picker label="Iris" name="Iris" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>  			<button label="Neue Augen" label_selected="Neue Augen" name="Create New"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  		</panel>  		<text label="Kleidung" name="clothes_placeholder"> @@ -159,7 +159,7 @@  			<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>  			<button label="Neues Hemd" label_selected="Neues Hemd" name="Create New"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  			<text name="title">  				[DESC] @@ -192,7 +192,7 @@  			<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>  			<button label="Neue Hose" label_selected="Neue Hose" name="Create New"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  			<text name="title">  				[DESC] @@ -249,7 +249,7 @@  			<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>  			<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  		</panel>  		<panel label="Socken" name="Socks"> @@ -282,7 +282,7 @@  			<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>  			<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  		</panel>  		<panel label="Jacke" name="Jacket"> @@ -316,7 +316,7 @@  			<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>  			<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  		</panel>  		<panel label="Handschuhe" name="Gloves"> @@ -349,7 +349,7 @@  			<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>  			<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  		</panel>  		<panel label="Unterhemd" name="Undershirt"> @@ -382,7 +382,7 @@  			<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>  			<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  		</panel>  		<panel label="Unterhose" name="Underpants"> @@ -415,7 +415,7 @@  			<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>  			<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  		</panel>  		<panel label="Rock" name="Skirt"> @@ -448,7 +448,7 @@  			<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>  			<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>  			<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/> -			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/> +			<button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>  			<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>  		</panel>  		<panel label="Tätowierung" name="Tattoo"> diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 59f1889808..40c6b14a4a 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1061,7 +1061,8 @@ Leyla Linden               </text>               left="10"               name="Autoreturn"               top_pad="0" -             width="310"> +             width="412" +             wrap="true">                  Auto return other Residents' objects (minutes, 0 for off):              </text>              <line_editor @@ -1073,9 +1074,9 @@ Leyla Linden               </text>               layout="topleft"               max_length="6"               name="clean other time" -             right="-72" -             width="56" -             top_delta="-6"/> +             left_pad="0" +             width="46" +             top_delta="-2"/>              <text               type="string"               length="1" diff --git a/indra/newview/skins/default/xui/en/floater_buy_object.xml b/indra/newview/skins/default/xui/en/floater_buy_object.xml index f0e5e30010..3d8f5d678b 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_object.xml @@ -5,7 +5,7 @@   height="290"   layout="topleft"   min_height="150" - min_width="200" + min_width="225"   name="contents"   help_topic="contents"   save_rect="true" @@ -52,7 +52,7 @@      <text       type="string"       length="1" -     follows="all" +     follows="left|top|right"       font="SansSerif"       height="16"       layout="topleft" @@ -90,7 +90,8 @@       name="buy_text"       text_color="white"       top_pad="5" -     width="276"> +     use_ellipses="true" +     width="260">          Buy for L$[AMOUNT] from [NAME]?      </text>      <button diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml index 32460e937d..01bced81d0 100644 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ b/indra/newview/skins/default/xui/en/floater_customize.xml @@ -11,7 +11,7 @@   save_rect="true"   title="APPEARANCE"   top_delta="-185" - width="524"> + width="600">      <tab_container       height="517"       layout="topleft" @@ -21,7 +21,7 @@       tab_position="left"       tab_height="50"       top="26" -     width="506"> +     width="580">              <text               type="string"               length="1" @@ -65,15 +65,15 @@               mouse_opaque="true"               width="16" />              <button -             follows="right|bottom" +             follows="left|top"               height="23" -             label="Revert" -             label_selected="Revert" +             label="Create New Shape" +             label_selected="Create New Shape"               layout="topleft" -             right="390" -             name="Revert" -             top="477" -             width="82" /> +             left="10" +             name="Create New" +             top="104" +             width="160" />              <button               follows="left|top"               height="23" @@ -280,46 +280,46 @@               type="string"               length="1"               top="488" -             follows="left|top|right" +             follows="left|top"               font="SansSerif"               halign="right"               height="23"               layout="topleft" +             left="10"               name="Item Action Label" -             right="90" -             width="100"> +             width="130">                  Shape:              </text>              <button -             follows="left|top" -             height="23" -             label="Create New Shape" -             label_selected="Create New Shape" -             layout="topleft" -             left="10" -             name="Create New" -             top="104" -             width="160" /> -            <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft"               name="Save" -             right="186" +             left_pad="2"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft"               name="Save As"               top="477" -             right="304" +             left_pad="3"               width="115" /> +            <button +             follows="left|bottom" +             height="23" +             label="Revert" +             label_selected="Revert" +             layout="topleft" +             left_pad="3" +             name="Revert" +             top="477" +             width="120" />          </panel>          <panel           border="false" @@ -352,6 +352,16 @@              <button               follows="left|top"               height="23" +             label="Create New Skin" +             label_selected="Create New Skin" +             layout="topleft" +             left_delta="0" +             name="Create New" +             top_delta="-249" +             width="160" /> +            <button +             follows="left|top" +             height="23"               label="Skin Color"               label_selected="Skin Color"               layout="topleft" @@ -479,20 +489,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             top="488" -             follows="left|top|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="topleft" -             name="Item Action Label" -             right="90" -             width="100"> -                Skin: -            </text>              <texture_picker               allow_no_texture="true"               can_apply_immediately="true" @@ -532,46 +528,50 @@               tool_tip="Click to choose a picture"               top_delta="102"               width="82" /> -            <button +            <text +             type="string" +             length="1" +             top="488"               follows="left|top" +             font="SansSerif" +             halign="right"               height="23" -             label="Create New Skin" -             label_selected="Create New Skin"               layout="topleft" -             left_delta="0" -             name="Create New" -             top_delta="-249" -             width="160" /> +             left="10" +             name="Item Action Label" +             width="130"> +                Skin: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>          <panel           border="false" @@ -729,20 +729,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             top="488" -             follows="left|top|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="topleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Hair: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -765,36 +751,50 @@               name="Create New"               top_delta="-89"               width="160" /> +            <text +             type="string" +             length="1" +             top="488" +             follows="left|top" +             font="SansSerif" +             halign="right" +             height="23" +             layout="topleft" +             name="Item Action Label" +             left="10" +             width="130"> +                Hair: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>          <panel           border="false" @@ -914,20 +914,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Eyes: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -949,36 +935,50 @@               name="Create New"               top="66"               width="160" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             name="Item Action Label" +             left="10" +             width="130"> +                Eyes: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>              <text               type="string" @@ -1063,36 +1063,50 @@               name="Create New"               top="66"               width="160" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             name="Item Action Label" +             left="10" +             width="130"> +                Shirt: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />              <text               type="string"               length="1" @@ -1183,20 +1197,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Shirt: -            </text>          </panel>          <panel           border="false" @@ -1266,36 +1266,50 @@               name="Create New"               top="66"               width="160" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             name="Item Action Label" +             left="10" +             width="130"> +                Pants: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />              <text               type="string"               length="1" @@ -1386,20 +1400,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Pants: -            </text>          </panel>          <panel           border="false" @@ -1528,20 +1528,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Shoes: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -1573,36 +1559,50 @@               name="Take Off"               top_pad="4"               width="82" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             left="10" +             name="Item Action Label" +             width="130"> +                Shoes: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>          <panel           border="false" @@ -1731,20 +1731,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Socks: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -1776,36 +1762,50 @@               name="Take Off"               top_pad="4"               width="82" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             left="10" +             name="Item Action Label" +             width="130"> +                Socks: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>          <panel           border="false" @@ -1934,20 +1934,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Jacket: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -1990,36 +1976,50 @@               name="Take Off"               top_pad="4"               width="82" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             left="10" +             name="Item Action Label" +             width="130"> +                Jacket: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>          <panel           border="false" @@ -2148,20 +2148,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Gloves: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -2193,36 +2179,50 @@               name="Take Off"               top_pad="4"               width="82" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             left="10" +             name="Item Action Label" +             width="130"> +                Gloves: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>          <panel           border="false" @@ -2351,20 +2351,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Undershirt: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -2396,36 +2382,50 @@               name="Take Off"               top_pad="4"               width="82" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             left="10" +             name="Item Action Label" +             width="130"> +                Undershirt: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>          <panel           border="false" @@ -2554,20 +2554,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Underpants: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -2599,36 +2585,50 @@               name="Take Off"               top_pad="4"               width="82" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             left="10" +             name="Item Action Label" +             width="130"> +                Underpants: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>          <panel           border="false" @@ -2757,20 +2757,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Skirt: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -2802,36 +2788,50 @@               name="Take Off"               top_pad="4"               width="82" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             left="10" +             name="Item Action Label" +             width="130"> +                Skirt: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>          <panel           border="false" @@ -2960,20 +2960,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Tattoo: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -3018,36 +3004,50 @@               top_pad="4"               left="10"               width="82" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             left="10" +             name="Item Action Label" +             width="130"> +                Tattoo: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>          <panel           border="false" @@ -3176,20 +3176,6 @@               width="373">                  You do not have permission to modify this wearable.              </text> -            <text -             type="string" -             length="1" -             bottom="4" -             follows="left|bottom|right" -             font="SansSerif" -             halign="right" -             height="23" -             layout="bottomleft" -             name="Item Action Label" -             right="90"  -             width="100"> -                Alpha: -            </text>              <texture_picker               can_apply_immediately="true"               default_image_name="Default" @@ -3299,47 +3285,61 @@               left="10"               top_pad="20"               width="82" /> +            <text +             type="string" +             length="1" +             bottom="4" +             follows="left|bottom" +             font="SansSerif" +             halign="right" +             height="23" +             layout="bottomleft" +             left="10" +             name="Item Action Label" +             width="130"> +                Alpha: +            </text>              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save"               label_selected="Save"               layout="topleft" -             right="186" +             left_pad="2"               name="Save"               top="477"               width="82" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Save As..."               label_selected="Save As..."               layout="topleft" -             right="304" +             left_pad="3"               name="Save As"               top="477"               width="115" />              <button -             follows="right|bottom" +             follows="left|bottom"               height="23"               label="Revert"               label_selected="Revert"               layout="topleft" -             right="390" +             left_pad="3"               name="Revert"               top="477" -             width="82" /> +             width="120" />          </panel>      </tab_container>      <scroll_container       follows="left|top|right|bottom"       height="409"       layout="topleft" -     left="211" +     left="247"       mouse_opaque="false"       name="panel_container"       top="92" -     width="292"> +     width="330">          <scrolling_panel_list           follows="left|bottom"           layout="topleft" @@ -3355,7 +3355,7 @@       name="script_info"       tool_tip="Show scripts attached to your avatar"       left="13" -     width="90" /> +     width="90" ></button>      <button       bottom="574"       follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml index 65a05f3ec5..ced8c29199 100644 --- a/indra/newview/skins/default/xui/en/floater_im_container.xml +++ b/indra/newview/skins/default/xui/en/floater_im_container.xml @@ -11,7 +11,7 @@   save_visibility="true"   single_instance="true"   title="CONVERSATIONS" - width="392"> + width="396">      <tab_container       follows="left|right|top|bottom"       height="390" @@ -27,7 +27,7 @@       halign="left"       use_ellipses="true"       top="0" -     width="390" /> +     width="394" />      <icon       color="DefaultShadowLight"       enabled="false" @@ -38,5 +38,5 @@       left="1"       name="im_box_tab_container_icon"       bottom="10" -     width="390" /> +     width="394" />  </multi_floater> diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 422e50f035..f537c81860 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -13,7 +13,7 @@   can_minimize="true"   can_close="true"   visible="false" - width="385" + width="394"   can_resize="true"   min_width="250"   min_height="190"> @@ -22,7 +22,7 @@     default_tab_group="2"    follows="all"    height="320" -  width="385" +  width="394"    layout="topleft"    orientation="horizontal"    name="im_panels" @@ -43,7 +43,7 @@         tab_group="2"         top="0"         height="200" -	     width="245" +	     width="254"         user_resize="true">          <button            height="20" @@ -70,7 +70,7 @@           parse_highlights="true"           allow_html="true"          left="1" -         width="240"> +         width="249">          </chat_history>          <line_editor           bottom="0" @@ -81,7 +81,7 @@           layout="bottomleft"           name="chat_editor"           tab_group="3" -         width="240"> +         width="249">          </line_editor>      </layout_panel>    </layout_stack> diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml index 5ea207675b..9db6568ee3 100644 --- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -119,7 +119,7 @@ No Answer.  Please try again later.       layout="topleft"       left="77"       name="leaving" -     top="52" +     top="62"       width="315"       word_wrap="true">  Leaving [CURRENT_CHAT]. diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 49361784ae..6e82bb09ee 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -47,7 +47,7 @@       tab_group="1"       tab_position="left"       tab_width="115" -     tab_padding_right="5" +     tab_padding_right="0"       top="21"       width="658">          <panel diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml index 8b10c7b049..6ca8766e3f 100644 --- a/indra/newview/skins/default/xui/en/menu_object.xml +++ b/indra/newview/skins/default/xui/en/menu_object.xml @@ -18,16 +18,16 @@       name="Edit...">          <menu_item_call.on_click           function="Object.Edit" /> -        <menu_item_call.on_visible +    <menu_item_call.on_visible           function="EnableEdit"/>      </menu_item_call>      <menu_item_call        label="Build"        name="Build">        <menu_item_call.on_click -       function="Object.Edit" /> -      <menu_item_call.on_visible -       function="VisibleBuild"/> +        function="Object.Build" /> +        <menu_item_call.on_visible +         function="EnableEdit"/>      </menu_item_call>     <menu_item_call       enabled="false" diff --git a/indra/newview/skins/default/xui/en/menu_url_agent.xml b/indra/newview/skins/default/xui/en/menu_url_agent.xml index fa05dac148..73f0fa7979 100644 --- a/indra/newview/skins/default/xui/en/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/en/menu_url_agent.xml @@ -7,7 +7,7 @@       layout="topleft"       name="show_agent">          <menu_item_call.on_click -         function="Url.Execute" /> +         function="Url.ShowProfile" />      </menu_item_call>      <menu_item_separator       layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/menu_url_group.xml b/indra/newview/skins/default/xui/en/menu_url_group.xml index c5eaf94d22..2cb125ce09 100644 --- a/indra/newview/skins/default/xui/en/menu_url_group.xml +++ b/indra/newview/skins/default/xui/en/menu_url_group.xml @@ -7,7 +7,7 @@       layout="topleft"       name="show_group">          <menu_item_call.on_click -         function="Url.Execute" /> +         function="Url.ShowProfile" />      </menu_item_call>      <menu_item_separator       layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml index 8e1e5ff062..a585069faa 100644 --- a/indra/newview/skins/default/xui/en/mime_types.xml +++ b/indra/newview/skins/default/xui/en/mime_types.xml @@ -120,7 +120,7 @@  			none  		</widgettype>  		<impl> -			media_plugin_quicktime +			media_plugin_webkit  		</impl>  	</mimetype>  	<mimetype name="none/none"> @@ -130,6 +130,9 @@  		<widgettype>  			none  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="audio/*">  		<label name="audio2_label"> @@ -160,6 +163,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">  		<label name="vnd.secondlife.qt.legacy_label"> @@ -179,6 +185,9 @@  		<widgettype>  			web  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/ogg">  		<label name="application/ogg_label"> @@ -187,6 +196,9 @@  		<widgettype>  			audio  		</widgettype> +		<impl> +			media_plugin_quicktime +		</impl>  	</mimetype>  	<mimetype name="application/pdf">  		<label name="application/pdf_label"> @@ -195,6 +207,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/postscript">  		<label name="application/postscript_label"> @@ -203,6 +218,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/rtf">  		<label name="application/rtf_label"> @@ -211,6 +229,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/smil">  		<label name="application/smil_label"> @@ -219,6 +240,9 @@  		<widgettype>  			movie  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/xhtml+xml">  		<label name="application/xhtml+xml_label"> @@ -227,6 +251,9 @@  		<widgettype>  			web  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/x-director">  		<label name="application/x-director_label"> @@ -235,6 +262,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="audio/mid">  		<label name="audio/mid_label"> diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml index 4748c14554..e95b371d00 100644 --- a/indra/newview/skins/default/xui/en/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml @@ -120,7 +120,7 @@  			none  		</widgettype>  		<impl> -			media_plugin_gstreamer +			media_plugin_webkit  		</impl>  	</mimetype>  	<mimetype name="none/none"> @@ -130,6 +130,9 @@  		<widgettype>  			none  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="audio/*">  		<label name="audio2_label"> @@ -160,6 +163,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">  		<label name="vnd.secondlife.qt.legacy_label"> @@ -179,6 +185,9 @@  		<widgettype>  			web  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/ogg">  		<label name="application/ogg_label"> @@ -187,6 +196,9 @@  		<widgettype>  			audio  		</widgettype> +		<impl> +			media_plugin_gstreamer +		</impl>  	</mimetype>  	<mimetype name="application/pdf">  		<label name="application/pdf_label"> @@ -195,6 +207,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/postscript">  		<label name="application/postscript_label"> @@ -203,6 +218,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/rtf">  		<label name="application/rtf_label"> @@ -211,6 +229,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/smil">  		<label name="application/smil_label"> @@ -219,6 +240,9 @@  		<widgettype>  			movie  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/xhtml+xml">  		<label name="application/xhtml+xml_label"> @@ -227,6 +251,9 @@  		<widgettype>  			web  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/x-director">  		<label name="application/x-director_label"> @@ -235,6 +262,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="audio/mid">  		<label name="audio/mid_label"> diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml index 8e1e5ff062..7931e55c0a 100644 --- a/indra/newview/skins/default/xui/en/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml @@ -130,6 +130,9 @@  		<widgettype>  			none  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="audio/*">  		<label name="audio2_label"> @@ -160,6 +163,9 @@  		<widgettype>  			image  		</widgettype> +        <impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">  		<label name="vnd.secondlife.qt.legacy_label"> @@ -179,6 +185,9 @@  		<widgettype>  			web  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/ogg">  		<label name="application/ogg_label"> @@ -187,6 +196,9 @@  		<widgettype>  			audio  		</widgettype> +		<impl> +			media_plugin_quicktime +		</impl>  	</mimetype>  	<mimetype name="application/pdf">  		<label name="application/pdf_label"> @@ -195,6 +207,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/postscript">  		<label name="application/postscript_label"> @@ -203,6 +218,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/rtf">  		<label name="application/rtf_label"> @@ -211,6 +229,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/smil">  		<label name="application/smil_label"> @@ -219,6 +240,9 @@  		<widgettype>  			movie  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/xhtml+xml">  		<label name="application/xhtml+xml_label"> @@ -227,6 +251,9 @@  		<widgettype>  			web  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="application/x-director">  		<label name="application/x-director_label"> @@ -235,6 +262,9 @@  		<widgettype>  			image  		</widgettype> +		<impl> +			media_plugin_webkit +		</impl>  	</mimetype>  	<mimetype name="audio/mid">  		<label name="audio/mid_label"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 07304eb14e..4479a3dd4d 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -5066,6 +5066,7 @@ No valid parcel could be found.    <notification     icon="notify.tga"     name="ObjectGiveItem" +   persist="true"     type="offer">  An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJECTTYPE]:  [ITEM_SLURL] @@ -5110,6 +5111,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th    <notification     icon="notify.tga"     name="UserGiveItem" +   persist="true"     type="offer">  [NAME_SLURL] has given you this [OBJECTTYPE]:  [ITEM_SLURL] @@ -5162,10 +5164,11 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th    <notification     icon="notify.tga"     name="TeleportOffered" +   persist="true"     type="offer">  [NAME_SLURL] has offered to teleport you to their location: -[MESSAGE], ([MATURITY]) +[MESSAGE] - [MATURITY_STR] <icon>[MATURITY_ICON]</icon>      <form name="form">        <button         index="0" @@ -5207,6 +5210,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th    <notification     icon="notify.tga"     name="OfferFriendship" +   persist="true"     type="offer">  [NAME_SLURL] is offering friendship. diff --git a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml new file mode 100644 index 0000000000..5fcc9b012b --- /dev/null +++ b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder--> +<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtime--> +<!-- Non of string values of controls below are visible to user. They are not need to be translated. --> +<accordion_tab + display_children="false" + follows="all" + height="45" + layout="topleft" + name="Mockup Tab" + title="Mockup Tab" + translate="false" + width="0"> +    <wearable_items_list +     allow_select="true" +     follows="all" +     keep_one_selected="true" +     name="wearable_items_list" +     translate="false" +    /> +</accordion_tab> diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml new file mode 100644 index 0000000000..01c7ae61d2 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + bg_alpha_color="DkGray" + border="false" + bottom="0" + follows="all" + height="200" + left="0" + name="cof_wearables" + width="313"> +    <accordion +     follows="all" +     height="373" +     layout="topleft" +     left="3" +     top="0" +     name="cof_wearables_accordion" +     background_visible="true" +     bg_alpha_color="DkGray2" +     width="307"> +        <accordion_tab +         layout="topleft" +         name="tab_attachments" +         title="Attachments"> +            <flat_list_view +             allow_select="true" +             follows="all" +             height="150" +             layout="topleft" +             left="0" +             name="list_attachments" +             top="0" +             width="307" /> +        </accordion_tab> +        <accordion_tab +         layout="topleft" +         name="tab_clothing" +         title="Clothing"> +            <flat_list_view +             allow_select="true" +             follows="all" +             height="150" +             layout="topleft" +             left="0" +             name="list_clothing" +             top="0" +             width="307" /> +        </accordion_tab> +        <accordion_tab +         layout="topleft" +         name="tab_body_parts" +         title="Body Parts"> +            <flat_list_view +             allow_select="true" +             follows="all" +             height="150" +             layout="topleft" +             left="0" +             name="list_body_parts" +             top="0" +             width="307" /> +        </accordion_tab> +    </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index 9e99a8ceaf..76f7484c68 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -17,6 +17,10 @@          You don't have permission to view group owned land      </panel.string>      <panel.string +     name="epmty_view_group_land_text"> +        No entries +    </panel.string> +    <panel.string       name="cant_view_group_accounting_text">          You don't have permission to view the group's accounting information.      </panel.string> diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index 29c6a17c31..33a5e01e4c 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -3,14 +3,14 @@   border="false"   height="300"   name="panel_im_control_panel" - width="110"> + width="119">      <avatar_icon       follows="left|top"       height="105"       left_delta="5"       name="avatar_icon"       top="-5" -     width="105"/> +     width="114"/>      <layout_stack       mouse_opaque="false"       border_size="0" @@ -22,7 +22,7 @@       name="button_stack"       orientation="vertical"       top_pad="5" -     width="105"> +     width="114">          <layout_panel           mouse_opaque="false"           auto_resize="true" @@ -31,7 +31,7 @@           layout="topleft"           left="2"           min_height="0" -         width="100" +         width="109"           top="0"           name="spacer"           user_resize="false" /> @@ -41,7 +41,7 @@           height="20"           layout="topleft"           min_height="20" -         width="100" +         width="109"           name="view_profile_btn_panel"           user_resize="false">              <button @@ -50,7 +50,7 @@               label="Profile"               name="view_profile_btn"               top="0" -             width="100" /> +             width="109" />          </layout_panel>          <layout_panel           auto_resize="false" @@ -58,7 +58,7 @@           height="25"           layout="topleft"           min_height="25" -         width="100" +         width="109"           name="add_friend_btn_panel"           user_resize="false">              <button @@ -67,7 +67,7 @@               label="Add Friend"               name="add_friend_btn"               top="5" -             width="100" /> +             width="109" />          </layout_panel>          <layout_panel           auto_resize="false" @@ -75,7 +75,7 @@           height="25"           layout="topleft"           min_height="25" -         width="100" +         width="109"           name="teleport_btn_panel"           user_resize="false">          <button @@ -85,7 +85,7 @@               label="Teleport"               name="teleport_btn"               tool_tip = "Offer to teleport this person" -             width="100" /> +             width="109" />          </layout_panel>          <layout_panel           auto_resize="false" @@ -93,7 +93,7 @@           height="25"           layout="topleft"           min_height="25" -         width="100" +         width="109"           name="share_btn_panel"           user_resize="false">             <button @@ -102,7 +102,7 @@               height="23"               label="Share"               name="share_btn" -             width="100" /> +             width="109" />          </layout_panel>          <layout_panel           auto_resize="false" @@ -110,7 +110,7 @@           height="25"           layout="topleft"           min_height="25" -         width="100" +         width="109"           name="pay_btn_panel"           user_resize="false">             <button @@ -119,7 +119,7 @@               height="23"               label="Pay"               name="pay_btn" -             width="100" /> +             width="109" />          </layout_panel>          <layout_panel           auto_resize="false" @@ -127,7 +127,7 @@           height="25"           layout="topleft"           min_height="25" -         width="100" +         width="109"           name="call_btn_panel"           user_resize="false">              <button @@ -135,7 +135,7 @@               height="23"               label="Call"               name="call_btn" -             width="100" /> +             width="109" />          </layout_panel>          <layout_panel           auto_resize="false" @@ -143,7 +143,7 @@           height="25"           layout="topleft"           min_height="25" -         width="100" +         width="109"           name="end_call_btn_panel"           user_resize="false"           visible="false"> @@ -152,7 +152,7 @@               height="23"               label="End Call"               name="end_call_btn" -             width="100" /> +             width="109" />          </layout_panel>          <layout_panel           auto_resize="false" @@ -160,7 +160,7 @@           height="25"           layout="topleft"           min_height="25" -         width="100" +         width="109"           name="voice_ctrls_btn_panel"           user_resize="false"           visible="false"> @@ -169,7 +169,7 @@               height="23"               label="Voice Controls"               name="voice_ctrls_btn" -             width="100" /> +             width="109" />          </layout_panel>      </layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_inventory_item.xml b/indra/newview/skins/default/xui/en/panel_inventory_item.xml new file mode 100644 index 0000000000..f1b7b92ece --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_inventory_item.xml @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + follows="top|right|left" + height="20" + layout="topleft" + left="0" + name="inventory_item" + top="0" + width="380"> +    <icon +     follows="top|right|left" +     height="20" +     image_name="ListItem_Over" +     layout="topleft" +     left="0" +     name="hovered_icon" +     top="0" +     visible="false" +     width="380" /> +    <icon +     height="20" +     follows="top|right|left" +     image_name="ListItem_Select" +     layout="topleft" +     left="0" +     name="selected_icon" +     top="0" +     visible="false" +     width="380" /> +    <icon +     height="16" +     follows="top|left" +     image_name="Inv_Object" +     layout="topleft" +     left="0" +     name="item_icon" +     top="0" +     width="16" /> +    <text +     follows="left|right" +     height="20" +     layout="topleft" +     left_pad="5" +     allow_html="false" +     use_ellipses="true" +     name="item_name" +     text_color="white" +     top="4" +     value="..." +     width="359" /> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml index 5e41d65720..841a4f5713 100644 --- a/indra/newview/skins/default/xui/en/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml @@ -401,14 +401,6 @@           name="edit_profile_btn"           tool_tip="Edit your personal information"           width="152" /> -        <button -         follows="bottom|right" -         height="23" -         label="Edit Appearance" -         left_pad="3" -         name="edit_appearance_btn" -         tool_tip="Create/edit your appearance: physical data, clothes and etc." -         width="153" />   </layout_panel>  </layout_stack>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml index 184ea54fcb..5dbd8bfe6a 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml @@ -17,7 +17,7 @@       layout="topleft"       left_delta="3"       left="0" -     max_length="512" +     max_length="1024"       name="chat_box"       text_pad_left="5"       text_pad_right="25" diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml index ff2aae645b..f5a78fc929 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml @@ -7,7 +7,7 @@    background_opaque="true"  	background_visible="true"  	layout="topleft" -	width="270" +	width="328"  	height="230"  	name="nearby_media"  	help_topic="nearby_media"> @@ -29,7 +29,7 @@  		follows="left"  		tool_tip="Turn all nearby media off"  		left="8" -		width="66" +		width="95"  		height="22"  		label="Stop All">  	  <button.commit_callback @@ -40,7 +40,7 @@  		follows="left"  		tool_tip="Turn all nearby media on"  		left_pad="4" -		width="66" +		width="95"  		height="22"  		label="Start All">  	  <button.commit_callback 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 c77e4e8d5e..73181392c9 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -149,29 +149,18 @@           auto_resize="true"           user_resize="true"> -            <scroll_list -             width="300" -             column_padding="0" -             draw_heading="false" -             draw_stripes="false" +            <!-- List containing items from the COF and Base outfit --> +            <panel +             background_visible="false" +             class="cof_wearables" +             filename="panel_cof_wearables.xml"               follows="left|top|right|bottom" +             height="193"               layout="topleft" -             name="look_items_list" -             search_column="1" -             sort_column="2"               left="0" -             height="193" -             top="0"> -                <scroll_list.columns -                 label="Look Item" -                 name="look_item" -                 width="285" /> -                <scroll_list.columns -                 label="Outfit Item Sort" -                 width="0" -                 sort_column="look_item_sort" -                 name="look_item_sort" /> -            </scroll_list> +             name="cof_wearables_list" +             top="0" +             width="300" />             <panel               background_visible="true" @@ -222,6 +211,30 @@                   top="1"                   width="31" />                  <button +                 follows="bottom|left" +                 height="25" +                 image_hover_unselected="Toolbar_Middle_Over" +                 image_overlay="Movement_Forward_On" +                 image_selected="Toolbar_Middle_Selected" +                 image_unselected="Toolbar_Middle_Off" +                 layout="topleft" +                 left_pad="1" +                 name="move_closer_btn" +                 top="1" +                 width="31" /> +                <button +                 follows="bottom|left" +                 height="25" +                 image_hover_unselected="Toolbar_Middle_Over" +                 image_overlay="Movement_Backward_On" +                 image_selected="Toolbar_Middle_Selected" +                 image_unselected="Toolbar_Middle_Off" +                 layout="topleft" +                 left_pad="1" +                 name="move_further_btn" +                 top="1" +                 width="31" /> +                <button                   follows="bottom|right"                   height="25"                   image_hover_unselected="Toolbar_Middle_Over" @@ -342,6 +355,30 @@               width="300"/>              <panel +             name="filtered_wearables_panel" +             background_opaque="true" +             background_visible="true" +             layout="topleft" +             follows="left|top|right|bottom" +             border="false" +             height="155" +             left="0" +             mouse_opaque="false" +             width="300" +             top_delta="0" +             visible="false"> +             <wearable_items_list +              name="filtered_wearables_list" +              allow_select="true" +              layout="topleft" +              follows="all" +              width="300" +              height="155" +              left="0" +              top="0" /> +            </panel> + +            <panel               background_visible="true"               bevel_style="none"               follows="left|right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml index 66ed43efec..b8ad278da7 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml @@ -23,20 +23,16 @@       tab_position="top"       halign="center"       width="312"> -         <inventory_panel +         <panel +           class="outfits_list" +           filename="panel_outfits_list.xml" +           height="490" +           name="outfitslist_tab"             background_visible="true" -           background_opaque="true" -           label="MY OUTFITS" -           help_topic="my_outfits_tab" -           allow_multi_select="true"             follows="all" -           border="false" -           left="0" -           top="0" -           width="315" -           mouse_opaque="true" -           name="outfitslist_tab" -           start_folder="My Outfits" />  +           label="MY OUTFITS" +           layout="topleft" +           width="315" />           <inventory_panel             follows="all"             background_visible="true" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml new file mode 100644 index 0000000000..5cf94c25d7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel +   background_visible="true" +   bg_alpha_color="DkGray" +   border="false" +   follows="all" +   height="400" +   name="Outfits" +   layout="topleft" +   left="0" +   top="0" +   width="313"> +    <accordion +     background_visible="true" +     bg_alpha_color="DkGray2" +     bg_opaque_color="DkGray2" +     follows="all" +     height="400" +     layout="topleft" +     left="3" +     name="outfits_accordion" +     top="0" +     width="307"> +    </accordion> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 61784fede4..066ea3be6e 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -16,13 +16,13 @@       value="No recent people. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]." />      <string       name="no_filtered_recent_people" -     value="Didn't find what you're looking for? Try [secondlife:///app/search/people Search]." /> +     value="Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]." />      <string       name="no_one_near"       value="No one nearby. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]." />      <string       name="no_one_filtered_near" -     value="Didn't find what you're looking for? Try [secondlife:///app/search/people Search]." /> +     value="Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]." />      <string       name="no_friends_online"       value="No friends online" /> @@ -30,6 +30,15 @@       name="no_friends"       value="No friends" />      <string +     name="no_friends_msg"> +         Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend. +Looking for people to hang out with? Try the [secondlife:///app/worldmap World Map]. +    </string> +    <string +     name="no_filtered_friends_msg"> +         Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]. +    </string> +    <string       name="people_filter_label"       value="Filter People" />      <string @@ -41,7 +50,7 @@       -->      <string       name="no_filtered_groups_msg" -     value="Didn't find what you're looking for? Try [secondlife:///app/search/groups Search]." /> +     value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." />      <string       name="no_groups_msg"       value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." /> @@ -265,14 +274,11 @@              <text               follows="all"               height="450" -             left="10" -             name="no_friends_msg" +             left="13" +             name="no_friends_help_text"               top="10"               width="293" -             wrap="true"> -                Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend. -Looking for people to hang out with? Try the [secondlife:///app/worldmap World Map]. -             </text> +             wrap="true" />          </panel>          <panel           background_opaque="true" @@ -293,6 +299,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M       Values are set from appropriate strings at the top of file via LLPeoplePanel::postBuild()      -->              <group_list +             allow_select="true"                background_visible="true"               bg_alpha_color="DkGray2"               bg_opaque_color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 500e65b916..2c6ceeef2e 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -374,5 +374,5 @@     min_val="10"     name="web_proxy_port"     top_delta="0" -   width="140" /> +   width="145" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index a666608103..d7a601d7a3 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -389,14 +389,6 @@           name="edit_profile_btn"           tool_tip="Edit your personal information"           width="130" /> -        <button -         follows="bottom|right" -         height="23" -         label="Edit Appearance" -         left_pad="10" -         name="edit_appearance_btn" -         tool_tip="Create/edit your appearance: physical data, clothes and etc." -         width="130" />          </layout_panel>  </layout_stack> diff --git a/indra/newview/skins/default/xui/en/panel_world_map.xml b/indra/newview/skins/default/xui/en/panel_world_map.xml index 9f08d3a817..16860a6117 100644 --- a/indra/newview/skins/default/xui/en/panel_world_map.xml +++ b/indra/newview/skins/default/xui/en/panel_world_map.xml @@ -45,6 +45,14 @@       name="world_map_northwest">          NW      </panel.string> +    <panel.string +     name="world_map_person"> +        1 person +    </panel.string> +    <panel.string +     name="world_map_people"> +        [NUMBER] people +    </panel.string>      <text       type="string"       length="1" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 80fddcba43..b0e43e72ed 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1842,7 +1842,8 @@ Clears (deletes) the media and all params from the given face.  	<string name="LeaveMouselook">Press ESC to return to World View</string>  	<!-- inventory --> -	<string name="InventoryNoMatchingItems">No matching items found in inventory.  Try [secondlife:///app/search/groups "Search"].</string> +	<string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string> +	<string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>  	<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>  	<string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>      <!-- use value="" because they have preceding spaces --> @@ -2897,6 +2898,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].    <string name="LocationCtrlBuildTooltip">Building/dropping objects not allowed</string>    <string name="LocationCtrlScriptsTooltip">Scripts not allowed</string>    <string name="LocationCtrlDamageTooltip">Health</string> +  <string name="LocationCtrlAdultIconTooltip">Adult Region</string> +  <string name="LocationCtrlModerateIconTooltip">Moderate Region</string> +  <string name="LocationCtrlGeneralIconTooltip">General Region</string>    <!-- Strings used by the (currently Linux) auto-updater app -->  	<string name="UpdaterWindowTitle"> @@ -2930,6 +2934,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  	  Failed to start viewer  	</string> +	<!-- System Messages --> +	<string name="ItemsComingInTooFastFrom">[APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds</string> +	<string name="ItemsComingInTooFast">[APP_NAME]: Items coming in too fast, automatic preview disabled for [TIME] seconds</string> +  	<!-- IM system messages -->  	<string name="IM_logging_string">-- Instant message logging enabled --</string>  	<string name="IM_typing_start_string">[NAME] is typing...</string> @@ -3110,4 +3118,7 @@ Abuse Report</string>    <string name="DefaultMimeType">none/none</string>    <string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string> +  <!-- language specific white-space characters, delimiters, spacers, item separation symbols --> +  <string name="sentences_separator" value=" "></string> +    </strings> diff --git a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml new file mode 100644 index 0000000000..6040d24128 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<loading_indicator +    follows="left|top" +    mouse_opaque="false" +    name="loading_indicator" +    rotations_per_sec="1.0" +    tab_stop="false" +/> diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 1d61447e31..02ea661da3 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -6,6 +6,8 @@  <location_input font="SansSerifSmall"                  icon_maturity_general="Parcel_PG_Light"                  icon_maturity_adult="Parcel_R_Light" +                icon_maturity_moderate="Parcel_M_Light" +                maturity_help_topic="TODO"                  add_landmark_image_enabled="Favorite_Star_Active"                  add_landmark_image_disabled="Favorite_Star_Off"                  add_landmark_image_hover="Favorite_Star_Over" @@ -43,7 +45,7 @@                            scale_image="false"  			  top="19"  			  left="-3" /> -  <maturity_icon +  <maturity_button      name="maturity_icon"      width="18"      height="16" diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml index 6118a63872..f3a278945c 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -263,7 +263,7 @@ Vaya al menú Mundo > Acerca del terreno o seleccione otra parcela para ver s  			<text left="204" name="selected_objects_text" width="48">  				[COUNT]  			</text> -			<text left="4" name="Autoreturn" width="412"> +			<text name="Autoreturn">  				Devolución automát. de objetos de otros (en min., 0 la desactiva):  			</text>  			<line_editor name="clean other time" right="-20"/> diff --git a/indra/newview/skins/default/xui/es/floater_customize.xml b/indra/newview/skins/default/xui/es/floater_customize.xml index b7058d4314..77b670d5f0 100644 --- a/indra/newview/skins/default/xui/es/floater_customize.xml +++ b/indra/newview/skins/default/xui/es/floater_customize.xml @@ -81,7 +81,7 @@  			<texture_picker label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>  			<button label="Crear una piel nueva" label_selected="Crear una piel nueva" name="Create New"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  		</panel>  		<panel label="Pelo" name="Hair"> @@ -116,7 +116,7 @@  			<texture_picker label="Textura" name="Texture" tool_tip="Pulse para elegir una imagen"/>  			<button label="Crear un pelo nuevo" label_selected="Crear un pelo nuevo" name="Create New"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  		</panel>  		<panel label="Ojos" name="Eyes"> @@ -147,7 +147,7 @@  			<texture_picker label="Iris" name="Iris" tool_tip="Pulse para elegir una imagen"/>  			<button label="Crear unos ojos nuevos" label_selected="Crear unos ojos nuevos" name="Create New"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  		</panel>  		<text label="Ropa" name="clothes_placeholder"> @@ -159,7 +159,7 @@  			<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>  			<button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  			<text name="title">  				[DESC] @@ -192,7 +192,7 @@  			<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>  			<button label="Crear unos pantalones nuevos" label_selected="Crear unos pantalones nuevos" name="Create New" width="185"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  			<text name="title">  				[DESC] @@ -249,7 +249,7 @@  			<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>  			<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  		</panel>  		<panel label="Calcetines" name="Socks"> @@ -282,7 +282,7 @@  			<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>  			<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  		</panel>  		<panel label="Chaqueta" name="Jacket"> @@ -316,7 +316,7 @@  			<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>  			<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  		</panel>  		<panel label="Guantes" name="Gloves"> @@ -349,7 +349,7 @@  			<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>  			<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  		</panel>  		<panel label="Camiseta" name="Undershirt"> @@ -382,7 +382,7 @@  			<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>  			<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  		</panel>  		<panel label="Ropa interior" name="Underpants"> @@ -415,7 +415,7 @@  			<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>  			<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  		</panel>  		<panel label="Falda" name="Skirt"> @@ -448,7 +448,7 @@  			<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>  			<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>  			<button label="Guardar" label_selected="Guardar" left="113" name="Save"/> -			<button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/> +			<button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>  			<button label="Restablecer" label_selected="Restablecer" name="Revert"/>  		</panel>  		<panel label="Tatuaje" name="Tattoo"> diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml index 5d630cdf48..2e52a90373 100644 --- a/indra/newview/skins/default/xui/fr/floater_about_land.xml +++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml @@ -267,7 +267,7 @@ ou divisé.  			<text left_delta="214" name="selected_objects_text" width="48">  				[COUNT]  			</text> -			<text left="4" name="Autoreturn" width="440"> +			<text name="Autoreturn">  				Renvoi automatique des objets d'autres résidents (minutes, 0 pour désactiver) :  			</text>  			<line_editor name="clean other time" right="-6" width="36"/> diff --git a/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml index 2bcf567655..c54e3e9ce0 100644 --- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml @@ -25,7 +25,7 @@  	<text left="8" name="Current color:">  		Couleur actuelle :  	</text> -	<text left="8" name="(Drag below to save.)" width="220"> +	<text name="(Drag below to save.)">  		Enr. : faire glisser dessous  	</text>  </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_customize.xml b/indra/newview/skins/default/xui/fr/floater_customize.xml index 6da010776e..ff407b25c1 100644 --- a/indra/newview/skins/default/xui/fr/floater_customize.xml +++ b/indra/newview/skins/default/xui/fr/floater_customize.xml @@ -1,11 +1,11 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="APPARENCE" width="548"> -	<tab_container name="customize tab container" tab_min_width="150" width="546"> +<floater name="floater customize" title="APPARENCE"> +	<tab_container name="customize tab container" tab_min_width="150">  		<text label="Parties du corps" name="body_parts_placeholder">  			Parties du corps  		</text>  		<panel label="Silhouette" left="154" name="Shape" width="389"> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  			<button label="Corps" label_selected="Corps" name="Body"/>  			<button label="Tête" label_selected="Tête" name="Head"/>  			<button label="Yeux" label_selected="Yeux" name="Eyes"/> @@ -44,8 +44,8 @@  				Silhouette :  			</text>  			<button label="Créer une silhouette" label_selected="Créer une silhouette" name="Create New"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>  		</panel>  		<panel label="Peau" name="Skin">  			<button label="Couleur" label_selected="Couleur" name="Skin Color" width="84"/> @@ -80,9 +80,9 @@  			<texture_picker label="Tatouages haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>  			<texture_picker label="Tatouages bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>  			<button label="Créer une peau" label_selected="Créer une peau" name="Create New"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  		</panel>  		<panel label="Cheveux" name="Hair">  			<button label="Couleur" label_selected="Couleur" name="Color"/> @@ -115,9 +115,9 @@  			</text>  			<texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/>  			<button label="Créer des cheveux" label_selected="Créer des cheveux" name="Create New"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  		</panel>  		<panel label="Yeux" name="Eyes">  			<text name="title"> @@ -146,9 +146,9 @@  			</text>  			<texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/>  			<button label="Créer des yeux" label_selected="Créer des yeux" name="Create New"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  		</panel>  		<text label="Habits" name="clothes_placeholder">  			Habits @@ -158,9 +158,9 @@  			<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>  			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>  			<button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  			<text name="title">  				[DESC]  			</text> @@ -191,9 +191,9 @@  			<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>  			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>  			<button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  			<text name="title">  				[DESC]  			</text> @@ -248,9 +248,9 @@  			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>  			<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>  			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  		</panel>  		<panel label="Chaussettes" name="Socks">  			<text name="title"> @@ -281,9 +281,9 @@  			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>  			<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>  			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  		</panel>  		<panel label="Veste" name="Jacket">  			<text name="title"> @@ -315,9 +315,9 @@  			<texture_picker label="Tissu (dessous)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>  			<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="81"/>  			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  		</panel>  		<panel label="Gants" name="Gloves">  			<text name="title"> @@ -348,9 +348,9 @@  			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>  			<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>  			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  		</panel>  		<panel label="Débardeur" name="Undershirt">  			<text name="title"> @@ -375,15 +375,15 @@  			<text name="no modify instructions">  				Vous n'avez pas la permission de modifier cet objet.  			</text> -			<text bottom="-470" name="Item Action Label" right="92"> +			<text name="Item Action Label">  				Débardeur :  			</text>  			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>  			<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>  			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  		</panel>  		<panel label="Caleçon" name="Underpants">  			<text name="title"> @@ -408,15 +408,15 @@  			<text name="no modify instructions">  				Vous n'avez pas la permission de modifier cet objet.  			</text> -			<text bottom="-470" name="Item Action Label" right="92"> +			<text name="Item Action Label">  				Caleçon :  			</text>  			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>  			<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>  			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  		</panel>  		<panel label="Jupe" name="Skirt">  			<text name="title"> @@ -447,9 +447,9 @@  			<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>  			<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>  			<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/> -			<button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/> -			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/> -			<button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/> +			<button label="Enregistrer" label_selected="Enregistrer" name="Save"/> +			<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/> +			<button label="Rétablir" label_selected="Rétablir" name="Revert"/>  		</panel>  		<panel label="Tatouage" name="Tattoo">  			<text name="title"> diff --git a/indra/newview/skins/default/xui/fr/menu_group_plus.xml b/indra/newview/skins/default/xui/fr/menu_group_plus.xml index f5882261b0..0db5afedc7 100644 --- a/indra/newview/skins/default/xui/fr/menu_group_plus.xml +++ b/indra/newview/skins/default/xui/fr/menu_group_plus.xml @@ -1,5 +1,5 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <menu name="menu_group_plus"> -	<menu_item_call label="Rejoignez des groupes..." name="item_join"/> +	<menu_item_call label="Rejoindre des groupes..." name="item_join"/>  	<menu_item_call label="Nouveau groupe..." name="item_new"/>  </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml index 91bccfd699..4cfdfd2614 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml @@ -7,7 +7,7 @@  	<menu_item_call label="Réinitialiser les filtres" name="reset_filters"/>  	<menu_item_call label="Fermer tous les dossiers" name="close_folders"/>  	<menu_item_call label="Vider la corbeille" name="empty_trash"/> -	<menu_item_call label="Vider les Objets trouvés" name="empty_lostnfound"/> +	<menu_item_call label="Vider les objets trouvés" name="empty_lostnfound"/>  	<menu_item_call label="Enregistrer la texture sous" name="Save Texture As"/>  	<menu_item_call label="Trouver l'original" name="Find Original"/>  	<menu_item_call label="Trouver tous les liens" name="Find All Links"/> diff --git a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml index 1a4450cccc..6cd9db2a5e 100644 --- a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml @@ -23,7 +23,7 @@  			<menu_item_call label="Réinitialiser les filtres" name="Reset Current"/>  			<menu_item_call label="Fermer tous les dossiers" name="Close All Folders"/>  			<menu_item_call label="Vider la corbeille" name="Empty Trash"/> -			<menu_item_call label="Vider les Objets trouvés" name="Empty Lost And Found"/> +			<menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/>  		</menu>  		<menu label="Créer" name="Create">  			<menu_item_call label="Nouveau dossier" name="New Folder"/> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 61659d386b..6d81df5cdb 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -2085,7 +2085,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].  		Large  	</string>  	<string name="Brow Size"> -		Taille +		Taille du front  	</string>  	<string name="Bug Eyes">  		Yeux globuleux @@ -2235,7 +2235,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].  		Extrémités  	</string>  	<string name="Egg Head"> -		Forme de la tête +		Proéminence  	</string>  	<string name="Eye Bags">  		Cernes @@ -2559,7 +2559,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].  		Fente labiale  	</string>  	<string name="Lip Cleft Depth"> -		Fente labiale +		Prof. fente labiale  	</string>  	<string name="Lip Fullness">  		Volume des lèvres @@ -2643,7 +2643,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].  		Abaisser  	</string>  	<string name="Lower Bridge"> -		Arête plus basse +		Arête inférieure  	</string>  	<string name="Lower Cheeks">  		Joue inférieure @@ -2817,10 +2817,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].  		Épaisseur du nez  	</string>  	<string name="Nose Tip Angle"> -		Bout du nez +		Angle bout du nez  	</string>  	<string name="Nose Tip Shape"> -		Bout du nez +		Forme bout du nez  	</string>  	<string name="Nose Width">  		Largeur du nez @@ -2946,7 +2946,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].  		Plus  	</string>  	<string name="Puffy Eyelids"> -		Cernes +		Paup. gonflées  	</string>  	<string name="Rainbow Color">  		Couleur arc en ciel @@ -3237,7 +3237,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].  		Arête supérieure  	</string>  	<string name="Upper Cheeks"> -		Pommette +		Joue supérieure  	</string>  	<string name="Upper Chin Cleft">  		Menton supérieur diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml index bc23c2e8ff..742cdf44a5 100644 --- a/indra/newview/skins/default/xui/it/floater_about_land.xml +++ b/indra/newview/skins/default/xui/it/floater_about_land.xml @@ -266,7 +266,7 @@ o suddivisa.  			<text left="214" name="selected_objects_text" width="48">  				[COUNT]  			</text> -			<text left="4" name="Autoreturn" width="412"> +			<text name="Autoreturn">  				Restituzione automatica degli oggetti di altri residenti (minuti, 0 per disattivarla):  			</text>  			<line_editor name="clean other time" right="-20"/> diff --git a/indra/newview/skins/default/xui/it/floater_customize.xml b/indra/newview/skins/default/xui/it/floater_customize.xml index 75ddf43f65..63c26b4d73 100644 --- a/indra/newview/skins/default/xui/it/floater_customize.xml +++ b/indra/newview/skins/default/xui/it/floater_customize.xml @@ -1,11 +1,11 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="ASPETTO" width="551"> -	<tab_container name="customize tab container" tab_min_width="120" width="549"> +<floater name="floater customize" title="ASPETTO"> +	<tab_container name="customize tab container" tab_min_width="120">  		<text label="Parti del corpo" name="body_parts_placeholder">  			Parti del corpo  		</text> -		<panel label="Forma del corpo" left="124" name="Shape" width="389"> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +		<panel label="Forma del corpo" left="124" name="Shape"> +			<button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/>  			<button label="Corpo" label_selected="Corpo" name="Body"/>  			<button label="Testa" label_selected="Testa" name="Head"/>  			<button label="Occhi" label_selected="Occhi" name="Eyes"/> @@ -40,12 +40,12 @@  			<text name="no modify instructions">  				Non hai il permesso di modificare questo indumento.  			</text> -			<text name="Item Action Label" right="89"> +			<text name="Item Action Label">  				Forma del corpo:  			</text> -			<button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> -			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> +			<button label="Salva" label_selected="Salva" name="Save"/> +			<button label="Salva come..." label_selected="Salva come..." name="Save As"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>  		</panel>  		<panel label="Pelle" name="Skin">  			<button label="Colore della pelle" label_selected="Colore della pelle" name="Skin Color" width="115"/> @@ -80,9 +80,9 @@  			<texture_picker label="Tatuaggi: superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un'immagine" width="96"/>  			<texture_picker label="Tatuaggi: inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un'immagine" width="96"/>  			<button label="Crea una nuova pelle" label_selected="Crea una nuova pelle" name="Create New"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> -			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button label="Salva" label_selected="Salva" name="Save"/> +			<button label="Salva come..." label_selected="Salva come..." name="Save As"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>  		</panel>  		<panel label="Capelli" name="Hair">  			<button label="Capelli" label_selected="Colore" name="Color"/> @@ -115,9 +115,9 @@  			</text>  			<texture_picker label="Texture" name="Texture" tool_tip="Clicca per scegliere un'immagine"/>  			<button label="Crea nuovi capelli" label_selected="Crea nuovi capelli" name="Create New"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>  		</panel>  		<panel label="Occhi" name="Eyes">  			<text name="title"> @@ -146,9 +146,9 @@  			</text>  			<texture_picker label="Iride" name="Iris" tool_tip="Clicca per scegliere un'immagine"/>  			<button label="Crea nuovi occhi" label_selected="Crea nuovi occhi" name="Create New"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>  		</panel>  		<text label="Vestiti" name="clothes_placeholder">  			Abiti @@ -158,9 +158,9 @@  			<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>  			<button label="Togli" label_selected="Togli" name="Take Off"/>  			<button label="Crea una nuova camicia" label_selected="Crea una nuova camicia" name="Create New"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche"  name="Revert" width="120"/>  			<text name="title">  				[DESC]  			</text> @@ -191,9 +191,9 @@  			<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>  			<button label="Togli" label_selected="Togli" name="Take Off"/>  			<button label="Crea nuovi pantaloni" label_selected="Crea nuovi pantaloni" name="Create New"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>  			<text name="title">  				[DESC]  			</text> @@ -248,9 +248,9 @@  			<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/>  			<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>  			<button label="Togli" label_selected="Togli" name="Take Off"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>  		</panel>  		<panel label="Calze" name="Socks">  			<text name="title"> @@ -281,9 +281,9 @@  			<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/>  			<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>  			<button label="Togli" label_selected="Togli" name="Take Off"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>  		</panel>  		<panel label="Giacca" name="Jacket">  			<text name="title"> @@ -315,9 +315,9 @@  			<texture_picker label="Tessuto: inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere un'immagine" width="96"/>  			<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>  			<button label="Togli" label_selected="Togli" name="Take Off"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>  		</panel>  		<panel label="Guanti" name="Gloves">  			<text name="title"> @@ -348,9 +348,9 @@  			<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/>  			<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>  			<button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>  		</panel>  		<panel label="Canottiera" name="Undershirt">  			<text name="title"> @@ -381,9 +381,9 @@  			<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/>  			<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>  			<button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>  		</panel>  		<panel label="Mutande" name="Underpants">  			<text name="title"> @@ -414,9 +414,9 @@  			<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/>  			<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>  			<button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>  		</panel>  		<panel label="Gonna" name="Skirt">  			<text name="title"> @@ -447,9 +447,9 @@  			<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/>  			<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>  			<button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> -			<button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/> +			<button label="Salva" label_selected="Salva" name="Save"/>  			<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> -			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/> +			<button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>  		</panel>  		<panel label="Tatuaggio" name="Tattoo">  			<text name="title"> @@ -522,7 +522,7 @@  			<button label="Ripristina" label_selected="Ripristina" name="Revert"/>  		</panel>  	</tab_container> -	<scroll_container left="254" name="panel_container"/> +	<scroll_container name="panel_container"/>  	<button label="Informazioni script" label_selected="Informazioni script" name="script_info" tool_tip="Mostra gli script collegati al tuo avatar"/>  	<button label="Crea vestiario" label_selected="Crea vestiario" name="make_outfit_btn"/>  	<button label="Annulla" label_selected="Annulla" name="Cancel"/> diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml index c9c01bc2a4..d23ab3565b 100644 --- a/indra/newview/skins/default/xui/ja/floater_about_land.xml +++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml @@ -264,7 +264,7 @@  			<text left="200" name="selected_objects_text">  				[COUNT]  			</text> -			<text name="Autoreturn" width="500"> +			<text name="Autoreturn">  				他人のオブジェクトを自動返却(分単位、0 で自動返却なし):  			</text>  			<line_editor left_delta="5" name="clean other time" right="-80"/> diff --git a/indra/newview/skins/default/xui/nl/floater_customize.xml b/indra/newview/skins/default/xui/nl/floater_customize.xml index 4de26347e1..e6a4ed7a27 100644 --- a/indra/newview/skins/default/xui/nl/floater_customize.xml +++ b/indra/newview/skins/default/xui/nl/floater_customize.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="UITERLIJK" width="551"> -	<tab_container name="customize tab container" tab_min_width="120" width="549"> +<floater name="floater customize" title="UITERLIJK"> +	<tab_container name="customize tab container" tab_min_width="120">  		<placeholder label="Lichaamsdelen" name="body_parts_placeholder"/>  		<panel label="Postuur" name="Shape" left="124" width="389">  			<button label="Herstel" label_selected="Herstel" name="Revert"/> @@ -462,7 +462,7 @@ slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen.  			<button label="Herstel" label_selected="Herstel" name="Revert"/>  		</panel>  	</tab_container> -	<scroll_container left="254" name="panel_container"/> +	<scroll_container name="panel_container"/>  	<button label="Annuleren" label_selected="Annuleren" name="Cancel"/>  	<button label="OK" label_selected="OK" name="Ok"/>  	<button label="Maak kleding..." label_selected="Maak kleding..." name="Make Outfit" left="110"/> diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml index 252969609a..cebf03755b 100644 --- a/indra/newview/skins/default/xui/pt/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml @@ -265,7 +265,7 @@ ou sub-divididos.  			<text left="214" name="selected_objects_text" width="48">  				[COUNT]  			</text> -			<text left="4" name="Autoreturn" width="412"> +			<text name="Autoreturn">  				Devolver objetos de outros residentes (p/ desligar tecle 0)  			</text>  			<line_editor name="clean other time" right="-10"/> diff --git a/indra/newview/skins/default/xui/pt/floater_customize.xml b/indra/newview/skins/default/xui/pt/floater_customize.xml index 2a367cb24a..a9ec0b9b1f 100644 --- a/indra/newview/skins/default/xui/pt/floater_customize.xml +++ b/indra/newview/skins/default/xui/pt/floater_customize.xml @@ -1,6 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="APARÊNCIA" width="546"> -	<tab_container name="customize tab container" tab_min_width="115" width="544"> +<floater name="floater customize" title="APARÊNCIA"> +	<tab_container name="customize tab container" tab_min_width="115">  		<text label="Corpo" name="body_parts_placeholder">  			Partes do corpo  		</text> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 18ac10fe38..668e21c253 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -332,6 +332,12 @@ class WindowsManifest(ViewerManifest):              self.path("media_plugin_webkit.dll")              self.end_prefix() +        # winmm.dll shim +        if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst="llplugin"): +            self.path("winmm.dll") +            self.end_prefix() + +          if self.args['configuration'].lower() == 'debug':              if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'debug'),                             dst="llplugin"): @@ -639,10 +645,14 @@ class DarwinManifest(ViewerManifest):                  self.path("../mac_crash_logger/" + self.args['configuration'] + "/mac-crash-logger.app", "mac-crash-logger.app")                  self.path("../mac_updater/" + self.args['configuration'] + "/mac-updater.app", "mac-updater.app") +                # plugin launcher +                self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin.app", "SLPlugin.app") +                  # our apps dependencies on shared libs                  if dylibs["llcommon"]:                      mac_crash_logger_res_path = self.dst_path_of("mac-crash-logger.app/Contents/Resources")                      mac_updater_res_path = self.dst_path_of("mac-updater.app/Contents/Resources") +                    slplugin_res_path = self.dst_path_of("SLPlugin.app/Contents/Resources")                      for libfile in ("libllcommon.dylib",                                      "libapr-1.0.3.7.dylib",                                      "libaprutil-1.0.3.8.dylib", @@ -656,9 +666,10 @@ class DarwinManifest(ViewerManifest):                                           {'target': target_lib,                                            'link' : os.path.join(mac_updater_res_path, libfile)}                                           ) - -                # plugin launcher -                self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin", "SLPlugin") +                        self.run_command("ln -sf %(target)r %(link)r" %  +                                         {'target': target_lib, +                                          'link' : os.path.join(slplugin_res_path, libfile)} +                                         )                  # plugins                  if self.prefix(src="", dst="llplugin"):  | 
