diff options
Diffstat (limited to 'indra/newview')
110 files changed, 4008 insertions, 2270 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e138b431c5..643f89068f 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -216,7 +216,6 @@ set(viewer_SOURCE_FILES      llfloaterwhitelistentry.cpp      llfloaterwindlight.cpp      llfloaterworldmap.cpp -    llfoldertype.cpp      llfolderview.cpp      llfolderviewitem.cpp      llfollowcam.cpp @@ -317,6 +316,7 @@ set(viewer_SOURCE_FILES      llpanelimcontrolpanel.cpp      llpanelland.cpp      llpanellandaudio.cpp +    llpanellandmarkinfo.cpp      llpanellandmarks.cpp      llpanellandmedia.cpp      llpanellogin.cpp @@ -337,6 +337,7 @@ set(viewer_SOURCE_FILES      llpanelpicks.cpp      llpanelplace.cpp      llpanelplaceinfo.cpp +    llpanelplaceprofile.cpp      llpanelplaces.cpp      llpanelplacestab.cpp      llpanelprimmediacontrols.cpp @@ -436,12 +437,14 @@ set(viewer_SOURCE_FILES      llvectorperfoptions.cpp      llviewchildren.cpp      llviewerassetstorage.cpp +    llviewerassettype.cpp      llvieweraudio.cpp      llviewercamera.cpp      llviewercontrol.cpp      llviewercontrollistener.cpp      llviewerdisplay.cpp      llviewerfloaterreg.cpp +    llviewerfoldertype.cpp      llviewergenericmessage.cpp      llviewergesture.cpp          llviewerhelp.cpp @@ -702,7 +705,6 @@ set(viewer_HEADER_FILES      llfloaterwhitelistentry.h      llfloaterwindlight.h      llfloaterworldmap.h -    llfoldertype.h      llfolderview.h      llfoldervieweventlistener.h      llfolderviewitem.h @@ -800,6 +802,7 @@ set(viewer_HEADER_FILES      llpanelimcontrolpanel.h      llpanelland.h      llpanellandaudio.h +    llpanellandmarkinfo.h      llpanellandmarks.h      llpanellandmedia.h      llpanellogin.h @@ -820,6 +823,7 @@ set(viewer_HEADER_FILES      llpanelpicks.h      llpanelplace.h      llpanelplaceinfo.h +    llpanelplaceprofile.h      llpanelplaces.h      llpanelplacestab.h      llpanelprimmediacontrols.h @@ -923,6 +927,7 @@ set(viewer_HEADER_FILES      llvectorperfoptions.h      llviewchildren.h      llviewerassetstorage.h +    llviewerassettype.h      llvieweraudio.h      llviewerbuild.h      llviewercamera.h @@ -930,6 +935,7 @@ set(viewer_HEADER_FILES      llviewercontrollistener.h      llviewerdisplay.h      llviewerfloaterreg.h +    llviewerfoldertype.h      llviewergenericmessage.h      llviewergesture.h          llviewerhelp.h diff --git a/indra/newview/app_settings/foldertypes.xml b/indra/newview/app_settings/foldertypes.xml index 2038779c4f..0d539177f3 100644 --- a/indra/newview/app_settings/foldertypes.xml +++ b/indra/newview/app_settings/foldertypes.xml @@ -1,66 +1,61 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <ensemble_defs>    <ensemble -    asset_num="-1" -    xui_name="default" -    icon_name="inv_plain_closed.tga" -     /> -  <ensemble -    asset_num="27" +    foldertype_num="27"      xui_name="head"      icon_name="inv_folder_outfit_head.tga"  	allowed="hair,eyes"       />    <ensemble -    asset_num="28" +    foldertype_num="28"      xui_name="gloves"      icon_name="inv_folder_outfit_gloves.tga"  	allowed="gloves"       />    <ensemble -    asset_num="29" +    foldertype_num="29"      xui_name="jacket"      icon_name="inv_folder_outfit_jacket.tga"  	allowed="jacket"       />    <ensemble -    asset_num="30" +    foldertype_num="30"      xui_name="pants"      icon_name="inv_folder_outfit_pants.tga"  	allowed="pants,underpants"       />    <ensemble -    asset_num="31" +    foldertype_num="31"      xui_name="shape"      icon_name="inv_folder_outfit_shape.tga"  	allowed="shape,skin,hair,eyes"       />    <ensemble -    asset_num="32" +    foldertype_num="32"      xui_name="shoes"      icon_name="inv_folder_outfit_shoes.tga"  	allowed="shoes,socks"       />    <ensemble -    asset_num="33" +    foldertype_num="33"      xui_name="shirt"      icon_name="inv_folder_outfit_shirt.tga"  	allowed="shirt,undershirt"       />    <ensemble -    asset_num="34" +    foldertype_num="34"      xui_name="skirt"      icon_name="inv_folder_outfit_skirt.tga"  	allowed=""       />    <ensemble -    asset_num="35" +    foldertype_num="35"      xui_name="underpants"      icon_name="inv_folder_outfit_underpants.tga"  	allowed="underpants"       />    <ensemble -    asset_num="36" +    foldertype_num="36"      xui_name="undershirt"      icon_name="inv_folder_outfit_undershirt.tga"  	allowed="undershirt" diff --git a/indra/newview/llagentpicksinfo.cpp b/indra/newview/llagentpicksinfo.cpp index 6e5835bace..3c8d0dac42 100644 --- a/indra/newview/llagentpicksinfo.cpp +++ b/indra/newview/llagentpicksinfo.cpp @@ -47,7 +47,8 @@ public:  	~LLAgentPicksObserver()  	{ -		LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this); +		if (LLAvatarPropertiesProcessor::instanceExists()) +			LLAvatarPropertiesProcessor::getInstance()->removeObserver(gAgent.getID(), this);  	}  	void sendAgentPicksRequest() diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index 09f7c49f23..2911a35581 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -92,7 +92,10 @@ std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/)  //static  BOOL LLAgentUI::checkAgentDistance(const LLVector3& pole, F32 radius)  { -	return  (gAgent.getPositionAgent() - pole).length() < radius; +	F32 delta_x = gAgent.getPositionAgent().mV[VX] - pole.mV[VX]; +	F32 delta_y = gAgent.getPositionAgent().mV[VY] - pole.mV[VY]; +	 +	return  sqrt( delta_x* delta_x + delta_y* delta_y ) < radius;  }  BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const LLVector3& agent_pos_region)  { diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 4b3d27767c..8c76a219a0 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -434,7 +434,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,  	if (save_in_lost_and_found)  	{  		category_id = gInventory.findCategoryUUIDForType( -			LLAssetType::AT_LOST_AND_FOUND); +			LLFolderType::FT_LOST_AND_FOUND);  	}  	else  	{ @@ -840,7 +840,7 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs  		}  		// Get the UUID of the current outfit folder (will be created if it doesn't exist) -		LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); +		const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  		LLInitialWearablesFetch* outfit = new LLInitialWearablesFetch(); @@ -981,8 +981,7 @@ void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 inde  	// Add a new one in the lost and found folder.  	// (We used to overwrite the "not found" one, but that could potentially  	// destory content.) JC -	LLUUID lost_and_found_id =  -		gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); +	const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);  	LLPointer<LLInventoryCallback> cb =  		new addWearableToAgentInventoryCallback(  			LLPointer<LLRefCount>(NULL), @@ -1123,8 +1122,8 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,  	// First, make a folder in the Clothes directory.  	LLUUID folder_id = gInventory.createNewCategory( -		gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING), -		LLAssetType::AT_NONE, +		gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING), +		LLFolderType::FT_NONE,  		new_folder_name);  	bool found_first_item = false; @@ -1257,10 +1256,10 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)  	}  	// First, make a folder in the My Outfits directory. -	LLUUID parent_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_MY_OUTFITS); +	const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);  	LLUUID folder_id = gInventory.createNewCategory(  		parent_id, -		LLAssetType::AT_OUTFIT, +		LLFolderType::FT_OUTFIT,  		new_folder_name);  	LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL); @@ -2032,7 +2031,7 @@ void LLInitialWearablesFetch::processWearablesMessage()  {  	if (!mAgentInitialWearables.empty()) // We have an empty current outfit folder, use the message data instead.  	{ -		LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); +		const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  		for (U8 i = 0; i < mAgentInitialWearables.size(); ++i)  		{  			// Populate the current outfit folder with links to the wearables passed in the message diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 382947e464..a50b39c10d 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -130,11 +130,11 @@ void LLOutfitObserver::done()  			{  				if(LLInventoryType::IT_GESTURE == item->getInventoryType())  				{ -					pid = gInventory.findCategoryUUIDForType(LLAssetType::AT_GESTURE); +					pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);  				}  				else  				{ -					pid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); +					pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  				}  				break;  			} @@ -146,7 +146,7 @@ void LLOutfitObserver::done()  		LLUUID cat_id = gInventory.createNewCategory(  			pid, -			LLAssetType::AT_NONE, +			LLFolderType::FT_NONE,  			name);  		mCatID = cat_id;  		LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(mCatID, mAppend); @@ -364,7 +364,7 @@ void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventory  /* static */   LLUUID LLAppearanceManager::getCOF()  { -	return gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); +	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  }  // Update appearance from outfit folder. @@ -384,12 +384,12 @@ void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, boo  	else  	{  		LLViewerInventoryCategory* catp = gInventory.getCategory(category); -		if (catp->getPreferredType() == LLAssetType::AT_NONE || -			LLAssetType::lookupIsEnsembleCategoryType(catp->getPreferredType())) +		if (catp->getPreferredType() == LLFolderType::FT_NONE || +			LLFolderType::lookupIsEnsembleType(catp->getPreferredType()))  		{  			updateCOFFromCategory(category, append);  // append is false - rebuild COF.  		} -		else if (catp->getPreferredType() == LLAssetType::AT_OUTFIT) +		else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT)  		{  			rebuildCOFFromOutfit(category);  		} @@ -416,7 +416,7 @@ void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool app  		return;  	} -	const LLUUID ¤t_outfit_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); +	const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  	// Processes that take time should show the busy cursor  	//inc_busy_count(); @@ -514,7 +514,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  		{  			LLViewerInventoryCategory *catp = item->getLinkedCategory();  			// Skip copying outfit links. -			if (catp && catp->getPreferredType() != LLAssetType::AT_OUTFIT) +			if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT)  			{  				link_inventory_item(gAgent.getID(),  									item->getLinkedUUID(), @@ -652,7 +652,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID  	// Add link to outfit if category is an outfit.   	LLViewerInventoryCategory* catp = gInventory.getCategory(category); -	if (!append && catp && catp->getPreferredType() == LLAssetType::AT_OUTFIT) +	if (!append && catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)  	{  		link_inventory_item(gAgent.getID(), category, cof, catp->getName(),  							LLAssetType::AT_LINK_FOLDER, link_waiter); @@ -743,7 +743,7 @@ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)  		LLNotifications::instance().add("CouldNotPutOnOutfit");  		return;  	} -		 +  	// Processes that take time should show the busy cursor  	//inc_busy_count(); @@ -761,7 +761,7 @@ void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)  	// Create a link to the outfit that we wore.  	LLViewerInventoryCategory* catp = gInventory.getCategory(category); -	if (catp && catp->getPreferredType() == LLAssetType::AT_OUTFIT) +	if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)  	{  		link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(),  							LLAssetType::AT_LINK_FOLDER, link_waiter); diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 5dbf57c9be..d4df6dfbe7 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -334,7 +334,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)  		LLAssetStorage::LLStoreAssetCallback callback = NULL;  		void *userdata = NULL;  		upload_new_resource(next_file, asset_name, asset_name, -				    0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, +				    0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,  				    next_owner_perms, group_perms,  				    everyone_perms, display_name,  				    callback, expected_upload_cost, userdata); diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 2f67401301..97e0aa5f46 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -343,7 +343,7 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re  		// Servers older than 1.25 require the text of the message to be the  		// calling card folder ID for the offering user. JC  		LLUUID calling_card_folder_id =  -			gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); +			gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);  		std::string message = calling_card_folder_id.asString();  		requestFriendship(notification["payload"]["id"].asUUID(),   		    notification["payload"]["name"].asString(), @@ -355,7 +355,7 @@ bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& re  // static  void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message)  { -	LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); +	const LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);  	send_improved_im(target_id,  					 target_name,  					 message, diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 7b2dc02864..8609ba8b1c 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -239,11 +239,46 @@ void LLAvatarList::refresh()  	bool dirty = add_limit_exceeded || (have_filter && !have_names);  	setDirty(dirty); +	// Refreshed all items, lets send refresh_complete signal. +	if(!dirty) +	{ +		std::vector<LLSD> cur_values; +		getValues(cur_values); +		mRefreshCompleteSignal(this, LLSD((S32)cur_values.size())); +	} +  	// Commit if we've added/removed items.  	if (modified)  		onCommit();  } +bool LLAvatarList::filterHasMatches() +{ +	uuid_vector_t values = getIDs(); + +	for (uuid_vector_t::const_iterator it=values.begin(); it != values.end(); it++) +	{ +		std::string name; +		const LLUUID& buddy_id = *it; +		BOOL have_name = gCacheName->getFullName(buddy_id, name); + +		// If name has not been loaded yet we consider it as a match. +		// When the name will be loaded the filter will be applied again(in refresh()). + +		if (have_name && !findInsensitive(name, mNameFilter)) +		{ +			continue; +		} + +		return true; +	} +	return false; +} + +boost::signals2::connection LLAvatarList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb) +{ +	return mRefreshCompleteSignal.connect(cb); +}  void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)  { diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 51d3760d39..195d9e5b55 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -82,6 +82,11 @@ public:  	const std::string getIconParamName() const{return mIconParamName;}  	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); +	// Return true if filter has at least one match. +	bool filterHasMatches(); + +	boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb); +  protected:  	void refresh(); @@ -107,6 +112,8 @@ private:  	uuid_vector_t			mIDs;  	LLAvatarListItem::ContextMenu* mContextMenu; + +	commit_signal_t mRefreshCompleteSignal;  };  /** Abstract comparator for avatar items */ diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 7214ac2886..b9e8c5394d 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -51,7 +51,7 @@  #include "lltransientfloatermgr.h"  static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel"); -static LLDefaultChildRegistry::Register<LLTalkButton> t2("chiclet_talk"); +static LLDefaultChildRegistry::Register<LLTalkButton> t2("talk_button");  static LLDefaultChildRegistry::Register<LLNotificationChiclet> t3("chiclet_notification");  static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t4("chiclet_im_p2p");  static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t5("chiclet_im_group"); @@ -830,13 +830,21 @@ LLChicletPanel::~LLChicletPanel()  void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){  	LLUUID session_id = data["session_id"].asUUID(); +	S32 unread = data["num_unread"].asInteger(); + +	LLIMFloater* im_floater = LLIMFloater::findInstance(session_id); +	if (im_floater && im_floater->getVisible()) +	{ +		unread = 0; +	} +  	std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id);  	std::list<LLChiclet *>::iterator iter;  	for (iter = chiclets.begin(); iter != chiclets.end(); iter++) {  		LLChiclet* chiclet = *iter;  		if (chiclet != NULL)  		{ -			chiclet->setCounter(data["num_unread"].asInteger()); +			chiclet->setCounter(unread);  		}  	    else  	    { @@ -1257,27 +1265,7 @@ LLTalkButton::Params::Params()   , show_button("show_button")   , monitor("monitor")  { -	// *TODO Vadim: move hardcoded labels (!) and other params to XUI. -	speak_button.name("left"); -	speak_button.label("Speak"); -	speak_button.label_selected("Speak"); -	speak_button.font(LLFontGL::getFontSansSerifSmall()); -	speak_button.tab_stop(false); -	speak_button.is_toggle(true); -	// Use default button art. JC -	//speak_button.image_selected(LLUI::getUIImage("SegmentedBtn_Left_Selected")); -	//speak_button.image_unselected(LLUI::getUIImage("SegmentedBtn_Left_Off")); - -	show_button.name("right"); -	show_button.rect(LLRect(0, 0, 20, 0)); -	show_button.tab_stop(false); -	show_button.is_toggle(true); -	show_button.image_selected(LLUI::getUIImage("ComboButton_Selected")); -	show_button.image_unselected(LLUI::getUIImage("ComboButton_Off")); - -	monitor.name("monitor"); -	// *TODO: Make this data driven. -	monitor.rect(LLRect(0, 18, 18, 0)); +	// See widgets/talk_button.xml  }  LLTalkButton::LLTalkButton(const Params& p) @@ -1333,6 +1321,7 @@ LLTalkButton::LLTalkButton(const Params& p)  	// never show "muted" because you can't mute yourself  	mOutputMonitor->setIsMuted(false); +	mOutputMonitor->setIsAgentControl(true);  }  LLTalkButton::~LLTalkButton() diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 04860b061c..18135fc558 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -437,7 +437,7 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,  			}  			else  			{ -				LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); +				const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);  				if (item->getParentUUID() == favorites_id)  				{  					llwarns << "Attemt to copy a favorite item into the same folder." << llendl; @@ -539,7 +539,7 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con  	LLToolDragAndDrop* tool_dad = LLToolDragAndDrop::getInstance();  	if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD)  	{ -		viewer_item->setType(LLAssetType::AT_FAVORITE); +		viewer_item->setType(LLAssetType::AT_LANDMARK);  		copy_inventory_from_notecard(tool_dad->getObjectID(), tool_dad->getSourceID(), viewer_item.get(), gInventoryCallbacks.registerCB(cb));  	}  	else @@ -561,7 +561,7 @@ void LLFavoritesBarCtrl::changed(U32 mask)  {  	if (mFavoriteFolderId.isNull())  	{ -		mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); +		mFavoriteFolderId = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);  		if (mFavoriteFolderId.notNull())  		{ diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 55b7ed0c99..095fe0a220 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -989,7 +989,7 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)  						    name,  						    desc,  						    0, -						    LLAssetType::AT_NONE, +						    LLFolderType::FT_NONE,  						    LLInventoryType::IT_ANIMATION,  						    LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),  						    name, diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 7cb8987879..538b44c056 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -264,7 +264,6 @@ void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, Invent  			( asstype == LLAssetType::AT_BODYPART  && gSavedSettings.getBOOL("BulkChangeIncludeBodyParts" )) ||  			( asstype == LLAssetType::AT_CLOTHING  && gSavedSettings.getBOOL("BulkChangeIncludeClothing"  )) ||  			( asstype == LLAssetType::AT_GESTURE   && gSavedSettings.getBOOL("BulkChangeIncludeGestures"  )) || -			( asstype == LLAssetType::AT_FAVORITE  && gSavedSettings.getBOOL("BulkChangeIncludeFavourite" )) ||  			( asstype == LLAssetType::AT_NOTECARD  && gSavedSettings.getBOOL("BulkChangeIncludeNotecards" )) ||  			( asstype == LLAssetType::AT_OBJECT    && gSavedSettings.getBOOL("BulkChangeIncludeObjects"   )) ||  			( asstype == LLAssetType::AT_LSL_TEXT  && gSavedSettings.getBOOL("BulkChangeIncludeScripts"   )) || diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index 3da06fa7b3..cefd7a3808 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -293,7 +293,7 @@ void LLFloaterBuy::onClickBuy()  {  	// Put the items where we put new folders.  	LLUUID category_id; -	category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); +	category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);  	// *NOTE: doesn't work for multiple object buy, which UI does not  	// currently support sale info is used for verification only, if diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index f3eaa0c916..32802f6a20 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -286,7 +286,7 @@ void LLFloaterBuyContents::onClickBuy()  	// Put the items where we put new folders.  	LLUUID category_id; -	category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CATEGORY); +	category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CATEGORY);  	// *NOTE: doesn't work for multiple object buy, which UI does not  	// currently support sale info is used for verification only, if diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index 8570b5eb4a..92778510e7 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -40,6 +40,7 @@  #include "llinventorymodel.h"  #include "llpanelmaininventory.h"  #include "llresmgr.h" +#include "llviewerfoldertype.h"  ///----------------------------------------------------------------------------  /// LLFloaterInventory diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h index f2f2963a33..c0de89bff2 100644 --- a/indra/newview/llfloaterinventory.h +++ b/indra/newview/llfloaterinventory.h @@ -35,6 +35,7 @@  #define LL_LLFLOATERINVENTORY_H  #include "llfloater.h" +#include "llfoldertype.h"  class LLInventoryPanel;  class LLPanelMainInventory; diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index ed7d2c71ea..b7296518d4 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -176,7 +176,7 @@ void LLFloaterNameDesc::onBtnOK( )  	upload_new_resource(mFilenameAndPath, // file  			    childGetValue("name_form").asString(),   			    childGetValue("description_form").asString(),  -			    0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, +			    0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,  			    LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),  			    display_name, callback, expected_upload_cost, nruserdata);  	closeFloater(false); diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index b6ec0868cf..e277aba493 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -158,14 +158,14 @@ void LLFloaterOpenObject::moveToInventory(bool wear)  	if (wear)  	{  		parent_category_id = gInventory.findCategoryUUIDForType( -			LLAssetType::AT_CLOTHING); +			LLFolderType::FT_CLOTHING);  	}  	else  	{  		parent_category_id = gInventory.getRootFolderID();  	}  	LLUUID category_id = gInventory.createNewCategory(parent_category_id,  -		LLAssetType::AT_NONE,  +		LLFolderType::FT_NONE,   		name);  	LLCatAndWear* data = new LLCatAndWear; diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index ad2fe34e95..0f4d6e33a3 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -770,7 +770,7 @@ void LLFloaterReporter::takeScreenshot()  	if (COMPLAINT_REPORT == mReportType)  	{  		mResourceDatap->mAssetInfo.mType = LLAssetType::AT_TEXTURE; -		mResourceDatap->mPreferredLocation = LLAssetType::EType(-2); +		mResourceDatap->mPreferredLocation = LLFolderType::EType(LLResourceData::INVALID_LOCATION);  	}  	else  	{ @@ -838,7 +838,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,  	}  	EReportType report_type = UNKNOWN_REPORT; -	if (data->mPreferredLocation == -2) +	if (data->mPreferredLocation == LLResourceData::INVALID_LOCATION)  	{  		report_type = COMPLAINT_REPORT;  	} diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 235e819218..541e2a2664 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -980,7 +980,7 @@ void LLSnapshotLivePreview::saveTexture()  				    "Snapshot : " + pos_string,  				    "Taken by " + who_took_it + " at " + pos_string,  				    0, -				    LLAssetType::AT_SNAPSHOT_CATEGORY, +				    LLFolderType::FT_SNAPSHOT_CATEGORY,  				    LLInventoryType::IT_SNAPSHOT,  				    PERM_ALL,  // Note: Snapshots to inventory is a special case of content upload  				    PERM_NONE, // that ignores the user's premissions preferences and continues to diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index f3f600149f..6567c1a649 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -327,7 +327,7 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)  		LLFirstUse::useMap();  		// Start speculative download of landmarks -		LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); +		const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);  		gInventory.startBackgroundFetch(landmark_folder_id);  		childSetFocus("location", TRUE); diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index a963c96da4..7863c373c6 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -55,6 +55,7 @@  #include "llviewermenu.h"  #include "lluictrlfactory.h"  #include "llviewercontrol.h" +#include "llviewerfoldertype.h"  #include "llviewerwindow.h"  #include "llvoavatar.h"  #include "llfloaterproperties.h" @@ -1108,7 +1109,7 @@ void LLFolderView::propertiesSelectedItems( void )  	}  } -void LLFolderView::changeType(LLInventoryModel *model, LLAssetType::EType new_folder_type) +void LLFolderView::changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type)  {  	LLFolderBridge *folder_bridge = LLFolderBridge::sSelf; @@ -1958,7 +1959,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)  	if (action.length() > change_folder_string.length() &&   		(action.compare(0,change_folder_string.length(),"change_folder_type_") == 0))  	{ -		LLAssetType::EType new_folder_type = LLFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length())); +		LLFolderType::EType new_folder_type = LLViewerFolderType::lookupTypeFromXUIName(action.substr(change_folder_string.length()));  		changeType(model, new_folder_type);  		return true;  	} diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index ebfb4efde2..0bd65b5f90 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -192,7 +192,7 @@ public:  	void propertiesSelectedItems( void );  	// change the folder type -	void changeType(LLInventoryModel *model, LLAssetType::EType new_folder_type); +	void changeType(LLInventoryModel *model, LLFolderType::EType new_folder_type);  	void autoOpenItem(LLFolderViewFolder* item);  	void closeAutoOpenedFolders(); diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index ff38da279a..60ece75cea 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -32,6 +32,7 @@  #define LLFOLDERVIEWEVENTLISTENER_H  #include "lldarray.h"	// JAMESDEBUG convert to std::vector +#include "llfoldertype.h"  #include "llfontgl.h"	// just for StyleFlags enum  #include "llpointer.h" @@ -57,7 +58,7 @@ public:  	virtual const LLUUID& getUUID() const = 0;  	virtual time_t getCreationDate() const = 0;	// UTC seconds  	virtual PermissionMask getPermissionMask() const = 0; -	virtual LLAssetType::EType getPreferredType() const = 0; +	virtual LLFolderType::EType getPreferredType() const = 0;  	virtual LLPointer<LLUIImage> getIcon() const = 0;  	virtual LLFontGL::StyleFlags getLabelStyle() const = 0;  	virtual std::string getLabelSuffix() const = 0; diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index f83a426cda..6fdaefd21a 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -248,13 +248,13 @@ void LLFolderViewItem::refreshFromListener()  	if(mListener)  	{  		mLabel = mListener->getDisplayName(); -		LLAssetType::EType preferred_type = mListener->getPreferredType(); +		LLFolderType::EType preferred_type = mListener->getPreferredType();  		// *TODO: to be removed when database supports multi language. This is a  		// temporary attempt to display the inventory folder in the user locale.  		// mantipov: *NOTE: be sure this code is synchronized with LLFriendCardsManager::findChildFolderUUID  		//		it uses the same way to find localized string -		if (LLAssetType::lookupIsProtectedCategoryType(preferred_type)) +		if (LLFolderType::lookupIsProtectedType(preferred_type))  		{  			LLTrans::findString(mLabel, "InvFolder " + mLabel);  		}; @@ -1753,7 +1753,7 @@ bool LLFolderViewFolder::isTrash() const  {  	if (mAmTrash == LLFolderViewFolder::UNKNOWN)  	{ -		mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH; +		mAmTrash = mListener->getUUID() == gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH, false) ? LLFolderViewFolder::TRASH : LLFolderViewFolder::NOT_TRASH;  	}  	return mAmTrash == LLFolderViewFolder::TRASH;  } @@ -2167,7 +2167,7 @@ BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )  {  	const LLUUID &cat_uuid = getListener()->getUUID();  	const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid); -	if (cat && cat->getPreferredType() == LLAssetType::AT_OUTFIT) +	if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)  	{  		getListener()->performAction(NULL, NULL,"replaceoutfit");  		return TRUE; @@ -2490,7 +2490,7 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde  		&& b->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)  	{ -		static LLUUID favorites_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); +		static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);  		LLUUID a_uuid = a->getParentFolder()->getListener()->getUUID();  		LLUUID b_uuid = b->getParentFolder()->getListener()->getUUID(); diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index fbcaeee01f..5f79fe8b20 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -135,14 +135,14 @@ const LLUUID LLFriendCardsManager::extractAvatarID(const LLUUID& avatarID)  // and this method must be called before any actions with friend list  void LLFriendCardsManager::ensureFriendFoldersExist()  { -	LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); +	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);  	LLUUID friendFolderUUID = findFriendFolderUUIDImpl();  	if (friendFolderUUID.isNull())  	{  		friendFolderUUID = gInventory.createNewCategory(callingCardsFolderID, -			LLAssetType::AT_CALLINGCARD, get_friend_folder_name()); +			LLFolderType::FT_CALLINGCARD, get_friend_folder_name());  	}  	LLUUID friendAllSubfolderUUID = findFriendAllSubfolderUUIDImpl(); @@ -150,7 +150,7 @@ void LLFriendCardsManager::ensureFriendFoldersExist()  	if (friendAllSubfolderUUID.isNull())  	{  		friendAllSubfolderUUID = gInventory.createNewCategory(friendFolderUUID, -			LLAssetType::AT_CALLINGCARD, get_friend_all_subfolder_name()); +			LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());  	}  } @@ -351,7 +351,7 @@ void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBud  /************************************************************************/  const LLUUID& LLFriendCardsManager::findFriendFolderUUIDImpl() const  { -	LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); +	const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);  	std::string friendFolderName = get_friend_folder_name(); diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index dee86f4a22..19fa66fd0e 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -106,6 +106,8 @@ void LLIMFloater::onFocusReceived()  // virtual  void LLIMFloater::onClose(bool app_quitting)  { +	if (!gIMMgr->hasSession(mSessionID)) return; +	  	setTyping(false);  	gIMMgr->leaveSession(mSessionID);  } @@ -234,7 +236,10 @@ BOOL LLIMFloater::postBuild()  	mChatHistory = getChild<LLChatHistory>("chat_history"); -	setTitle(LLIMModel::instance().getName(mSessionID)); +	std::string session_name(LLIMModel::instance().getName(mSessionID)); +	LLStringUtil::toUpper(session_name); +	setTitle(session_name); +  	setDocked(true);  	mTypingStart = LLTrans::getString("IM_typing_start_string"); diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index bfad2b1624..9989a3b473 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -188,7 +188,8 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)  {  	mCommitCallbackRegistrar.add("InspectAvatar.ViewProfile",	boost::bind(&LLInspectAvatar::onClickViewProfile, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.AddFriend",	boost::bind(&LLInspectAvatar::onClickAddFriend, this));	 -	mCommitCallbackRegistrar.add("InspectAvatar.IM",	boost::bind(&LLInspectAvatar::onClickIM, this));	 +	mCommitCallbackRegistrar.add("InspectAvatar.IM", +		boost::bind(&LLInspectAvatar::onClickIM, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.Teleport",	boost::bind(&LLInspectAvatar::onClickTeleport, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup",	boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));	  	mCommitCallbackRegistrar.add("InspectAvatar.Pay",	boost::bind(&LLInspectAvatar::onClickPay, this));	 @@ -306,7 +307,21 @@ void LLInspectAvatar::requestUpdate()  	// You can't re-add someone as a friend if they are already your friend  	bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL;  	bool is_self = (mAvatarID == gAgentID); -	childSetEnabled("add_friend_btn", !is_friend && !is_self); +	if (is_self) +	{ +		getChild<LLUICtrl>("add_friend_btn")->setVisible(false); +		getChild<LLUICtrl>("im_btn")->setVisible(false); +	} +	else if (is_friend) +	{ +		getChild<LLUICtrl>("add_friend_btn")->setVisible(false); +		getChild<LLUICtrl>("im_btn")->setVisible(true); +	} +	else +	{ +		getChild<LLUICtrl>("add_friend_btn")->setVisible(true); +		getChild<LLUICtrl>("im_btn")->setVisible(false); +	}  	// Use an avatar_icon even though the image id will come down with the  	// avatar properties because the avatar_icon code maintains a cache of icons diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index b9775cf0e9..b9a25d5dc7 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -78,6 +78,7 @@  #include "llscrollcontainer.h"  #include "llimview.h"  #include "lltooldraganddrop.h" +#include "llviewerfoldertype.h"  #include "llviewertexturelist.h"  #include "llviewerinventory.h"  #include "llviewerobjectlist.h" @@ -85,6 +86,7 @@  #include "llvoavatar.h"  #include "llwearable.h"  #include "llwearablelist.h" +#include "llviewerassettype.h"  #include "llviewermessage.h"  #include "llviewerregion.h"  #include "llvoavatarself.h" @@ -202,9 +204,9 @@ PermissionMask LLInvFVBridge::getPermissionMask() const  }  // virtual -LLAssetType::EType LLInvFVBridge::getPreferredType() const +LLFolderType::EType LLInvFVBridge::getPreferredType() const  { -	return LLAssetType::AT_NONE; +	return LLFolderType::FT_NONE;  } @@ -339,7 +341,7 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*  	LLInventoryModel* model = getInventoryModel();  	if(!model) return;  	LLMessageSystem* msg = gMessageSystem; -	LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);  	LLViewerInventoryItem* item = NULL;  	LLViewerInventoryCategory* cat = NULL;  	std::vector<LLUUID> move_ids; @@ -504,7 +506,7 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const  			}  		}  		const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i)); -		if (cat && !LLAssetType::lookupCanLink(cat->getPreferredType())) +		if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()))  		{  			return FALSE;  		} @@ -645,7 +647,7 @@ BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const  	if(obj)  	{ -		*type = LLAssetType::lookupDragAndDropType(obj->getActualType()); +		*type = LLViewerAssetType::lookupDragAndDropType(obj->getActualType());  		if(*type == DAD_NONE)  		{  			return FALSE; @@ -686,7 +688,7 @@ BOOL LLInvFVBridge::isInTrash() const  {  	LLInventoryModel* model = getInventoryModel();  	if(!model) return FALSE; -	const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);  	return model->isObjectDescendentOf(mUUID, trash_id);  } @@ -699,7 +701,7 @@ BOOL LLInvFVBridge::isLinkedObjectInTrash() const  	{  		LLInventoryModel* model = getInventoryModel();  		if(!model) return FALSE; -		const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); +		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);  		return model->isObjectDescendentOf(obj->getLinkedUUID(), trash_id);  	}  	return FALSE; @@ -717,7 +719,7 @@ BOOL LLInvFVBridge::isCOFFolder() const  {  	const LLInventoryModel* model = getInventoryModel();  	if(!model) return TRUE; -	const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); +	const LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  	if (mUUID == cof_id || model->isObjectDescendentOf(mUUID, cof_id))  	{  		return TRUE; @@ -1044,7 +1046,7 @@ void LLItemBridge::restoreItem()  	if(item)  	{  		LLInventoryModel* model = getInventoryModel(); -		const LLUUID new_parent = model->findCategoryUUIDForType(item->getType()); +		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType()));  		// do not restamp on restore.  		LLInvFVBridge::changeItemParent(model, item, new_parent, FALSE);  	} @@ -1077,7 +1079,7 @@ void LLItemBridge::restoreToWorld()  	}  	// Check if it's in the trash. (again similar to the normal rez logic) -	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  	if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))  	{  		remove_from_inventory = TRUE; @@ -1272,7 +1274,7 @@ BOOL LLItemBridge::removeItem()  	LLPreview::hide(mUUID, TRUE);  	LLInventoryModel* model = getInventoryModel();  	if(!model) return FALSE; -	LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);  	LLViewerInventoryItem* item = getItem();  	// if item is not already in trash @@ -1365,7 +1367,7 @@ BOOL LLFolderBridge::isItemMovable() const  	LLInventoryObject* obj = getInventoryObject();  	if(obj)  	{ -		return (!LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)obj)->getPreferredType())); +		return (!LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)obj)->getPreferredType()));  	}  	return FALSE;  } @@ -1401,7 +1403,7 @@ BOOL LLFolderBridge::isItemRemovable()  		return FALSE;  	} -	if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) +	if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))  	{  		return FALSE;  	} @@ -1414,7 +1416,7 @@ BOOL LLFolderBridge::isItemRemovable()  	for( i = 0; i < descendent_categories.count(); i++ )  	{  		LLInventoryCategory* category = descendent_categories[i]; -		if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) +		if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))  		{  			return FALSE;  		} @@ -1591,20 +1593,20 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  		const LLUUID& cat_id = inv_cat->getUUID();  		// Is the destination the trash? -		const LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); +		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);  		BOOL move_is_into_trash = (mUUID == trash_id)  				|| model->isObjectDescendentOf(mUUID, trash_id); -		BOOL is_movable = (!LLAssetType::lookupIsProtectedCategoryType(inv_cat->getPreferredType())); -		LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); +		BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType())); +		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); -		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); +		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);  		if (move_is_into_current_outfit || move_is_into_outfit)  		{  			// BAP - restrictions?  			is_movable = true;  		} -		if (mUUID == gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE)) +		if (mUUID == gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE))  		{  			is_movable = FALSE; // It's generally movable but not into Favorites folder. EXT-1604  		} @@ -1616,7 +1618,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,  			for( i = 0; i < descendent_categories.count(); i++ )  			{  				LLInventoryCategory* category = descendent_categories[i]; -				if(LLAssetType::lookupIsProtectedCategoryType(category->getPreferredType())) +				if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))  				{  					// ...can't move "special folders" like Textures  					is_movable = FALSE; @@ -1849,8 +1851,8 @@ bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,  		LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe?  		// BAP remove AT_NONE support after ensembles are fully working?  		return (linked_category && -				((linked_category->getPreferredType() == LLAssetType::AT_NONE) || -				 (LLAssetType::lookupIsEnsembleCategoryType(linked_category->getPreferredType())))); +				((linked_category->getPreferredType() == LLFolderType::FT_NONE) || +				 (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType()))));  	}  } @@ -2152,7 +2154,7 @@ void LLFolderBridge::determineFolderType()  BOOL LLFolderBridge::isItemRenameable() const  {  	LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory(); -	if(cat && !LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType()) +	if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())  	   && (cat->getOwnerID() == gAgent.getID()))  	{  		return TRUE; @@ -2167,15 +2169,15 @@ void LLFolderBridge::restoreItem()  	if(cat)  	{  		LLInventoryModel* model = getInventoryModel(); -		LLUUID new_parent = model->findCategoryUUIDForType(cat->getType()); +		const LLUUID new_parent = model->findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(cat->getType()));  		// do not restamp children on restore  		LLInvFVBridge::changeCategoryParent(model, cat, new_parent, FALSE);  	}  } -LLAssetType::EType LLFolderBridge::getPreferredType() const +LLFolderType::EType LLFolderBridge::getPreferredType() const  { -	LLAssetType::EType preferred_type = LLAssetType::AT_NONE; +	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;  	LLViewerInventoryCategory* cat = getCategory();  	if(cat)  	{ @@ -2188,7 +2190,7 @@ LLAssetType::EType LLFolderBridge::getPreferredType() const  // Icons for folders are based on the preferred type  LLUIImagePtr LLFolderBridge::getIcon() const  { -	LLAssetType::EType preferred_type = LLAssetType::AT_NONE; +	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;  	LLViewerInventoryCategory* cat = getCategory();  	if(cat)  	{ @@ -2197,7 +2199,7 @@ LLUIImagePtr LLFolderBridge::getIcon() const  	return getIcon(preferred_type);  } -LLUIImagePtr LLFolderBridge::getIcon(LLAssetType::EType preferred_type) +LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)  {  	// we only have one folder image now  	return LLUI::getUIImage("Inv_FolderClosed"); @@ -2236,7 +2238,7 @@ BOOL LLFolderBridge::removeItem()  	LLInventoryModel* model = getInventoryModel();  	if(!model) return FALSE; -	LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);  	// Look for any gestures and deactivate them  	LLInventoryModel::cat_array_t	descendent_categories; @@ -2354,11 +2356,11 @@ void LLFolderBridge::folderOptionsMenu()  	if(!model) return;  	const LLInventoryCategory* category = model->getCategory(mUUID); -	LLAssetType::EType type = category->getPreferredType(); -	const bool is_default_folder = category && LLAssetType::lookupIsProtectedCategoryType(type); +	LLFolderType::EType type = category->getPreferredType(); +	const bool is_default_folder = category && LLFolderType::lookupIsProtectedType(type);  	// BAP change once we're no longer treating regular categories as ensembles. -	const bool is_ensemble = category && (type == LLAssetType::AT_NONE || -										  LLAssetType::lookupIsEnsembleCategoryType(type)); +	const bool is_ensemble = category && (type == LLFolderType::FT_NONE || +										  LLFolderType::lookupIsEnsembleType(type));  	// calling card related functionality for folders. @@ -2424,8 +2426,8 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  //	std::vector<std::string> disabled_items;  	LLInventoryModel* model = getInventoryModel();  	if(!model) return; -	LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); -	LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); +	const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH); +	const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);  	mItems.clear(); //adding code to clear out member Items (which means Items should not have other data here at this point)  	mDisabledItems.clear(); //adding code to clear out disabled members from previous @@ -2455,7 +2457,6 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  	else if(isAgentInventory()) // do not allow creating in library  	{  		LLViewerInventoryCategory *cat =  getCategory(); -  		// BAP removed protected check to re-enable standard ops in untyped folders.  		// Not sure what the right thing is to do here.  		if (!isCOFFolder() && cat /*&& @@ -2472,7 +2473,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  			mItems.push_back(std::string("Change Type"));  			LLViewerInventoryCategory *cat = getCategory(); -			if (cat && LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())) +			if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))  			{  				mDisabledItems.push_back(std::string("Change Type"));  			} @@ -2482,7 +2483,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		else  		{  			// Want some but not all of the items from getClipboardEntries for outfits. -			if (cat && cat->getPreferredType()==LLAssetType::AT_OUTFIT) +			if (cat && cat->getPreferredType()==LLFolderType::FT_OUTFIT)  			{  				mItems.push_back(std::string("Rename"));  				mItems.push_back(std::string("Delete")); @@ -2618,7 +2619,7 @@ void LLFolderBridge::createNewCategory(void* user_data)  	if(!model) return;  	LLUUID id;  	id = model->createNewCategory(bridge->getUUID(), -								  LLAssetType::AT_NONE, +								  LLFolderType::FT_NONE,  								  LLStringUtil::null);  	model->notifyObservers(); @@ -2703,7 +2704,7 @@ void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type)  // Separate function so can be called by global menu as well as right-click  // menu.  // static -void LLFolderBridge::createWearable(LLUUID parent_id, EWearableType type) +void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type)  {  	LLWearable* wearable = LLWearableList::instance().createNewWearable(type);  	LLAssetType::EType asset_type = wearable->getAssetType(); @@ -2846,17 +2847,17 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  			break;  		case LLAssetType::AT_CATEGORY: -			is_movable = !LLAssetType::lookupIsProtectedCategoryType(((LLInventoryCategory*)inv_item)->getPreferredType()); +			is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());  			break;  		default:  			break;  		} -		LLUUID trash_id = model->findCategoryUUIDForType(LLAssetType::AT_TRASH); +		const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);  		BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); -		LLUUID current_outfit_id = model->findCategoryUUIDForType(LLAssetType::AT_CURRENT_OUTFIT); +		const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);  		BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); -		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLAssetType::AT_OUTFIT); +		BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);  		if(is_movable && move_is_into_trash)  		{ @@ -2886,7 +2887,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,  				.isObjDirectDescendentOfCategory (inv_item, getCategory());  		} -		LLUUID favorites_id = model->findCategoryUUIDForType(LLAssetType::AT_FAVORITE); +		const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);  		// we can move item inside a folder only if this folder is Favorites. See EXT-719  		accept = is_movable && ((mUUID != inv_item->getParentUUID()) || (mUUID == favorites_id)); @@ -4934,7 +4935,7 @@ void	LLLSLTextBridgeAction::doIt()  BOOL LLWearableBridgeAction::isInTrash() const  {  	if(!mModel) return FALSE; -	LLUUID trash_id = mModel->findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID trash_id = mModel->findCategoryUUIDForType(LLFolderType::FT_TRASH);  	return mModel->isObjectDescendentOf(mUUID, trash_id);  } @@ -5073,7 +5074,7 @@ std::string LLLinkFolderBridge::sPrefix("Link: ");  LLUIImagePtr LLLinkFolderBridge::getIcon() const  { -	LLAssetType::EType preferred_type = LLAssetType::AT_NONE; +	LLFolderType::EType preferred_type = LLFolderType::FT_NONE;  	if (LLViewerInventoryItem *item = getItem())  	{  		if (const LLViewerInventoryCategory* cat = item->getLinkedCategory()) diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3f3513a665..f95e8f9361 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -159,7 +159,7 @@ public:  	virtual const std::string& getName() const;  	virtual const std::string& getDisplayName() const;  	virtual PermissionMask getPermissionMask() const; -	virtual LLAssetType::EType getPreferredType() const; +	virtual LLFolderType::EType getPreferredType() const;  	virtual time_t getCreationDate() const;  	virtual LLFontGL::StyleFlags getLabelStyle() const  	{ @@ -298,9 +298,9 @@ public:  	virtual void selectItem();  	virtual void restoreItem(); -	virtual LLAssetType::EType getPreferredType() const; +	virtual LLFolderType::EType getPreferredType() const;  	virtual LLUIImagePtr getIcon() const; -	static LLUIImagePtr getIcon(LLAssetType::EType asset_type); +	static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);  	virtual BOOL renameItem(const std::string& new_name);  	virtual BOOL removeItem(); @@ -321,7 +321,7 @@ public:  	virtual BOOL copyToClipboard() const;  	static void createWearable(LLFolderBridge* bridge, EWearableType type); -	static void createWearable(LLUUID parent_folder_id, EWearableType type); +	static void createWearable(const LLUUID &parent_folder_id, EWearableType type);  	LLViewerInventoryCategory* getCategory() const; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 77121bd922..75218e98e0 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -317,10 +317,6 @@ const std::string& get_item_icon_name(LLAssetType::EType asset_type,  	case LLAssetType::AT_GESTURE:  		idx = GESTURE_ICON_NAME;  		break; -	case LLAssetType::AT_FAVORITE: -		//TODO - need bette idx -		idx = LANDMARK_ICON_NAME; -		break;  	case LLAssetType::AT_LINK:  		idx = LINKITEM_ICON_NAME;  		break; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 23439191f3..baf34b42ff 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -49,6 +49,7 @@  #include "llinventoryfunctions.h"  #include "llinventorypanel.h"  #include "llfloaterinventory.h" +#include "llviewerfoldertype.h"  #include "llviewerinventory.h"  #include "llviewermessage.h"  #include "llviewerwindow.h" @@ -316,7 +317,7 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id)  // specifies 'type' as what it defaults to containing. The category is  // not necessarily only for that type. *NOTE: This will create a new  // inventory category on the fly if one does not exist. -LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool create_folder) +const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder)  {  	const LLUUID &rv = findCatUUID(t);  	if(rv.isNull() && isInventoryUsable() && create_folder) @@ -332,10 +333,10 @@ LLUUID LLInventoryModel::findCategoryUUIDForType(LLAssetType::EType t, bool crea  // Internal method which looks for a category with the specified  // preferred type. Returns LLUUID::null if not found. -const LLUUID &LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type) const +const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type) const  {  	const LLUUID &root_id = gInventory.getRootFolderID(); -	if(LLAssetType::AT_CATEGORY == preferred_type) +	if(LLFolderType::FT_CATEGORY == preferred_type)  	{  		return root_id;  	} @@ -363,7 +364,7 @@ const LLUUID &LLInventoryModel::findCatUUID(LLAssetType::EType preferred_type) c  // version will take care of details like what the name should be  // based on preferred type. Returns the UUID of the new category.  LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, -										   LLAssetType::EType preferred_type, +										   LLFolderType::EType preferred_type,  										   const std::string& pname)  {  	LLUUID id; @@ -373,9 +374,9 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,  		return id;  	} -	if(preferred_type == LLAssetType::AT_SIMSTATE) +	if(LLFolderType::lookup(preferred_type) == LLFolderType::badLookup())  	{ -		lldebugs << "Attempt to create simstate category." << llendl; +		lldebugs << "Attempt to create undefined category." << llendl;  		return id;  	} @@ -387,7 +388,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id,  	}  	else  	{ -		name.assign(LLAssetType::lookupCategoryName(preferred_type)); +		name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type));  	}  	// Add the category to the internal representation @@ -451,7 +452,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,  	// Start with categories  	if(!include_trash)  	{ -		const LLUUID trash_id = findCategoryUUIDForType(LLAssetType::AT_TRASH); +		const LLUUID trash_id = findCategoryUUIDForType(LLFolderType::FT_TRASH);  		if(trash_id.notNull() && (trash_id == id))  			return;  	} @@ -485,7 +486,7 @@ void LLInventoryModel::collectDescendentsIf(const LLUUID& id,  			if (item->getActualType() == LLAssetType::AT_LINK_FOLDER)  			{  				LLViewerInventoryCategory *linked_cat = item->getLinkedCategory(); -				if (linked_cat && linked_cat->getPreferredType() != LLAssetType::AT_OUTFIT) +				if (linked_cat && linked_cat->getPreferredType() != LLFolderType::FT_OUTFIT)  					// BAP - was   					// LLAssetType::lookupIsEnsembleCategoryType(linked_cat->getPreferredType()))  					// Change back once ensemble typing is in place. @@ -665,7 +666,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)  		if(item->getParentUUID().isNull())  		{ -			LLUUID category_id = findCategoryUUIDForType(new_item->getType()); +			const LLUUID category_id = findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(new_item->getType()));  			new_item->setParent(category_id);  			item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, category_id);  			if( item_array ) @@ -689,7 +690,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)  			LLUUID parent_id = item->getParentUUID();  			if(parent_id == CATEGORIZE_LOST_AND_FOUND_ID)  			{ -				parent_id = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); +				parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);  				new_item->setParent(parent_id);  			}  			item_array_t* item_array = get_ptr_in_map(mParentChildItemTree, parent_id); @@ -702,7 +703,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)  				// Whoops! No such parent, make one.  				llinfos << "Lost item: " << new_item->getUUID() << " - "  						<< new_item->getName() << llendl; -				parent_id = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); +				parent_id = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);  				new_item->setParent(parent_id);  				item_array = get_ptr_in_map(mParentChildItemTree, parent_id);  				if(item_array) @@ -1184,7 +1185,7 @@ void LLInventoryModel::mock(const LLUUID& root_id)  		root_id,  		LLUUID::null,  		LLAssetType::AT_CATEGORY, -		LLAssetType::lookupCategoryName(LLAssetType::AT_ROOT_CATEGORY), +		LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_CATEGORY),  		gAgent.getID());  	addCategory(cat);  	gInventory.buildParentChildMap(); @@ -1342,7 +1343,7 @@ void  fetchDescendentsResponder::result(const LLSD& content)  				    item_it != folder_sd["items"].endArray();  				    ++item_it)  			    {	 -                    LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); +                    const LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);                      if (lost_uuid.notNull())                      {  				        LLSD item = *item_it; @@ -2049,11 +2050,11 @@ bool LLInventoryModel::loadSkeleton(  			cat->setUUID(folder_id.asUUID());  			cat->setParent(parent_id.asUUID()); -			LLAssetType::EType preferred_type = LLAssetType::AT_NONE; +			LLFolderType::EType preferred_type = LLFolderType::FT_NONE;  			LLSD type_default = (*it)["type_default"];  			if(type_default.isDefined())              { -				preferred_type = (LLAssetType::EType)type_default.asInteger(); +				preferred_type = (LLFolderType::EType)type_default.asInteger();              }              cat->setPreferredType(preferred_type);  			cat->setVersion(version.asInteger()); @@ -2400,12 +2401,12 @@ void LLInventoryModel::buildParentChildMap()  					<< cat->getName() << llendl;  			++lost;  			// plop it into the lost & found. -			LLAssetType::EType pref = cat->getPreferredType(); -			if(LLAssetType::AT_NONE == pref) +			LLFolderType::EType pref = cat->getPreferredType(); +			if(LLFolderType::FT_NONE == pref)  			{ -				cat->setParent(findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND)); +				cat->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));  			} -			else if(LLAssetType::AT_CATEGORY == pref) +			else if(LLFolderType::FT_CATEGORY == pref)  			{  				// it's the root  				cat->setParent(LLUUID::null); @@ -2464,7 +2465,7 @@ void LLInventoryModel::buildParentChildMap()  			++lost;  			// plop it into the lost & found.  			// -			item->setParent(findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND)); +			item->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));  			// move it later using a special message to move items. If  			// we update server here, the client might crash.  			//item->updateServer(); @@ -2485,7 +2486,7 @@ void LLInventoryModel::buildParentChildMap()  		llwarns << "Found " << lost << " lost items." << llendl;  		LLMessageSystem* msg = gMessageSystem;  		BOOL start_new_message = TRUE; -		LLUUID lnf = findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); +		const LLUUID lnf = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);  		for(std::vector<LLUUID>::iterator it = lost_item_ids.begin() ; it < lost_item_ids.end(); ++it)  		{  			if(start_new_message) @@ -2938,7 +2939,7 @@ void LLInventoryModel::processUpdateInventoryFolder(LLMessageSystem* msg,  		lastfolder = tfolder;  		tfolder->unpackMessage(msg, _PREHASH_FolderData, i);  		// make sure it's not a protected folder -		tfolder->setPreferredType(LLAssetType::AT_NONE); +		tfolder->setPreferredType(LLFolderType::FT_NONE);  		folders.push_back(tfolder);  		// examine update for changes.  		LLViewerInventoryCategory* folderp = gInventory.getCategory(tfolder->getUUID()); @@ -3325,31 +3326,31 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**)  //---------------------------------------------------------------------------- -// Trash: LLAssetType::AT_TRASH, "ConfirmEmptyTrash" -// Lost&Found: LLAssetType::AT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound" +// Trash: LLFolderType::FT_TRASH, "ConfirmEmptyTrash" +// Lost&Found: LLFolderType::FT_LOST_AND_FOUND, "ConfirmEmptyLostAndFound" -bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLAssetType::EType folder_type) +bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type)  {  	S32 option = LLNotification::getSelectedOption(notification, response);  	if (option == 0) // YES  	{ -		LLUUID folder_id = findCategoryUUIDForType(folder_type); +		const LLUUID folder_id = findCategoryUUIDForType(preferred_type);  		purgeDescendentsOf(folder_id);  		notifyObservers();  	}  	return false;  } -void LLInventoryModel::emptyFolderType(const std::string notification, LLAssetType::EType folder_type) +void LLInventoryModel::emptyFolderType(const std::string notification, LLFolderType::EType preferred_type)  {  	if (!notification.empty())  	{  		LLNotifications::instance().add(notification, LLSD(), LLSD(), -										boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, folder_type)); +										boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, preferred_type));  	}  	else  	{ -		LLUUID folder_id = findCategoryUUIDForType(folder_type); +		const LLUUID folder_id = findCategoryUUIDForType(preferred_type);  		purgeDescendentsOf(folder_id);  		notifyObservers();  	} @@ -3360,7 +3361,7 @@ void LLInventoryModel::emptyFolderType(const std::string notification, LLAssetTy  void LLInventoryModel::removeItem(const LLUUID& item_id)  {  	LLViewerInventoryItem* item = getItem(item_id); -	const LLUUID new_parent = findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID new_parent = findCategoryUUIDForType(LLFolderType::FT_TRASH);  	if (item && item->getParentUUID() != new_parent)  	{  		LLInventoryModel::update_list_t update; diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index d51460b374..aba0a619db 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -34,6 +34,7 @@  #define LL_LLINVENTORYMODEL_H  #include "llassettype.h" +#include "llfoldertype.h"  #include "lldarray.h"  #include "llframetimer.h"  #include "llhttpclient.h" @@ -280,7 +281,7 @@ public:  	// SDK: Added flag to specify whether the folder should be created if not found.  This fixes the horrible  	// multiple trash can bug. -	LLUUID findCategoryUUIDForType(LLAssetType::EType preferred_type, bool create_folder = true); +	const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true);  	// Call this method when it's time to update everyone on a new  	// state, by default, the inventory model will not update @@ -329,7 +330,7 @@ public:  	// category. If you want to use the default name based on type,  	// pass in a NULL to the 'name parameter.  	LLUUID createNewCategory(const LLUUID& parent_id, -							 LLAssetType::EType preferred_type, +							 LLFolderType::EType preferred_type,  							 const std::string& name);  	// methods to load up inventory skeleton & meat. These are used @@ -385,9 +386,9 @@ public:  	bool isCategoryComplete(const LLUUID& cat_id) const;  	// callbacks -	// Trigger a notification and empty the folder type (AT_TRASH or AT_LOST_AND_FOUND) if confirmed -	void emptyFolderType(const std::string notification, LLAssetType::EType folder_type); -	bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLAssetType::EType folder_type); +	// Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed +	void emptyFolderType(const std::string notification, LLFolderType::EType folder_type); +	bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type);  	// Utility Functions  	void removeItem(const LLUUID& item_id); @@ -431,7 +432,7 @@ protected:  	//   	// Internal method which looks for a category with the specified  	// preferred type. Returns LLUUID::null if not found - 	const LLUUID &findCatUUID(LLAssetType::EType preferred_type) const; + 	const LLUUID &findCatUUID(LLFolderType::EType preferred_type) const;  	// Empty the entire contents  	void empty(); diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index d1ca0efed3..178e7d0823 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -78,6 +78,7 @@  #include "lltabcontainer.h"  #include "lltooldraganddrop.h"  #include "lluictrlfactory.h" +#include "llviewerfoldertype.h"  #include "llviewerinventory.h"  #include "llviewermessage.h"  #include "llviewerobjectlist.h" @@ -110,8 +111,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :  	// contex menu callbacks  	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLInventoryPanel::doToSelected, this, _2)); -	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); -	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); +	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); +	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));  	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2));  	mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));  	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this)); @@ -169,19 +170,19 @@ BOOL LLInventoryPanel::postBuild()  	// determine the root folder, if any, so inventory contents show just the children  	// of that folder (i.e. not including the folder itself). -	const LLAssetType::EType preferred_type = LLAssetType::lookupHumanReadable(mStartFolderString); +	const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString); -	if ("inventory" == mStartFolderString) +	if ("INVENTORY" == mStartFolderString)  	{  		mStartFolderID = gInventory.getRootFolderID();  	} -	else if ("library" == mStartFolderString) +	else if ("LIBRARY" == mStartFolderString)  	{  		mStartFolderID = gInventory.getLibraryRootFolderID();  	}  	else  	{ -		mStartFolderID = (preferred_type != LLAssetType::AT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null); +		mStartFolderID = (preferred_type != LLFolderType::FT_NONE ? gInventory.findCategoryUUIDForType(preferred_type) : LLUUID::null);  	}  	// build view of inventory if we need default full hierarchy and inventory ready, otherwise wait for modelChanged() callback @@ -192,7 +193,7 @@ BOOL LLInventoryPanel::postBuild()  	}  	// bit of a hack to make sure the inventory is open. -	mFolders->openFolder(preferred_type != LLAssetType::AT_NONE ? LLAssetType::lookupCategoryName(preferred_type) : "My Inventory"); +	mFolders->openFolder(preferred_type != LLFolderType::FT_NONE ? LLViewerFolderType::lookupNewCategoryName(preferred_type) : "My Inventory");  	if (mSortOrderSetting != INHERIT_SORT_ORDER)  	{ @@ -382,6 +383,19 @@ void LLInventoryPanel::modelChanged(U32 mask)  							view_item->getParentFolder()->extractItem(view_item);  							view_item->addToFolder(new_parent, mFolders);  						} +/* +						 on the other side in case Inventory Panel has content of the any folder +						 it is possible that item moved to some folder which is absent in current +						 Panel. For ex. removing item (via moving to trash). +						 In this case we need to check if new parent is other then inventory start folder +						 and simply remove its View from the hierarchy. +						 See details in EXT-2098. +*/ +						// So, let check if item was moved into folder out of this Inventory Panel. +						else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID) +						{ +							view_item->getParentFolder()->extractItem(view_item); +						}  					}  				}  				else @@ -650,7 +664,7 @@ void LLInventoryPanel::openAllFolders()  	mFolders->arrangeAll();  } -void LLInventoryPanel::openDefaultFolderForType(LLAssetType::EType type) +void LLInventoryPanel::openDefaultFolderForType(LLFolderType::EType type)  {  	LLUUID category_id = mInventory->findCategoryUUIDForType(type);  	LLOpenFolderByID opener(category_id); diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 997678a478..9f74fad5c1 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -122,7 +122,7 @@ public:  	// Call this method to set the selection.  	void openAllFolders(); -	void openDefaultFolderForType(LLAssetType::EType); +	void openDefaultFolderForType(LLFolderType::EType);  	void setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus);  	void setSelectCallback(const LLFolderView::signal_t::slot_type& cb) { if (mFolders) mFolders->setSelectCallback(cb); }  	void clearSelection(); diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp index 0b07dd4f21..b1829b3945 100644 --- a/indra/newview/lllandmarkactions.cpp +++ b/indra/newview/lllandmarkactions.cpp @@ -135,13 +135,13 @@ public:  // Returns true if the given inventory item is a landmark pointing to the current parcel.  // Used to find out if there is at least one landmark from current parcel. -class LLFistAgentParcelLandmark : public LLInventoryCollectFunctor +class LLFirstAgentParcelLandmark : public LLInventoryCollectFunctor  {  private:	  	bool mFounded;// to avoid unnecessary  check  public: -	LLFistAgentParcelLandmark(): mFounded(false){} +	LLFirstAgentParcelLandmark(): mFounded(false){}  	/*virtual*/ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)  	{ @@ -165,8 +165,7 @@ static void fetch_landmarks(LLInventoryModel::cat_array_t& cats,  							LLInventoryCollectFunctor& add)  {  	// Look in "My Favorites" -	LLUUID favorites_folder_id = -		gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); +	const LLUUID favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);  	gInventory.collectDescendentsIf(favorites_folder_id,  		cats,  		items, @@ -174,8 +173,7 @@ static void fetch_landmarks(LLInventoryModel::cat_array_t& cats,  		add);  	// Look in "Landmarks" -	LLUUID landmarks_folder_id =  -		gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); +	const LLUUID landmarks_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);  	gInventory.collectDescendentsIf(landmarks_folder_id,  		cats,  		items, @@ -202,7 +200,7 @@ bool LLLandmarkActions::landmarkAlreadyExists()  //static  bool LLLandmarkActions::hasParcelLandmark()  { -	LLFistAgentParcelLandmark get_first_agent_landmark; +	LLFirstAgentParcelLandmark get_first_agent_landmark;  	LLInventoryModel::cat_array_t cats;  	LLInventoryModel::item_array_t items;  	fetch_landmarks(cats, items, get_first_agent_landmark); @@ -287,7 +285,7 @@ void LLLandmarkActions::createLandmarkHere()  	LLAgentUI::buildLocationString(landmark_name, LLAgentUI::LOCATION_FORMAT_LANDMARK);  	LLAgentUI::buildLocationString(landmark_desc, LLAgentUI::LOCATION_FORMAT_FULL); -	LLUUID folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); +	const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);  	createLandmarkHere(landmark_name, landmark_desc, folder_id);  } diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h index 312426cab0..1c524c820c 100644 --- a/indra/newview/lllandmarkactions.h +++ b/indra/newview/lllandmarkactions.h @@ -55,7 +55,7 @@ public:  	static bool landmarkAlreadyExists();  	/** -	 * @brief Checks whether landmark exists for current parcel. +	 * @brief Checks whether landmark exists for current agent parcel.  	 */  	static bool hasParcelLandmark(); diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index e63daac4af..b35fd6134b 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -50,6 +50,7 @@  #include "llslurl.h"  #include "llurlsimstring.h"  #include "llviewerinventory.h" +#include "llviewermenu.h"  #include "llviewerparcelmgr.h"  #include "llworldmap.h"  #include "llappviewer.h" @@ -271,6 +272,12 @@ void LLNavigationBar::draw()  	LLPanel::draw();  } +BOOL LLNavigationBar::handleRightMouseDown(S32 x, S32 y, MASK mask) +{ +	show_navbar_context_menu(this,x,y); +	return TRUE; +} +  void LLNavigationBar::onBackButtonClicked()  {  	LLTeleportHistory::getInstance()->goBack(); diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h index 04707d8d48..52f5a827e4 100644 --- a/indra/newview/llnavigationbar.h +++ b/indra/newview/llnavigationbar.h @@ -54,6 +54,7 @@ public:  	virtual ~LLNavigationBar();  	/*virtual*/ void	draw(); +	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);  	/*virtual*/ BOOL	postBuild();  	void handleLoginComplete(); diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 12638ab855..81d033d7f9 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -97,14 +97,39 @@ BOOL LLNearbyChat::postBuild()  	if (getDockControl() == NULL)  	{  		setDockControl(new LLDockControl( -				LLBottomTray::getInstance()->getNearbyChatBar(), this, -				getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1))); +			LLBottomTray::getInstance()->getNearbyChatBar(), this, +			getDockTongue(), LLDockControl::LEFT, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));  	}  	return true;  } +void    LLNearbyChat::applySavedVariables() +{ + +	if (mRectControl.size() > 1) +	{ +		const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl); +		reshape(rect.getWidth(), rect.getHeight()); +		setRect(rect); +	} + + +	if(!LLUI::sSettingGroups["floater"]->controlExists(mDocStateControl)) +	{ +		setDocked(true); +	} +	else +	{ +		if (mDocStateControl.size() > 1) +		{ +			bool dockState = LLUI::sSettingGroups["floater"]->getBOOL(mDocStateControl); +			setDocked(dockState); +		} +	} +} +  LLColor4 nearbychat_get_text_color(const LLChat& chat)  {  	LLColor4 text_color; @@ -265,11 +290,5 @@ void LLNearbyChat::getAllowedRect(LLRect& rect)  {  	rect = gViewerWindow->getWorldViewRect();  } -void LLNearbyChat::setVisible	(BOOL visible) -{ -	LLDockableFloater::setVisible(visible); -} -void LLNearbyChat::toggleWindow() -{ -} + diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 20cbf7537d..cb4654654a 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -52,16 +52,15 @@ public:  	void	onNearbyChatContextMenuItemClicked(const LLSD& userdata);  	bool	onNearbyChatCheckContextMenuItem(const LLSD& userdata); -	void	setDocked			(bool docked, bool pop_on_undock); -	void	toggleWindow		(); +	void	setDocked			(bool docked, bool pop_on_undock = true);  	/*virtual*/ void	onOpen	(const LLSD& key); -	virtual void setVisible		(BOOL visible); -  	virtual void setRect		(const LLRect &rect);  private: +	virtual void    applySavedVariables(); +  	void	getAllowedRect		(LLRect& rect);  	void	onNearbySpeakers	(); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 32dc5e5927..d7a5ff289c 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -77,6 +77,10 @@ LLGestureComboBox::LLGestureComboBox(const LLGestureComboBox::Params& p)  	// refresh list from current active gestures  	refreshGestures(); + +	// This forces using of halign from xml, since LLComboBox +	// sets it to LLFontGL::LEFT, if text entry is disabled +	mButton->setHAlign(p.drop_down_button.font_halign);  }  LLGestureComboBox::~LLGestureComboBox() @@ -207,6 +211,7 @@ LLNearbyChatBar::LLNearbyChatBar()  	: LLPanel()  	, mChatBox(NULL)  { +	mSpeakerMgr = LLLocalSpeakerMgr::getInstance();  }  //virtual @@ -516,8 +521,8 @@ void LLNearbyChatBar::displaySpeakingIndicator()  	LLUUID id;  	id.setNull(); -	mSpeakerMgr.update(TRUE); -	mSpeakerMgr.getSpeakerList(&speaker_list, FALSE); +	mSpeakerMgr->update(TRUE); +	mSpeakerMgr->getSpeakerList(&speaker_list, FALSE);  	for (LLSpeakerMgr::speaker_list_t::iterator i = speaker_list.begin(); i != speaker_list.end(); ++i)  	{ diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index 06204e6367..0307eee7bf 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -127,7 +127,7 @@ protected:  	LLLineEditor*		mChatBox;  	LLTalkButton*		mTalkBtn;  	LLOutputMonitorCtrl* mOutputMonitor; -	LLActiveSpeakerMgr  mSpeakerMgr; +	LLLocalSpeakerMgr*  mSpeakerMgr;  };  #endif diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp index 8bac9937f0..39381e3faa 100644 --- a/indra/newview/lloutputmonitorctrl.cpp +++ b/indra/newview/lloutputmonitorctrl.cpp @@ -80,7 +80,8 @@ LLOutputMonitorCtrl::LLOutputMonitorCtrl(const LLOutputMonitorCtrl::Params& p)  	mImageLevel2(p.image_level_2),  	mImageLevel3(p.image_level_3),  	mAutoUpdate(p.auto_update), -	mSpeakerId(p.speaker_id) +	mSpeakerId(p.speaker_id), +	mIsAgentControl(false)  {  	//static LLUIColor output_monitor_muted_color = LLUIColorTable::instance().getColor("OutputMonitorMutedColor", LLColor4::orange);  	//static LLUIColor output_monitor_overdriven_color = LLUIColorTable::instance().getColor("OutputMonitorOverdrivenColor", LLColor4::red); @@ -132,7 +133,14 @@ void LLOutputMonitorCtrl::draw()  	if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull())  	{  		setPower(gVoiceClient->getCurrentPower(mSpeakerId)); -		setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId)); +		if(mIsAgentControl) +		{ +			setIsTalking(gVoiceClient->getUserPTTState()); +		} +		else +		{ +			setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId)); +		}  	}  	LLPointer<LLUIImage> icon; diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h index 7a7b8bc3a1..85ea552a57 100644 --- a/indra/newview/lloutputmonitorctrl.h +++ b/indra/newview/lloutputmonitorctrl.h @@ -81,6 +81,8 @@ public:  	// For the current user, need to know the PTT state to show  	// correct button image. +	void			setIsAgentControl(bool val) { mIsAgentControl = val; } +  	void			setIsTalking(bool val) { mIsTalking = val; }  	void			setSpeakerId(const LLUUID& speaker_id); @@ -100,6 +102,7 @@ private:  	F32				mPower; +	bool			mIsAgentControl;  	bool			mIsMuted;  	bool			mIsTalking;  	LLPointer<LLUIImage> mImageMute; diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index c28792a711..9d591ef43d 100644 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -59,6 +59,7 @@  #include "lltoolcomp.h"  #include "lltoolmgr.h"  #include "lltrans.h" +#include "llviewerassettype.h"  #include "llviewerobject.h"  #include "llviewerregion.h"  #include "llviewerwindow.h" @@ -167,7 +168,7 @@ void LLPanelContents::onClickNewScript(void *userdata)  			PERM_NONE,  			PERM_MOVE | PERM_TRANSFER);  		std::string desc; -		LLAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc); +		LLViewerAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc);  		LLPointer<LLViewerInventoryItem> new_item =  			new LLViewerInventoryItem(  				LLUUID::null, diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index b54975b76b..21e88b6d07 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -112,21 +112,32 @@ BOOL LLPanelIMControlPanel::postBuild()  	childSetAction("add_friend_btn", boost::bind(&LLPanelIMControlPanel::onAddFriendButtonClicked, this));  	childSetAction("share_btn", boost::bind(&LLPanelIMControlPanel::onShareButtonClicked, this)); +	childSetAction("teleport_btn", boost::bind(&LLPanelIMControlPanel::onTeleportButtonClicked, this)); +	childSetAction("pay_btn", boost::bind(&LLPanelIMControlPanel::onPayButtonClicked, this));  	childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId()));  	return LLPanelChatControlPanel::postBuild();  } +void LLPanelIMControlPanel::onTeleportButtonClicked() +{ +	LLAvatarActions::offerTeleport(mAvatarID); +} +void LLPanelIMControlPanel::onPayButtonClicked() +{ +	LLAvatarActions::pay(mAvatarID); +} +  void LLPanelIMControlPanel::onViewProfileButtonClicked()  { -	LLAvatarActions::showProfile(getChild<LLAvatarIconCtrl>("avatar_icon")->getAvatarId()); +	LLAvatarActions::showProfile(mAvatarID);  }  void LLPanelIMControlPanel::onAddFriendButtonClicked()  {  	LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon");  	std::string full_name = avatar_icon->getFirstName() + " " + avatar_icon->getLastName(); -	LLAvatarActions::requestFriendshipDialog(avatar_icon->getAvatarId(), full_name); +	LLAvatarActions::requestFriendshipDialog(mAvatarID, full_name);  }  void LLPanelIMControlPanel::onShareButtonClicked() @@ -140,12 +151,12 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)  	LLIMModel& im_model = LLIMModel::instance(); -	LLUUID avatar_id = im_model.getOtherParticipantID(session_id); +	mAvatarID = im_model.getOtherParticipantID(session_id);  	// Disable "Add friend" button for friends. -	childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(avatar_id)); +	childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID)); -	getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(avatar_id); +	getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID);  	// Disable profile button if participant is not realy SL avatar  	LLIMModel::LLIMSession* im_session = @@ -188,6 +199,20 @@ void LLPanelGroupControlPanel::onGroupInfoButtonClicked()  	LLGroupActions::show(mGroupID);  } +void LLPanelGroupControlPanel::onSortMenuItemClicked(const LLSD& userdata) +{ +	// TODO: Check this code when when sort order menu will be added. (EM) +	if (false && !mParticipantList) +		return; + +	std::string chosen_item = userdata.asString(); + +	if (chosen_item == "sort_name") +	{ +		mParticipantList->setSortOrder(LLParticipantList::E_SORT_BY_NAME); +	} + +}  void LLPanelGroupControlPanel::setSessionId(const LLUUID& session_id)  { diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index d25f33935a..fa101f4280 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -73,6 +73,8 @@ private:  	void onViewProfileButtonClicked();  	void onAddFriendButtonClicked();  	void onShareButtonClicked(); +	void onTeleportButtonClicked(); +	void onPayButtonClicked();  	LLUUID mAvatarID;  }; @@ -97,6 +99,7 @@ protected:  private:  	void onGroupInfoButtonClicked(); +	void onSortMenuItemClicked(const LLSD& userdata);  };  class LLPanelAdHocControlPanel : public LLPanelGroupControlPanel diff --git a/indra/newview/llpanellandmarkinfo.h b/indra/newview/llpanellandmarkinfo.h new file mode 100644 index 0000000000..03377986b3 --- /dev/null +++ b/indra/newview/llpanellandmarkinfo.h @@ -0,0 +1,85 @@ +/** + * @file llpanellandmarkinfo.h + * @brief Displays landmark info in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, 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_LLPANELLANDMARKINFO_H +#define LL_LLPANELLANDMARKINFO_H + +#include "llpanelplaceinfo.h" + +class LLComboBox; +class LLLineEditor; +class LLTextEditor; + +class LLPanelLandmarkInfo : public LLPanelPlaceInfo +{ +public: +	LLPanelLandmarkInfo(); +	/*virtual*/ ~LLPanelLandmarkInfo(); + +	/*virtual*/ BOOL postBuild(); + +	/*virtual*/ void resetLocation(); + +	/*virtual*/ void setInfoType(INFO_TYPE type); + +	/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); + +	// Displays landmark owner, creator and creation date info. +	void displayItemInfo(const LLInventoryItem* pItem); + +	void toggleLandmarkEditMode(BOOL enabled); + +	const std::string& getLandmarkTitle() const; +	const std::string getLandmarkNotes() const; +	const LLUUID getLandmarkFolder() const; + +	// Select current landmark folder in combobox. +	BOOL setLandmarkFolder(const LLUUID& id); + +	// Create a landmark for the current location +	// in a folder specified by folder_id. +	void createLandmark(const LLUUID& folder_id); + +	static std::string getFullFolderName(const LLViewerInventoryCategory* cat); + +private: +	void populateFoldersList(); + +	LLTextBox*			mOwner; +	LLTextBox*			mCreator; +	LLTextBox*			mCreated; +	LLLineEditor*		mTitleEditor; +	LLTextEditor*		mNotesEditor; +	LLComboBox*			mFolderCombo; +}; + +#endif // LL_LLPANELLANDMARKINFO_H diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 91e1590dc3..6d6fd38cce 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -553,14 +553,16 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const  	std::string command_name = userdata.asString();  	if("add_landmark" == command_name)  	{ -		if(LLLandmarkActions::landmarkAlreadyExists()) +		LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos(); +		if(landmark) +		{ +			LLSideTray::getInstance()->showPanel("panel_places",  +								LLSD().insert("type", "landmark").insert("id",landmark->getUUID())); +		} +		else  		{ -			std::string location; -			LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_FULL); -			llwarns<<" Landmark already exists at location:  "<< location<<llendl; -			return; +			LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));  		} -		LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "create_landmark"));  	}   	else if ("category" == command_name)  	{ @@ -584,7 +586,7 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const  			menu_create_inventory_item(mCurrentSelectedList->getRootFolder(),  					dynamic_cast<LLFolderBridge*> (folder_bridge), LLSD(  							"category"), gInventory.findCategoryUUIDForType( -							LLAssetType::AT_LANDMARK)); +							LLFolderType::FT_LANDMARK));  		}  	}  } @@ -616,19 +618,21 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const  void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)  { -	if(!mCurrentSelectedList) return; - -	LLFolderView* root_folder = mCurrentSelectedList->getRootFolder(); +	LLFolderView* landmarks_folder = mLandmarksInventoryPanel->getRootFolder(); +	LLFolderView* fav_folder = mFavoritesInventoryPanel->getRootFolder();  	std::string command_name = userdata.asString();  	if ("expand_all" == command_name)  	{ -		root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); -		root_folder->arrangeAll(); +		landmarks_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); +		fav_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN); +		landmarks_folder->arrangeAll(); +		fav_folder->arrangeAll();  	}  	else if ("collapse_all" == command_name)  	{ -		root_folder->closeAllFolders(); +		landmarks_folder->closeAllFolders(); +		fav_folder->closeAllFolders();  	}  	else if ( "sort_by_date" == command_name)  	{ @@ -639,6 +643,9 @@ void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)  	}  	else  	{ +		if(!mCurrentSelectedList) return; + +		LLFolderView* root_folder = mCurrentSelectedList->getRootFolder();  		root_folder->doToSelected(&gInventory, userdata);  	}  } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 617445a27f..25be09fa24 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -84,8 +84,8 @@ LLPanelMainInventory::LLPanelMainInventory()  	// Menu Callbacks (non contex menus)  	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2));  	mCommitCallbackRegistrar.add("Inventory.CloseAllFolders", boost::bind(&LLPanelMainInventory::closeAllFolders, this)); -	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); -	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); +	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); +	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));  	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLPanelMainInventory::doCreate, this, _2));   	mCommitCallbackRegistrar.add("Inventory.NewWindow", boost::bind(&LLPanelMainInventory::newWindow, this));  	mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this)); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 68181f12b9..79b33e29f5 100644 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -60,6 +60,7 @@  #include "llsidetray.h"  #include "llstatusbar.h"  #include "lltrans.h" +#include "llviewerassettype.h"  #include "llviewerregion.h"  #include "llviewerobjectlist.h"  #include "llviewermessage.h" @@ -102,7 +103,7 @@ public:  	virtual const std::string& getName() const;  	virtual const std::string& getDisplayName() const;  	virtual PermissionMask getPermissionMask() const { return PERM_NONE; } -	/*virtual*/ LLAssetType::EType getPreferredType() const { return LLAssetType::AT_NONE; } +	/*virtual*/ LLFolderType::EType getPreferredType() const { return LLFolderType::FT_NONE; }  	virtual const LLUUID& getUUID() const { return mUUID; }  	virtual time_t getCreationDate() const;  	virtual LLUIImagePtr getIcon() const; @@ -275,7 +276,7 @@ bool LLTaskInvFVBridge::commitBuyItem(const LLSD& notification, const LLSD& resp  		msg->addUUIDFast(_PREHASH_ObjectID, notification["payload"]["task_id"].asUUID());  		msg->addUUIDFast(_PREHASH_ItemID, notification["payload"]["item_id"].asUUID());  		msg->addUUIDFast(_PREHASH_FolderID, -			gInventory.findCategoryUUIDForType((LLAssetType::EType)notification["payload"]["type"].asInteger())); +			gInventory.findCategoryUUIDForType((LLFolderType::EType)notification["payload"]["type"].asInteger()));  		msg->sendReliable(object->getRegion()->getHost());  	}  	return false; @@ -573,7 +574,7 @@ BOOL LLTaskInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const  //				   || gAgent.isGodlike())  				{ -					*type = LLAssetType::lookupDragAndDropType(inv->getType()); +					*type = LLViewerAssetType::lookupDragAndDropType(inv->getType());  					*id = inv->getUUID();  					return TRUE; @@ -778,7 +779,7 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const  //				   || gAgent.isGodlike())  				{ -					*type = LLAssetType::lookupDragAndDropType(inv->getType()); +					*type = LLViewerAssetType::lookupDragAndDropType(inv->getType());  					*id = inv->getUUID();  					return TRUE; @@ -1461,7 +1462,6 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*  											  item->getFlags());  		break;  	case LLAssetType::AT_CATEGORY: -	case LLAssetType::AT_FAVORITE:  		new_bridge = new LLTaskCategoryBridge(panel,  											  object->getUUID(),  											  object->getName()); @@ -1503,8 +1503,8 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par  {  	// Setup context menu callbacks  	mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelObjectInventory::doToSelected, this, _2)); -	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLAssetType::AT_TRASH)); -	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLAssetType::AT_LOST_AND_FOUND)); +	mCommitCallbackRegistrar.add("Inventory.EmptyTrash", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyTrash", LLFolderType::FT_TRASH)); +	mCommitCallbackRegistrar.add("Inventory.EmptyLostAndFound", boost::bind(&LLInventoryModel::emptyFolderType, &gInventory, "ConfirmEmptyLostAndFound", LLFolderType::FT_LOST_AND_FOUND));  	mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&do_nothing));  	mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing));  	mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing)); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 4580eeb336..2f8fae0f5d 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -42,6 +42,7 @@  #include "llpanelpeople.h"  // newview +#include "llaccordionctrl.h"  #include "llaccordionctrltab.h"  #include "llagent.h"  #include "llavataractions.h" @@ -516,6 +517,9 @@ BOOL LLPanelPeople::postBuild()  	// call this method in case some list is empty and buttons can be in inconsistent state  	updateButtons(); +	mOnlineFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2)); +	mAllFriendList->setRefreshCompleteCallback(boost::bind(&LLPanelPeople::onFriendListRefreshComplete, this, _1, _2)); +  	return TRUE;  } @@ -560,6 +564,8 @@ void LLPanelPeople::updateFriendList()  	mOnlineFriendList->setDirty();  	mAllFriendList->setDirty(); + +	showFriendsAccordionsIfNeeded();  }  void LLPanelPeople::updateNearbyList() @@ -797,14 +803,15 @@ void LLPanelPeople::reSelectedCurrentTab()  void LLPanelPeople::onFilterEdit(const std::string& search_string)  { -	if (mFilterSubString == search_string) -		return; +	std::string search_upper = search_string; +	// Searches are case-insensitive +	LLStringUtil::toUpper(search_upper); +	LLStringUtil::trimHead(search_upper); -	mFilterSubString = search_string; +	if (mFilterSubString == search_upper) +		return; -	// Searches are case-insensitive -	LLStringUtil::toUpper(mFilterSubString); -	LLStringUtil::trimHead(mFilterSubString); +	mFilterSubString = search_upper;  	// Apply new filter.  	mNearbyList->setNameFilter(mFilterSubString); @@ -812,6 +819,8 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)  	mAllFriendList->setNameFilter(mFilterSubString);  	mRecentList->setNameFilter(mFilterSubString);  	mGroupList->setNameFilter(mFilterSubString); + +	showFriendsAccordionsIfNeeded();  }  void LLPanelPeople::onTabSelected(const LLSD& param) @@ -1124,3 +1133,49 @@ void	LLPanelPeople::onOpen(const LLSD& key)  	else  		reSelectedCurrentTab();  } + +void LLPanelPeople::showAccordion(const std::string name, bool show) +{ +	if(name.empty()) +	{ +		llwarns << "No name provided" << llendl; +		return; +	} + +	LLAccordionCtrlTab* tab = getChild<LLAccordionCtrlTab>(name); +	tab->setVisible(show); +	if(show) +	{ +		// expand accordion +		tab->changeOpenClose(false); +	} +} + +void LLPanelPeople::showFriendsAccordionsIfNeeded() +{ +	if(FRIENDS_TAB_NAME == getActiveTabName()) +	{ +		// Expand and show accordions if needed, else - hide them +		showAccordion("tab_online", mOnlineFriendList->filterHasMatches()); +		showAccordion("tab_all", mAllFriendList->filterHasMatches()); + +		// Rearrange accordions +		LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); +		accordion->arrange(); +	} +} + +void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param) +{ +	if(ctrl == mOnlineFriendList) +	{ +		showAccordion("tab_online", param.asInteger()); +	} +	else if(ctrl == mAllFriendList) +	{ +		showAccordion("tab_all", param.asInteger()); +	} + +	LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); +	accordion->arrange(); +} diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index dc0aaeb70f..9bf9befe90 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -124,6 +124,12 @@ private:  	void					onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list); +	void					showAccordion(const std::string name, bool show); + +	void					showFriendsAccordionsIfNeeded(); + +	void					onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param); +  	LLFilterEditor*			mFilterEditor;  	LLTabContainer*			mTabContainer;  	LLAvatarList*			mOnlineFriendList; diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 34644cfe42..2c5f4b5afa 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -1,6 +1,6 @@  /**   * @file llpanelplaceinfo.cpp - * @brief Displays place information in Side Tray. + * @brief Base class for place information in Side Tray.   *   * $LicenseInfo:firstyear=2009&license=viewergpl$   *  @@ -39,66 +39,34 @@  #include "llsecondlifeurls.h"  #include "llinventory.h" -#include "llparcel.h" -#include "llqueryflags.h" +#include "llsdutil_math.h" -#include "llbutton.h" -#include "llcombobox.h" -#include "lliconctrl.h"  #include "llscrollcontainer.h"  #include "lltextbox.h" -#include "lltrans.h" -#include "llaccordionctrl.h" -#include "llaccordionctrltab.h"  #include "llagent.h" -#include "llagentui.h" -#include "llappviewer.h"  #include "llavatarpropertiesprocessor.h" -#include "llcallbacklist.h"  #include "llexpandabletextbox.h"  #include "llfloaterworldmap.h" -#include "llfloaterbuycurrency.h"  #include "llinventorymodel.h" -#include "lllandmarkactions.h"  #include "llpanelpick.h"  #include "lltexturectrl.h" -#include "llstatusbar.h"  #include "llviewerinventory.h"  #include "llviewerparcelmgr.h"  #include "llviewerregion.h" -#include "llviewercontrol.h"   #include "llviewertexteditor.h"  #include "llworldmap.h" -#include "llsdutil_math.h" - -//---------------------------------------------------------------------------- -// Aux types and methods -//---------------------------------------------------------------------------- - -typedef std::pair<LLUUID, std::string> folder_pair_t; - -static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right); -static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats); - -static LLRegisterPanelClassWrapper<LLPanelPlaceInfo> t_place_info("panel_place_info");  LLPanelPlaceInfo::LLPanelPlaceInfo()  :	LLPanel(),  	mParcelID(),  	mRequestedID(),  	mPosRegion(), -	mLandmarkID(), -	mMinHeight(0), -	mScrollingPanel(NULL), -	mInfoPanel(NULL), -	mMediaPanel(NULL), -	mForSalePanel(NULL), -	mYouAreHerePanel(NULL), -	mSelectedParcelID(-1) +	mMinHeight(0)  {} +//virtual  LLPanelPlaceInfo::~LLPanelPlaceInfo()  {  	if (mParcelID.notNull()) @@ -107,220 +75,41 @@ LLPanelPlaceInfo::~LLPanelPlaceInfo()  	}  } +//virtual  BOOL LLPanelPlaceInfo::postBuild()  { -	mTitle = getChild<LLTextBox>("panel_title"); +	mTitle = getChild<LLTextBox>("title");  	mCurrentTitle = mTitle->getText(); -	mForSalePanel = getChild<LLPanel>("for_sale_panel"); -	mYouAreHerePanel = getChild<LLPanel>("here_panel"); -	gIdleCallbacks.addFunction(&LLPanelPlaceInfo::updateYouAreHereBanner, this); -	 -	//Icon value should contain sale price of last selected parcel.  -	mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")-> -				setMouseDownCallback(boost::bind(&LLPanelPlaceInfo::onForSaleBannerClick, this)); -  	mSnapshotCtrl = getChild<LLTextureCtrl>("logo");  	mRegionName = getChild<LLTextBox>("region_title");  	mParcelName = getChild<LLTextBox>("parcel_title");  	mDescEditor = getChild<LLExpandableTextBox>("description");  	mMaturityRatingText = getChild<LLTextBox>("maturity_value"); -	mParcelOwner = getChild<LLTextBox>("owner_value"); -	mLastVisited = getChild<LLTextBox>("last_visited_value"); - -	mRatingText = getChild<LLTextBox>("rating_value"); -	mVoiceText = getChild<LLTextBox>("voice_value"); -	mFlyText = getChild<LLTextBox>("fly_value"); -	mPushText = getChild<LLTextBox>("push_value"); -	mBuildText = getChild<LLTextBox>("build_value"); -	mScriptsText = getChild<LLTextBox>("scripts_value"); -	mDamageText = getChild<LLTextBox>("damage_value"); - -	mRegionNameText = getChild<LLTextBox>("region_name"); -	mRegionTypeText = getChild<LLTextBox>("region_type"); -	mRegionRatingText = getChild<LLTextBox>("region_rating"); -	mRegionOwnerText = getChild<LLTextBox>("region_owner"); -	mRegionGroupText = getChild<LLTextBox>("region_group"); - -	mEstateNameText = getChild<LLTextBox>("estate_name"); -	mEstateRatingText = getChild<LLTextBox>("estate_rating"); -	mEstateOwnerText = getChild<LLTextBox>("estate_owner"); -	mCovenantText = getChild<LLTextEditor>("covenant"); - -	mSalesPriceText = getChild<LLTextBox>("sales_price"); -	mAreaText = getChild<LLTextBox>("area"); -	mTrafficText = getChild<LLTextBox>("traffic"); -	mPrimitivesText = getChild<LLTextBox>("primitives"); -	mParcelScriptsText = getChild<LLTextBox>("parcel_scripts"); -	mTerraformLimitsText = getChild<LLTextBox>("terraform_limits"); -	mSubdivideText = getChild<LLTextEditor>("subdivide"); -	mResaleText = getChild<LLTextEditor>("resale"); -	mSaleToText = getChild<LLTextBox>("sale_to"); -	mOwner = getChild<LLTextBox>("owner"); -	mCreator = getChild<LLTextBox>("creator"); -	mCreated = getChild<LLTextBox>("created"); - -	mTitleEditor = getChild<LLLineEditor>("title_editor"); -	mNotesEditor = getChild<LLTextEditor>("notes_editor"); -	mFolderCombo = getChild<LLComboBox>("folder_combo"); - -	LLScrollContainer* scroll_container = getChild<LLScrollContainer>("scroll_container"); +	LLScrollContainer* scroll_container = getChild<LLScrollContainer>("place_scroll");  	scroll_container->setBorderVisible(FALSE);  	mMinHeight = scroll_container->getScrolledViewRect().getHeight(); -	mScrollingPanel = getChild<LLPanel>("scrolling_panel"); -	mInfoPanel = getChild<LLPanel>("info_panel"); -	mMediaPanel = getChild<LLMediaPanel>("media_panel"); -	if (!mMediaPanel) -		return FALSE; -  	return TRUE;  } -void LLPanelPlaceInfo::displayItemInfo(const LLInventoryItem* pItem) -{ -	if (!pItem) -		return; - -	mLandmarkID = pItem->getUUID(); - -	if(!gCacheName) -		return; - -	const LLPermissions& perm = pItem->getPermissions(); - -	////////////////// -	// CREATOR NAME // -	////////////////// -	if (pItem->getCreatorUUID().notNull()) -	{ -		std::string name; -		LLUUID creator_id = pItem->getCreatorUUID(); -		if (!gCacheName->getFullName(creator_id, name)) -		{ -			gCacheName->get(creator_id, FALSE, -							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mCreator, _2, _3)); -		} -		mCreator->setText(name); -	} -	else -	{ -		mCreator->setText(getString("unknown")); -	} - -	//////////////// -	// OWNER NAME // -	//////////////// -	if(perm.isOwned()) -	{ -		std::string name; -		if (perm.isGroupOwned()) -		{ -			LLUUID group_id = perm.getGroup(); -			if (!gCacheName->getGroupName(group_id, name)) -			{ -				gCacheName->get(group_id, TRUE, -								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3)); -			} -		} -		else -		{ -			LLUUID owner_id = perm.getOwner(); -			if (!gCacheName->getFullName(owner_id, name)) -			{ -				gCacheName->get(owner_id, FALSE, -								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mOwner, _2, _3)); -			} -		} -		mOwner->setText(name); -	} -	else -	{ -		mOwner->setText(getString("public")); -	} -	 -	////////////////// -	// ACQUIRE DATE // -	////////////////// -	time_t time_utc = pItem->getCreationDate(); -	if (0 == time_utc) -	{ -		mCreated->setText(getString("unknown")); -	} -	else -	{ -		std::string timeStr = getString("acquired_date"); -		LLSD substitution; -		substitution["datetime"] = (S32) time_utc; -		LLStringUtil::format (timeStr, substitution); -		mCreated->setText(timeStr); -	} - -	mTitleEditor->setText(pItem->getName()); -	mNotesEditor->setText(pItem->getDescription()); -} - -void LLPanelPlaceInfo::nameUpdatedCallback( -	LLTextBox* text, -	const std::string& first, -	const std::string& last) -{ -	text->setText(first + " " + last); -} - +//virtual  void LLPanelPlaceInfo::resetLocation()  {  	mParcelID.setNull();  	mRequestedID.setNull(); -	mLandmarkID.setNull();  	mPosRegion.clearVec(); -	mForSalePanel->setVisible(FALSE); -	mYouAreHerePanel->setVisible(FALSE); +  	std::string not_available = getString("not_available");  	mMaturityRatingText->setValue(not_available); -	mParcelOwner->setValue(not_available); -	mLastVisited->setValue(not_available);  	mRegionName->setText(not_available);  	mParcelName->setText(not_available);  	mDescEditor->setText(not_available); -	mCreator->setText(not_available); -	mOwner->setText(not_available); -	mCreated->setText(not_available); -	mTitleEditor->setText(LLStringUtil::null); -	mNotesEditor->setText(LLStringUtil::null); +  	mSnapshotCtrl->setImageAssetID(LLUUID::null);  	mSnapshotCtrl->setFallbackImageName("default_land_picture.j2c"); - -	mRatingText->setText(not_available); -	mVoiceText->setText(not_available); -	mFlyText->setText(not_available); -	mPushText->setText(not_available); -	mBuildText->setText(not_available); -	mParcelScriptsText->setText(not_available); -	mDamageText->setText(not_available); - -	mRegionNameText->setValue(not_available); -	mRegionTypeText->setValue(not_available); -	mRegionRatingText->setValue(not_available); -	mRegionOwnerText->setValue(not_available); -	mRegionGroupText->setValue(not_available); - -	mEstateNameText->setValue(not_available); -	mEstateRatingText->setValue(not_available); -	mEstateOwnerText->setValue(not_available); -	mCovenantText->setValue(not_available); - -	mSalesPriceText->setValue(not_available); -	mAreaText->setValue(not_available); -	mTrafficText->setValue(not_available); -	mPrimitivesText->setValue(not_available); -	mParcelScriptsText->setValue(not_available); -	mTerraformLimitsText->setValue(not_available); -	mSubdivideText->setValue(not_available); -	mResaleText->setValue(not_available); -	mSaleToText->setValue(not_available);  }  //virtual @@ -330,108 +119,55 @@ void LLPanelPlaceInfo::setParcelID(const LLUUID& parcel_id)  	sendParcelInfoRequest();  } +//virtual  void LLPanelPlaceInfo::setInfoType(INFO_TYPE type)  { -	LLPanel* landmark_info_panel = getChild<LLPanel>("landmark_info_panel"); -	LLPanel* landmark_edit_panel = getChild<LLPanel>("landmark_edit_panel"); - -	bool is_info_type_agent = type == AGENT; -	bool is_info_type_create_landmark = type == CREATE_LANDMARK; -	bool is_info_type_landmark = type == LANDMARK; -	bool is_info_type_teleport_history = type == TELEPORT_HISTORY; - -	getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent); -	mMaturityRatingText->setVisible(!is_info_type_agent); - -	getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent); -	mParcelOwner->setVisible(is_info_type_agent); - -	getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history); -	mLastVisited->setVisible(is_info_type_teleport_history); - -	landmark_info_panel->setVisible(is_info_type_landmark); -	landmark_edit_panel->setVisible(is_info_type_landmark || is_info_type_create_landmark); - -	getChild<LLTextBox>("folder_lable")->setVisible(is_info_type_create_landmark); -	mFolderCombo->setVisible(is_info_type_create_landmark); - -	getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent); - -	switch(type) -	{ -		case CREATE_LANDMARK: -			mCurrentTitle = getString("title_create_landmark"); - -			mTitleEditor->setEnabled(TRUE); -			mNotesEditor->setEnabled(TRUE); - -			populateFoldersList(); -		break; - -		case AGENT: -		case PLACE: -			mCurrentTitle = getString("title_place"); - -			if (!isMediaPanelVisible()) -			{ -				mTitle->setText(mCurrentTitle); -			} -		break; - -		case LANDMARK: -			mCurrentTitle = getString("title_landmark"); - -			mTitleEditor->setEnabled(FALSE); -			mNotesEditor->setEnabled(FALSE); - -			populateFoldersList(); -		break; - -		case TELEPORT_HISTORY: -			mCurrentTitle = getString("title_teleport_history"); -		break; -	} - -	if (type != AGENT) -		toggleMediaPanel(FALSE); +	mTitle->setText(mCurrentTitle);  	mInfoType = type;  } -BOOL LLPanelPlaceInfo::isMediaPanelVisible() +void LLPanelPlaceInfo::sendParcelInfoRequest()  { -	if (!mMediaPanel) -		return FALSE; +	if (mParcelID != mRequestedID) +	{ +		LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this); +		LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID); -	return mMediaPanel->getVisible(); +		mRequestedID = mParcelID; +	}  } -void LLPanelPlaceInfo::toggleMediaPanel(BOOL visible) +void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id, +										 const LLVector3d& pos_global)  { -    if (!mMediaPanel) -        return; +	LLViewerRegion* region = gAgent.getRegion(); +	if (!region) +		return; + +	mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), +					  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), +					  (F32)pos_global.mdV[VZ]); -    if (visible) +	LLSD body; +	std::string url = region->getCapability("RemoteParcelRequest"); +	if (!url.empty())  	{ -		mTitle->setText(getString("title_media")); +		body["location"] = ll_sd_from_vector3(mPosRegion); +		if (!region_id.isNull()) +		{ +			body["region_id"] = region_id; +		} +		if (!pos_global.isExactlyZero()) +		{ +			U64 region_handle = to_region_handle(pos_global); +			body["region_handle"] = ll_sd_from_U64(region_handle); +		} +		LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));  	}  	else  	{ -		mTitle->setText(mCurrentTitle); -	} - -    mInfoPanel->setVisible(!visible); -    mMediaPanel->setVisible(visible); -} - -void LLPanelPlaceInfo::sendParcelInfoRequest() -{ -	if (mParcelID != mRequestedID) -	{ -		LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this); -		LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID); - -		mRequestedID = mParcelID; +		mDescEditor->setText(getString("server_update_text"));  	}  } @@ -473,27 +209,6 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)  		mDescEditor->setText(parcel_data.desc);  	} -	// HACK: Flag 0x2 == adult region, -	// Flag 0x1 == mature region, otherwise assume PG -	std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); -	if (parcel_data.flags & 0x2) -	{ -		rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); -	} -	else if (parcel_data.flags & 0x1) -	{ -		rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); -	} - -	mMaturityRatingText->setValue(rating); -	mRatingText->setValue(rating); - -	//update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE -	//because we deal with remote parcel response format -	bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) && -					 mInfoType == AGENT ? TRUE : FALSE; -	mForSalePanel->setVisible(is_for_sale); -  	S32 region_x;  	S32 region_y;  	S32 region_z; @@ -521,408 +236,25 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)  	{  		mParcelName->setText(getString("not_available"));  	} - -	if (mInfoType == CREATE_LANDMARK) -	{ -		if (parcel_data.name.empty()) -		{ -			mTitleEditor->setText(llformat("%s (%d, %d, %d)", -								  parcel_data.sim_name.c_str(), region_x, region_y, region_z)); -		} -		else -		{ -			mTitleEditor->setText(parcel_data.name); -		} - -		// FIXME: Creating landmark works only for current agent location. -		std::string desc; -		LLAgentUI::buildLocationString(desc, LLAgentUI::LOCATION_FORMAT_FULL, gAgent.getPositionAgent()); -		mNotesEditor->setText(desc); - -		if (!LLLandmarkActions::landmarkAlreadyExists()) -		{ -			createLandmark(mFolderCombo->getValue().asUUID()); -		} -	}  } -void LLPanelPlaceInfo::displayParcelInfo(const LLUUID& region_id, -										 const LLVector3d& pos_global) +// virtual +void LLPanelPlaceInfo::handleVisibilityChange(BOOL new_visibility)  { -	LLViewerRegion* region = gAgent.getRegion(); -	if (!region) -		return; - -	mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), -					  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), -					  (F32)pos_global.mdV[VZ]); - -	LLSD body; -	std::string url = region->getCapability("RemoteParcelRequest"); -	if (!url.empty()) -	{ -		body["location"] = ll_sd_from_vector3(mPosRegion); -		if (!region_id.isNull()) -		{ -			body["region_id"] = region_id; -		} -		if (!pos_global.isExactlyZero()) -		{ -			U64 region_handle = to_region_handle(pos_global); -			body["region_handle"] = ll_sd_from_U64(region_handle); -		} -		LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle())); -	} -	else -	{ -		mDescEditor->setText(getString("server_update_text")); -	} -} +	LLPanel::handleVisibilityChange(new_visibility); -void LLPanelPlaceInfo::displaySelectedParcelInfo(LLParcel* parcel, -											  LLViewerRegion* region, -											  const LLVector3d& pos_global, -											  bool is_current_parcel) -{ -	if (!region || !parcel) +	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); +	if (!parcel_mgr)  		return; -	// send EstateCovenantInfo message -	LLMessageSystem *msg = gMessageSystem; -	msg->newMessage("EstateCovenantRequest"); -	msg->nextBlockFast(_PREHASH_AgentData); -	msg->addUUIDFast(_PREHASH_AgentID,	gAgent.getID()); -	msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); -	msg->sendReliable(region->getHost()); - -	LLParcelData parcel_data; - -	// HACK: Converting sim access flags to the format -	// returned by remote parcel response. -	switch(region->getSimAccess()) -	{ -	case SIM_ACCESS_MATURE: -		parcel_data.flags = 0x1; -		break; - -	case SIM_ACCESS_ADULT: -		parcel_data.flags = 0x2; -		break; - -	default: -		parcel_data.flags = 0; -	} -	parcel_data.desc = parcel->getDesc(); -	parcel_data.name = parcel->getName(); -	parcel_data.sim_name = region->getName(); -	parcel_data.snapshot_id = parcel->getSnapshotID(); -	mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), -					  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), -					  (F32)pos_global.mdV[VZ]); -	parcel_data.global_x = pos_global.mdV[VX]; -	parcel_data.global_y = pos_global.mdV[VY]; -	parcel_data.global_z = pos_global.mdV[VZ]; - -	std::string on = getString("on"); -	std::string off = getString("off"); - -	// Processing parcel characteristics -	if (parcel->getParcelFlagAllowVoice()) -	{ -		mVoiceText->setText(on); -	} -	else -	{ -		mVoiceText->setText(off); -	} - -	if (!region->getBlockFly() && parcel->getAllowFly()) -	{ -		mFlyText->setText(on); -	} -	else -	{ -		mFlyText->setText(off); -	} - -	if (region->getRestrictPushObject() || parcel->getRestrictPushObject()) -	{ -		mPushText->setText(off); -	} -	else -	{ -		mPushText->setText(on); -	} - -	if (parcel->getAllowModify()) -	{ -		mBuildText->setText(on); -	} -	else -	{ -		mBuildText->setText(off); -	} - -	if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) || -	   (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) || -	   !parcel->getAllowOtherScripts()) -	{ -		mScriptsText->setText(off); -	} -	else -	{ -		mScriptsText->setText(on); -	} - -	if (region->getAllowDamage() || parcel->getAllowDamage()) -	{ -		mDamageText->setText(on); -	} -	else -	{ -		mDamageText->setText(off); -	} - -	mRegionNameText->setText(region->getName()); -	mRegionTypeText->setText(region->getSimProductName()); -	mRegionRatingText->setText(region->getSimAccessString()); - -	// Determine parcel owner -	if (parcel->isPublic()) -	{ -		mParcelOwner->setText(getString("public")); -		mRegionOwnerText->setText(getString("public")); -	} -	else -	{ -		if (parcel->getIsGroupOwned()) -		{ -			mRegionOwnerText->setText(getString("group_owned_text")); - -			if(!parcel->getGroupID().isNull()) -			{ -				// FIXME: Using parcel group as region group. -				gCacheName->get(parcel->getGroupID(), TRUE, -								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionGroupText, _2, _3)); - -				gCacheName->get(parcel->getGroupID(), TRUE, -								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3)); -			} -			else -			{ -				std::string owner = getString("none_text"); -				mRegionGroupText->setText(owner); -				mParcelOwner->setText(owner); -			} -		} -		else -		{ -			// Figure out the owner's name -			gCacheName->get(parcel->getOwnerID(), FALSE, -							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mParcelOwner, _2, _3)); -			gCacheName->get(region->getOwner(), FALSE, -							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mRegionOwnerText, _2, _3)); -		} - -		if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus()) -		{ -			mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text")); -		} -	} - -	mEstateRatingText->setText(region->getSimAccessString()); - -	S32 area; -	S32 claim_price; -	S32 rent_price; -	F32 dwell; -	BOOL for_sale = parcel->getForSale(); -	LLViewerParcelMgr::getInstance()->getDisplayInfo(&area, -													 &claim_price, -													 &rent_price, -													 &for_sale, -													 &dwell); -	if (for_sale) -	{ -		// Adding "For Sale" flag in remote parcel response format. -		parcel_data.flags |= DFQ_FOR_SALE; - -		const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); -		if(auth_buyer_id.notNull()) -		{ -			gCacheName->get(auth_buyer_id, TRUE, -							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, this, mSaleToText, _2, _3)); - -			// Show sales info to a specific person or a group he belongs to. -			if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id)) -			{ -				for_sale = FALSE; -			} -		} -		else -		{ -			mSaleToText->setText(getString("anyone")); -		} - -		const U8* sign = (U8*)getString("price_text").c_str(); -		const U8* sqm = (U8*)getString("area_text").c_str(); - -		mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice())); -		mAreaText->setText(llformat("%d %s", area, sqm)); -		mTrafficText->setText(llformat("%.0f", dwell)); - -		// Can't have more than region max tasks, regardless of parcel -		// object bonus factor. -		S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()), -							   (S32)region->getMaxTasks()); - -		const U8* available = (U8*)getString("available").c_str(); -		const U8* allocated = (U8*)getString("allocated").c_str(); - -		mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated)); - -		if (parcel->getAllowOtherScripts()) -		{ -			mParcelScriptsText->setText(getString("all_residents_text")); -		} -		else if (parcel->getAllowGroupScripts()) -		{ -			mParcelScriptsText->setText(getString("group_text")); -		} -		else -		{ -			mParcelScriptsText->setText(off); -		} - -		mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off); - -		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) -		{ -			mSubdivideText->setText(getString("can_change")); -		} -		else -		{ -			mSubdivideText->setText(getString("can_not_change")); -		} -		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) -		{ -			mResaleText->setText(getString("can_not_resell")); -		} -		else -		{ -			mResaleText->setText(getString("can_resell")); -		} -	} - -	mSelectedParcelID = parcel->getLocalID(); -	mLastSelectedRegionID = region->getRegionID(); -	processParcelInfo(parcel_data); - -	mYouAreHerePanel->setVisible(is_current_parcel); -	getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale); -} - -void LLPanelPlaceInfo::updateEstateName(const std::string& name) -{ -	mEstateNameText->setText(name); -} - -void LLPanelPlaceInfo::updateEstateOwnerName(const std::string& name) -{ -	mEstateOwnerText->setText(name); -} - -void LLPanelPlaceInfo::updateCovenantText(const std::string &text) -{ -	mCovenantText->setText(text); -} - -void LLPanelPlaceInfo::updateLastVisitedText(const LLDate &date) -{ -	if (date.isNull()) -	{ -		mLastVisited->setText(getString("unknown")); -	} -	else -	{ -		std::string timeStr = getString("acquired_date"); -		LLSD substitution; -		substitution["datetime"] = (S32) date.secondsSinceEpoch(); -		LLStringUtil::format (timeStr, substitution); -		mLastVisited->setText(timeStr); -	} -} - -void LLPanelPlaceInfo::toggleLandmarkEditMode(BOOL enabled) -{ -	// If switching to edit mode while creating landmark -	// the "Create Landmark" title remains. -	if (enabled && mInfoType != CREATE_LANDMARK) -	{ -		mTitle->setText(getString("title_edit_landmark")); -	} -	else -	{ -		mTitle->setText(mCurrentTitle); -	} - -	if (mNotesEditor->getReadOnly() ==  (enabled == TRUE)) -	{ -		mTitleEditor->setEnabled(enabled); -		mNotesEditor->setReadOnly(!enabled); -		mFolderCombo->setVisible(enabled); -		getChild<LLTextBox>("folder_lable")->setVisible(enabled); - -		// HACK: To change the text color in a text editor -		// when it was enabled/disabled we set the text once again. -		mNotesEditor->setText(mNotesEditor->getText()); -	} -} - -const std::string& LLPanelPlaceInfo::getLandmarkTitle() const -{ -	return mTitleEditor->getText(); -} - -const std::string LLPanelPlaceInfo::getLandmarkNotes() const -{ -	return mNotesEditor->getText(); -} - -const LLUUID LLPanelPlaceInfo::getLandmarkFolder() const -{ -	return mFolderCombo->getValue().asUUID(); -} - -BOOL LLPanelPlaceInfo::setLandmarkFolder(const LLUUID& id) -{ -	return mFolderCombo->setCurrentByID(id); -} - -void LLPanelPlaceInfo::createLandmark(const LLUUID& folder_id) -{ -	std::string name = mTitleEditor->getText(); -	std::string desc = mNotesEditor->getText(); - -	LLStringUtil::trim(name); -	LLStringUtil::trim(desc); - -	// If typed name is empty use the parcel name instead. -	if (name.empty()) +	// Remove land selection when panel hides. +	if (!new_visibility)  	{ -		name = mParcelName->getText(); - -		// If no parcel exists use the region name instead. -		if (name.empty()) +		if (!parcel_mgr->selectionEmpty())  		{ -			name = mRegionName->getText(); +			parcel_mgr->deselectLand();  		}  	} - -	LLStringUtil::replaceChar(desc, '\n', ' '); -	// If no folder chosen use the "Landmarks" folder. -	LLLandmarkActions::createLandmarkHere(name, desc, -		folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK));  }  void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel) @@ -942,159 +274,10 @@ void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit*  	pick_panel->setPickData(&data);  } -// virtual -void LLPanelPlaceInfo::handleVisibilityChange (BOOL new_visibility) -{ -	LLPanel::handleVisibilityChange(new_visibility); - -	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); -	if (!parcel_mgr) -		return; - -	// Remove land selection when panel hides. -	if (!new_visibility) -	{ -		if (!parcel_mgr->selectionEmpty()) -		{ -			parcel_mgr->deselectLand(); -		} -	} -} - -void LLPanelPlaceInfo::populateFoldersList() +// static +void LLPanelPlaceInfo::nameUpdatedCallback(LLTextBox* text, +										   const std::string& first, +										   const std::string& last)  { -	// Collect all folders that can contain landmarks. -	LLInventoryModel::cat_array_t cats; -	collectLandmarkFolders(cats); - -	mFolderCombo->removeall(); - -	// Put the "Landmarks" folder first in list. -	LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); -	const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id); -	if (!cat) -	{ -		llwarns << "Cannot find the landmarks folder" << llendl; -	} -	std::string cat_full_name = getFullFolderName(cat); -	mFolderCombo->add(cat_full_name, cat->getUUID()); - -	typedef std::vector<folder_pair_t> folder_vec_t; -	folder_vec_t folders; -	// Sort the folders by their full name. -	for (S32 i = 0; i < cats.count(); i++) -	{ -		cat = cats.get(i); -		cat_full_name = getFullFolderName(cat); -		folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name)); -	} -	sort(folders.begin(), folders.end(), cmp_folders); - -	// Finally, populate the combobox. -	for (folder_vec_t::const_iterator it = folders.begin(); it != folders.end(); it++) -		mFolderCombo->add(it->second, LLSD(it->first)); -} - -//static -void LLPanelPlaceInfo::updateYouAreHereBanner(void* userdata) -{ -	//YouAreHere Banner should be displayed only for selected places,  -	// If you want to display it for landmark or teleport history item, you should check by mParcelId -	 -	LLPanelPlaceInfo* self  = static_cast<LLPanelPlaceInfo*>(userdata); -	if(!self->getVisible()) -		return; -	if(!gDisconnected) -	{ -		static F32 radius  = gSavedSettings.getF32("YouAreHereDistance"); - -		BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID &&  -			LLAgentUI::checkAgentDistance(self->mPosRegion, radius); - -		self->mYouAreHerePanel->setVisible(display_banner); -	} -} - -void LLPanelPlaceInfo::onForSaleBannerClick() -{ -	LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance(); -	LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection(); -	LLViewerRegion* selected_region =  mgr->getSelectionRegion(); -	if(!hParcel.isNull() && selected_region) -	{ -		if(hParcel->getParcel()->getLocalID() == mSelectedParcelID &&  -				mLastSelectedRegionID ==selected_region->getRegionID()) -		{ -			if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0) -			{ -				LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice()); -			} -			else -			{ -				LLViewerParcelMgr::getInstance()->startBuyLand(); -			} -		} -		else -		{ -			LL_WARNS("Places") << "User  is trying  to buy remote parcel.Operation is not supported"<< LL_ENDL;  -		} -		 -	} -	 -	 -} - -/*static*/ -std::string LLPanelPlaceInfo::getFullFolderName(const LLViewerInventoryCategory* cat) -{ -	std::string name = cat->getName(); -	LLUUID parent_id; - -	// translate category name, if it's right below the root -	// FIXME: it can throw notification about non existent string in strings.xml -	if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID()) -	{ -		LLTrans::findString(name, "InvFolder " + name); -	} - -	// we don't want "My Inventory" to appear in the name -	while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID()) -	{ -		cat = gInventory.getCategory(parent_id); -		name = cat->getName() + "/" + name; -	} - -	return name; -} - -static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right) -{ -	return left.second < right.second; -} - -static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats) -{ -	LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); - -	// Add descendent folders of the "Landmarks" category. -	LLInventoryModel::item_array_t items; // unused -	LLIsType is_category(LLAssetType::AT_CATEGORY); -	gInventory.collectDescendentsIf( -		landmarks_id, -		cats, -		items, -		LLInventoryModel::EXCLUDE_TRASH, -		is_category); - -	// Add the "My Favorites" category. -	LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); -	LLViewerInventoryCategory* favorites_cat = gInventory.getCategory(favorites_id); -	if (!favorites_cat) -	{ -		llwarns << "Cannot find the favorites folder" << llendl; -	} -	else -	{ -		cats.put(favorites_cat); -	} +	text->setText(first + " " + last);  } diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h index 07a2434d59..c9e1347542 100644 --- a/indra/newview/llpanelplaceinfo.h +++ b/indra/newview/llpanelplaceinfo.h @@ -1,6 +1,6 @@  /**    * @file llpanelplaceinfo.h - * @brief Displays place information in Side Tray. + * @brief Base class for place information in Side Tray.   *   * $LicenseInfo:firstyear=2009&license=viewergpl$   *  @@ -38,19 +38,13 @@  #include "v3dmath.h"  #include "lluuid.h" -#include "llpanelmedia.h"  #include "llremoteparcelrequest.h" -class LLButton; -class LLComboBox;  class LLExpandableTextBox;  class LLInventoryItem; -class LLLineEditor;  class LLPanelPickEdit;  class LLParcel; -class LLIconCtrl;  class LLTextBox; -class LLTextEditor;  class LLTextureCtrl;  class LLViewerRegion;  class LLViewerInventoryCategory; @@ -74,30 +68,18 @@ public:  	// Ignore all old location information, useful if you are   	// recycling an existing dialog and need to clear it. -	void resetLocation(); +	virtual void resetLocation();  	// Sends a request for data about the given parcel, which will  	// only update the location if there is none already available.  	/*virtual*/ void setParcelID(const LLUUID& parcel_id); -	// Depending on how the panel was triggered  -	// (from landmark or current location, or other)  +	// Depending on how the panel was triggered +	// (from landmark or current location, or other)  	// sets a corresponding title and contents. -	void setInfoType(INFO_TYPE type); - -	// Create a landmark for the current location -	// in a folder specified by folder_id. -	void createLandmark(const LLUUID& folder_id); -	 -	// Create a pick for the location specified -	// by global_pos. -	void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel); - -	BOOL isMediaPanelVisible(); -	void toggleMediaPanel(BOOL visible); -	void displayItemInfo(const LLInventoryItem* pItem); -	/*virtual*/ void setErrorStatus(U32 status, const std::string& reason); +	virtual void setInfoType(INFO_TYPE type); +	// Requests remote parcel info by parcel ID.  	void sendParcelInfoRequest();  	// Displays information about a remote parcel. @@ -105,109 +87,37 @@ public:  	void displayParcelInfo(const LLUUID& region_id,  						   const LLVector3d& pos_global); -	// Displays information about the currently selected parcel -	// without sending a request to the server. -	// If is_current_parcel true shows "You Are Here" banner. -	void displaySelectedParcelInfo(LLParcel* parcel, -								LLViewerRegion* region, -								const LLVector3d& pos_global, -								bool is_current_parcel); - -	void updateEstateName(const std::string& name); -	void updateEstateOwnerName(const std::string& name); -	void updateCovenantText(const std::string &text); -	void updateLastVisitedText(const LLDate &date); - -	void nameUpdatedCallback(LLTextBox* text, -							 const std::string& first, -							 const std::string& last); - -	void toggleLandmarkEditMode(BOOL enabled); - -	const std::string& getLandmarkTitle() const; -	const std::string getLandmarkNotes() const; -	const LLUUID getLandmarkFolder() const; - -	// Select current landmark folder in combobox. -	BOOL setLandmarkFolder(const LLUUID& id); +	/*virtual*/ void setErrorStatus(U32 status, const std::string& reason);  	/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); +  	/*virtual*/ void handleVisibilityChange (BOOL new_visibility); -	 -	 static std::string getFullFolderName(const LLViewerInventoryCategory* cat); -private: +	// Create a pick for the location specified +	// by global_pos. +	void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel); -	void populateFoldersList(); -	static void updateYouAreHereBanner(void*);// added to gIdleCallbacks -	void onForSaleBannerClick(); +protected: +	static void nameUpdatedCallback(LLTextBox* text, +									const std::string& first, +									const std::string& last);  	/**  	 * mParcelID is valid only for remote places, in other cases it's null. See resetLocation()   	 */ -	LLUUID			mParcelID; -	LLUUID			mRequestedID; -	LLUUID			mLandmarkID; -	LLVector3		mPosRegion; -	std::string		mCurrentTitle; -	S32				mMinHeight; -	INFO_TYPE 		mInfoType; - -	/** -	 * Hold last displayed parcel. Needs for YouAreHere banner. -	 */ -	S32			mSelectedParcelID; -	LLUUID		mLastSelectedRegionID; - -	LLTextBox*			mTitle; -	LLPanel*			mForSalePanel; -	LLPanel*			mYouAreHerePanel; -	LLTextureCtrl*		mSnapshotCtrl; -	LLTextBox*			mRegionName; -	LLTextBox*			mParcelName; -	LLExpandableTextBox*mDescEditor; -	LLTextBox*			mMaturityRatingText; -	LLTextBox*			mParcelOwner; -	LLTextBox*			mLastVisited; - -	LLTextBox*			mRatingText; -	LLTextBox*			mVoiceText; -	LLTextBox*			mFlyText; -	LLTextBox*			mPushText; -	LLTextBox*			mBuildText; -	LLTextBox*			mScriptsText; -	LLTextBox*			mDamageText; - -	LLTextBox*			mRegionNameText; -	LLTextBox*			mRegionTypeText; -	LLTextBox*			mRegionRatingText; -	LLTextBox*			mRegionOwnerText; -	LLTextBox*			mRegionGroupText; - -	LLTextBox*			mEstateNameText; -	LLTextBox*			mEstateRatingText; -	LLTextBox*			mEstateOwnerText; -	LLTextEditor*		mCovenantText; - -	LLTextBox*			mSalesPriceText; -	LLTextBox*			mAreaText; -	LLTextBox*			mTrafficText; -	LLTextBox*			mPrimitivesText; -	LLTextBox*			mParcelScriptsText; -	LLTextBox*			mTerraformLimitsText; -	LLTextEditor*		mSubdivideText; -	LLTextEditor*		mResaleText; -	LLTextBox*			mSaleToText; - -	LLTextBox*			mOwner; -	LLTextBox*			mCreator; -	LLTextBox*			mCreated; -	LLLineEditor*		mTitleEditor; -	LLTextEditor*		mNotesEditor; -	LLComboBox*			mFolderCombo; -	LLPanel*            mScrollingPanel; -	LLPanel*			mInfoPanel; -	LLMediaPanel*		mMediaPanel; +	LLUUID					mParcelID; +	LLUUID					mRequestedID; +	LLVector3				mPosRegion; +	std::string				mCurrentTitle; +	S32						mMinHeight; +	INFO_TYPE 				mInfoType; + +	LLTextBox*				mTitle; +	LLTextureCtrl*			mSnapshotCtrl; +	LLTextBox*				mRegionName; +	LLTextBox*				mParcelName; +	LLExpandableTextBox*	mDescEditor; +	LLTextBox*				mMaturityRatingText;  };  #endif // LL_LLPANELPLACEINFO_H diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp new file mode 100644 index 0000000000..9ba72fe6cf --- /dev/null +++ b/indra/newview/llpanelplaceprofile.cpp @@ -0,0 +1,541 @@ +/** + * @file llpanelplaceprofile.cpp + * @brief Displays place profile in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, 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 "llpanelplaceprofile.h" + +#include "llparcel.h" + +#include "llqueryflags.h" + +#include "lliconctrl.h" +#include "lllineeditor.h" +#include "lltextbox.h" +#include "lltexteditor.h" + +#include "llaccordionctrl.h" +#include "llaccordionctrltab.h" +#include "llagent.h" +#include "llagentui.h" +#include "llappviewer.h" +#include "llcallbacklist.h" +#include "llfloaterbuycurrency.h" +#include "llstatusbar.h" +#include "llviewercontrol.h" +#include "llviewerparcelmgr.h" +#include "llviewerregion.h" + +static LLRegisterPanelClassWrapper<LLPanelPlaceProfile> t_place_profile("panel_place_profile"); + +LLPanelPlaceProfile::LLPanelPlaceProfile() +:	LLPanelPlaceInfo(), +	mForSalePanel(NULL), +	mYouAreHerePanel(NULL), +	mSelectedParcelID(-1) +{} + +// virtual +LLPanelPlaceProfile::~LLPanelPlaceProfile() +{} + +// virtual +BOOL LLPanelPlaceProfile::postBuild() +{ +	LLPanelPlaceInfo::postBuild(); + +	mForSalePanel = getChild<LLPanel>("for_sale_panel"); +	mYouAreHerePanel = getChild<LLPanel>("here_panel"); +	gIdleCallbacks.addFunction(&LLPanelPlaceProfile::updateYouAreHereBanner, this); + +	//Icon value should contain sale price of last selected parcel. +	mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")-> +				setMouseDownCallback(boost::bind(&LLPanelPlaceProfile::onForSaleBannerClick, this)); + +	mParcelOwner = getChild<LLTextBox>("owner_value"); +	mLastVisited = getChild<LLTextBox>("last_visited_value"); + +	mRatingText = getChild<LLTextBox>("rating_value"); +	mVoiceText = getChild<LLTextBox>("voice_value"); +	mFlyText = getChild<LLTextBox>("fly_value"); +	mPushText = getChild<LLTextBox>("push_value"); +	mBuildText = getChild<LLTextBox>("build_value"); +	mScriptsText = getChild<LLTextBox>("scripts_value"); +	mDamageText = getChild<LLTextBox>("damage_value"); + +	mRegionNameText = getChild<LLTextBox>("region_name"); +	mRegionTypeText = getChild<LLTextBox>("region_type"); +	mRegionRatingText = getChild<LLTextBox>("region_rating"); +	mRegionOwnerText = getChild<LLTextBox>("region_owner"); +	mRegionGroupText = getChild<LLTextBox>("region_group"); + +	mEstateNameText = getChild<LLTextBox>("estate_name"); +	mEstateRatingText = getChild<LLTextBox>("estate_rating"); +	mEstateOwnerText = getChild<LLTextBox>("estate_owner"); +	mCovenantText = getChild<LLTextEditor>("covenant"); + +	mSalesPriceText = getChild<LLTextBox>("sales_price"); +	mAreaText = getChild<LLTextBox>("area"); +	mTrafficText = getChild<LLTextBox>("traffic"); +	mPrimitivesText = getChild<LLTextBox>("primitives"); +	mParcelScriptsText = getChild<LLTextBox>("parcel_scripts"); +	mTerraformLimitsText = getChild<LLTextBox>("terraform_limits"); +	mSubdivideText = getChild<LLTextEditor>("subdivide"); +	mResaleText = getChild<LLTextEditor>("resale"); +	mSaleToText = getChild<LLTextBox>("sale_to"); + +	return TRUE; +} + +// virtual +void LLPanelPlaceProfile::resetLocation() +{ +	LLPanelPlaceInfo::resetLocation(); + +	mForSalePanel->setVisible(FALSE); +	mYouAreHerePanel->setVisible(FALSE); + +	std::string not_available = getString("not_available"); +	mParcelOwner->setValue(not_available); +	mLastVisited->setValue(not_available); + +	mRatingText->setText(not_available); +	mVoiceText->setText(not_available); +	mFlyText->setText(not_available); +	mPushText->setText(not_available); +	mBuildText->setText(not_available); +	mParcelScriptsText->setText(not_available); +	mDamageText->setText(not_available); + +	mRegionNameText->setValue(not_available); +	mRegionTypeText->setValue(not_available); +	mRegionRatingText->setValue(not_available); +	mRegionOwnerText->setValue(not_available); +	mRegionGroupText->setValue(not_available); + +	mEstateNameText->setValue(not_available); +	mEstateRatingText->setValue(not_available); +	mEstateOwnerText->setValue(not_available); +	mCovenantText->setValue(not_available); + +	mSalesPriceText->setValue(not_available); +	mAreaText->setValue(not_available); +	mTrafficText->setValue(not_available); +	mPrimitivesText->setValue(not_available); +	mParcelScriptsText->setValue(not_available); +	mTerraformLimitsText->setValue(not_available); +	mSubdivideText->setValue(not_available); +	mResaleText->setValue(not_available); +	mSaleToText->setValue(not_available); +} + +// virtual +void LLPanelPlaceProfile::setInfoType(INFO_TYPE type) +{ +	bool is_info_type_agent = type == AGENT; +	bool is_info_type_teleport_history = type == TELEPORT_HISTORY; + +	getChild<LLTextBox>("maturity_label")->setVisible(!is_info_type_agent); +	mMaturityRatingText->setVisible(!is_info_type_agent); + +	getChild<LLTextBox>("owner_label")->setVisible(is_info_type_agent); +	mParcelOwner->setVisible(is_info_type_agent); + +	getChild<LLTextBox>("last_visited_label")->setVisible(is_info_type_teleport_history); +	mLastVisited->setVisible(is_info_type_teleport_history); + +	getChild<LLAccordionCtrl>("advanced_info_accordion")->setVisible(is_info_type_agent); + +	switch(type) +	{ +		case AGENT: +		case PLACE: +		default: +			mCurrentTitle = getString("title_place"); +		break; + +		case TELEPORT_HISTORY: +			mCurrentTitle = getString("title_teleport_history"); +		break; +	} + +	LLPanelPlaceInfo::setInfoType(type); +} + +// virtual +void LLPanelPlaceProfile::processParcelInfo(const LLParcelData& parcel_data) +{ +	LLPanelPlaceInfo::processParcelInfo(parcel_data); + +	// HACK: Flag 0x2 == adult region, +	// Flag 0x1 == mature region, otherwise assume PG +	std::string rating = LLViewerRegion::accessToString(SIM_ACCESS_PG); +	if (parcel_data.flags & 0x2) +	{ +		rating = LLViewerRegion::accessToString(SIM_ACCESS_ADULT); +	} +	else if (parcel_data.flags & 0x1) +	{ +		rating = LLViewerRegion::accessToString(SIM_ACCESS_MATURE); +	} + +	mMaturityRatingText->setValue(rating); +	mRatingText->setValue(rating); + +	//update for_sale banner, here we should use DFQ_FOR_SALE instead of PF_FOR_SALE +	//because we deal with remote parcel response format +	bool is_for_sale = (parcel_data.flags & DFQ_FOR_SALE) && +					 mInfoType == AGENT ? TRUE : FALSE; +	mForSalePanel->setVisible(is_for_sale); +} + +void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, +													LLViewerRegion* region, +													const LLVector3d& pos_global, +													bool is_current_parcel) +{ +	if (!region || !parcel) +		return; + +	// send EstateCovenantInfo message +	LLMessageSystem *msg = gMessageSystem; +	msg->newMessage("EstateCovenantRequest"); +	msg->nextBlockFast(_PREHASH_AgentData); +	msg->addUUIDFast(_PREHASH_AgentID,	gAgent.getID()); +	msg->addUUIDFast(_PREHASH_SessionID,gAgent.getSessionID()); +	msg->sendReliable(region->getHost()); + +	LLParcelData parcel_data; + +	// HACK: Converting sim access flags to the format +	// returned by remote parcel response. +	switch(region->getSimAccess()) +	{ +	case SIM_ACCESS_MATURE: +		parcel_data.flags = 0x1; +		break; + +	case SIM_ACCESS_ADULT: +		parcel_data.flags = 0x2; +		break; + +	default: +		parcel_data.flags = 0; +	} +	parcel_data.desc = parcel->getDesc(); +	parcel_data.name = parcel->getName(); +	parcel_data.sim_name = region->getName(); +	parcel_data.snapshot_id = parcel->getSnapshotID(); +	mPosRegion.setVec((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS), +					  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS), +					  (F32)pos_global.mdV[VZ]); +	parcel_data.global_x = pos_global.mdV[VX]; +	parcel_data.global_y = pos_global.mdV[VY]; +	parcel_data.global_z = pos_global.mdV[VZ]; + +	std::string on = getString("on"); +	std::string off = getString("off"); + +	// Processing parcel characteristics +	if (parcel->getParcelFlagAllowVoice()) +	{ +		mVoiceText->setText(on); +	} +	else +	{ +		mVoiceText->setText(off); +	} + +	if (!region->getBlockFly() && parcel->getAllowFly()) +	{ +		mFlyText->setText(on); +	} +	else +	{ +		mFlyText->setText(off); +	} + +	if (region->getRestrictPushObject() || parcel->getRestrictPushObject()) +	{ +		mPushText->setText(off); +	} +	else +	{ +		mPushText->setText(on); +	} + +	if (parcel->getAllowModify()) +	{ +		mBuildText->setText(on); +	} +	else +	{ +		mBuildText->setText(off); +	} + +	if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) || +	   (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) || +	   !parcel->getAllowOtherScripts()) +	{ +		mScriptsText->setText(off); +	} +	else +	{ +		mScriptsText->setText(on); +	} + +	if (region->getAllowDamage() || parcel->getAllowDamage()) +	{ +		mDamageText->setText(on); +	} +	else +	{ +		mDamageText->setText(off); +	} + +	mRegionNameText->setText(region->getName()); +	mRegionTypeText->setText(region->getSimProductName()); +	mRegionRatingText->setText(region->getSimAccessString()); + +	// Determine parcel owner +	if (parcel->isPublic()) +	{ +		mParcelOwner->setText(getString("public")); +		mRegionOwnerText->setText(getString("public")); +	} +	else +	{ +		if (parcel->getIsGroupOwned()) +		{ +			mRegionOwnerText->setText(getString("group_owned_text")); + +			if(!parcel->getGroupID().isNull()) +			{ +				// FIXME: Using parcel group as region group. +				gCacheName->get(parcel->getGroupID(), TRUE, +								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionGroupText, _2, _3)); + +				gCacheName->get(parcel->getGroupID(), TRUE, +								boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3)); +			} +			else +			{ +				std::string owner = getString("none_text"); +				mRegionGroupText->setText(owner); +				mParcelOwner->setText(owner); +			} +		} +		else +		{ +			// Figure out the owner's name +			gCacheName->get(parcel->getOwnerID(), FALSE, +							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3)); +			gCacheName->get(region->getOwner(), FALSE, +							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionOwnerText, _2, _3)); +		} + +		if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus()) +		{ +			mRegionOwnerText->setText(mRegionOwnerText->getText() + getString("sale_pending_text")); +		} +	} + +	mEstateRatingText->setText(region->getSimAccessString()); + +	S32 area; +	S32 claim_price; +	S32 rent_price; +	F32 dwell; +	BOOL for_sale = parcel->getForSale(); +	LLViewerParcelMgr::getInstance()->getDisplayInfo(&area, +													 &claim_price, +													 &rent_price, +													 &for_sale, +													 &dwell); +	if (for_sale) +	{ +		// Adding "For Sale" flag in remote parcel response format. +		parcel_data.flags |= DFQ_FOR_SALE; + +		const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); +		if(auth_buyer_id.notNull()) +		{ +			gCacheName->get(auth_buyer_id, TRUE, +							boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mSaleToText, _2, _3)); + +			// Show sales info to a specific person or a group he belongs to. +			if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id)) +			{ +				for_sale = FALSE; +			} +		} +		else +		{ +			mSaleToText->setText(getString("anyone")); +		} + +		const U8* sign = (U8*)getString("price_text").c_str(); +		const U8* sqm = (U8*)getString("area_text").c_str(); + +		mSalesPriceText->setText(llformat("%s%d ", sign, parcel->getSalePrice())); +		mAreaText->setText(llformat("%d %s", area, sqm)); +		mTrafficText->setText(llformat("%.0f", dwell)); + +		// Can't have more than region max tasks, regardless of parcel +		// object bonus factor. +		S32 primitives = llmin(llround(parcel->getMaxPrimCapacity() * parcel->getParcelPrimBonus()), +							   (S32)region->getMaxTasks()); + +		const U8* available = (U8*)getString("available").c_str(); +		const U8* allocated = (U8*)getString("allocated").c_str(); + +		mPrimitivesText->setText(llformat("%d %s, %d %s", primitives, available, parcel->getPrimCount(), allocated)); + +		if (parcel->getAllowOtherScripts()) +		{ +			mParcelScriptsText->setText(getString("all_residents_text")); +		} +		else if (parcel->getAllowGroupScripts()) +		{ +			mParcelScriptsText->setText(getString("group_text")); +		} +		else +		{ +			mParcelScriptsText->setText(off); +		} + +		mTerraformLimitsText->setText(parcel->getAllowTerraform() ? on : off); + +		if (region->getRegionFlags() & REGION_FLAGS_ALLOW_PARCEL_CHANGES) +		{ +			mSubdivideText->setText(getString("can_change")); +		} +		else +		{ +			mSubdivideText->setText(getString("can_not_change")); +		} +		if (region->getRegionFlags() & REGION_FLAGS_BLOCK_LAND_RESELL) +		{ +			mResaleText->setText(getString("can_not_resell")); +		} +		else +		{ +			mResaleText->setText(getString("can_resell")); +		} +	} + +	mSelectedParcelID = parcel->getLocalID(); +	mLastSelectedRegionID = region->getRegionID(); +	processParcelInfo(parcel_data); + +	mYouAreHerePanel->setVisible(is_current_parcel); +	getChild<LLAccordionCtrlTab>("sales_tab")->setVisible(for_sale); +} + +void LLPanelPlaceProfile::updateEstateName(const std::string& name) +{ +	mEstateNameText->setText(name); +} + +void LLPanelPlaceProfile::updateEstateOwnerName(const std::string& name) +{ +	mEstateOwnerText->setText(name); +} + +void LLPanelPlaceProfile::updateCovenantText(const std::string &text) +{ +	mCovenantText->setText(text); +} + +void LLPanelPlaceProfile::updateLastVisitedText(const LLDate &date) +{ +	if (date.isNull()) +	{ +		mLastVisited->setText(getString("unknown")); +	} +	else +	{ +		std::string timeStr = getString("acquired_date"); +		LLSD substitution; +		substitution["datetime"] = (S32) date.secondsSinceEpoch(); +		LLStringUtil::format (timeStr, substitution); +		mLastVisited->setText(timeStr); +	} +} + +void LLPanelPlaceProfile::onForSaleBannerClick() +{ +	LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance(); +	LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection(); +	LLViewerRegion* selected_region =  mgr->getSelectionRegion(); +	if(!hParcel.isNull() && selected_region) +	{ +		if(hParcel->getParcel()->getLocalID() == mSelectedParcelID && +				mLastSelectedRegionID ==selected_region->getRegionID()) +		{ +			if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0) +			{ +				LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice()); +			} +			else +			{ +				LLViewerParcelMgr::getInstance()->startBuyLand(); +			} +		} +		else +		{ +			LL_WARNS("Places") << "User  is trying  to buy remote parcel.Operation is not supported"<< LL_ENDL; +		} + +	} +} + +// static +void LLPanelPlaceProfile::updateYouAreHereBanner(void* userdata) +{ +	//YouAreHere Banner should be displayed only for selected places, +	// If you want to display it for landmark or teleport history item, you should check by mParcelId + +	LLPanelPlaceProfile* self = static_cast<LLPanelPlaceProfile*>(userdata); +	if(!self->getVisible()) +		return; + +	if(!gDisconnected) +	{ +		static F32 radius = gSavedSettings.getF32("YouAreHereDistance"); + +		BOOL display_banner = gAgent.getRegion()->getRegionID() == self->mLastSelectedRegionID && +										LLAgentUI::checkAgentDistance(self->mPosRegion, radius); + +		self->mYouAreHerePanel->setVisible(display_banner); +	} +} diff --git a/indra/newview/llpanelplaceprofile.h b/indra/newview/llpanelplaceprofile.h new file mode 100644 index 0000000000..d8e4bcb6bd --- /dev/null +++ b/indra/newview/llpanelplaceprofile.h @@ -0,0 +1,114 @@ +/** + * @file llpanelplaceprofile.h + * @brief Displays place profile in Side Tray. + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + * + * Copyright (c) 2004-2009, 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_LLPANELPLACEPROFILE_H +#define LL_LLPANELPLACEPROFILE_H + +#include "llpanelplaceinfo.h" + +class LLTextEditor; + +class LLPanelPlaceProfile : public LLPanelPlaceInfo +{ +public: +	LLPanelPlaceProfile(); +	/*virtual*/ ~LLPanelPlaceProfile(); + +	/*virtual*/ BOOL postBuild(); + +	/*virtual*/ void resetLocation(); + +	/*virtual*/ void setInfoType(INFO_TYPE type); + +	/*virtual*/ void processParcelInfo(const LLParcelData& parcel_data); + +	// Displays information about the currently selected parcel +	// without sending a request to the server. +	// If is_current_parcel true shows "You Are Here" banner. +	void displaySelectedParcelInfo(LLParcel* parcel, +								   LLViewerRegion* region, +								   const LLVector3d& pos_global, +								   bool is_current_parcel); + +	void updateEstateName(const std::string& name); +	void updateEstateOwnerName(const std::string& name); +	void updateCovenantText(const std::string &text); +	void updateLastVisitedText(const LLDate &date); + +private: +	void onForSaleBannerClick(); + +	static void updateYouAreHereBanner(void*);// added to gIdleCallbacks + +	/** +	 * Holds last displayed parcel. Needed for YouAreHere banner. +	 */ +	S32					mSelectedParcelID; +	LLUUID				mLastSelectedRegionID; + +	LLPanel*			mForSalePanel; +	LLPanel*			mYouAreHerePanel; + +	LLTextBox*			mParcelOwner; +	LLTextBox*			mLastVisited; + +	LLTextBox*			mRatingText; +	LLTextBox*			mVoiceText; +	LLTextBox*			mFlyText; +	LLTextBox*			mPushText; +	LLTextBox*			mBuildText; +	LLTextBox*			mScriptsText; +	LLTextBox*			mDamageText; + +	LLTextBox*			mRegionNameText; +	LLTextBox*			mRegionTypeText; +	LLTextBox*			mRegionRatingText; +	LLTextBox*			mRegionOwnerText; +	LLTextBox*			mRegionGroupText; + +	LLTextBox*			mEstateNameText; +	LLTextBox*			mEstateRatingText; +	LLTextBox*			mEstateOwnerText; +	LLTextEditor*		mCovenantText; + +	LLTextBox*			mSalesPriceText; +	LLTextBox*			mAreaText; +	LLTextBox*			mTrafficText; +	LLTextBox*			mPrimitivesText; +	LLTextBox*			mParcelScriptsText; +	LLTextBox*			mTerraformLimitsText; +	LLTextEditor*		mSubdivideText; +	LLTextEditor*		mResaleText; +	LLTextBox*			mSaleToText; +}; + +#endif // LL_LLPANELPLACEPROFILE_H diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index b2e9110e96..66efb96fc7 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -57,9 +57,10 @@  #include "llinventorymodel.h"  #include "lllandmarkactions.h"  #include "lllandmarklist.h" -#include "llpanelplaceinfo.h" +#include "llpanellandmarkinfo.h"  #include "llpanellandmarks.h"  #include "llpanelpick.h" +#include "llpanelplaceprofile.h"  #include "llpanelteleporthistory.h"  #include "llteleporthistorystorage.h"  #include "lltoggleablemenu.h" @@ -121,7 +122,8 @@ LLPanelPlaces::LLPanelPlaces()  		mFilterSubString(LLStringUtil::null),  		mActivePanel(NULL),  		mFilterEditor(NULL), -		mPlaceInfo(NULL), +		mPlaceProfile(NULL), +		mLandmarkInfo(NULL),  		mPickPanel(NULL),  		mItem(NULL),  		mPlaceMenu(NULL), @@ -135,7 +137,7 @@ LLPanelPlaces::LLPanelPlaces()  	gInventory.addObserver(mInventoryObserver);  	LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback( -			boost::bind(&LLPanelPlaces::onAgentParcelChange, this)); +			boost::bind(&LLPanelPlaces::updateVerbs, this));  	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()  } @@ -206,25 +208,32 @@ BOOL LLPanelPlaces::postBuild()  		mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false));  	} -	mPlaceInfo = getChild<LLPanelPlaceInfo>("panel_place_info"); +	mPlaceProfile = getChild<LLPanelPlaceProfile>("panel_place_profile"); +	mLandmarkInfo = getChild<LLPanelLandmarkInfo>("panel_landmark_info"); +	if (!mPlaceProfile || !mLandmarkInfo) +		return FALSE; -	LLButton* back_btn = mPlaceInfo->getChild<LLButton>("back_btn"); +	LLButton* back_btn = mPlaceProfile->getChild<LLButton>("back_btn");  	back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); -	LLLineEditor* title_editor = mPlaceInfo->getChild<LLLineEditor>("title_editor"); +	back_btn = mLandmarkInfo->getChild<LLButton>("back_btn"); +	back_btn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); + +	LLLineEditor* title_editor = mLandmarkInfo->getChild<LLLineEditor>("title_editor");  	title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL); -	LLTextEditor* notes_editor = mPlaceInfo->getChild<LLTextEditor>("notes_editor"); +	LLTextEditor* notes_editor = mLandmarkInfo->getChild<LLTextEditor>("notes_editor");  	notes_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); -	LLComboBox* folder_combo = mPlaceInfo->getChild<LLComboBox>("folder_combo"); +	LLComboBox* folder_combo = mLandmarkInfo->getChild<LLComboBox>("folder_combo");  	folder_combo->setSelectionCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this)); +  	return TRUE;  }  void LLPanelPlaces::onOpen(const LLSD& key)  { -	if(mPlaceInfo == NULL || key.size() == 0) +	if(!mPlaceProfile || !mLandmarkInfo || key.size() == 0)  		return;  	mFilterEditor->clear(); @@ -239,11 +248,11 @@ void LLPanelPlaces::onOpen(const LLSD& key)  	if (mPlaceInfoType == AGENT_INFO_TYPE)  	{ -		mPlaceInfo->setInfoType(LLPanelPlaceInfo::AGENT); +		mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT);  	}  	else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE)  	{ -		mPlaceInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); +		mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK);  		if (key.has("x") && key.has("y") && key.has("z"))  		{ @@ -256,11 +265,11 @@ void LLPanelPlaces::onOpen(const LLSD& key)  			mPosGlobal = gAgent.getPositionGlobal();  		} -		mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal); +		mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal);  	}  	else if (mPlaceInfoType == LANDMARK_INFO_TYPE)  	{ -		mPlaceInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); +		mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK);  		LLInventoryItem* item = gInventory.getItem(key["id"].asUUID());  		if (!item) @@ -270,17 +279,12 @@ void LLPanelPlaces::onOpen(const LLSD& key)  	}  	else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)  	{ -		if (mPlaceInfo->isMediaPanelVisible()) -		{ -			toggleMediaPanel(); -		} -  		mPosGlobal = LLVector3d(key["x"].asReal(),  								key["y"].asReal(),  								key["z"].asReal()); -		mPlaceInfo->setInfoType(LLPanelPlaceInfo::PLACE); -		mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal); +		mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); +		mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);  	}  	else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)  	{ @@ -291,9 +295,9 @@ void LLPanelPlaces::onOpen(const LLSD& key)  		mPosGlobal = hist_items[index].mGlobalPos; -		mPlaceInfo->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); -		mPlaceInfo->updateLastVisitedText(hist_items[index].mDate); -		mPlaceInfo->displayParcelInfo(LLUUID(), mPosGlobal); +		mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); +		mPlaceProfile->updateLastVisitedText(hist_items[index].mDate); +		mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal);  	}  	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); @@ -321,7 +325,7 @@ void LLPanelPlaces::onOpen(const LLSD& key)  void LLPanelPlaces::setItem(LLInventoryItem* item)  { -	if (!mPlaceInfo || !item) +	if (!mLandmarkInfo || !item)  		return;  	mItem = item; @@ -351,19 +355,19 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)  	if (is_landmark_editable)  	{ -		if(!mPlaceInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull()) +		if(!mLandmarkInfo->setLandmarkFolder(mItem->getParentUUID()) && !mItem->getParentUUID().isNull())  		{  			const LLViewerInventoryCategory* cat = gInventory.getCategory(mItem->getParentUUID()); -			if(cat) +			if (cat)  			{ -				std::string cat_fullname = LLPanelPlaceInfo::getFullFolderName(cat); -				LLComboBox* folderList = mPlaceInfo->getChild<LLComboBox>("folder_combo"); -				folderList->add(cat_fullname, cat->getUUID(),ADD_TOP); +				std::string cat_fullname = LLPanelLandmarkInfo::getFullFolderName(cat); +				LLComboBox* folderList = mLandmarkInfo->getChild<LLComboBox>("folder_combo"); +				folderList->add(cat_fullname, cat->getUUID(), ADD_TOP);  			}  		}  	} -	mPlaceInfo->displayItemInfo(mItem); +	mLandmarkInfo->displayItemInfo(mItem);  	LLLandmark* lm = gLandmarkList.getAsset(mItem->getAssetUUID(),  											boost::bind(&LLPanelPlaces::onLandmarkLoaded, this, _1)); @@ -375,13 +379,13 @@ void LLPanelPlaces::setItem(LLInventoryItem* item)  void LLPanelPlaces::onLandmarkLoaded(LLLandmark* landmark)  { -	if (!mPlaceInfo) +	if (!mLandmarkInfo)  		return;  	LLUUID region_id;  	landmark->getRegionID(region_id);  	landmark->getGlobalPos(mPosGlobal); -	mPlaceInfo->displayParcelInfo(region_id, mPosGlobal); +	mLandmarkInfo->displayParcelInfo(region_id, mPosGlobal);  }  void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_filter) @@ -418,10 +422,8 @@ void LLPanelPlaces::onShareButtonClicked()  void LLPanelPlaces::onTeleportButtonClicked()  { -	if (!mPlaceInfo) -		return; - -	if (mPlaceInfo->getVisible()) +	LLPanelPlaceInfo* panel = getCurrentInfoPanel(); +	if (panel && panel->getVisible())  	{  		if (mPlaceInfoType == LANDMARK_INFO_TYPE)  		{ @@ -450,10 +452,8 @@ void LLPanelPlaces::onTeleportButtonClicked()  void LLPanelPlaces::onShowOnMapButtonClicked()  { -	if (!mPlaceInfo) -		return; - -	if (mPlaceInfo->getVisible()) +	LLPanelPlaceInfo* panel = getCurrentInfoPanel(); +	if (panel && panel->getVisible())  	{  		LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();  		if(!worldmap_instance) @@ -496,31 +496,31 @@ void LLPanelPlaces::onShowOnMapButtonClicked()  void LLPanelPlaces::onEditButtonClicked()  { -	if (!mPlaceInfo || isLandmarkEditModeOn) +	if (!mLandmarkInfo || isLandmarkEditModeOn)  		return;  	isLandmarkEditModeOn = true; -	mPlaceInfo->toggleLandmarkEditMode(TRUE); +	mLandmarkInfo->toggleLandmarkEditMode(TRUE);  	updateVerbs();  }  void LLPanelPlaces::onSaveButtonClicked()  { -	if (!mPlaceInfo || mItem.isNull()) +	if (!mLandmarkInfo || mItem.isNull())  		return; -	std::string current_title_value = mPlaceInfo->getLandmarkTitle(); +	std::string current_title_value = mLandmarkInfo->getLandmarkTitle();  	std::string item_title_value = mItem->getName(); -	std::string current_notes_value = mPlaceInfo->getLandmarkNotes(); +	std::string current_notes_value = mLandmarkInfo->getLandmarkNotes();  	std::string item_notes_value = mItem->getDescription();  	LLStringUtil::trim(current_title_value);  	LLStringUtil::trim(current_notes_value);  	LLUUID item_id = mItem->getUUID(); -	LLUUID folder_id = mPlaceInfo->getLandmarkFolder(); +	LLUUID folder_id = mLandmarkInfo->getLandmarkFolder();  	LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(mItem); @@ -553,7 +553,7 @@ void LLPanelPlaces::onSaveButtonClicked()  void LLPanelPlaces::onCancelButtonClicked()  { -	if (!mPlaceInfo) +	if (!mLandmarkInfo)  		return;  	if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) @@ -562,13 +562,13 @@ void LLPanelPlaces::onCancelButtonClicked()  	}  	else  	{ -		mPlaceInfo->toggleLandmarkEditMode(FALSE); +		mLandmarkInfo->toggleLandmarkEditMode(FALSE);  		isLandmarkEditModeOn = false;  		updateVerbs();  		// Reload the landmark properties. -		mPlaceInfo->displayItemInfo(mItem); +		mLandmarkInfo->displayItemInfo(mItem);  	}  } @@ -597,7 +597,7 @@ void LLPanelPlaces::onOverflowButtonClicked()  		if (mItem.notNull())  		{  			const LLUUID& item_id = mItem->getUUID(); -			const LLUUID& trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +			const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  			is_landmark_removable = gInventory.isObjectDescendentOf(item_id, gInventory.getRootFolderID()) &&  									!gInventory.isObjectDescendentOf(item_id, trash_id);  		} @@ -652,9 +652,6 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)  	}  	else if (item == "pick")  	{ -		if (!mPlaceInfo) -			return; -  		if (mPickPanel == NULL)  		{  			mPickPanel = LLPanelPickEdit::create(); @@ -667,7 +664,12 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)  		togglePickPanel(TRUE);  		mPickPanel->onOpen(LLSD()); -		mPlaceInfo->createPick(mPosGlobal, mPickPanel); + +		LLPanelPlaceInfo* panel = getCurrentInfoPanel(); +		if (panel) +		{ +			panel->createPick(mPosGlobal, mPickPanel); +		}  		LLRect rect = getRect();  		mPickPanel->reshape(rect.getWidth(), rect.getHeight()); @@ -677,7 +679,7 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)      {          if ( mItem.notNull() )           { -            LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); +            const LLUUID& favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);              if ( favorites_id.notNull() )              {                  copy_inventory_item(gAgent.getID(), @@ -694,39 +696,16 @@ void LLPanelPlaces::onOverflowMenuItemClicked(const LLSD& param)  void LLPanelPlaces::onBackButtonClicked()  { -	if (!mPlaceInfo) -		return; -	 -	if (mPlaceInfo->isMediaPanelVisible()) -	{ -		toggleMediaPanel(); -	} -	else -	{ -		togglePlaceInfoPanel(FALSE); +	togglePlaceInfoPanel(FALSE); -		// Resetting mPlaceInfoType when Place Info panel is closed. -		mPlaceInfoType = LLStringUtil::null; +	// Resetting mPlaceInfoType when Place Info panel is closed. +	mPlaceInfoType = LLStringUtil::null; -		isLandmarkEditModeOn = false; -	} +	isLandmarkEditModeOn = false;  	updateVerbs();  } -void LLPanelPlaces::toggleMediaPanel() -{ -	if (!mPlaceInfo) -		return; - -	mPlaceInfo->toggleMediaPanel(!mPlaceInfo->isMediaPanelVisible()); - -	// Refresh the current place info because -	// the media panel controls can't refer to -	// the remote parcel media. -	onOpen(LLSD().insert("type", AGENT_INFO_TYPE)); -} -  void LLPanelPlaces::togglePickPanel(BOOL visible)  {  	setAllChildrenVisible(this, !visible); @@ -737,26 +716,50 @@ void LLPanelPlaces::togglePickPanel(BOOL visible)  void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible)  { -	if (!mPlaceInfo) +	if (!mPlaceProfile || !mLandmarkInfo)  		return; -	mPlaceInfo->setVisible(visible);  	mFilterEditor->setVisible(!visible);  	mTabContainer->setVisible(!visible); -	if (visible) +	if (mPlaceInfoType == AGENT_INFO_TYPE || +		mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || +		mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE)  	{ -		mPlaceInfo->resetLocation(); +		mPlaceProfile->setVisible(visible); -		LLRect rect = getRect(); -		LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); -		mPlaceInfo->reshape(new_rect.getWidth(),new_rect.getHeight()); +		if (visible) +		{ +			mPlaceProfile->resetLocation(); + +			LLRect rect = getRect(); +			LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); +			mPlaceProfile->reshape(new_rect.getWidth(), new_rect.getHeight()); + +			mLandmarkInfo->setVisible(FALSE); +		} +	} +	else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || +			 mPlaceInfoType == LANDMARK_INFO_TYPE) +	{ +		mLandmarkInfo->setVisible(visible); + +		if (visible) +		{ +			mLandmarkInfo->resetLocation(); + +			LLRect rect = getRect(); +			LLRect new_rect = LLRect(rect.mLeft, rect.mTop, rect.mRight, mTabContainer->getRect().mBottom); +			mLandmarkInfo->reshape(new_rect.getWidth(), new_rect.getHeight()); + +			mPlaceProfile->setVisible(FALSE); +		}  	}  }  void LLPanelPlaces::changedParcelSelection()  { -	if (!mPlaceInfo) +	if (!mPlaceProfile)  		return;  	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); @@ -782,8 +785,8 @@ void LLPanelPlaces::changedParcelSelection()  		}  	} -	mPlaceInfo->resetLocation(); -	mPlaceInfo->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel); +	mPlaceProfile->resetLocation(); +	mPlaceProfile->displaySelectedParcelInfo(parcel, region, mPosGlobal, is_current_parcel);  	updateVerbs();  } @@ -830,30 +833,22 @@ void LLPanelPlaces::changedInventory(U32 mask)  	gInventory.removeObserver(mInventoryObserver);  } -void LLPanelPlaces::onAgentParcelChange() +void LLPanelPlaces::updateVerbs()  { -	if (!mPlaceInfo) -		return; +	bool is_place_info_visible; -	if (mPlaceInfo->isMediaPanelVisible()) +	LLPanelPlaceInfo* panel = getCurrentInfoPanel(); +	if (panel)  	{ -		onOpen(LLSD().insert("type", AGENT_INFO_TYPE)); +		is_place_info_visible = panel->getVisible();  	}  	else  	{ -		updateVerbs(); +		is_place_info_visible = false;  	} -} -void LLPanelPlaces::updateVerbs() -{ -	if (!mPlaceInfo) -		return; - -	bool is_place_info_visible = mPlaceInfo->getVisible();  	bool is_agent_place_info_visible = mPlaceInfoType == AGENT_INFO_TYPE;  	bool is_create_landmark_visible = mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE; -	bool is_media_panel_visible = mPlaceInfo->isMediaPanelVisible();  	mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);  	mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn); @@ -864,7 +859,7 @@ void LLPanelPlaces::updateVerbs()  	mCancelBtn->setVisible(isLandmarkEditModeOn);  	mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn); -	mOverflowBtn->setEnabled(is_place_info_visible && !is_media_panel_visible && !is_create_landmark_visible); +	mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible);  	if (is_place_info_visible)  	{ @@ -872,16 +867,13 @@ void LLPanelPlaces::updateVerbs()  		{  			// We don't need to teleport to the current location  			// so check if the location is not within the current parcel. -			mTeleportBtn->setEnabled(!is_media_panel_visible && -									 !mPosGlobal.isExactlyZero() && +			mTeleportBtn->setEnabled(!mPosGlobal.isExactlyZero() &&  									 !LLViewerParcelMgr::getInstance()->inAgentParcel(mPosGlobal));  		}  		else if (mPlaceInfoType == LANDMARK_INFO_TYPE || mPlaceInfoType == REMOTE_PLACE_INFO_TYPE)  		{  			mTeleportBtn->setEnabled(TRUE);  		} - -		mShowOnMapBtn->setEnabled(!is_media_panel_visible);  	}  	else  	{ @@ -890,6 +882,23 @@ void LLPanelPlaces::updateVerbs()  	}  } +LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel() +{ +	if (mPlaceInfoType == AGENT_INFO_TYPE || +		mPlaceInfoType == REMOTE_PLACE_INFO_TYPE || +		mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) +	{ +		return mPlaceProfile; +	} +	else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || +			 mPlaceInfoType == LANDMARK_INFO_TYPE) +	{ +		return mLandmarkInfo; +	} + +	return NULL; +} +  static bool is_agent_in_selected_parcel(LLParcel* parcel)  {  	LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index e2d281dd84..39eb5261db 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -37,6 +37,10 @@  class LLInventoryItem;  class LLFilterEditor;  class LLLandmark; + +class LLPanelLandmarkInfo; +class LLPanelPlaceProfile; +  class LLPanelPickEdit;  class LLPanelPlaceInfo;  class LLPanelPlacesTab; @@ -85,13 +89,16 @@ private:  	void togglePickPanel(BOOL visible);  	void togglePlaceInfoPanel(BOOL visible); -	void onAgentParcelChange();  	void updateVerbs(); +	LLPanelPlaceInfo* getCurrentInfoPanel(); +  	LLFilterEditor*				mFilterEditor;  	LLPanelPlacesTab*			mActivePanel;  	LLTabContainer*				mTabContainer; -	LLPanelPlaceInfo*			mPlaceInfo; +	LLPanelPlaceProfile*		mPlaceProfile; +	LLPanelLandmarkInfo*		mLandmarkInfo; +  	LLPanelPickEdit*			mPickPanel;  	LLToggleableMenu*			mPlaceMenu;  	LLToggleableMenu*			mLandmarkMenu; diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h index b59d1d42f3..45c2fc116e 100644 --- a/indra/newview/llpanelprofileview.h +++ b/indra/newview/llpanelprofileview.h @@ -36,6 +36,8 @@  #include "llpanel.h"  #include "llpanelprofile.h"  #include "llavatarpropertiesprocessor.h" +#include "llagent.h" +#include "lltooldraganddrop.h"  class LLPanelProfile;  class LLPanelProfileTab; @@ -64,6 +66,18 @@ public:  	/*virtual*/ void togglePanel(LLPanel* panel); +	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, +						   BOOL drop, EDragAndDropType cargo_type, +						   void *cargo_data, EAcceptance *accept, +						   std::string& tooltip_msg) +	{ +		LLToolDragAndDrop::handleGiveDragAndDrop(getAvatarId(), gAgent.getSessionID(), drop, +				 cargo_type, cargo_data, accept); + +		return TRUE; +	} + +  protected:  	void onBackBtnClick(); diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index e97eb1df2b..9450bee315 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -32,6 +32,11 @@  #include "llviewerprecompiledheaders.h" +// common includes +#include "lltrans.h" +#include "llavataractions.h" +#include "llagent.h" +  #include "llparticipantlist.h"  #include "llavatarlist.h"  #include "llspeakers.h" @@ -39,15 +44,18 @@  //LLParticipantList retrieves add, clear and remove events and updates view accordingly   LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list):  	mSpeakerMgr(data_source), -	mAvatarList(avatar_list) +	mAvatarList(avatar_list), +	mSpeakerAddListener(*this), +	mSpeakerRemoveListener(*this), +	mSpeakerClearListener(*this), +	mSortOrder(E_SORT_BY_NAME)  { -	mSpeakerAddListener = new SpeakerAddListener(mAvatarList); -	mSpeakerRemoveListener = new SpeakerRemoveListener(mAvatarList); -	mSpeakerClearListener = new SpeakerClearListener(mAvatarList); +	mSpeakerMgr->addListener(&mSpeakerAddListener, "add"); +	mSpeakerMgr->addListener(&mSpeakerRemoveListener, "remove"); +	mSpeakerMgr->addListener(&mSpeakerClearListener, "clear"); -	mSpeakerMgr->addListener(mSpeakerAddListener, "add"); -	mSpeakerMgr->addListener(mSpeakerRemoveListener, "remove"); -	mSpeakerMgr->addListener(mSpeakerClearListener, "clear"); +	mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData")); +	mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));  	//Lets fill avatarList with existing speakers  	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); @@ -58,24 +66,33 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av  	{  		group_members.push_back((*it)->mID);  	} -	mAvatarList->setDirty(); -	mAvatarList->sortByName(); +	sort();  }  LLParticipantList::~LLParticipantList()  { -	delete mSpeakerAddListener; -	delete mSpeakerRemoveListener; -	delete mSpeakerClearListener; -	mSpeakerAddListener = NULL; -	mSpeakerRemoveListener = NULL; -	mSpeakerClearListener = NULL;  } -// -// LLParticipantList::SpeakerAddListener -// -bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list) +{ +	LLUUID clicked_id = list->getSelectedUUID(); + +	if (clicked_id.isNull() || clicked_id == gAgent.getID()) +		return; +	 +	LLAvatarActions::startIM(clicked_id); +} + +void LLParticipantList::setSortOrder(EParticipantSortOrder order) +{ +	if ( mSortOrder != order ) +	{ +		mSortOrder = order; +		sort(); +	} +} + +bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)  {  	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();  	LLUUID uu_id = event->getValue().asUUID(); @@ -88,15 +105,11 @@ bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::L  	}  	group_members.push_back(uu_id); -	mAvatarList->setDirty(); -	mAvatarList->sortByName(); +	sort();  	return true;  } -// -// LLParticipantList::SpeakerRemoveListener -// -bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)  {  	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();  	LLAvatarList::uuid_vector_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID()); @@ -108,10 +121,7 @@ bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents  	return true;  } -// -// LLParticipantList::SpeakerClearListener -// -bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)  {  	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();  	group_members.clear(); @@ -119,3 +129,45 @@ bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents:  	return true;  } +void LLParticipantList::sort() +{ +	if ( !mAvatarList ) +		return; + +	// Mark AvatarList as dirty one +	mAvatarList->setDirty(); + +	// TODO: Implement more sorting orders after specs updating (EM) +	switch ( mSortOrder ) { +	case E_SORT_BY_NAME : +		mAvatarList->sortByName(); +		break; +	default : +		llwarns << "Unrecognized sort order for " << mAvatarList->getName() << llendl; +		return; +	} +} + +// +// LLParticipantList::SpeakerAddListener +// +bool LLParticipantList::SpeakerAddListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ +	return mParent.onAddItemEvent(event, userdata); +} + +// +// LLParticipantList::SpeakerRemoveListener +// +bool LLParticipantList::SpeakerRemoveListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ +	return mParent.onRemoveItemEvent(event, userdata); +} + +// +// LLParticipantList::SpeakerClearListener +// +bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) +{ +	return mParent.onClearListEvent(event, userdata); +} diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 68aae0aee5..04d9e29256 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -38,46 +38,74 @@ class LLAvatarList;  class LLParticipantList  { +	LOG_CLASS(LLParticipantList);  	public:  		LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list);  		~LLParticipantList(); +		typedef enum e_participant_sort_oder { +			E_SORT_BY_NAME = 0, +		} EParticipantSortOrder; + +		/** +		  * Set and sort Avatarlist by given order +		  */ +		void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME); +  	protected: +		/** +		 * LLSpeakerMgr event handlers +		 */ +		bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); +		bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); +		bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + +		/** +		 * Sorts the Avatarlist by stored order +		 */ +		void sort();  		//List of listeners implementing LLOldEvents::LLSimpleListener.  		//There is no way to handle all the events in one listener as LLSpeakerMgr registers listeners in such a way  		//that one listener can handle only one type of event -		class SpeakerAddListener : public LLOldEvents::LLSimpleListener +		class BaseSpeakerListner : public LLOldEvents::LLSimpleListener  		{  		public: -			SpeakerAddListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} +			BaseSpeakerListner(LLParticipantList& parent) : mParent(parent) {} +		protected: +			LLParticipantList& mParent; +		}; +		class SpeakerAddListener : public BaseSpeakerListner +		{ +		public: +			SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}  			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); -			LLAvatarList* mAvatarList;  		}; -		class SpeakerRemoveListener : public LLOldEvents::LLSimpleListener +		class SpeakerRemoveListener : public BaseSpeakerListner  		{  		public: -			SpeakerRemoveListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} - +			SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}  			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); -			LLAvatarList* mAvatarList;  		}; -		class SpeakerClearListener : public LLOldEvents::LLSimpleListener +		class SpeakerClearListener : public BaseSpeakerListner  		{  		public: -			SpeakerClearListener(LLAvatarList* avatar_list) : mAvatarList(avatar_list) {} - +			SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {}  			/*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); -			LLAvatarList* mAvatarList;  		}; +  	private: +		void onAvatarListDoubleClicked(LLAvatarList* list); +  		LLSpeakerMgr*		mSpeakerMgr; -		LLAvatarList* 		mAvatarList; +		LLAvatarList*		mAvatarList; + +		SpeakerAddListener		mSpeakerAddListener; +		SpeakerRemoveListener	mSpeakerRemoveListener; +		SpeakerClearListener	mSpeakerClearListener; -		SpeakerAddListener* mSpeakerAddListener; -		SpeakerRemoveListener* mSpeakerRemoveListener; -		SpeakerClearListener* mSpeakerClearListener; +		EParticipantSortOrder	mSortOrder;  }; diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index b06e70c00a..34e78b5c46 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -45,6 +45,7 @@  #include "lltooldraganddrop.h"  #include "llradiogroup.h"  #include "llassetstorage.h" +#include "llviewerassettype.h"  #include "llviewerobject.h"  #include "llviewerobjectlist.h"  #include "lldbstrings.h" @@ -317,7 +318,7 @@ BOOL LLPreview::handleHover(S32 x, S32 y, MASK mask)  		   && LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y))  		{  			EDragAndDropType type; -			type = LLAssetType::lookupDragAndDropType(item->getType()); +			type = LLViewerAssetType::lookupDragAndDropType(item->getType());  			LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_LIBRARY;  			if(!mObjectUUID.isNull())  			{ @@ -406,7 +407,7 @@ void LLPreview::onDiscardBtn(void* data)  	*/  	// Move the item to the trash -	LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  	if (item->getParentUUID() != trash_id)  	{  		LLInventoryModel::update_list_t update; diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index ab2afb8056..7b3a20d102 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -130,10 +130,10 @@ LLPreviewGesture* LLPreviewGesture::show(const LLUUID& item_id, const LLUUID& ob  	preview->setObjectID(object_id);  	// Start speculative download of sounds and animations -	LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_ANIMATION); +	const LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ANIMATION);  	gInventory.startBackgroundFetch(animation_folder_id); -	LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_SOUND); +	const LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_SOUND);  	gInventory.startBackgroundFetch(sound_folder_id);  	// this will call refresh when we have everything. diff --git a/indra/newview/llresourcedata.h b/indra/newview/llresourcedata.h index 46b79150bb..b4b9042689 100644 --- a/indra/newview/llresourcedata.h +++ b/indra/newview/llresourcedata.h @@ -39,11 +39,12 @@  struct LLResourceData  {  	LLAssetInfo mAssetInfo; -	LLAssetType::EType mPreferredLocation; +	LLFolderType::EType mPreferredLocation;  	LLInventoryType::EType mInventoryType;  	U32 mNextOwnerPerm;  	S32 mExpectedUploadCost;  	void *mUserData; +	static const S8 INVALID_LOCATION = -2;  };  #endif diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index b8ceef0899..26e668adb5 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -2827,7 +2827,7 @@ bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response,  	case 0:  		{  			// TODO: Make sure you have delete permissions on all of them. -			LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +			const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  			// attempt to derez into the trash.  			LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id);  			LLSelectMgr::getInstance()->sendListToRegions("DeRezObject", diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 9bdea57491..b23e7feda2 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -334,7 +334,7 @@ void populate_favorites_bar()  	S32 count = lib_cats->count();  	for(S32 i = 0; i < count; ++i)  	{ -		if(lib_cats->get(i)->getPreferredType() == LLAssetType::AT_LANDMARK) +		if(lib_cats->get(i)->getPreferredType() == LLFolderType::FT_LANDMARK)  		{  			lib_landmarks = lib_cats->get(i)->getUUID();  			break; @@ -351,7 +351,7 @@ void populate_favorites_bar()  	gInventory.getDirectDescendentsOf(lib_landmarks, lm_cats, lm_items);  	if (!lm_items) return; -	LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE); +	const LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);  	if (favorites_id.isNull())  	{  		llerror("My Inventory is missing My Favorites", 0); @@ -1673,7 +1673,7 @@ bool idle_startup()  		gInventory.buildParentChildMap();  		//all categories loaded. lets create "My Favorites" category -		gInventory.findCategoryUUIDForType(LLAssetType::AT_FAVORITE,true); +		gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);  		// lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" and fill it with buddies  		LLFriendCardsManager::instance().syncFriendsFolder(); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index efe8804742..de00ca8420 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -426,7 +426,7 @@ BOOL LLFloaterTexturePicker::postBuild()  		mInventoryPanel->getRootFolder()->getFilter()->markDefault();  		// Commented out to stop opening all folders with textures -		// mInventoryPanel->openDefaultFolderForType(LLAssetType::AT_TEXTURE); +		// mInventoryPanel->openDefaultFolderForType(LLFolderType::FT_TEXTURE);  		// don't put keyboard focus on selected item, because the selection callback  		// will assume that this was user input @@ -1073,7 +1073,7 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask)  	{  		showPicker(FALSE);  		//grab textures first... -		gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLAssetType::AT_TEXTURE)); +		gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE));  		//...then start full inventory fetch.  		gInventory.startBackgroundFetch();  		handled = TRUE; diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index e78737fe0d..f82573f46c 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -220,7 +220,6 @@ bool LLToastGroupNotifyPanel::isAttachmentOpenable(LLAssetType::EType type)  	switch(type)  	{  	case LLAssetType::AT_LANDMARK: -	case LLAssetType::AT_FAVORITE:  	case LLAssetType::AT_NOTECARD:  	case LLAssetType::AT_IMAGE_JPEG:  	case LLAssetType::AT_IMAGE_TGA: diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 9a63f07a7e..959cb3f182 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -92,7 +92,7 @@ public:  	virtual bool operator()(LLInventoryCategory* cat,  							LLInventoryItem* item)  	{ -		if(cat && (cat->getPreferredType() == LLAssetType::AT_NONE)) +		if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE))  		{  			return true;  		} @@ -109,7 +109,7 @@ public:  							LLInventoryItem* item)  	{  		if(item) return true; -		if(cat && (cat->getPreferredType() == LLAssetType::AT_NONE)) +		if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE))  		{  			return true;  		} @@ -1317,8 +1317,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,  	// Check if it's in the trash.  	bool is_in_trash = false; -	LLUUID trash_id; -	trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  	if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))  	{  		is_in_trash = true; @@ -2088,7 +2087,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(  	if(!item || !item->isComplete()) return ACCEPT_NO;  	// must not be in the trash -	LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); +	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  	if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )  	{  		return ACCEPT_NO; @@ -2170,8 +2169,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(  	}  	// Check if it's in the trash. -	LLUUID trash_id; -	trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  	if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))  	{  		accept = ACCEPT_YES_SINGLE; @@ -2249,8 +2247,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(  	}  	// Check if it's in the trash. -	LLUUID trash_id; -	trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  	if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))  	{  		accept = ACCEPT_YES_SINGLE; @@ -2388,7 +2385,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(  	if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)  	{  		// it's in the agent inventory -		LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  		if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )  		{  			return ACCEPT_NO; @@ -2443,7 +2440,7 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture(  	if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)  	{  		// it's in the agent inventory -		LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  		if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )  		{  			return ACCEPT_NO; @@ -2502,7 +2499,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(  	if(mSource == SOURCE_AGENT)  	{ -		LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); +		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  		if( gInventory.isObjectDescendentOf( category->getUUID(), trash_id ) )  		{  			return ACCEPT_NO; diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp new file mode 100644 index 0000000000..c974171c2c --- /dev/null +++ b/indra/newview/llviewerassettype.cpp @@ -0,0 +1,114 @@ +/**  + * @file llassettype.cpp + * @brief Implementatino of LLViewerAssetType functionality. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2009, 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 "llviewerassettype.h" +#include "lldictionary.h" +#include "llmemory.h" +#include "llsingleton.h" + +static const std::string empty_string; + +struct ViewerAssetEntry : public LLDictionaryEntry +{ +	ViewerAssetEntry(EDragAndDropType dad_type // drag and drop type +		) +		: +		LLDictionaryEntry(empty_string), // no reverse lookup needed for now, so just leave this blank +		mDadType(dad_type) +	{ +	} +	EDragAndDropType mDadType; +}; + +class LLViewerAssetDictionary : public LLSingleton<LLViewerAssetDictionary>, +						  public LLDictionary<LLViewerAssetType::EType, ViewerAssetEntry> +{ +public: +	LLViewerAssetDictionary(); +}; + +LLViewerAssetDictionary::LLViewerAssetDictionary() +{ +	//       												      	   	   	 DRAG&DROP TYPE		     +	//   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	   	|--------------------| +	addEntry(LLViewerAssetType::AT_TEXTURE, 			new ViewerAssetEntry(DAD_TEXTURE)); +	addEntry(LLViewerAssetType::AT_SOUND, 				new ViewerAssetEntry(DAD_SOUND)); +	addEntry(LLViewerAssetType::AT_CALLINGCARD, 		new ViewerAssetEntry(DAD_CALLINGCARD)); +	addEntry(LLViewerAssetType::AT_LANDMARK, 			new ViewerAssetEntry(DAD_LANDMARK)); +	addEntry(LLViewerAssetType::AT_SCRIPT, 				new ViewerAssetEntry(DAD_NONE)); +	addEntry(LLViewerAssetType::AT_CLOTHING, 			new ViewerAssetEntry(DAD_CLOTHING)); +	addEntry(LLViewerAssetType::AT_OBJECT, 				new ViewerAssetEntry(DAD_OBJECT)); +	addEntry(LLViewerAssetType::AT_NOTECARD, 			new ViewerAssetEntry(DAD_NOTECARD)); +	addEntry(LLViewerAssetType::AT_CATEGORY, 			new ViewerAssetEntry(DAD_CATEGORY)); +	addEntry(LLViewerAssetType::AT_ROOT_CATEGORY, 		new ViewerAssetEntry(DAD_ROOT_CATEGORY)); +	addEntry(LLViewerAssetType::AT_LSL_TEXT, 			new ViewerAssetEntry(DAD_SCRIPT)); +	addEntry(LLViewerAssetType::AT_LSL_BYTECODE, 		new ViewerAssetEntry(DAD_NONE)); +	addEntry(LLViewerAssetType::AT_TEXTURE_TGA, 		new ViewerAssetEntry(DAD_NONE)); +	addEntry(LLViewerAssetType::AT_BODYPART, 			new ViewerAssetEntry(DAD_BODYPART)); +	addEntry(LLViewerAssetType::AT_SOUND_WAV, 			new ViewerAssetEntry(DAD_NONE)); +	addEntry(LLViewerAssetType::AT_IMAGE_TGA, 			new ViewerAssetEntry(DAD_NONE)); +	addEntry(LLViewerAssetType::AT_IMAGE_JPEG, 			new ViewerAssetEntry(DAD_NONE)); +	addEntry(LLViewerAssetType::AT_ANIMATION, 			new ViewerAssetEntry(DAD_ANIMATION)); +	addEntry(LLViewerAssetType::AT_GESTURE, 			new ViewerAssetEntry(DAD_GESTURE)); +	addEntry(LLViewerAssetType::AT_SIMSTATE, 			new ViewerAssetEntry(DAD_NONE)); + +	addEntry(LLViewerAssetType::AT_LINK, 				new ViewerAssetEntry(DAD_LINK)); +	addEntry(LLViewerAssetType::AT_LINK_FOLDER, 		new ViewerAssetEntry(DAD_LINK)); + +	addEntry(LLViewerAssetType::AT_NONE, 				new ViewerAssetEntry(DAD_NONE)); +}; + +EDragAndDropType LLViewerAssetType::lookupDragAndDropType(EType asset_type) +{ +	const LLViewerAssetDictionary *dict = LLViewerAssetDictionary::getInstance(); +	const ViewerAssetEntry *entry = dict->lookup(asset_type); +	if (entry) +		return entry->mDadType; +	else +		return DAD_NONE; +} + +// Generate a good default description +void LLViewerAssetType::generateDescriptionFor(LLViewerAssetType::EType asset_type, +											   std::string& description) +{ +	const S32 BUF_SIZE = 30; +	char time_str[BUF_SIZE];	/* Flawfinder: ignore */ +	time_t now; +	time(&now); +	memset(time_str, '\0', BUF_SIZE); +	strftime(time_str, BUF_SIZE - 1, "%Y-%m-%d %H:%M:%S ", localtime(&now)); +	description.assign(time_str); +	description.append(LLAssetType::lookupHumanReadable(asset_type)); +} diff --git a/indra/newview/llviewerassettype.h b/indra/newview/llviewerassettype.h new file mode 100644 index 0000000000..01158885ce --- /dev/null +++ b/indra/newview/llviewerassettype.h @@ -0,0 +1,54 @@ +/**  + * @file llviewerassettype.h + * @brief Declaration of LLViewerViewerAssetType. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2009, 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_LLVIEWERASSETTYPE_H +#define LL_LLVIEWERASSETTYPE_H + +#include <string> +#include "llassettype.h" + +// This class is similar to llassettype, but contains methods +// only used by the viewer. +class LLViewerAssetType : public LLAssetType +{ +public: +	// Generate a good default description. You may want to add a verb +	// or agent name after this depending on your application. +	static void 				generateDescriptionFor(LLViewerAssetType::EType asset_type, +													   std::string& description); +	static EDragAndDropType   	lookupDragAndDropType(EType asset_type); +protected: +	LLViewerAssetType() {} +	~LLViewerAssetType() {} +}; + +#endif // LL_LLVIEWERASSETTYPE_H diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp new file mode 100644 index 0000000000..384538364f --- /dev/null +++ b/indra/newview/llviewerfoldertype.cpp @@ -0,0 +1,263 @@ +/**  + * @file llfoldertype.cpp + * @brief Implementation of LLViewerFolderType functionality. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2009, 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 "llviewerfoldertype.h" +#include "lldictionary.h" +#include "llmemory.h" +#include "llvisualparam.h" + +static const std::string empty_string; + +struct ViewerFolderEntry : public LLDictionaryEntry +{ +	// Constructor for non-ensembles +	ViewerFolderEntry(const std::string &new_category_name, // default name when creating a new category of this type +					  const std::string &icon_name 			// name of the folder icon +		)  +		: +		LLDictionaryEntry(empty_string), // no reverse lookup needed on non-ensembles, so just leave this blank +		mIconName(icon_name), +		mNewCategoryName(new_category_name) +	{ +		mAllowedNames.clear(); +	} + +	// Constructor for ensembles +	ViewerFolderEntry(const std::string &xui_name, 			// name of the xui menu item +					  const std::string &new_category_name, // default name when creating a new category of this type +					  const std::string &icon_name, 		// name of the folder icon +					  const std::string allowed_names 		// allowed item typenames for this folder type +		)  +		: +		LLDictionaryEntry(xui_name), +		mIconName(icon_name), +		mNewCategoryName(new_category_name) +	{ +		const std::string delims (","); +		LLStringUtilBase<char>::getTokens(allowed_names, mAllowedNames, delims); +	} + +	bool getIsAllowedName(const std::string &name) const +	{ +		if (mAllowedNames.empty()) +			return false; +		for (name_vec_t::const_iterator iter = mAllowedNames.begin(); +			 iter != mAllowedNames.end(); +			 iter++) +		{ +			if (name == (*iter)) +				return true; +		} +		return false; +	} +	const std::string mIconName; +	const std::string mNewCategoryName; +	typedef std::vector<std::string> name_vec_t; +	name_vec_t mAllowedNames; +}; + +class LLViewerFolderDictionary : public LLSingleton<LLViewerFolderDictionary>, +								 public LLDictionary<LLFolderType::EType, ViewerFolderEntry> +{ +public: +	LLViewerFolderDictionary(); +protected: +	bool initEnsemblesFromFile(); // Reads in ensemble information from foldertypes.xml +}; + +LLViewerFolderDictionary::LLViewerFolderDictionary() +{ +	initEnsemblesFromFile(); + +	//       													    	  NEW CATEGORY NAME         FOLDER ICON NAME +	//      												  		     |-------------------------|---------------------------| +	addEntry(LLFolderType::FT_TEXTURE, 				new ViewerFolderEntry("Textures",				"inv_folder_texture.tga")); +	addEntry(LLFolderType::FT_SOUND, 				new ViewerFolderEntry("Sounds",					"inv_folder_sound.tga")); +	addEntry(LLFolderType::FT_CALLINGCARD, 			new ViewerFolderEntry("Calling Cards",			"inv_folder_callingcard.tga")); +	addEntry(LLFolderType::FT_LANDMARK, 			new ViewerFolderEntry("Landmarks",				"inv_folder_landmark.tga")); +	addEntry(LLFolderType::FT_CLOTHING, 			new ViewerFolderEntry("Clothing",				"inv_folder_clothing.tga")); +	addEntry(LLFolderType::FT_OBJECT, 				new ViewerFolderEntry("Objects",				"inv_folder_object.tga")); +	addEntry(LLFolderType::FT_NOTECARD, 			new ViewerFolderEntry("Notecards",				"inv_folder_notecard.tga")); +	addEntry(LLFolderType::FT_CATEGORY, 			new ViewerFolderEntry("New Folder",				"inv_folder_plain_closed.tga")); +	addEntry(LLFolderType::FT_ROOT_CATEGORY, 		new ViewerFolderEntry("Inventory",				"")); +	addEntry(LLFolderType::FT_LSL_TEXT, 			new ViewerFolderEntry("Scripts",				"inv_folder_script.tga")); +	addEntry(LLFolderType::FT_BODYPART, 			new ViewerFolderEntry("Body Parts",				"inv_folder_bodypart.tga")); +	addEntry(LLFolderType::FT_TRASH, 				new ViewerFolderEntry("Trash",					"inv_folder_trash.tga")); +	addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, 	new ViewerFolderEntry("Photo Album",			"inv_folder_snapshot.tga")); +	addEntry(LLFolderType::FT_LOST_AND_FOUND, 		new ViewerFolderEntry("Lost And Found",	   		"inv_folder_lostandfound.tga")); +	addEntry(LLFolderType::FT_ANIMATION, 			new ViewerFolderEntry("Animations",				"inv_folder_animation.tga")); +	addEntry(LLFolderType::FT_GESTURE, 				new ViewerFolderEntry("Gestures",				"inv_folder_gesture.tga")); +	addEntry(LLFolderType::FT_FAVORITE, 			new ViewerFolderEntry("Favorite",				"inv_folder_plain_closed.tga")); + +	addEntry(LLFolderType::FT_CURRENT_OUTFIT, 		new ViewerFolderEntry("Current Outfit",			"inv_folder_current_outfit.tga")); +	addEntry(LLFolderType::FT_OUTFIT, 				new ViewerFolderEntry("New Outfit",				"inv_folder_outfit.tga")); +	addEntry(LLFolderType::FT_MY_OUTFITS, 			new ViewerFolderEntry("My Outfits",				"inv_folder_my_outfits.tga")); +	addEntry(LLFolderType::FT_INBOX, 				new ViewerFolderEntry("Inbox",					"inv_folder_inbox.tga")); +		  +	addEntry(LLFolderType::FT_NONE, 				new ViewerFolderEntry("New Folder",				"inv_folder_plain_closed.tga")); +} + +bool LLViewerFolderDictionary::initEnsemblesFromFile() +{ +	std::string xml_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"foldertypes.xml"); +	LLXmlTree folder_def; +	if (!folder_def.parseFile(xml_filename)) +	{ +		llerrs << "Failed to parse folders file " << xml_filename << llendl; +		return false; +	} + +	LLXmlTreeNode* rootp = folder_def.getRoot(); +	for (LLXmlTreeNode* ensemble = rootp->getFirstChild(); +		 ensemble; +		 ensemble = rootp->getNextChild()) +	{ +		if (!ensemble->hasName("ensemble")) +		{ +			llwarns << "Invalid ensemble definition node " << ensemble->getName() << llendl; +			continue; +		} + +		S32 ensemble_type; +		static LLStdStringHandle ensemble_num_string = LLXmlTree::addAttributeString("foldertype_num"); +		if (!ensemble->getFastAttributeS32(ensemble_num_string, ensemble_type)) +		{ +			llwarns << "No ensemble type defined" << llendl; +			continue; +		} + + +		if (ensemble_type < S32(LLFolderType::FT_ENSEMBLE_START) || ensemble_type > S32(LLFolderType::FT_ENSEMBLE_END)) +		{ +			llwarns << "Exceeded maximum ensemble index" << LLFolderType::FT_ENSEMBLE_END << llendl; +			break; +		} + +		std::string xui_name; +		static LLStdStringHandle xui_name_string = LLXmlTree::addAttributeString("xui_name"); +		if (!ensemble->getFastAttributeString(xui_name_string, xui_name)) +		{ +			llwarns << "No xui name defined" << llendl; +			continue; +		} + +		std::string icon_name; +		static LLStdStringHandle icon_name_string = LLXmlTree::addAttributeString("icon_name"); +		if (!ensemble->getFastAttributeString(icon_name_string, icon_name)) +		{ +			llwarns << "No ensemble icon name defined" << llendl; +			continue; +		} + +		std::string allowed_names; +		static LLStdStringHandle allowed_names_string = LLXmlTree::addAttributeString("allowed"); +		if (!ensemble->getFastAttributeString(allowed_names_string, allowed_names)) +		{ +		} + +		// Add the entry and increment the asset number. +		const static std::string new_ensemble_name = "New Ensemble"; +		addEntry(LLFolderType::EType(ensemble_type), new ViewerFolderEntry(xui_name, new_ensemble_name, icon_name, allowed_names)); +	} + +	return true; +} + + +const std::string &LLViewerFolderType::lookupXUIName(LLFolderType::EType folder_type) +{ +	const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type); +	if (entry) +	{ +		return entry->mName; +	} +	return badLookup(); +} + +LLFolderType::EType LLViewerFolderType::lookupTypeFromXUIName(const std::string &name) +{ +	return LLViewerFolderDictionary::getInstance()->lookup(name); +} + +const std::string &LLViewerFolderType::lookupIconName(LLFolderType::EType folder_type) +{ +	const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type); +	if (entry) +	{ +		return entry->mIconName; +	} +	return badLookup(); +} + +const std::string &LLViewerFolderType::lookupNewCategoryName(LLFolderType::EType folder_type) +{ +	const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type); +	if (entry) +	{ +		return entry->mNewCategoryName; +	} +	return badLookup(); +} + +LLFolderType::EType LLViewerFolderType::lookupTypeFromNewCategoryName(const std::string& name) +{ +	for (LLViewerFolderDictionary::const_iterator iter = LLViewerFolderDictionary::getInstance()->begin(); +		 iter != LLViewerFolderDictionary::getInstance()->end(); +		 iter++) +	{ +		const ViewerFolderEntry *entry = iter->second; +		if (entry->mNewCategoryName == name) +		{ +			return iter->first; +		} +	} +	return FT_NONE; +} + + +U64 LLViewerFolderType::lookupValidFolderTypes(const std::string& item_name) +{ +	U64 matching_folders = 0; +	for (LLViewerFolderDictionary::const_iterator iter = LLViewerFolderDictionary::getInstance()->begin(); +		 iter != LLViewerFolderDictionary::getInstance()->end(); +		 iter++) +	{ +		const ViewerFolderEntry *entry = iter->second; +		if (entry->getIsAllowedName(item_name)) +		{ +			matching_folders |= 1LL << iter->first; +		} +	} +	return matching_folders; +} diff --git a/indra/newview/llviewerfoldertype.h b/indra/newview/llviewerfoldertype.h new file mode 100644 index 0000000000..a6aea62b2a --- /dev/null +++ b/indra/newview/llviewerfoldertype.h @@ -0,0 +1,57 @@ +/**  + * @file llviewerfoldertype.h + * @brief Declaration of LLAssetType. + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2009, 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_LLVIEWERFOLDERTYPE_H +#define LL_LLVIEWERFOLDERTYPE_H + +#include <string> +#include "llfoldertype.h" + +// This class is similar to llfoldertype, but contains methods +// only used by the viewer.  This also handles ensembles. +class LLViewerFolderType : public LLFolderType +{ +public: +	static const std::string&   lookupXUIName(EType folder_type); // name used by the UI +	static LLFolderType::EType 	lookupTypeFromXUIName(const std::string& name); + +	static const std::string&   lookupIconName(EType asset_type); // folder icon name +	static const std::string&	lookupNewCategoryName(EType folder_type); // default name when creating new category +	static LLFolderType::EType	lookupTypeFromNewCategoryName(const std::string& name); // default name when creating new category + +	static U64					lookupValidFolderTypes(const std::string& item_name); // which folders allow an item of this type? +protected: +	LLViewerFolderType() {} +	~LLViewerFolderType() {} +}; + +#endif // LL_LLVIEWERFOLDERTYPE_H diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 470739baa9..1d62ead843 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -37,7 +37,7 @@  #include "indra_constants.h"  #include "llagent.h" -#include "llfoldertype.h" +#include "llviewerfoldertype.h"  #include "llfolderview.h"  #include "llviewercontrol.h"  #include "llconsole.h" @@ -48,6 +48,7 @@  #include "llinventorybridge.h"  #include "llfloaterinventory.h" +#include "llviewerassettype.h"  #include "llviewerregion.h"  #include "llviewerobjectlist.h"  #include "llpreviewgesture.h" @@ -359,7 +360,7 @@ void LLViewerInventoryItem::updateParentOnServer(BOOL restamp) const  LLViewerInventoryCategory::LLViewerInventoryCategory(const LLUUID& uuid,  													 const LLUUID& parent_uuid, -													 LLAssetType::EType pref, +													 LLFolderType::EType pref,  													 const std::string& name,  													 const LLUUID& owner_id) :  	LLInventoryCategory(uuid, parent_uuid, pref, name), @@ -416,7 +417,7 @@ void LLViewerInventoryCategory::updateServer(BOOL is_new) const  {  	// communicate that change with the server. -	if (LLAssetType::lookupIsProtectedCategoryType(mPreferredType)) +	if (LLFolderType::lookupIsProtectedType(mPreferredType))  	{  		LLNotifications::instance().add("CannotModifyProtectedCategories");  		return; @@ -440,7 +441,7 @@ void LLViewerInventoryCategory::removeFromServer( void )  	llinfos << "Removing inventory category " << mUUID << " from server."  			<< llendl;  	// communicate that change with the server. -	if(LLAssetType::lookupIsProtectedCategoryType(mPreferredType)) +	if(LLFolderType::lookupIsProtectedType(mPreferredType))  	{  		LLNotifications::instance().add("CannotRemoveProtectedCategories");  		return; @@ -543,7 +544,7 @@ bool LLViewerInventoryCategory::importFileLocal(LLFILE* fp)  		}  		else if(0 == strcmp("pref_type", keyword))  		{ -			mPreferredType = LLAssetType::lookup(valuestr); +			mPreferredType = LLFolderType::lookup(valuestr);  		}  		else if(0 == strcmp("name", keyword))  		{ @@ -581,7 +582,7 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const  	mParentUUID.toString(uuid_str);  	fprintf(fp, "\t\tparent_id\t%s\n", uuid_str.c_str());  	fprintf(fp, "\t\ttype\t%s\n", LLAssetType::lookup(mType)); -	fprintf(fp, "\t\tpref_type\t%s\n", LLAssetType::lookup(mPreferredType)); +	fprintf(fp, "\t\tpref_type\t%s\n", LLFolderType::lookup(mPreferredType).c_str());  	fprintf(fp, "\t\tname\t%s|\n", mName.c_str());  	mOwnerID.toString(uuid_str);  	fprintf(fp, "\t\towner_id\t%s\n", uuid_str.c_str()); @@ -592,8 +593,8 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const  void LLViewerInventoryCategory::determineFolderType()  { -	LLAssetType::EType original_type = getPreferredType(); -	if (LLAssetType::lookupIsProtectedCategoryType(original_type)) +	LLFolderType::EType original_type = getPreferredType(); +	if (LLFolderType::lookupIsProtectedType(original_type))  		return;  	U64 folder_valid = 0; @@ -616,28 +617,28 @@ void LLViewerInventoryCategory::determineFolderType()  			{  				const EWearableType wearable_type = item->getWearableType();  				const std::string& wearable_name = LLWearableDictionary::getTypeName(wearable_type); -				U64 valid_folder_types = LLFolderType::lookupValidFolderTypes(wearable_name); +				U64 valid_folder_types = LLViewerFolderType::lookupValidFolderTypes(wearable_name);  				folder_valid |= valid_folder_types;  				folder_invalid |= ~valid_folder_types;  			}  		} -		for (U8 i = LLAssetType::AT_FOLDER_ENSEMBLE_START; i <= LLAssetType::AT_FOLDER_ENSEMBLE_END; i++) +		for (U8 i = LLFolderType::FT_ENSEMBLE_START; i <= LLFolderType::FT_ENSEMBLE_END; i++)  		{  			if ((folder_valid & (1LL << i)) &&  				!(folder_invalid & (1LL << i)))  			{ -				changeType((LLAssetType::EType)i); +				changeType((LLFolderType::EType)i);  				return;  			}  		}  	} -	if (LLAssetType::lookupIsEnsembleCategoryType(original_type)) +	if (LLFolderType::lookupIsEnsembleType(original_type))  	{ -		changeType(LLAssetType::AT_NONE); +		changeType(LLFolderType::FT_NONE);  	}  } -void LLViewerInventoryCategory::changeType(LLAssetType::EType new_folder_type) +void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type)  {  	const LLUUID &folder_id = getUUID();  	const LLUUID &parent_id = getParentUUID(); @@ -948,7 +949,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar      body["notecard-id"] = notecard_inv_id;      body["object-id"] = object_id;      body["item-id"] = src->getUUID(); -    body["folder-id"] = gInventory.findCategoryUUIDForType(src->getType()); +	body["folder-id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType()));      body["callback-id"] = (LLSD::Integer)callback_id;      request["message"] = "CopyInventoryFromNotecard"; @@ -964,7 +965,7 @@ void create_new_item(const std::string& name,  				   U32 next_owner_perm)  {  	std::string desc; -	LLAssetType::generateDescriptionFor(asset_type, desc); +	LLViewerAssetType::generateDescriptionFor(asset_type, desc);  	next_owner_perm = (next_owner_perm) ? next_owner_perm : PERM_MOVE | PERM_TRANSFER; @@ -989,19 +990,14 @@ const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not  const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably not)  const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not) +// ! REFACTOR ! Really need to refactor this so that it's not a bunch of if-then statements...  void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid)  { -	std::string type = userdata.asString(); +	std::string type_name = userdata.asString(); -	if (("category" == type) || ("current" == type) || ("outfit" == type) || ("my_otfts" == type) ) +	if (("category" == type_name) || ("current" == type_name) || ("outfit" == type_name) || ("my_otfts" == type_name))  	{ -		LLAssetType::EType a_type = LLAssetType::AT_NONE; -		if ("current" == type) -			a_type = LLAssetType::AT_CURRENT_OUTFIT; -		if ("outfit" == type) -			a_type = LLAssetType::AT_OUTFIT; -		if ("my_otfts" == type) -			a_type = LLAssetType::AT_MY_OUTFITS; +		LLFolderType::EType preferred_type = LLFolderType::lookup(type_name);  		LLUUID parent_id;  		if (bridge) @@ -1017,100 +1013,100 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co  			parent_id = gInventory.getRootFolderID();  		} -		LLUUID category = gInventory.createNewCategory(parent_id, a_type, LLStringUtil::null); +		LLUUID category = gInventory.createNewCategory(parent_id, preferred_type, LLStringUtil::null);  		gInventory.notifyObservers();  		folder->setSelectionByID(category, TRUE);  	} -	else if ("lsl" == type) +	else if ("lsl" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_LSL_TEXT); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_LSL_TEXT);  		create_new_item(NEW_LSL_NAME,  					  parent_id,  					  LLAssetType::AT_LSL_TEXT,  					  LLInventoryType::IT_LSL,  					  PERM_MOVE | PERM_TRANSFER);  	} -	else if ("notecard" == type) +	else if ("notecard" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_NOTECARD); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_NOTECARD);  		create_new_item(NEW_NOTECARD_NAME,  					  parent_id,  					  LLAssetType::AT_NOTECARD,  					  LLInventoryType::IT_NOTECARD,  					  PERM_ALL);  	} -	else if ("gesture" == type) +	else if ("gesture" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_GESTURE); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);  		create_new_item(NEW_GESTURE_NAME,  					  parent_id,  					  LLAssetType::AT_GESTURE,  					  LLInventoryType::IT_GESTURE,  					  PERM_ALL);  	} -	else if ("shirt" == type) +	else if ("shirt" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  		LLFolderBridge::createWearable(parent_id, WT_SHIRT);  	} -	else if ("pants" == type) +	else if ("pants" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  		LLFolderBridge::createWearable(parent_id, WT_PANTS);  	} -	else if ("shoes" == type) +	else if ("shoes" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  		LLFolderBridge::createWearable(parent_id, WT_SHOES);  	} -	else if ("socks" == type) +	else if ("socks" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  		LLFolderBridge::createWearable(parent_id, WT_SOCKS);  	} -	else if ("jacket" == type) +	else if ("jacket" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  		LLFolderBridge::createWearable(parent_id, WT_JACKET);  	} -	else if ("skirt" == type) +	else if ("skirt" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  		LLFolderBridge::createWearable(parent_id, WT_SKIRT);  	} -	else if ("gloves" == type) +	else if ("gloves" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  		LLFolderBridge::createWearable(parent_id, WT_GLOVES);  	} -	else if ("undershirt" == type) +	else if ("undershirt" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  		LLFolderBridge::createWearable(parent_id, WT_UNDERSHIRT);  	} -	else if ("underpants" == type) +	else if ("underpants" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_CLOTHING); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);  		LLFolderBridge::createWearable(parent_id, WT_UNDERPANTS);  	} -	else if ("shape" == type) +	else if ("shape" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);  		LLFolderBridge::createWearable(parent_id, WT_SHAPE);  	} -	else if ("skin" == type) +	else if ("skin" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);  		LLFolderBridge::createWearable(parent_id, WT_SKIN);  	} -	else if ("hair" == type) +	else if ("hair" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);  		LLFolderBridge::createWearable(parent_id, WT_HAIR);  	} -	else if ("eyes" == type) +	else if ("eyes" == type_name)  	{ -		LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLAssetType::AT_BODYPART); +		const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(LLFolderType::FT_BODYPART);  		LLFolderBridge::createWearable(parent_id, WT_EYES);  	} diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index d523bf2859..529425aa25 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -185,7 +185,7 @@ protected:  public:  	LLViewerInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid, -							  LLAssetType::EType preferred_type, +							  LLFolderType::EType preferred_type,  							  const std::string& name,  							  const LLUUID& owner_id);  	LLViewerInventoryCategory(const LLUUID& owner_id); @@ -221,7 +221,7 @@ public:  	bool exportFileLocal(LLFILE* fp) const;  	bool importFileLocal(LLFILE* fp);  	void determineFolderType(); -	void changeType(LLAssetType::EType new_folder_type); +	void changeType(LLFolderType::EType new_folder_type);  protected:  	LLUUID mOwnerID;  	S32 mVersion; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 1883bde7f1..2c2b2047ca 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4175,12 +4175,10 @@ void handle_take_copy()  {  	if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return; -	LLUUID category_id = -		gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); +	const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);  	derez_objects(DRD_ACQUIRE_TO_AGENT_INVENTORY, category_id);  } -  // You can return an object to its owner if it is on your land.  class LLObjectReturn : public view_listener_t  { @@ -4261,7 +4259,7 @@ class LLObjectEnableReturn : public view_listener_t  void force_take_copy(void*)  {  	if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) return; -	const LLUUID& category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); +	const LLUUID category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);  	derez_objects(DRD_FORCE_TO_GOD_INVENTORY, category_id);  } @@ -4322,8 +4320,7 @@ void handle_take()  		if(category_id.notNull())  		{  		        // check trash -			LLUUID trash; -			trash = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +			const LLUUID trash = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  			if(category_id == trash || gInventory.isObjectDescendentOf(category_id, trash))  			{  				category_id.setNull(); @@ -4339,7 +4336,7 @@ void handle_take()  	}  	if(category_id.isNull())  	{ -		category_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_OBJECT); +		category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);  	}  	LLSD payload;  	payload["folder_id"] = category_id; @@ -6918,7 +6915,7 @@ void handle_grab_texture(void* data)  		LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << llendl;  		LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE;  		LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE; -		LLUUID folder_id(gInventory.findCategoryUUIDForType(asset_type)); +		const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(asset_type));  		if(folder_id.notNull())  		{  			std::string name = "Unknown"; diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index d3a9e1cef8..d17c7e486f 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -319,7 +319,7 @@ class LLFileUploadBulk : public view_listener_t  			LLAssetStorage::LLStoreAssetCallback callback = NULL;  			S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();  			void *userdata = NULL; -			upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, +			upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,  				LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),  					    display_name,  					    callback, expected_upload_cost, userdata); @@ -493,7 +493,7 @@ void handle_compress_image(void*)  void upload_new_resource(const std::string& src_filename, std::string name,  			 std::string desc, S32 compression_info, -			 LLAssetType::EType destination_folder_type, +			 LLFolderType::EType destination_folder_type,  			 LLInventoryType::EType inv_type,  			 U32 next_owner_perms,  			 U32 group_perms, @@ -810,7 +810,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt  	if(result >= 0)  	{ -		LLAssetType::EType dest_loc = (data->mPreferredLocation == LLAssetType::AT_NONE) ? data->mAssetInfo.mType : data->mPreferredLocation; +		LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation;  		if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||  			LLAssetType::AT_TEXTURE == data->mAssetInfo.mType || @@ -856,7 +856,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt  		{  			// Actually add the upload to inventory  			llinfos << "Adding " << uuid << " to inventory." << llendl; -			LLUUID folder_id(gInventory.findCategoryUUIDForType(dest_loc)); +			const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc);  			if(folder_id.notNull())  			{  				U32 next_owner_perms = data->mNextOwnerPerm; @@ -903,7 +903,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt  		LLAssetStorage::LLStoreAssetCallback callback = NULL;  		void *userdata = NULL;  		upload_new_resource(next_file, asset_name, asset_name,	// file -				    0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, +				    0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,  				    PERM_NONE, PERM_NONE, PERM_NONE,  				    display_name,  				    callback, @@ -915,7 +915,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt  void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type,  			 std::string name,  			 std::string desc, S32 compression_info, -			 LLAssetType::EType destination_folder_type, +			 LLFolderType::EType destination_folder_type,  			 LLInventoryType::EType inv_type,  			 U32 next_owner_perms,  			 U32 group_perms, @@ -973,14 +973,14 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty  	llinfos << "Name: " << name << llendl;  	llinfos << "Desc: " << desc << llendl;  	llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl; -	lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type) << llendl; +	lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl;  	lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl;  	std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");  	if (!url.empty())  	{  		llinfos << "New Agent Inventory via capability" << llendl;  		LLSD body; -		body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLAssetType::AT_NONE) ? asset_type : destination_folder_type); +		body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type);  		body["asset_type"] = LLAssetType::lookup(asset_type);  		body["inventory_type"] = LLInventoryType::lookup(inv_type);  		body["name"] = name; diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index bf21292082..da78537a29 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -33,7 +33,7 @@  #ifndef LLVIEWERMENUFILE_H  #define LLVIEWERMENUFILE_H -#include "llassettype.h" +#include "llfoldertype.h"  #include "llinventorytype.h"  class LLTransactionID; @@ -45,7 +45,7 @@ void upload_new_resource(const std::string& src_filename,  			 std::string name,  			 std::string desc,   			 S32 compression_info, -			 LLAssetType::EType destination_folder_type, +			 LLFolderType::EType destination_folder_type,  			 LLInventoryType::EType inv_type,  			 U32 next_owner_perms,  			 U32 group_perms, @@ -60,7 +60,7 @@ void upload_new_resource(const LLTransactionID &tid,  			 std::string name,  			 std::string desc,   			 S32 compression_info, -			 LLAssetType::EType destination_folder_type, +			 LLFolderType::EType destination_folder_type,  			 LLInventoryType::EType inv_type,  			 U32 next_owner_perms,  			 U32 group_perms, diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index ff1c7b526f..d8e6c52c8c 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -140,7 +140,7 @@  #include "llgroupactions.h"  #include "llagentui.h"  #include "llpanelblockedlist.h" -#include "llpanelplaceinfo.h" +#include "llpanelplaceprofile.h"  #include <boost/tokenizer.hpp>  #include <boost/algorithm/string/split.hpp> @@ -209,7 +209,6 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] =  bool friendship_offer_callback(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotification::getSelectedOption(notification, response); -	LLUUID fid;  	LLMessageSystem* msg = gMessageSystem;  	const LLSD& payload = notification["payload"]; @@ -219,10 +218,11 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)  	switch(option)  	{  	case 0: +	{  		// accept  		LLAvatarTracker::formFriendship(payload["from_id"]); -		fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); +		const LLUUID fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);  		// This will also trigger an onlinenotification if the user is online  		msg->newMessageFast(_PREHASH_AcceptFriendship); @@ -235,7 +235,9 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)  		msg->addUUIDFast(_PREHASH_FolderID, fid);  		msg->sendReliable(LLHost(payload["sender"].asString()));  		break; +	}  	case 1: +	{  		// decline  		// We no longer notify other viewers, but we DO still send  		// the rejection to the simulator to delete the pending userop. @@ -247,6 +249,7 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)  		msg->addUUIDFast(_PREHASH_TransactionID, payload["session_id"]);  		msg->sendReliable(LLHost(payload["sender"].asString()));  		break; +	}  	default:  		// close button probably, possibly timed out  		break; @@ -767,8 +770,7 @@ public:  	virtual void done()  	{  		LL_DEBUGS("Messaging") << "LLDiscardAgentOffer::done()" << LL_ENDL; -		LLUUID trash_id; -		trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  		bool notify = false;  		if(trash_id.notNull() && mObjectID.notNull())  		{ @@ -875,7 +877,7 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)  {  	std::vector<LLUUID>::const_iterator it = items.begin();  	std::vector<LLUUID>::const_iterator end = items.end(); -	LLUUID trash_id(gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH)); +	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  	LLInventoryItem* item;  	for(; it != end; ++it)  	{ @@ -946,13 +948,12 @@ void open_offer(const std::vector<LLUUID>& items, const std::string& from_name)  		}  		//Trash Check -		LLUUID trash_id; -		trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); +		const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);  		if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))  		{  			return;  		} -		LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LOST_AND_FOUND); +		const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);  		//BOOL inventory_has_focus = gFocusMgr.childHasKeyboardFocus(view);  		BOOL user_is_away = gAwayTimer.getStarted(); @@ -1716,7 +1717,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  				info->mFromGroup = from_group;  				info->mTransactionID = session_id;  				info->mType = (LLAssetType::EType) asset_type; -				info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); +				info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType));  				std::string from_name;  				from_name += "A group member named "; @@ -1850,7 +1851,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)  			info->mFromID = from_id;  			info->mFromGroup = from_group;  			info->mTransactionID = session_id; -			info->mFolderID = gInventory.findCategoryUUIDForType(info->mType); +			info->mFolderID = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(info->mType));  			if (dialog == IM_TASK_INVENTORY_OFFERED)  			{ @@ -2144,7 +2145,7 @@ bool callingcard_offer_callback(const LLSD& notification, const LLSD& response)  		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());  		msg->nextBlockFast(_PREHASH_TransactionBlock);  		msg->addUUIDFast(_PREHASH_TransactionID, notification["payload"]["transaction_id"].asUUID()); -		fid = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); +		fid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);  		msg->nextBlockFast(_PREHASH_FolderData);  		msg->addUUIDFast(_PREHASH_FolderID, fid);  		msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); @@ -2597,11 +2598,10 @@ BOOL LLPostTeleportNotifiers::tick()  	{  		// get callingcards and landmarks available to the user arriving.  		LLInventoryFetchDescendentsObserver::folder_ref_t folders; -		LLUUID folder_id; -		folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD); -		if(folder_id.notNull())  -			folders.push_back(folder_id); -		folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_LANDMARK); +		const LLUUID callingcard_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); +		if(callingcard_id.notNull())  +			folders.push_back(callingcard_id); +		const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);  		if(folder_id.notNull())   			folders.push_back(folder_id);  		if(!folders.empty()) @@ -4819,7 +4819,7 @@ void container_inventory_arrived(LLViewerObject* object,  		// create a new inventory category to put this in  		LLUUID cat_id;  		cat_id = gInventory.createNewCategory(gInventory.getRootFolderID(), -											  LLAssetType::AT_NONE, +											  LLFolderType::FT_NONE,  											  LLTrans::getString("AcquiredItems"));  		InventoryObjectList::const_iterator it = inventory->begin(); @@ -4869,7 +4869,7 @@ void container_inventory_arrived(LLViewerObject* object,  		}  		LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it)); -		LLUUID category = gInventory.findCategoryUUIDForType(item->getType()); +		const LLUUID category = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(item->getType()));  		LLUUID item_id;  		item_id.generate(); @@ -5549,7 +5549,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**)  	LLPanelLandCovenant::updateEstateOwnerName(owner_name);  	LLFloaterBuyLand::updateEstateOwnerName(owner_name); -	LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info"); +	LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile");  	if (panel)  	{  		panel->updateEstateName(estate_name); @@ -5683,7 +5683,7 @@ void onCovenantLoadComplete(LLVFS *vfs,  	LLPanelLandCovenant::updateCovenantText(covenant_text);  	LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid); -	LLPanelPlaceInfo* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceInfo>("panel_place_info"); +	LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile");  	if (panel)  	{  		panel->updateCovenantText(covenant_text); diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 5c40f2a540..90dff465c9 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -62,6 +62,7 @@  #include "lltooltip.h"  #include "lltrans.h"  #include "lluictrlfactory.h" +#include "llviewerassettype.h"  #include "llviewercontrol.h"  #include "llviewerinventory.h"  #include "llviewertexturelist.h" @@ -505,19 +506,17 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const  				}  				break; -			case LLAssetType::AT_SOUND:			img_name = "Inv_Sound";	break; +			case LLAssetType::AT_SOUND:			img_name = "Inv_Sound";		break;  			case LLAssetType::AT_CLOTHING:		img_name = "Inv_Clothing";	break; -			case LLAssetType::AT_OBJECT:		img_name = "Inv_Object"; break; +			case LLAssetType::AT_OBJECT:		img_name = "Inv_Object"; 	break;  			case LLAssetType::AT_CALLINGCARD:	img_name = "Inv_CallingCard"; break; -			case LLAssetType::AT_LANDMARK:		img_name = "Inv_Landmark"; break; +			case LLAssetType::AT_LANDMARK:		img_name = "Inv_Landmark"; 	break;  			case LLAssetType::AT_NOTECARD:		img_name = "Inv_Notecard";	break;  			case LLAssetType::AT_LSL_TEXT:		img_name = "Inv_Script";	break; -			case LLAssetType::AT_BODYPART:		img_name = "Inv_Skin";	break; -			case LLAssetType::AT_ANIMATION:		img_name = "Inv_Animation";break; -			case LLAssetType::AT_GESTURE:			img_name = "Inv_Gesture";	break; -				//TODO need img_name -			case LLAssetType::AT_FAVORITE:		img_name = "Inv_Landmark";	 break; -			default: llassert(0);  +			case LLAssetType::AT_BODYPART:		img_name = "Inv_Skin";		break; +			case LLAssetType::AT_ANIMATION:		img_name = "Inv_Animation";	break; +			case LLAssetType::AT_GESTURE:		img_name = "Inv_Gesture";	break; +			default: llassert(0);  		}  		return LLUI::getUIImage(img_name); @@ -732,11 +731,10 @@ BOOL LLViewerTextEditor::handleHover(S32 x, S32 y, MASK mask)  		if( LLToolDragAndDrop::getInstance()->isOverThreshold( screen_x, screen_y ) )  		{  			LLToolDragAndDrop::getInstance()->beginDrag( -				LLAssetType::lookupDragAndDropType( mDragItem->getType() ), +				LLViewerAssetType::lookupDragAndDropType( mDragItem->getType() ),  				mDragItem->getUUID(),  				LLToolDragAndDrop::SOURCE_NOTECARD,  				mPreviewID, mObjectID); -  			return LLToolDragAndDrop::getInstance()->handleHover( x, y, mask );  		}  		getWindow()->setCursor(UI_CURSOR_HAND); diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 75ca37f661..85a68fdd3f 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -41,53 +41,22 @@  #include "llvoavatarself.h"  #include "llvoavatar.h" -#include <stdio.h> -#include <ctype.h> - -#include "llaudioengine.h" -#include "noise.h" +#include "pipeline.h" -// TODO: Seraph - Remove unnecessary headers.  These are copied from llvoavatar.h.  #include "llagent.h" //  Get state values from here  #include "llagentwearables.h" -#include "llviewercontrol.h" -#include "lldrawpoolavatar.h" -#include "lldriverparam.h" -#include "lleditingmotion.h" -#include "llemote.h" -#include "llface.h" -#include "llfirstuse.h" -#include "llheadrotmotion.h"  #include "llhudeffecttrail.h"  #include "llhudmanager.h" -#include "llkeyframefallmotion.h" -#include "llkeyframestandmotion.h" -#include "llkeyframewalkmotion.h" -#include "llmutelist.h"  #include "llselectmgr.h" -#include "llsprite.h" -#include "lltargetingmotion.h" -#include "lltexlayer.h" -#include "lltexglobalcolor.h"  #include "lltoolgrab.h"	// for needsRenderBeam  #include "lltoolmgr.h" // for needsRenderBeam  #include "lltoolmorph.h"  #include "lltrans.h"  #include "llviewercamera.h" -#include "llviewertexturelist.h"  #include "llviewermenu.h"  #include "llviewerobjectlist.h" -#include "llviewerparcelmgr.h"  #include "llviewerstats.h" -#include "llvovolume.h" -#include "llworld.h" -#include "pipeline.h" -#include "llviewershadermgr.h" -#include "llsky.h" -#include "llanimstatelabels.h" -#include "llgesturemgr.h" //needed to trigger the voice gesticulations -#include "llvoiceclient.h" -#include "llvoicevisualizer.h" // Ventrella +#include "llviewerregion.h"  #include "llappearancemgr.h"  #if LL_MSVC diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 746214088a..2b4861ce4f 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -1116,7 +1116,7 @@ void LLWearable::saveNewAsset() const  		{  			llinfos << "Update Agent Inventory via capability" << llendl;  			LLSD body; -			body["folder_id"] = gInventory.findCategoryUUIDForType(getAssetType()); +			body["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetToFolderType(getAssetType()));  			body["asset_type"] = LLAssetType::lookup(getAssetType());  			body["inventory_type"] = LLInventoryType::lookup(LLInventoryType::IT_WEARABLE);  			body["name"] = getName(); diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tgaBinary files differ new file mode 100644 index 0000000000..04539c2cc4 --- /dev/null +++ b/indra/newview/skins/default/textures/inv_folder_inbox.tga 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 26d2f4e497..88aca005cf 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -3,7 +3,7 @@   legacy_header_height="18"   background_visible="true"   follows="left|top|right|bottom" - height="270" + height="359"   layout="topleft"   left="0"   name="panel_im" @@ -12,13 +12,13 @@   can_dock="true"   can_minimize="true"   visible="true"  - width="365" + width="400"   can_resize="true"   min_width="200"   min_height="150">    <layout_stack follows="left|top|right|bottom" -                height="255" -                width="365" +                height="344" +                width="400"                  layout="topleft"                  orientation="horizontal"                  name="im_panels" @@ -28,13 +28,13 @@        name="panel_im_control_panel"        layout="topleft"        top_delta="-3" -      width="146" -      height="255" +      height="344"        follows="left"        label="IM Control Panel" +      auto_resize="false"        user_resize="false" /> -    <layout_panel height="255" -                  width="200" +    <layout_panel height="344" +                  width="235"                    left_delta="146"                     top="0"                    user_resize="false"> @@ -56,14 +56,14 @@         length="1"         follows="left|top|right|bottom"         font="SansSerif" -       height="205" +       height="290"         layout="topleft"         name="chat_history"         parse_highlights="true"         allow_html="true"  -       width="195"> +       width="230">        </chat_history> -      <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="190"> +      <line_editor follows="left|right" name="chat_editor" height="20" layout="topleft" width="225">        </line_editor>      </layout_panel>    </layout_stack> diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml index 920b2d4fbf..2c1e2b6dc0 100644 --- a/indra/newview/skins/default/xui/en/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml @@ -126,6 +126,8 @@       left_delta="110"       tab_stop="false"       width="18" /> +  <!-- Overlapping buttons for default actions +    llinspectavatar.cpp makes visible the most likely default action -->      <button       follows="bottom|left"       height="23" @@ -134,6 +136,16 @@       top="246"       name="add_friend_btn"       width="100" /> +    <button +     follows="bottom|left" +     height="23" +     label="IM" +     left_delta="0" +     top_delta="0" +     name="im_btn" +     width="100" +     commit_callback.function="InspectAvatar.IM" +     />      <menu_button       follows="top|left"       height="18" diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml index 6049476a43..8ee67b9a02 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml @@ -7,7 +7,6 @@           name="Gear Menu">
    <menu_item_call
     label="View Profile"
 -   layout="topleft"
     enabled="true" 
     name="view_profile">
      <menu_item_call.on_click
 @@ -15,49 +14,42 @@    </menu_item_call>
    <menu_item_call
     label="Add Friend"
 -   layout="topleft"
     name="add_friend">
      <menu_item_call.on_click
       function="InspectAvatar.AddFriend"/>
    </menu_item_call>
    <menu_item_call
     label="IM"
 -   layout="topleft"
     name="im">
      <menu_item_call.on_click
       function="InspectAvatar.IM"/>
    </menu_item_call>
    <menu_item_call
     label="Call"
 -   layout="topleft"
     enabled="true"
     name="call">
    </menu_item_call>
    <menu_item_call
     label="Teleport"
 -   layout="topleft"
     name="teleport">
      <menu_item_call.on_click
       function="InspectAvatar.Teleport"/>
    </menu_item_call>
    <menu_item_call
     label="Invite to Group"
 -   layout="topleft"
     name="invite_to_group">
      <menu_item_call.on_click
       function="InspectAvatar.InviteToGroup"/>
    </menu_item_call>
 -  <menu_item_separator layout="topleft" />
 +  <menu_item_separator />
    <menu_item_call
     label="Block"
 -   layout="topleft"
     name="block">
      <menu_item_call.on_click
       function="InspectAvatar.Block"/>
    </menu_item_call>
    <menu_item_call
     label="Report"
 -   layout="topleft"
     name="report">
      <menu_item_call.on_click
       function="InspectAvatar.Report"/>
 @@ -88,7 +80,6 @@    </menu_item_call>
    <menu_item_call
     label="Find On Map"
 -   layout="topleft"
     name="find_on_map">
      <menu_item_call.on_click
       function="InspectAvatar.FindOnMap"/>
 @@ -97,16 +88,14 @@    </menu_item_call>
    <menu_item_call
     label="Zoom In"
 -   layout="topleft"
     name="zoom_in">
      <menu_item_call.on_click
       function="InspectAvatar.ZoomIn"/>
    </menu_item_call>  
    <menu_item_call
     label="Pay"
 -   layout="topleft"
     name="pay">
      <menu_item_call.on_click
       function="InspectAvatar.Pay"/>
    </menu_item_call>
 -</menu>
\ No newline at end of file +</menu>
 diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index 19c2bf3496..ce5ee83f55 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -7,7 +7,6 @@           name="Gear Menu">    <menu_item_call     label="Stand Up" -   layout="topleft"     enabled="true"     name="stand_up">      <menu_item_call.on_click @@ -18,7 +17,6 @@    </menu_item_call>    <menu_item_call     label="My Appearance" -   layout="topleft"     name="my_appearance">      <menu_item_call.on_click       function="ShowFloater" @@ -28,7 +26,6 @@    </menu_item_call>    <menu_item_call     label="My Profile" -   layout="topleft"     enabled="true"      name="my_profile">      <menu_item_call.on_click @@ -37,7 +34,6 @@    </menu_item_call>    <menu_item_call     label="My Friends" -   layout="topleft"     name="my_friends">      <menu_item_call.on_click       function="Self.Friends" @@ -45,9 +41,8 @@    </menu_item_call>    <menu_item_call     label="My Groups" -   layout="topleft"     name="my_groups">      <menu_item_call.on_click       function="Self.Groups" />    </menu_item_call> -</menu>
\ No newline at end of file +</menu> diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index f50acc224f..87c4e2787f 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   name="panel_im_control_panel" - width="146" + width="180"   height="215"   border="false">      <avatar_list @@ -16,10 +16,11 @@       show_info_btn="false"       show_profile_btn="false"       top="10" -     width="140" /> +     width="180" />      <button       name="call_btn"       label="Call" +     left_delta="27"       width="125"       height="20" />      <button diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 2b1d1c3d9b..3149a1f7b3 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -60,7 +60,7 @@           min_width="96"           name="speak_panel"           user_resize="false"> -         <chiclet_talk +         <talk_button            follows="right"            height="23"            speak_button.tab_stop="true" @@ -93,7 +93,7 @@           min_width="76"           name="gesture_panel"           user_resize="false"> -         <button +         <gesture_combo_box             follows="right"            height="23"            label="Gesture" diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 9ed510dff3..3358015335 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   name="panel_im_control_panel" - width="146" + width="180"   height="238"   border="false">      <avatar_list @@ -16,11 +16,11 @@       show_info_btn="false"       show_profile_btn="false"       top="10" -     width="140" /> +     width="180" />      <button       name="group_info_btn"       label="Group Info" -     left_delta="3" +     left_delta="27"       width="125"       height="20" />      <button diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index a85c55f9b2..4f24c7a745 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -1,14 +1,14 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   follows="all" - height="412" +     height="380"   label="General"   class="panel_group_general"   layout="topleft"   left="0"   top="0"   name="general_tab" - width="313"> + width="303">      <panel.string       name="help_text">          The General tab contains general information about this group, a list of members, general Group Preferences and member options. @@ -41,7 +41,7 @@ Hover your mouse over the options for more help.       draw_heading="true"       follows="left|top"       heading_height="16" -     height="160" +     height="130"       layout="topleft"       left_delta="0"       name="visible_members" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index f3304bf4e5..c2f9cfe675 100644 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -5,7 +5,7 @@ background_visible="true"   height="570"   label="Group Info"   layout="topleft" - min_height="350" + min_height="425"   left="0"   top="20"   name="GroupInfo" @@ -46,7 +46,7 @@ background_visible="true"       text_color="white"       top="0"       value="(Loading...)" -     use_elipsis="true" +     use_ellipses="true"       width="300" />      <line_editor       follows="left|top" @@ -59,7 +59,7 @@ background_visible="true"       top_delta="5"       width="250"       height="20" -     visible="true" /> +     visible="false" />      <texture_picker       follows="left|top"       height="113" @@ -111,33 +111,46 @@ background_visible="true"       left_delta="0"       top_pad="6"       height="23" -     label="Join now!" -     label_selected="Join now!" +     label="JOIN NOW!"       name="btn_join"       visible="true"       width="120" />     <accordion               follows="all" -             height="405" +             height="425"               layout="topleft"               left="0" +             multiple_expansion="false"               name="groups_accordion" -             top_pad="20" -             width="333"> +             top_pad="15" +             width="336">               <accordion_tab                   can_resize="false" +                 expanded="true"                   layout="topleft"                   name="tab_general"                   title="General"> -        <panel -        border="false" -         filename="panel_group_general.xml" +         <scroll_container +         color="DkGray2" +         opaque="true" +         height="323" +         follows="all"           layout="topleft"           left="0" -         help_topic="group_general_tab" -         name="general_tab"           top="0" -         width="333" /> +         name="general_scroll" +         reserve_scroll_corner="false" +         width="333"> +            <panel +            border="false" +             filename="panel_group_general.xml" +             layout="topleft" +             left="0" +             help_topic="group_general_tab" +             name="general_tab" +             top="0" +             width="303" /> +         </scroll_container>           </accordion_tab>           <accordion_tab                   can_resize="false" @@ -145,15 +158,27 @@ background_visible="true"                   layout="topleft"                   name="tab_roles"                   title="Roles"> -        <panel -        border="false" -         filename="panel_group_roles.xml" -         layout="topleft" -         left="0" -         help_topic="group_roles_tab" -         name="roles_tab" -         top="0" -         width="333" /> +               <scroll_container +                  color="DkGray2" +                  opaque="true" +                  height="323" +                  follows="all" +                  layout="topleft" +                  left="0" +                  top="0" +                  name="roles_scroll" +                  reserve_scroll_corner="false" +                  width="333"> +                 <panel +                 border="false" +                  filename="panel_group_roles.xml" +                  layout="topleft" +                  left="0" +                  help_topic="group_roles_tab" +                  name="roles_tab" +                  top="0" +             width="303" /> +         </scroll_container>           </accordion_tab>           <accordion_tab                   can_resize="false" @@ -161,21 +186,45 @@ background_visible="true"                   layout="topleft"                   name="tab_notices"                   title="Notices"> +            <scroll_container +                  color="DkGray2" +                  opaque="true" +                  height="323" +                  follows="all" +                  layout="topleft" +                  left="0" +                  top="0" +                  name="notices_scroll" +                  reserve_scroll_corner="false" +                  width="333">          <panel +        border="false"           filename="panel_group_notices.xml"           layout="topleft"           left="0"           help_topic="group_notices_tab"           name="notices_tab"           top="0" -         width="333" /> +         width="303" /> +         </scroll_container>           </accordion_tab> -                  <accordion_tab +        <accordion_tab                   can_resize="false"                   expanded="false"                   layout="topleft"                   name="tab_notices"                   title="Land/Assets"> +           <scroll_container +                  color="DkGray2" +                  opaque="true" +                  height="323" +                  follows="all" +                  layout="topleft" +                  left="0" +                  top="0" +                  name="land_scroll" +                  reserve_scroll_corner="false" +                  width="333">          <panel          border="false"           filename="panel_group_land_money.xml" @@ -184,40 +233,42 @@ background_visible="true"           help_topic="group_land_money_tab"           name="land_money_tab"           top="0" -         width="333" /> +         width="313" /> +         </scroll_container>           </accordion_tab>           </accordion> -    <button +   <button       follows="top|left" -     height="20" +     height="22"       image_overlay="Refresh_Off"       layout="topleft" -     name="btn_refresh"       left="5" -     width="20" /> -     <button -     height="20" -     font="SansSerifSmall" -     label="Save" -     label_selected="Save" -     name="btn_apply" -     left_pad="5" -     width="65" /> -    <button +     name="btn_refresh" +     top_pad="-15" +     width="23" /> +         <button       height="20"       label="Create" -     label_selected="Create" +     label_selected="New group"       name="btn_create" -     left_pad="5" +     left_pad="10"       visible="false" -     width="65" /> -    <button -     left_pad="5" +     width="100" /> +   <!-- <button +     left_pad="10"       height="20"       label="Cancel"       label_selected="Cancel"       name="btn_cancel"       visible="false" +     width="65" />--> +     <button +     height="20" +     font="SansSerifSmall" +     label="Save" +     label_selected="Save" +     name="btn_apply" +     left_pad="10" +     right="-10"       width="65" /> -  </panel>
\ No newline at end of file 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 c81c7113ae..99fc39c466 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 @@ -1,25 +1,25 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel - border="true" + border="false"   follows="all"   height="510"   label="Land & L$"   layout="topleft"   left="1"   name="land_money_tab" - top="490" - width="280"> + top="0" + width="313">      <panel.string       name="help_text"> -        Parcels owned by the group are listed along with contribution details. A warning appears until the Total Land in Use is less than or equal to the Total Contribution. The Planning, Details, and Sales tabs provide information about the group's finances. +        Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution.      </panel.string>      <panel.string       name="cant_view_group_land_text"> -        You do not have permission to view group owned land. +        You don't have permission to view group owned land      </panel.string>      <panel.string       name="cant_view_group_accounting_text"> -        You do not have permission to view the group's accounting information. +        You don't have permission to view the group's accounting information.      </panel.string>      <panel.string       name="loading_txt"> @@ -27,7 +27,7 @@      </panel.string>      <panel.string       name="land_contrib_error"> -        Unable to set your land contribution. +        Unable to set your land contribution      </panel.string>     <!-- <text       type="string" @@ -44,29 +44,29 @@      <scroll_list       draw_heading="true"       follows="top" -     heading_height="14" -     height="100" +     heading_height="20" +     height="150"       layout="topleft" -     left="5" +     left="0"       name="group_parcel_list" -     top_pad="10" -     width="265"> +     top_pad="0" +     width="313">          <scroll_list.columns           label="Parcel"           name="name" -         width="67" /> +         width="78" />          <scroll_list.columns           label="Region"           name="location" -         width="72" /> +         width="78" />          <scroll_list.columns           label="Type"           name="type" -         width="60" /> +         width="70" />          <scroll_list.columns           label="Area"           name="area" -         width="20" /> +         width="50" />          <scroll_list.columns           label=""           name="hidden" @@ -74,14 +74,14 @@      </scroll_list>      <button       follows="top" -     height="20" +     height="23"       label="Map"       label_selected="Map"       layout="topleft" -     left="150"       name="map_button" -     top_pad="10" -     width="125" +     right="-10" +     top_pad="5" +     width="95"       enabled="false" />      <text       type="string" @@ -91,11 +91,12 @@       layout="topleft"       left="5"       name="total_contributed_land_label" -     top_pad="10" +     top_pad="0"       width="130">          Total Contribution:      </text>      <text +    text_color="EmphasisColor"       type="string"       follows="left|top"       height="16" @@ -119,6 +120,7 @@          Total Land In Use:      </text>      <text +    text_color="EmphasisColor"       type="string"       follows="left|top"       height="16" @@ -142,6 +144,7 @@          Land Available:      </text>      <text +    text_color="EmphasisColor"       type="string"       follows="left|top"       height="16" @@ -168,19 +171,19 @@       border_style="line"       border_thickness="1"       follows="left|top" -     height="16" +     height="19"       layout="topleft"       left_pad="5"       max_length="10"       name="your_contribution_line_editor" -     top_delta="-2" +     top_delta="0"       width="95" />      <text       type="string"       follows="left|top"       height="16"       layout="topleft" -     left_pad="5" +     left_pad="3"       name="your_contribution_units"       top_delta="2">          m² @@ -193,13 +196,13 @@       layout="topleft"       left="140"       name="your_contribution_max_value" -     top_pad="0" +     top_pad="2"       width="95">          ([AMOUNT] max)      </text>      <icon       height="16" -     image_name="smicon_warn.tga" +     image_name="notify_next"       layout="topleft"       left="9"       name="group_over_limit_icon" @@ -211,14 +214,14 @@       type="string"       word_wrap="true"       font="SansSerifSmall" -     height="40" +     height="35"       layout="topleft" -     left_pad="5" +     left_pad="0"       name="group_over_limit_text" -     text_color="GroupOverTierColor" +     text_color="EmphasisColor"       top_delta="0" -     width="250"> -        Group members must contribute more land credits to support land in use. +     width="290"> +        Group members must contribute more land credits to support land in use      </text>      <text       type="string" @@ -242,128 +245,126 @@       name="group_money_tab_container"       tab_position="top"       tab_height="20" -     top_pad="10" -     width="265"> +     top_pad="2" +     tab_min_width="70" +     width="300">          <panel -         border="true" +         border="false"           follows="all"           height="180" -         label="Planning" +         label="PLANNING"           layout="topleft" -         left="1" +         left="0"           help_topic="group_money_planning_tab"           name="group_money_planning_tab"           top="5" -         width="265"> +         width="300">              <text_editor               type="string" -             bg_readonly_color="0.784314 0.819608 0.8 1"               follows="all" -             font="Monospace" -             height="168" +             font="SansSerif" +             height="140"               layout="topleft" -             left="8" +             left="0"               max_length="4096"               name="group_money_planning_text" -             top="5" -             width="250" +             top="0" +             width="300"               word_wrap="true"> -                Computing... +                Loading...              </text_editor>          </panel>        <panel -         border="true" -         follows="left|top|right|bottom" +         border="false" +         follows="all"           height="180" -         label="Details" +         label="DETAILS"           layout="topleft" -         left_delta="0" +         left="0"           help_topic="group_money_details_tab"           name="group_money_details_tab" -         top_delta="0" -         width="265"> +         top="5" +         width="300">            <text_editor               type="string" -             bg_readonly_color="0.784314 0.819608 0.8 1"               follows="all" -             font="Monospace"               height="140"               layout="topleft" -             left="8" +             left="0"               max_length="4096"               name="group_money_details_text" -             top="7" -             width="250" +             top="0" +             width="300"               word_wrap="true"> -                Computing... +                Loading...              </text_editor> -          <button -             height="20" -             label="< Earlier" -             label_selected="< Earlier" -             layout="topleft" -             left="5" -             name="earlier_details_button" -             tool_tip="Go back in time" -             top_pad="10" -             width="125" />              <button -             height="20" -             label="Later >" -             label_selected="Later >" -             layout="topleft" -             left_pad="5" +	     follows="left|top" +	     height="23" +	     image_overlay="Arrow_Left_Off" +	     layout="topleft" +	     name="earlier_details_button" +	     picture_style="true" +	     tool_tip="Back" +	     top_pad="3" +             right="-35" +	     width="31" /> +             <button +	     follows="left|top" +	     height="23" +	     image_overlay="Arrow_Right_Off" +	     layout="topleft" +	     left_pad="10"               name="later_details_button" -             tool_tip="Go forward in time" -             top_delta="0" -             width="125" /> +	     picture_style="true" +	     tool_tip="Next" +	     width="31" />          </panel>        <panel -         border="true" -         follows="left|top|right|bottom" +         border="false" +         follows="all"           height="180" -         label="Sales" +         label="SALES"           layout="topleft"           left_delta="0"           help_topic="group_money_sales_tab"           name="group_money_sales_tab"           top_delta="-1" -         width="265"> +         width="300">              <text_editor               type="string" -             bg_readonly_color="0.784314 0.819608 0.8 1"               follows="all" -             font="Monospace"               height="140"               layout="topleft" -             left="8" +             left="0"               max_length="4096"               name="group_money_sales_text" -             top="7" -             width="250" +             top="0" +             width="300"               word_wrap="true"> -                Computing... +                Loading...              </text_editor> -            <button -             height="20" -             label="< Earlier" -             label_selected="< Earlier" -             layout="topleft" -             left="5" -             name="earlier_sales_button" -             tool_tip="Go back in time" -             top_pad="10" -             width="125" /> -            <button -             height="20" -             label="Later >" -             label_selected="Later >" -             layout="topleft" -             left_pad="5" +                         <button +	     follows="left|top" +	     height="23" +	     image_overlay="Arrow_Left_Off" +	     layout="topleft" +	     name="earlier_sales_button" +	     picture_style="true" +	     tool_tip="Back" +	     top_pad="3" +             right="-35" +	     width="31" /> +             <button +	     follows="left|top" +	     height="23" +	     image_overlay="Arrow_Right_Off" +	     layout="topleft" +	     left_pad="10"               name="later_sales_button" -             tool_tip="Go forward in time" -             top_delta="0" -             width="125" /> +	     picture_style="true" +	     tool_tip="Next" +	     width="31" />          </panel>      </tab_container>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 0e4d490369..bfb49a60c2 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -1,14 +1,13 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel - border="true"   follows="all"   height="485"   label="Notices"   layout="topleft" - left="1" + left="0"   name="notices_tab" - top="485" - width="280"> + top="0" + width="313">      <panel.string       name="help_text">          Notices are a quick way to communicate across a  @@ -20,60 +19,48 @@ the General tab.      </panel.string>      <panel.string       name="no_notices_text"> -        There are no past notices. +        There are no past notices      </panel.string> -     <!--<text -      follows="left|top" -     type="string" -     font="SansSerifBig" -     height="16" -     layout="topleft" -     left="10" -     name="lbl" -     top_pad="10" -     width="269"> -        Group Notices Archive -    </text> -->      <text        follows="left|top"       type="string"       word_wrap="true" -     height="40" +     height="30"       layout="topleft" -     left_delta="10" +     left="10"       name="lbl2" -     text_color="EmphasisColor" -     top_pad="10" -     width="270"> -        Notices are kept for 14 days. Notice lists are limited to 200 notices per group on a daily basis. +     top="5" +     width="300"> +     Notices are kept for 14 days +Groups are limited to 200 notices/group daily      </text>      <scroll_list        follows="left|top"       column_padding="0"       draw_heading="true" -     heading_height="14" -     height="109" +     heading_height="16" +     height="125"       layout="topleft" -     left_delta="0" +     left="0"       name="notice_list"       top_pad="0" -     width="265"> +     width="303">          <scroll_list.columns           label=""           name="icon" -         width="16" /> +         width="20" />          <scroll_list.columns           label="Subject"           name="subject" -         width="100" /> +         width="125" />          <scroll_list.columns           label="From"           name="from" -         width="83" /> +         width="90" />          <scroll_list.columns           label="Date"           name="date" -         width="50" /> +         width="30" />          <scroll_list.columns           name="sort"           width="-1" /> @@ -84,39 +71,42 @@ the General tab.       layout="topleft"       name="notice_list_none_found"       visible="false"> -        None found. +        None found      </text> -    <button -      follows="left|top" -     height="20" -     font="SansSerifSmall" -     label="New Notice" -     label_selected="Create New Notice" -     layout="topleft" -     left_delta="0" -     name="create_new_notice" -     top_delta="4" -     width="125" /> -    <button -      follows="left|top" -     height="20" -     font="SansSerifSmall" -     label="Refresh" -     label_selected="Refresh List" +         <button +       follows="bottom|left" +       height="18" +       image_selected="AddItem_Press" +       image_unselected="AddItem_Off" +       image_disabled="AddItem_Disabled" +       layout="topleft" +       label="Create a new notice" +       left="15" +       name="create_new_notice" +       picture_style="true" +       tool_tip="Create a new notice" +     top_delta="-5" +       width="18" /> +     <button +     follows="top|left" +     height="22" +     image_overlay="Refresh_Off"       layout="topleft" -     left_pad="12"       name="refresh_notices" -     top_delta="0" -     width="125" /> +     picture_style="true" +     right="-5" +     top_delta="5" +     width="23" />      <panel       follows="left|top" -     height="268" +     height="300"       label="Create New Notice"       layout="topleft"       left="0" -     name="panel_create_new_notice"       top_pad="10" -     width="265"> +     visible="false" +     name="panel_create_new_notice" +     width="303">          <text           follows="left|top"           type="string" @@ -127,30 +117,16 @@ the General tab.           mouse_opaque="false"           name="lbl"           text_color="EmphasisColor" -         top_pad="0" -         width="265"> +         top="0" +         width="200">              Create a Notice          </text>          <text           follows="left|top"           type="string" -         word_wrap="true" -         height="90" -         layout="topleft" -         left_delta="0" -         name="lbl2" -         text_color="EmphasisColor" -         top_pad="4" -         width="195"> -            You can add a single item to a notice by dragging it from your inventory to this panel. Attached items must be copiable and transferrable, and you can't send a folder. -        </text> -        <text -         follows="left|top" -         type="string"           halign="left"           height="16"           layout="topleft" -         left_delta="0"           name="lbl3"           top_pad="10"           width="60"> @@ -164,8 +140,7 @@ the General tab.           left_pad="3"           max_length="63"           name="create_subject" -         top_delta="-1" -         width="200" /> +         width="220" />          <text           follows="left|top"           type="string" @@ -174,106 +149,100 @@ the General tab.           layout="topleft"           left="10"           name="lbl4" -         top_pad="10" +         top_pad="5"           width="60">              Message:          </text>          <text_editor -         height="75" +         height="90"           layout="topleft"           left_pad="3"           max_length="511"           name="create_message"           top_delta="0" -         width="200" +         width="220"           word_wrap="true" />          <text           follows="left|top"           type="string"           halign="left" -         height="16" +         height="14"           layout="topleft"           left="10"           name="lbl5" -         top_pad="10" -         width="60"> +         width="200">              Attach:          </text>          <line_editor           enabled="false" -         height="16" +         height="19"           layout="topleft" -         left_pad="3" -         max_length="63" +         max_length="90"           mouse_opaque="false"           name="create_inventory_name" -         top_delta="0" -         width="200" /> +         top_pad="2" +         width="285" /> +        <text +        text_color="EmphasisColor" +         follows="left|top" +         type="string" +         halign="right" +         height="34" +         layout="topleft" +         left="10" +         name="string" +         top_pad="15" +         word_wrap="true" +         width="150"> +            Drag here to attach something -- > +        </text>          <icon -         height="16" +         height="72" +         image_name="DropTarget"           layout="topleft" -         left_delta="0" -         name="create_inv_icon" -         top_delta="0" -         width="16" /> +         left_pad="10" +         mouse_opaque="true" +         name="drop_icon" +         top_delta="-10" +         width="72" />          <button           follows="left|top" -         height="20" -         font="SansSerifSmall" -         label="Remove Attachment" -         label_selected="Remove Attachment" +         height="23" +         label="Remove"           layout="topleft" -         left="10" +         left="70"           name="remove_attachment" -         top_pad="10" -         width="135" /> +         top_delta="45" +         width="90" />          <button           follows="left|top" -         height="20" -         font="SansSerifSmall" +         height="23"           label="Send"           label_selected="Send Notice"           layout="topleft" -         left_delta="138" +         right="-10" +         top_pad="20"           name="send_notice" -         top_delta="0" -         width="125" /> -        <panel -         bevel_style="in" -         border="true" -         height="71" -         layout="topleft" -         left="200" -         name="drop_target2" -         top="20" -         width="71" /> -        <icon -         height="59" -         image_name="icon_groupnoticeinventory.tga" -         layout="topleft" -         left_delta="6" -         mouse_opaque="true" -         name="drop_icon" -         top="26" -         width="59" /> -        <group_drop_target +         width="100" /> +      <group_drop_target           height="466" -         layout="topleft" +         top="0"           left="0" +         layout="topleft"           name="drop_target"           tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice." -         top="-198" -         width="280" /> +         width="295" />     </panel>       <panel       follows="left|top" -     height="268" +     height="300"       label="View Past Notice"       layout="topleft"       left="0" +     visible="true"       name="panel_view_past_notice" -     top="197" -     width="265"> +     top="180" +     width="303">          <text           type="string"           font="SansSerifBig" @@ -294,9 +263,9 @@ the General tab.           layout="topleft"           left_delta="0"           name="lbl2" -         top_pad="4" +         top_pad="2"           width="265"> -            To send a new notice, click the 'New Notice' button above. +            To send a new notice, click the + button          </text>          <text           type="string" @@ -305,7 +274,7 @@ the General tab.           layout="topleft"           left_delta="0"           name="lbl3" -         top_pad="24" +         top_pad="15"           visible="false"           width="60">              Subject: @@ -336,13 +305,13 @@ the General tab.          </text>          <text_editor           enabled="false" -         height="150" +         height="205"           layout="topleft"           left="10"           max_length="511"           name="view_message"           top_delta="-35" -         width="260" +         width="285"           word_wrap="true" />          <line_editor           enabled="false" @@ -353,7 +322,7 @@ the General tab.           mouse_opaque="false"           name="view_inventory_name"           top_pad="10" -         width="260" /> +         width="285" />          <icon           height="16"           layout="topleft" @@ -363,14 +332,12 @@ the General tab.           width="16" />          <button           follows="left|top" -         height="20" -         font="SansSerifSmall" -         label="Open Attachment" -         label_selected="Open Attachment" +         height="23" +         label="Open attachment"           layout="topleft" -         left_delta="0" +         right="-10"           name="open_attachment" -         top_pad="10" +         top_pad="5"           width="135" />          </panel>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index e87859f788..5ed464bcec 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -1,7 +1,7 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel   border="false" - height="412" + height="552"   label="Members & Roles"   layout="topleft"   left="0" @@ -18,158 +18,28 @@      </panel.string>      <panel.string       name="help_text" /> -    <!--<panel -     follows="left|top" -     height="80" -     layout="topleft" -     left="10" -     name="members_header" -     top_pad="10" -     width="270"> -        <text -         type="string" -         font="SansSerifBig" -         height="16" -         layout="topleft" -         left="0" -         name="static" -         top="0" -         width="270"> -            Members & Roles -        </text> -        <text -         type="string" -         word_wrap="true" -         height="40" -         layout="topleft" -         left_delta="0" -         name="static2" -         top_pad="4" -         width="270"> -            Group Members are assigned Roles with Abilities. These settings can easily be customized, allowing for greater organization and flexibility. -        </text> -    </panel> -    <panel -     follows="left|top" -     height="24" -     layout="topleft" -     left_delta="0" -     name="roles_header" -     top_delta="0" -     visible="false" -     width="270"> -        <text -         type="string" -         font="SansSerifBig" -         height="16" -         layout="topleft" -         left="0" -         name="static" -         top="0" -         width="270"> -            Roles -        </text> -        <text -         type="string" -         word_wrap="true" -         height="40" -         layout="topleft" -         left_delta="0" -         name="role_properties_modifiable" -         top_pad="4" -         visible="false" -         width="270"> -            Select a Role below.  You can modify its Name, Description and Member Title. -        </text> -        <text -         type="string" -         word_wrap="true" -         height="40" -         layout="topleft" -         left_delta="0" -         name="role_properties_not_modifiable" -         top_delta="0" -         width="270"> -            Select a Role below to see its properties, Members and allowed Abilities. -        </text> -        <text -         type="string" -         word_wrap="true" -         height="16" -         layout="topleft" -         left_delta="0" -         name="role_actions_modifiable" -         top_delta="24" -         visible="false" -         width="270"> -            You can also assign Abilities to the Role. -        </text> -        <text -         type="string" -         word_wrap="true" -         height="16" -         layout="topleft" -         left_delta="0" -         name="role_actions_not_modifiable" -         top_delta="0" -         width="270"> -            You may view, but not modify, assigned Abilities. -        </text> -    </panel> -    <panel -     follows="left|top" -     height="24" -     layout="topleft" -     left_delta="0" -     name="actions_header" -     top_delta="0" -     visible="false" -     width="270"> -        <text -         type="string" -         font="SansSerifBig" -         height="16" -         layout="topleft" -         left="0" -         name="static" -         top="0" -         width="270"> -            Abilities -        </text> -        <text -         type="string" -         word_wrap="true" -         height="40" -         layout="topleft" -         left_delta="0" -         name="static2" -         top_pad="4" -         width="270"> -            You can view an Ability's Description and which Roles and Members can execute the Ability. -        </text> -    </panel> -->      <tab_container -    border="true" +    border="false"       follows="left|top" -     height="260" +     height="245"       halign="center"       layout="topleft"       left="5"       name="roles_tab_container"       tab_position="top"       tab_height="20" -     top="0" +     tab_min_width="96" +     top="3"       width="303">          <panel           border="false" -         height="260" -         label="Members" +         height="220" +         label="MEMBERS"           layout="topleft" -         left="1" +         left="0"           help_topic="roles_members_tab"           name="members_sub_tab"           tool_tip="Members" -         top="17"           class="panel_group_members_subtab"           width="300">              <panel.string @@ -187,8 +57,7 @@ clicking on their names.           follows="left|top|right"           max_length="250"           label="Filter Members" -         name="filter_input" -         font="SansSerif" /> +         name="filter_input" />            <!--  <button               enabled="false"               font="SansSerifSmall" @@ -229,6 +98,7 @@ clicking on their names.               font="SansSerifSmall"               label="Invite"               layout="topleft" +             left="5"               name="member_invite"               top_pad="3"               width="100" /> @@ -238,8 +108,10 @@ clicking on their names.               label="Eject"               layout="topleft"               left_pad="5" +             right="-5"               name="member_eject"               width="100" /> +             <!--What is this?-->              <icon               height="16"               image_name="Inv_FolderClosed" @@ -250,15 +122,14 @@ clicking on their names.          </panel>          <panel           border="false" -         height="164" -         label="Roles" +         height="220" +         label="ROLES"           layout="topleft" -         left_delta="0" +         left="0"           help_topic="roles_roles_tab"           name="roles_sub_tab"           class="panel_group_roles_subtab" -         top="17" -         width="265"> +         width="300">              <panel.string               name="help_text">                  Roles have a title and an allowed list of Abilities @@ -282,40 +153,19 @@ including the Everyone and Owner Roles.               name="power_partial_icon">                  checkbox_enabled_false.tga              </panel.string> -            <filter_editor -            layout="topleft" -            top="10" -            left="4" -            width="260" -            height="20" -            follows="left|top|right" -            max_length="250" -            label="Filter Roles" -            name="filter_input" -            font="SansSerif" /> -            <!--<line_editor -             border_style="line" -             border_thickness="1" -             follows="left|top" -             height="16" -             layout="topleft" -             left="4" -             max_length="63" -             name="search_text" -             top="10" -             width="90" /> -            <button -             font="SansSerifSmall" -             height="20" -             label="Search" -             layout="topleft" -             left_pad="5" -             name="search_button" -             top_delta="-2" -             width="80" /> +         <filter_editor +         layout="topleft" +         top="10" +         left="4" +         width="280" +         height="20" +         follows="left|top|right" +         max_length="250" +         label="Filter Roles" +         name="filter_input" /> +            <!--              <button               enabled="false" -             font="SansSerifSmall"               height="20"               label="Show All"               layout="topleft" @@ -326,11 +176,13 @@ including the Everyone and Owner Roles.              <scroll_list               column_padding="0"               draw_heading="true" +             draw_stripes="false"               follows="left|top"               heading_height="20"               height="150"               layout="topleft" -             left="4" +             search_column="1" +             left="0"               name="role_list"               top_pad="4"               width="300"> @@ -352,7 +204,7 @@ including the Everyone and Owner Roles.               font="SansSerifSmall"               label="Add Role"               layout="topleft" -             left_delta="0" +             left="5"               name="role_create"               top_pad="6"               width="125" /> @@ -362,20 +214,20 @@ including the Everyone and Owner Roles.               label="Delete Role"               layout="topleft"               left_pad="5" +             right="-5"               name="role_delete"               top_delta="0"               width="125" />          </panel>          <panel           border="false" -         height="164" -         label="Abilities" +         height="220" +         label="ABILITIES"           layout="topleft" -         left_delta="0" +         left="0"           help_topic="roles_actions_tab"           name="actions_sub_tab"           class="panel_group_actions_subtab" -         top="17"           tool_tip="You can view an Ability's Description and which Roles and Members can execute the Ability."           width="300">              <panel.string @@ -383,37 +235,17 @@ including the Everyone and Owner Roles.                  Abilities allow Members in Roles to do specific  things in this group. There's a broad variety of Abilities.              </panel.string> -            <filter_editor -            layout="topleft" -            top="10" -            left="4" -            width="255" -            height="20" -            follows="left|top|right" -            max_length="250" -            label="Filter Abilities" -            name="filter_input" -            font="SansSerif" /> -            <!--<line_editor -             border_style="line" -             border_thickness="1" -             follows="left|top" -             height="16" -             layout="topleft" -             left="4" -             max_length="63" -             name="search_text" -             top="10" -             width="90" /> -            <button -             font="SansSerifSmall" -             height="20" -             label="Search" -             layout="topleft" -             left_pad="5" -             name="search_button" -             top_delta="-2" -             width="80" /> +         <filter_editor +         layout="topleft" +         top="10" +         left="4" +         width="280" +         height="20" +         follows="left|top|right" +         max_length="250" +         label="Filter Abilities" +         name="filter_input" /> +            <!--              <button               enabled="false"               font="SansSerifSmall" @@ -428,19 +260,19 @@ things in this group. There's a broad variety of Abilities.               column_padding="0"               draw_stripes="false"               follows="left|top" -             height="100" +             height="160"               layout="topleft" -             left="6" +             left="0"               multi_select="true"               name="action_list"               search_column="1"               tool_tip="Select an Ability to view more details"               top_pad="6" -             width="255"> +             width="300">                  <scroll_list.columns                   label=""                   name="icon" -                 width="18" /> +                 width="16" />                  <scroll_list.columns                   label=""                   name="action" @@ -448,7 +280,7 @@ things in this group. There's a broad variety of Abilities.              </scroll_list>              <icon               height="16" -             image_name="inv_folder_plain_closed.tga" +             image_name="Inv_FolderClosed"               layout="topleft"               name="power_folder_icon"               visible="false" @@ -456,105 +288,93 @@ things in this group. There's a broad variety of Abilities.          </panel>      </tab_container>      <panel -     height="150" +     height="252"       layout="topleft"       follows="left|top"       left="10"       name="members_footer" -     top_pad="2" +     top_pad="10" +     top_delta="0"       width="300">          <text           type="string" -         font="SansSerif"           height="16"           layout="topleft"           follows="left|top"           left="0"           name="static" -         top_pad="0" -         width="100"> +         top_pad="5" +         width="295">              Assigned Roles          </text> -        <text -         type="string" -         font="SansSerif" -         height="16" -         layout="topleft" -         follows="left|top" -         left_pad="35" -         name="static2" -         top_delta="0" -         width="100"> -            Allowed Abilities -        </text>          <scroll_list           draw_stripes="false"           follows="left|top" -         height="150" +         height="80"           layout="topleft"           left="0"           name="member_assigned_roles" -         top_pad="5" -         width="130"> +         top_pad="0" +         width="295">              <scroll_list.columns               label=""               name="checkbox" -             width="18" /> +             width="30" />              <scroll_list.columns               label=""               name="role" -             width="107" /> +             width="265" />          </scroll_list> -        <scroll_list -         draw_stripes="false" -         height="150" +                 <text +         type="string" +         height="16"           layout="topleft"           follows="left|top" -         left_pad="5" +         left="0" +         name="static2" +         top_pad="5" +         width="295"> +            Allowed Abilities +        </text> +         <scroll_list +         draw_stripes="false" +         height="80" +         layout="topleft" +         left="0"           name="member_allowed_actions" +         search_column="2"           tool_tip="For details of each allowed ability see the abilities tab" -         top_delta="0" -         width="130"> +         top_pad="0" +         width="295">              <scroll_list.columns               label=""               name="icon" -             width="14" /> +             width="20" />              <scroll_list.columns               label=""               name="action" -             width="126" /> +             width="275" />          </scroll_list>      </panel>      <panel -     height="252" +     height="297"       layout="topleft" -     left_delta="0" +     left="10"       name="roles_footer"       top_delta="0" +     top="245"       visible="false" -     width="270"> +     width="300">          <text           type="string" -         font="SansSerif"           height="16"           layout="topleft"           left="0"           name="static"           top="0" -         width="100"> +         width="140">              Name          </text> -        <text -         type="string" -         font="SansSerif" -         height="16" -         layout="topleft" -         left_pad="35" -         name="static2" -         top_delta="0" -         width="100"> -            Description -        </text>          <line_editor           type="string"           border_style="line" @@ -563,21 +383,19 @@ things in this group. There's a broad variety of Abilities.           height="20"           layout="topleft"           left="0" -         max_length="20" +         max_length="295"           name="role_name"           top_pad="0" -         width="130"> +         width="295">              Employees          </line_editor>          <text           type="string" -         font="SansSerif"           height="16"           layout="topleft" -         left_delta="0"           name="static3" -         top_pad="10" -         width="100"> +         top_pad="5" +         width="295">              Title          </text>          <line_editor @@ -587,158 +405,159 @@ things in this group. There's a broad variety of Abilities.           follows="left|top"           height="20"           layout="topleft" -         left_delta="0" -         max_length="20" +         max_length="295"           name="role_title"           top_pad="0" -         width="130"> -            (waiting) +         width="295"> +          (waiting)          </line_editor> +                <text +         type="string" +         height="16" +         layout="topleft" +         left="0" +         name="static2" +         top_pad="5" +         width="100"> +            Description +        </text>          <text_editor           type="string"           halign="left" -         height="48" +         height="35"           layout="topleft" -         left="135" -         max_length="254" +         left="0" +         max_length="295"           name="role_description" -         top="16" -         width="130" +         top_pad="0" +         width="295"           word_wrap="true"> -            (waiting) +          (waiting)          </text_editor>          <text           type="string" -         font="SansSerif"           height="16"           layout="topleft" +         follows="left|top"           left="0" -         name="static4" -         top="85" -         width="120"> -            Assigned Members -        </text> -        <text -         type="string" -         font="SansSerif" -         height="16" -         layout="topleft" -         left_pad="15" -         name="static5" -         tool_tip="A list of abilities the currently selected role can perform" -         top_delta="0" -         width="100"> -            Allowed Abilities +         name="static" +         top_pad="5" +         width="295"> +            Assigned Roles          </text>          <name_list           draw_stripes="false" -         height="150" +         height="50"           layout="topleft"           left="0"           name="role_assigned_members"           top_pad="0" -         width="130" /> +         width="295" />          <check_box -         height="16" -         label="Members are visible" +         height="15" +         label="Reveal members"           layout="topleft" -         left_delta="0"           name="role_visible_in_list"           tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group." -         top_pad="10" -         width="130" /> +         top_pad="3" +         width="290" /> +         <text +         type="string" +         height="16" +         layout="topleft" +         follows="left|top" +         left="0" +         name="static2" +         top_pad="5" +         width="295"> +            Allowed Abilities +        </text>          <scroll_list           draw_stripes="false" -         height="150" +         height="50"           layout="topleft" -         left="135" +         left="0"           name="role_allowed_actions"           search_column="2"           tool_tip="For details of each allowed ability see the abilities tab" -         top="101" -         width="130"> +         top_pad="0" +         width="295">              <scroll_list.columns               label=""               name="icon" -             width="2" /> +             width="20" />              <scroll_list.columns               label=""               name="checkbox" -             width="16" /> +             width="20" />              <scroll_list.columns               label=""               name="action" -             width="220" /> +             width="250" />          </scroll_list>      </panel>     <panel -     height="215" +     height="303"       layout="topleft" -     left_delta="0" +     left="10"       name="actions_footer"       top_delta="0" +     top="245"       visible="false" -     width="265"> +     width="300">          <text           type="string" -         font="SansSerif"           height="16"           layout="topleft" -         left="0"           name="static" -         top="0"           width="200"> -            Description +            Ability description          </text>          <text_editor           type="string"           enabled="false"           halign="left" -         height="48" +         height="80"           layout="topleft"           left_delta="0"           max_length="512"           name="action_description"           top_pad="0" -         width="265" +         width="295"           word_wrap="true">              This Ability is 'Eject Members from this Group'. Only an Owner can eject another Owner.          </text_editor>          <text           type="string" -         font="SansSerif"           height="16"           layout="topleft"           left_delta="0"           name="static2" -         top_pad="10" -         width="125"> -            Roles with Ability +         top_pad="5" +         width="295"> +            Roles with this ability          </text> -        <text +        <scroll_list +         height="60" +         layout="topleft" +         left="0" +         name="action_roles" +         top_pad="0" +         width="295" /> +                 <text           type="string" -         font="SansSerif"           height="16"           layout="topleft" -         left_pad="10"           name="static3" -         top_delta="0" -         width="125"> -            Members with Ability +         top_pad="5" +         width="295"> +            Members with this ability          </text> -        <scroll_list -         height="150" -         layout="topleft" -         left="0" -         name="action_roles" -         top="90" -         width="130" />          <name_list -         height="150" +         height="100"           layout="topleft" -         left_pad="5"           name="action_members" -         top_delta="0" -         width="130" /> +         top_pad="0" +         width="295" />      </panel>  </panel> 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 c4cdaa41f9..0dd3878426 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 @@ -1,30 +1,35 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel name="panel_im_control_panel" -       width="125" -       height="248" +       width="128" +       height="327"         border="false">    <avatar_icon name="avatar_icon" -               width="96" -               height="96" /> +               follows="left|top" +               left_delta="3" +               width="125" +               height="125" />    <button name="view_profile_btn" +          follows="left|bottom"            label="View Profile" -          left_delta="3"            width="125"  		  height="20" />    <button name="add_friend_btn" +          follows="left|bottom"            label="Add Friend"            width="125"            height="20" />    <button name="call_btn" +          follows="left|bottom"            label="Call"            width="125"            height="20" />      <button +     follows="left|bottom"       height="20"       label="End Call"       name="end_call_btn" @@ -33,15 +38,27 @@    <button  	 enabled="false" +     follows="left|bottom"       name="voice_ctrls_btn"       label="Open Voice Controls"       width="125"       height="20"       visible="false"/> +  <button name="teleport_btn" +          follows="left|bottom" +          label="Teleport" +          width="125" +          height="20" />    <button name="share_btn" +          follows="left|bottom"            label="Share"            width="125"            height="20" /> +  <button name="pay_btn" +          follows="left|bottom" +          label="Pay" +          width="125" +          height="20" />  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml new file mode 100644 index 0000000000..03ba7f7c81 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -0,0 +1,257 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="570" + layout="topleft" + left="0" + min_height="350" + name="landmark_info" + top="20" + width="330"> +    <string +     name="title_create_landmark" +     value="Create Landmark" /> +    <string +     name="title_edit_landmark" +     value="Edit Landmark" /> +    <string +     name="title_landmark" +     value="Landmark" /> +    <string +     name="not_available" +     value="(N\A)" /> +    <string +     name="unknown" +     value="(unknown)" /> +    <string +     name="public" +     value="(public)" /> +    <string +     name="server_update_text"> +        Place information not available without server update. +    </string> +    <string +     name="server_error_text"> +        Information about this location is unavailable at this time, please try again later. +    </string> +    <string +     name="server_forbidden_text"> +        Information about this location is unavailable due to access restrictions.  Please check your permissions with the parcel owner. +    </string> +    <string +     name="acquired_date"> +        [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] +    </string> +    <button +     follows="top|right" +     height="23" +     image_overlay="BackArrow_Off" +     layout="topleft" +     left="10" +     name="back_btn" +     picture_style="true" +     tab_stop="false" +     top="0" +     width="23" /> +    <text +     follows="top|left|right" +     font="SansSerifHugeBold" +     height="26" +     layout="topleft" +     left_pad="10" +     name="title" +     text_color="white" +     top="0" +     use_ellipses="true" +     value="Place Profile" +     width="275" /> +    <scroll_container +     color="DkGray2" +     follows="all" +     height="533" +     layout="topleft" +     left="10" +     name="place_scroll" +     opaque="true" +     top_pad="5" +     width="313"> +        <panel +         bg_alpha_color="DkGray2" +         follows="all" +         height="533" +         layout="topleft" +         left="0" +         min_height="300" +         name="scrolling_panel" +         top="0" +         width="313"> +            <texture_picker +             enabled="false" +             follows="top|left" +             height="190" +             layout="topleft" +             left="10" +             name="logo" +             top="10" +             width="290" /> +            <text +             follows="left|top|right" +             font="SansSerifLarge" +             height="14" +             layout="topleft" +             left="10" +             name="region_title" +             text_color="white" +             top_pad="5" +             use_ellipses="true" +             value="SampleRegion" +             width="290" /> +            <text +             follows="left|top|right" +             height="14" +             layout="topleft" +             left="10" +             name="parcel_title" +             top_pad="4" +             use_ellipses="true" +             value="SampleParcel, Name Long (145, 228, 26)" +             width="285" /> +            <expandable_text +             follows="left|top|right" +             height="50" +             layout="topleft" +             left="5" +             name="description" +             top_pad="10" +             value="Du waltz die spritz" +             width="300" /> +            <panel +             follows="left|top|right" +             height="55" +             layout="topleft" +             left="10" +             name="landmark_info_panel" +             top_pad="10" +             width="290"> +                <text +                 follows="left|top" +                 height="15" +                 layout="topleft" +                 left="0" +                 name="owner_label" +                 top_pad="10" +                 value="Owner:" +                 width="90" /> +                <text +                 follows="left|top|right" +                 height="15" +                 layout="topleft" +                 left="70" +                 name="owner" +                 top_delta="0" +                 width="200" /> +                <text +                 follows="left|top" +                 height="15" +                 layout="topleft" +                 left="0" +                 name="creator_label" +                 value="Creator:" +                 width="90" /> +                <text +                 follows="left|top|right" +                 height="15" +                 layout="topleft" +                 left="70" +                 name="creator" +                 top_delta="0" +                 width="200" /> +                <text +                 follows="left|top" +                 height="15" +                 layout="topleft" +                 left="0" +                 name="created_label" +                 value="Created:" +                 width="50" /> +                <text +                 follows="left|top|right" +                 height="15" +                 layout="topleft" +                 left="70" +                 name="created" +                 top_delta="0" +                 width="200" /> +            </panel> +            <panel +             follows="left|top|right" +             height="210" +             layout="topleft" +             left="10" +             name="landmark_edit_panel" +             width="290"> +                <text +                 follows="left|top" +                 height="15" +                 layout="topleft" +                 left="0" +                 name="title_label" +                 top_pad="10" +                 value="Title:" +                 width="290" /> +                <line_editor +                 background_image_disabled="task_panel_background.png" +                 follows="left|top|right" +                 height="22" +                 layout="topleft" +                 left="0" +                 max_length="63" +                 name="title_editor" +                 prevalidate_callback="ascii" +                 text_readonly_color="white" +                 top_pad="5" +                 width="290" /> +                <text +                 follows="left|top" +                 height="15" +                 layout="topleft" +                 left="0" +                 name="notes_label" +                 top_pad="10" +                 value="My notes:" +                 width="290" /> +                <text_editor +                 bg_readonly_color="DkGray2" +                 follows="all" +                 height="70" +                 layout="topleft" +                 left="0" +                 max_length="127" +                 name="notes_editor" +                 read_only="true" +                 text_readonly_color="white" +                 top_pad="5" +                 width="290" +                 wrap="true" /> +                <text +                 follows="left|top" +                 height="15" +                 layout="topleft" +                 left="0" +                 name="folder_label" +                 top_pad="15" +                 value="Landmark location:" +                 width="290" /> +                <combo_box +                 follows="bottom|left|right" +                 height="20" +                 layout="topleft" +                 left="0" +                 name="folder_combo" +                 top_pad="5" +                 width="200" /> +            </panel> +        </panel> +    </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index a2ddc7a43b..f05684db10 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -31,7 +31,7 @@               left="0"               mouse_opaque="true"               name="favorites_list" -             start_folder="favorite" +             start_folder="Favorite"               width="380"/>          </accordion_tab>          <accordion_tab @@ -47,7 +47,7 @@               left="0"               mouse_opaque="true"               name="landmarks_list" -             start_folder="landmark" +             start_folder="Landmarks"               width="380"/>          </accordion_tab>          <accordion_tab @@ -63,13 +63,13 @@               left="0"               mouse_opaque="true"               name="my_inventory_list" -             start_folder="inventory" +             start_folder="INVENTORY"               width="380"/> -        </accordion_tab> -        <accordion_tab -         layout="topleft" -         name="tab_library" -         title="Library"> +          </accordion_tab> +          <accordion_tab +           layout="topleft" +           name="tab_library" +           title="Library">              <inventory_subtree_panel               allow_multi_select="true"               border="true" @@ -79,7 +79,7 @@               left="0"               mouse_opaque="true"               name="library_list" -             start_folder="library" +             start_folder="LIBRARY"               width="380"/>          </accordion_tab>      </accordion> 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 2182163da5..555fedb1ff 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 @@ -42,13 +42,17 @@       width="20" />      <button       follows="right" +     is_toggle="true"       width="45"       top="0"       layout="topleft"       left_pad="8"       label="Log"       height="23" +     name="show_nearby_chat"       tool_tip="Show/hide nearby chat log"> -    <button.commit_callback function="Floater.Toggle" parameter="nearby_chat"/> +        <button.init_callback +           function="Button.SetDockableFloaterToggle" +           parameter="nearby_chat" />      </button>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index 42a1363b1b..cf18aa2d39 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -29,7 +29,7 @@       text_color="white"       top="0"       value="Pick Info" -     use_elipsis="true" +     use_ellipses="true"       width="275" />      <scroll_container       color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml new file mode 100644 index 0000000000..7e073f064d --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -0,0 +1,979 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + follows="all" + height="570" + layout="topleft" + left="0" + min_height="350" + name="place_profile" + top="20" + width="330"> +    <string +     name="on" +     value="On" /> +    <string +     name="off" +     value="Off" /> +    <string +     name="anyone" +     value="Anyone" /> +    <string +     name="available" +     value="available" /> +    <string +     name="allocated" +     value="allocated" /> +    <string +     name="title_place" +     value="Place Profile" /> +    <string +     name="title_teleport_history" +     value="Teleport History Location" /> +    <string +     name="not_available" +     value="(N\A)" /> +    <string +     name="unknown" +     value="(unknown)" /> +    <string +     name="public" +     value="(public)" /> +    <string +     name="none_text" +     value="(none)" /> +    <string +     name="sale_pending_text" +     value="(Sale Pending)" /> +    <string +     name="group_owned_text" +     value="(Group Owned)" /> +    <string +     name="price_text" +     value="L$" /> +    <string +     name="area_text" +     value="m²" /> +    <string +     name="all_residents_text" +     value="All Residents" /> +    <string +     name="group_text" +     value="Group" /> +    <string +     name="can_resell"> +        Purchased land in this region may be resold. +    </string> +    <string +     name="can_not_resell"> +        Purchased land in this region may not be resold. +    </string> +    <string +     name="can_change"> +        Purchased land in this region may be joined or subdivided. +    </string> +    <string +     name="can_not_change"> +        Purchased land in this region may not be joined or subdivided. +    </string> +    <string +     name="server_update_text"> +        Place information not available without server update. +    </string> +    <string +     name="server_error_text"> +        Information about this location is unavailable at this time, please try again later. +    </string> +    <string +     name="server_forbidden_text"> +        Information about this location is unavailable due to access restrictions.  Please check your permissions with the parcel owner. +    </string> +    <string +     name="acquired_date"> +        [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local] +    </string> +    <button +     follows="top|right" +     height="23" +     image_overlay="BackArrow_Off" +     layout="topleft" +     left="10" +     name="back_btn" +     picture_style="true" +     tab_stop="false" +     top="0" +     width="23" /> +    <text +     follows="top|left|right" +     font="SansSerifHugeBold" +     height="26" +     layout="topleft" +     left_pad="10" +     name="title" +     text_color="white" +     top="0" +     use_ellipses="true" +     value="Place Profile" +     width="275" /> +    <scroll_container +     color="DkGray2" +     follows="all" +     height="533" +     layout="topleft" +     left="10" +     name="place_scroll" +     opaque="true" +     top_pad="5" +     width="313"> +        <panel +         bg_alpha_color="DkGray2" +         follows="all" +         height="533" +         layout="topleft" +         left="0" +         min_height="300" +         name="scrolling_panel" +         top="0" +         value=">" +         width="313"> +            <texture_picker +             enabled="false" +             follows="top|left" +             height="190" +             layout="topleft" +             left="10" +             name="logo" +             top="10" +             width="290" /> +            <layout_stack +             border_size="0" +             clip="false" +             follows="all" +             height="50" +             layout="topleft" +             mouse_opaque="false" +             name="panel_stack" +             orientation="horizontal" +             top_pad="-65" +             width="100"> +                <layout_panel +                 follows="left|right" +                 height="50" +                 layout="topleft" +                 left="0" +                 min_height="50" +                 min_width="50" +                 mouse_opaque="false" +                 name="here_panel" +                 top="0" +                 user_resize="false" +                 width="60"> +                    <icon +                     follows="top|left" +                     height="50" +                     image_name="YouAreHere_Badge" +                     layout="topleft" +                     left="0" +                     name="icon_you_are_here" +                     top="0" +                     width="50" /> +                </layout_panel> +                <layout_panel +                 follows="left|right" +                 height="60" +                 layout="topleft" +                 min_height="50" +                 min_width="60" +                 mouse_opaque="false" +                 name="for_sale_panel" +                 top="0" +                 user_resize="false" +                 width="60"> +                    <icon +                     follows="top|left" +                     height="50" +                     image_name="ForSale_Badge" +                     layout="topleft" +                     left="10" +                     name="icon_for_sale" +                     top="0" +                     width="50" /> +                </layout_panel> +            </layout_stack> +            <text +             follows="left|top|right" +             font="SansSerifLarge" +             height="14" +             layout="topleft" +             left="10" +             name="region_title" +             text_color="white" +             top_pad="5" +             use_ellipses="true" +             value="SampleRegion" +             width="290" /> +       <!-- <icon +             follows="top|right" +             height="16" +             image_name="Icon_For_Sale" +             layout="topleft" +             left="3" +             mouse_opaque="true" +             name="icon_for_sale" +             width="16" />--> +            <text +             follows="left|top|right" +             height="14" +             layout="topleft" +             left="10" +             name="parcel_title" +             top_pad="4" +             use_ellipses="true" +             value="SampleParcel, Name Long (145, 228, 26)" +             width="285" /> +            <expandable_text +             follows="left|top|right" +             height="50" +             layout="topleft" +             left="5" +             name="description" +             top_pad="10" +             value="Du waltz die spritz" +             width="300" /> +            <text +             follows="left|top" +             height="14" +             layout="topleft" +             left="10" +             name="owner_label" +             text_color="White" +             top_pad="0" +             value="Owner:" +             width="90" /> +         <!--TODO: HOOK THIS NAME UP WITH AN INSPECTOR  --> +            <text +             follows="left|top|right" +             height="14" +             layout="topleft" +             left_pad="1" +             name="owner_value" +             top_delta="0" +             value="Alex Superduperlongenamenton" +             width="205" /> +            <accordion +             follows="all" +             height="230" +             layout="topleft" +             left="0" +             name="advanced_info_accordion" +             top_pad="10" +             width="313"> +                <accordion_tab +                 layout="topleft" +                 name="parcel_characteristics_tab" +                 title="Parcel"> +                    <scroll_container +                     color="DkGray2" +                     follows="all" +                     height="132" +                     layout="topleft" +                     left="0" +                     name="parcel_scroll" +                     opaque="true" +                     top="0" +                     width="290"> +                        <panel +                         follows="all" +                         height="165" +                         layout="topleft" +                         left="0" +                         top="0" +                         width="275"> +                            <icon +                             follows="top|left" +                             height="16" +                             image_name="parcel_drk_M" +                             layout="topleft" +                             left="20" +                             name="icon_M" +                             top="0" +                             width="18" /> +                            <icon +                             follows="top|left" +                             height="16" +                             image_name="parcel_drk_R" +                             layout="topleft" +                             left="20" +                             name="icon_R" +                             top="0" +                             width="18" /> +                            <icon +                             follows="top|left" +                             height="16" +                             image_name="parcel_drk_PG" +                             layout="topleft" +                             left="20" +                             name="icon_PG" +                             top="0" +                             visible="false" +                             width="18" /> +                            <text +                             follows="left|top" +                             height="16" +                             layout="topleft" +                             left_pad="8" +                             name="rating_label" +                             value="Rating:" +                             width="80" /> +                            <text +                             follows="right|top" +                             height="16" +                             layout="topleft" +                             left_pad="0" +                             name="rating_value" +                             top_delta="0" +                             value="Mature" +                             width="120" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_Voice" +                             layout="topleft" +                             left="20" +                             name="icon_Voice" +                             top_pad="5" +                             width="22" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_VoiceNo" +                             layout="topleft" +                             left="20" +                             name="icon_VoiceNo" +                             top_delta="0" +                             visible="false" +                             width="22" /> +                            <text +                             follows="left|top" +                             height="18" +                             layout="topleft" +                             left_pad="8" +                             name="voice_label" +                             top_delta="0" +                             value="Voice:" +                             width="76" /> +                            <text +                             follows="right|top" +                             height="18" +                             layout="topleft" +                             left_pad="0" +                             name="voice_value" +                             top_delta="0" +                             value="On" +                             width="60" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_Fly" +                             layout="topleft" +                             left="20" +                             name="icon_Fly" +                             top_pad="3" +                             width="22" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_FlyNo" +                             layout="topleft" +                             left="20" +                             name="icon_FlyNo" +                             top_delta="0" +                             visible="false" +                             width="22" /> +                            <text +                             follows="left|top" +                             height="16" +                             layout="topleft" +                             left_pad="8" +                             name="fly_label" +                             value="Fly:" +                             width="76" /> +                            <text +                             follows="right|top" +                             height="16" +                             layout="topleft" +                             left_pad="0" +                             name="fly_value" +                             top_delta="0" +                             value="On" +                             width="60" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_Push" +                             layout="topleft" +                             left="20" +                             name="icon_Push" +                             top_pad="3" +                             visible="false" +                             width="22" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_PushNo" +                             layout="topleft" +                             left="20" +                             name="icon_PushNo" +                             top_delta="0" +                             width="22" /> +                            <text +                             follows="left|top" +                             height="14" +                             layout="topleft" +                             left_pad="8" +                             name="push_label" +                             value="Push:" +                             width="76" /> +                            <text +                             follows="right|top" +                             height="14" +                             layout="topleft" +                             left_pad="0" +                             name="push_value" +                             top_delta="0" +                             value="Off" +                             width="60" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_Build" +                             layout="topleft" +                             left="20" +                             name="icon_Build" +                             top_pad="3" +                             width="22" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_BuildNo" +                             layout="topleft" +                             left="20" +                             name="icon_BuildNo" +                             top_delta="0" +                             visible="false" /> +                            <text +                             follows="left|top" +                             height="14" +                             layout="topleft" +                             left_pad="8" +                             name="build_label" +                             value="Build:" +                             width="76" /> +                            <text +                             follows="right|top" +                             height="15" +                             layout="topleft" +                             left_pad="0" +                             name="build_value" +                             top_delta="0" +                             value="On" +                             width="60" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_Scripts" +                             layout="topleft" +                             left="20" +                             name="icon_Scripts" +                             top_pad="3" +                             width="22" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_ScriptsNo" +                             layout="topleft" +                             left="20" +                             name="icon_ScriptsNo" +                             top_delta="0" +                             visible="false" /> +                            <text +                             follows="left|top" +                             height="14" +                             layout="topleft" +                             left_pad="8" +                             name="scripts_label" +                             value="Scripts:" +                             width="76" /> +                            <text +                             follows="right|top" +                             height="14" +                             layout="topleft" +                             left_pad="0" +                             name="scripts_value" +                             top_delta="0" +                             value="On" +                             width="60" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_Damage" +                             layout="topleft" +                             left="20" +                             name="icon_Damage" +                             top_pad="7" +                             visible="false" +                             width="22" /> +                            <icon +                             follows="top|left" +                             height="18" +                             image_name="parcel_drk_DamageNo" +                             layout="topleft" +                             left="20" +                             name="icon_DamageNo" +                             top_delta="0" /> +                            <text +                             follows="left|top" +                             height="14" +                             layout="topleft" +                             left_pad="8" +                             name="damage_label" +                             value="Damage:" +                             width="76" /> +                            <text +                             follows="right|top" +                             height="14" +                             layout="topleft" +                             left_pad="0" +                             name="damage_value" +                             top_delta="0" +                             value="Off" +                             width="60" /> +                            <button +                             follows="bottom|right" +                             height="19" +                             label="About Land" +                             layout="topleft" +                             name="about_land_btn" +                             right="-5" +                             tab_stop="false" +                             top="138" +                             width="90"> +                                <click_callback +                                 function="ShowFloater" +                                 parameter="about_land" /> +                            </button> +                        </panel> +                    </scroll_container> +                </accordion_tab> +                <accordion_tab +                 expanded="false" +                 layout="topleft" +                 name="region_information_tab" +                 title="Region"> +                    <panel +                     follows="all" +                     height="125" +                     layout="topleft" +                     left="0" +                     top="0" +                     width="290"> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="region_name_label" +                         top_pad="5" +                         value="Region:" +                         width="80" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left_pad="0" +                         name="region_name" +                         top_delta="0" +                         value="Mooseland" +                         width="195" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="region_type_label" +                         top_pad="5" +                         value="Type:" +                         width="80" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left_pad="0" +                         name="region_type" +                         top_delta="0" +                         value="Moose" +                         width="195" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="region_rating_label" +                         top_pad="7" +                         value="Rating:" +                         width="80" /> +                        <icon +                         follows="top|left" +                         height="16" +                         image_name="parcel_drk_M" +                         layout="topleft" +                         left_pad="0" +                         name="icon_M" +                         width="18" /> +                        <icon +                         follows="top|left" +                         height="16" +                         image_name="parcel_drk_R" +                         layout="topleft" +                         left_delta="0" +                         name="icon_R" +                         top_delta="0" +                         visible="false" +                         width="18" /> +                        <icon +                         follows="top|left" +                         height="16" +                         image_name="parcel_drk_PG" +                         layout="topleft" +                         left_delta="0" +                         name="icon_PG" +                         top_delta="0" +                         visible="false" +                         width="18" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left_pad="10" +                         name="region_rating" +                         value="Explicit" +                         width="100" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="region_owner_label" +                         top_pad="5" +                         value="Owner:" +                         width="80" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left_pad="0" +                         name="region_owner" +                         top_delta="0" +                         value="moose Van Moose" +                         width="195" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="region_group_label" +                         top_pad="5" +                         value="Group:" +                         width="80" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left_pad="0" +                         name="region_group" +                         top_delta="0" +                         use_ellipses="true" +                         width="195"> +                            The Mighty Moose of mooseville soundvillemoose +                        </text> +                        <button +                         follows="bottom|right" +                         height="19" +                         label="Region/Estate" +                         layout="topleft" +                         name="region_info_btn" +                         right="-5" +                         tab_stop="false" +                         width="105"> +                            <click_callback +                             function="ShowFloater" +                             parameter="region_info" /> +                        </button> +                    </panel> +                </accordion_tab> +                <accordion_tab +                 expanded="false" +                 layout="topleft" +                 name="estate_information_tab" +                 title="Estate"> +                    <panel +                     follows="all" +                     height="189" +                     layout="topleft" +                     left="0" +                     top="0" +                     width="290"> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="estate_name_label" +                         top_pad="5" +                         value="Estate:" +                         width="80" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left="90" +                         name="estate_name" +                         top_delta="0" +                         width="160" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="estate_rating_label" +                         top_pad="5" +                         value="Rating:" +                         width="80" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left="90" +                         name="estate_rating" +                         top_delta="0" +                         width="160" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="estate_owner_label" +                         top_pad="5" +                         value="Owner:" +                         width="80" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left="90" +                         name="estate_owner" +                         top_delta="0" +                         width="160" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="covenant_label" +                         top_pad="5" +                         value="Covenant:" +                         width="220" /> +                        <text_editor +                         bg_focus_color="DkGray2" +                         bg_readonly_color="DkGray2" +                         follows="left|top|right" +                         handle_edit_keys_directly="true" +                         height="90" +                         layout="topleft" +                         left="10" +                         max_length="65535" +                         name="covenant" +                         read_only="true" +                         top_pad="0" +                         width="280" /> +                    </panel> +                </accordion_tab> +                <accordion_tab +                 expanded="false" +                 layout="topleft" +                 name="sales_tab" +                 title="For Sale"> +                    <panel +                     follows="all" +                     height="300" +                     layout="topleft" +                     left="0" +                     top="0" +                     width="290"> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="sales_price_label" +                         top_pad="5" +                         value="Price:" +                         width="100" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left="110" +                         name="sales_price" +                         top_delta="0" +                         width="140" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="area_label" +                         top_pad="5" +                         value="Area:" +                         width="100" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left="110" +                         name="area" +                         top_delta="0" +                         width="140" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="traffic_label" +                         top_pad="5" +                         value="Traffic:" +                         width="100" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left="110" +                         name="traffic" +                         top_delta="0" +                         width="140" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="primitives_label" +                         top_pad="5" +                         value="Primitives:" +                         width="100" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left="110" +                         name="primitives" +                         top_delta="0" +                         width="140" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="parcel_scripts_label" +                         top_pad="5" +                         value="Scripts:" +                         width="100" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left="110" +                         name="parcel_scripts" +                         top_delta="0" +                         width="140" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="terraform_limits_label" +                         top_pad="5" +                         value="Terraform limits:" +                         width="100" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left="110" +                         name="terraform_limits" +                         top_delta="0" +                         width="140" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="subdivide_label" +                         top_pad="5" +                         value="Subdivide/Join ability:" +                         width="220" /> +                        <text_editor +                         bg_focus_color="DkGray2" +                         bg_readonly_color="DkGray2" +                         follows="left|top|right" +                         height="45" +                         layout="topleft" +                         left="10" +                         max_length="65535" +                         name="subdivide" +                         read_only="true" +                         top_pad="5" +                         width="245" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="resale_label" +                         top_pad="5" +                         value="ReSale ability:" +                         width="80" /> +                        <text_editor +                         bg_focus_color="DkGray2" +                         bg_readonly_color="DkGray2" +                         follows="left|top|right" +                         height="45" +                         layout="topleft" +                         left="10" +                         max_length="65535" +                         name="resale" +                         read_only="true" +                         top_pad="5" +                         width="245" /> +                        <text +                         follows="left|top" +                         height="15" +                         layout="topleft" +                         left="10" +                         name="sale_to_label" +                         top_pad="5" +                         value="For sale to:" +                         width="80" /> +                        <text +                         follows="left|top|right" +                         height="15" +                         layout="topleft" +                         left="90" +                         name="sale_to" +                         top_delta="0" +                         width="160" /> +                    </panel> +                </accordion_tab> +            </accordion> +        </panel> +    </scroll_container> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 5887d05d7c..4b5bde690c 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -40,14 +40,26 @@ background_visible="true"       top_pad="10"       width="313" />      <panel -     class="panel_place_info" -     filename="panel_place_info.xml" +     class="panel_place_profile" +     filename="panel_place_profile.xml"       follows="all"       height="533"       layout="topleft"       left="0"       help_topic="places_info_tab" -     name="panel_place_info" +     name="panel_place_profile" +     top="5" +     visible="false" +     width="313" /> +    <panel +     class="panel_landmark_info" +     filename="panel_landmark_info.xml" +     follows="all" +     height="533" +     layout="topleft" +     left="0" +     help_topic="places_info_tab" +     name="panel_landmark_info"       top="5"       visible="false"       width="313" /> diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 5af7d7d674..c3a92f9d9a 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -157,7 +157,7 @@           value="http://librarianavengers.org"           width="280"           word_wrap="false" -         use_elipsis="true" +         use_ellipses="true"           />          <text           follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml index 70e6a08e96..b015346a79 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -35,7 +35,7 @@       text_color="white"       top="0"       value="(Loading...)" -     use_elipsis="true" +     use_ellipses="true"       width="275" />      <text       follows="top|left" diff --git a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml index ab4ad94089..6171be034f 100644 --- a/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/gesture_combo_box.xml @@ -15,14 +15,14 @@                            image_disabled_selected="ComboButton_Disabled_Selected" />    <gesture_combo_box.drop_down_button name="Drop Down Button"                                label="" +                              halign="center"                                hover_glow_amount="0.15"                                font="SansSerif"                                scale_image="true" -                              pad_right="24" -                              image_unselected="DropDown_Off" -                              image_selected="DropDown_Selected" -                              image_disabled="DropDown_Disabled" -                              image_disabled_selected="DropDown_Disabled_Selected" /> +                              image_unselected="PushButton_Off" +                              image_selected="PushButton_Selected" +                              image_disabled="PushButton_Disabled" +                              image_disabled_selected="PushButton_Selected_Disabled" />    <gesture_combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"                                  scroll_bar_bg_visible="true" />    <gesture_combo_box.combo_editor name="Combo Text Entry" diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml new file mode 100644 index 0000000000..725492052c --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<!-- Derives from LLUICtrl --> +<talk_button> +  <!-- To make speak button look green when selected set: +    image_selected="SegmentedBtn_Left_Selected" +    image_unselected="SegmentedBtn_Left_Off" +  --> +  <speak_button +    name="left" +    label="Speak" +    label_selected="Speak" +    font="SansSerifSmall" +    tab_stop="false" +    is_toggle="true" +    picture_style="true" +    /> +  <show_button +    name="right" +    label="" +    left="0" +    top="0" +    right="20" +    bottom="0" +    tab_stop="false" +    is_toggle="true" +    picture_style="true" +    image_selected="ComboButton_Selected" +    image_unselected="ComboButton_Off" +    /> +  <monitor +    name="monitor" +    left="0" +    top="18" +    right="18" +    bottom="0" +    /> +</talk_button> | 
