diff options
36 files changed, 442 insertions, 50 deletions
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index 3282c5f726..8166ef6a07 100755 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -1629,9 +1629,9 @@ void LLFolderView::update()  	if (mNeedsAutoSelect)  	{  		LL_RECORD_BLOCK_TIME(FTM_AUTO_SELECT); -		// select new item only if a filtered item not currently selected +		// select new item only if a filtered item not currently selected and there was a selection  		LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back(); -		if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->getViewModelItem()->potentiallyVisible())) +		if (!mAutoSelectOverride && selected_itemp && !selected_itemp->getViewModelItem()->potentiallyVisible())  		{  			// these are named variables to get around gcc not binding non-const references to rvalues  			// and functor application is inherently non-const to allow for stateful functors diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 3def0386e1..5eb5ca4f82 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -972,6 +972,11 @@ void LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder)  	mIndentation = (getParentFolder())  		? getParentFolder()->getIndentation() + mLocalIndentation  		: 0;  + +	if(isOpen() && folder->isOpen()) +	{ +		requestArrange(); +	}  }  static LLTrace::BlockTimerStatHandle FTM_ARRANGE("Arrange"); diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 2cd6638042..a0d3dc0f99 100755 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -37,7 +37,7 @@             tooltip_ref="Command_Build_Tooltip"             execute_function="Build.Toggle"             execute_parameters="build" -           is_enabled_function="Build.Enabled" +           is_enabled_function="Build.EnabledOrActive"             is_enabled_parameters="build"             is_running_function="Floater.IsOpen"             is_running_parameters="build" diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index 00bc8ebe87..a6e745448a 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -476,13 +476,63 @@ void LLAvatarActions::kick(const LLUUID& id)  }  // static +void LLAvatarActions::freezeAvatar(const LLUUID& id) +{ +	std::string fullname; +	gCacheName->getFullName(id, fullname); +	LLSD payload; +	payload["avatar_id"] = id; + +	if (!fullname.empty()) +	{ +		LLSD args; +		args["AVATAR_NAME"] = fullname; +		LLNotificationsUtil::add("FreezeAvatarFullname", args, payload, handleFreezeAvatar); +	} +	else +	{ +		LLNotificationsUtil::add("FreezeAvatar", LLSD(), payload, handleFreezeAvatar); +	} +} + +// static +void LLAvatarActions::ejectAvatar(const LLUUID& id, bool ban_enabled) +{ +	std::string fullname; +	gCacheName->getFullName(id, fullname); +	LLSD payload; +	payload["avatar_id"] = id; +	payload["ban_enabled"] = ban_enabled; +	LLSD args; +	if (!fullname.empty()) +	{ +		args["AVATAR_NAME"] = fullname; +	} + +	if (ban_enabled) +	{ +			LLNotificationsUtil::add("EjectAvatarFullname", args, payload, handleEjectAvatar); +	} +	else +	{ +		if (!fullname.empty()) +		{ +			LLNotificationsUtil::add("EjectAvatarFullnameNoBan", args, payload, handleEjectAvatar); +		} +		else +		{ +			LLNotificationsUtil::add("EjectAvatarNoBan", LLSD(), payload, handleEjectAvatar); +		} +	} +} + +// static  void LLAvatarActions::freeze(const LLUUID& id)  {  	LLSD payload;  	payload["avatar_id"] = id;  	LLNotifications::instance().add("FreezeUser", LLSD(), payload, handleFreeze);  } -  // static  void LLAvatarActions::unfreeze(const LLUUID& id)  { @@ -1133,10 +1183,77 @@ bool LLAvatarActions::handleKick(const LLSD& notification, const LLSD& response)  	}  	return false;  } -bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response) + +bool LLAvatarActions::handleFreezeAvatar(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotification::getSelectedOption(notification, response); +	if (0 == option || 1 == option) +	{ +	    U32 flags = 0x0; +	    if (1 == option) +	    { +	        // unfreeze +	        flags |= 0x1; +	    } +	    LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); +		LLMessageSystem* msg = gMessageSystem; + +		msg->newMessage("FreezeUser"); +		msg->nextBlock("AgentData"); +		msg->addUUID("AgentID", gAgent.getID()); +		msg->addUUID("SessionID", gAgent.getSessionID()); +		msg->nextBlock("Data"); +		msg->addUUID("TargetID", avatar_id ); +		msg->addU32("Flags", flags ); +		gAgent.sendReliableMessage(); +	} +	return false; +} + +bool LLAvatarActions::handleEjectAvatar(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (2 == option) +	{ +		return false; +	} +	LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); +	bool ban_enabled = notification["payload"]["ban_enabled"].asBoolean(); + +	if (0 == option) +	{ +		LLMessageSystem* msg = gMessageSystem; +		U32 flags = 0x0; +		msg->newMessage("EjectUser"); +		msg->nextBlock("AgentData"); +		msg->addUUID("AgentID", gAgent.getID() ); +		msg->addUUID("SessionID", gAgent.getSessionID() ); +		msg->nextBlock("Data"); +		msg->addUUID("TargetID", avatar_id ); +		msg->addU32("Flags", flags ); +		gAgent.sendReliableMessage(); +	} +	else if (ban_enabled) +	{ +		LLMessageSystem* msg = gMessageSystem; + +		U32 flags = 0x1; +		msg->newMessage("EjectUser"); +		msg->nextBlock("AgentData"); +		msg->addUUID("AgentID", gAgent.getID() ); +		msg->addUUID("SessionID", gAgent.getSessionID() ); +		msg->nextBlock("Data"); +		msg->addUUID("TargetID", avatar_id ); +		msg->addU32("Flags", flags ); +		gAgent.sendReliableMessage(); +	} +	return false; +} + +bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotification::getSelectedOption(notification, response);  	if (option == 0)  	{  		LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID(); @@ -1153,6 +1270,7 @@ bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& respons  	}  	return false;  } +  bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& response)  {  	S32 option = LLNotification::getSelectedOption(notification, response); diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index bd0ac24e93..256d44d820 100755 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -173,6 +173,9 @@ public:  	 */	  	static void inviteToGroup(const LLUUID& id); +	static void freezeAvatar(const LLUUID& id); + +	static void ejectAvatar(const LLUUID& id, bool ban_enabled = false);  	/**  	 * Kick avatar off grid  	 */	 @@ -242,6 +245,8 @@ private:  	static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);  	static bool handleRemove(const LLSD& notification, const LLSD& response);  	static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id); +	static bool handleFreezeAvatar(const LLSD& notification, const LLSD& response); +	static bool handleEjectAvatar(const LLSD& notification, const LLSD& response);  	static bool handleKick(const LLSD& notification, const LLSD& response);  	static bool handleFreeze(const LLSD& notification, const LLSD& response);  	static bool handleUnfreeze(const LLSD& notification, const LLSD& response); diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 4b426081d0..9564951986 100755 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -169,6 +169,16 @@ public:  	} +    bool onObjectIconContextMenuItemEnabled(const LLSD& userdata) +    { +        std::string level = userdata.asString(); +        if (level == "is_blocked") +        { +            return !LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat); +        } +        return false; +    } +  	void onAvatarIconContextMenuItemClicked(const LLSD& userdata)  	{  		std::string level = userdata.asString(); @@ -275,6 +285,7 @@ public:  		registrar.add("AvatarIcon.Action", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemClicked, this, _2));  		registrar_enable.add("AvatarIcon.Check", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemChecked, this, _2));  		registrar.add("ObjectIcon.Action", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemClicked, this, _2)); +		registrar_enable.add("ObjectIcon.Enable", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemEnabled, this, _2));  		LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());  		mPopupMenuHandleAvatar = menu->getHandle(); diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 7da65a9a7c..d842106146 100755 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -528,7 +528,8 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)  			LLInventoryItem* item = gInventory.getItem(*it);  			if(item  && item->getInventoryType() == LLInventoryType::IT_GESTURE)  			{ -				LLClipboard::instance().addToClipboard(item->getUUID(),LLAssetType::AT_GESTURE); +				LLWString item_name = utf8str_to_wstring(item->getName()); +				LLClipboard::instance().addToClipboard(item_name, 0, item_name.size());  			}  		}  	} diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index 135bbb335e..4a5732aecf 100755 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -42,6 +42,8 @@  #include "llfloaterperms.h"  #include "llviewercontrol.h"  #include "llviewermenufile.h"	// upload_new_resource() +#include "llstatusbar.h"	// can_afford_transaction() +#include "llnotificationsutil.h"  #include "lluictrlfactory.h"  #include "llstring.h"  #include "lleconomy.h" @@ -161,12 +163,15 @@ void LLFloaterNameDesc::onBtnOK( )  	LLAssetStorage::LLStoreAssetCallback callback = NULL;  	S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass). -	void *nruserdata = NULL; -	std::string display_name = LLStringUtil::null; -    LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo( +    if (can_afford_transaction(expected_upload_cost)) +    { +        void *nruserdata = NULL; +        std::string display_name = LLStringUtil::null; + +        LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo(              mFilenameAndPath, -            getChild<LLUICtrl>("name_form")->getValue().asString(),  +            getChild<LLUICtrl>("name_form")->getValue().asString(),              getChild<LLUICtrl>("description_form")->getValue().asString(), 0,              LLFolderType::FT_NONE, LLInventoryType::IT_NONE,              LLFloaterPerms::getNextOwnerPerms("Uploads"), @@ -174,7 +179,14 @@ void LLFloaterNameDesc::onBtnOK( )              LLFloaterPerms::getEveryonePerms("Uploads"),              expected_upload_cost)); -    upload_new_resource(uploadInfo, callback, nruserdata); +        upload_new_resource(uploadInfo, callback, nruserdata); +    } +    else +    { +        LLSD args; +        args["COST"] = llformat("%d", expected_upload_cost); +        LLNotificationsUtil::add("ErrorTextureCannotAfford", args); +    }  	closeFloater(false);  } diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index afec981d56..b906671c7f 100755 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1418,6 +1418,20 @@ void LLFloaterSnapshot::postPanelSwitch()  }  // static +void LLFloaterSnapshot::inventorySaveFailed() +{ +    LLFloaterSnapshot* instance = findInstance(); +    if (!instance) +    { +        llassert(instance != NULL); +        return; +    } + +    instance->impl.updateControls(instance); +    instance->impl.setStatus(Impl::STATUS_FINISHED, false, "inventory"); +} + +// static  LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()  {  	// FIXME: May not work for textures. diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 0bb9474bb5..eb3a94999b 100755 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -61,6 +61,7 @@ public:  	static BOOL saveLocal();  	static void postSave();  	static void postPanelSwitch(); +	static void inventorySaveFailed();  	static LLPointer<LLImageFormatted> getImageData();  	static const LLVector3d& getPosTakenGlobal();  	static void setAgentEmail(const std::string& email); diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index ece3e10faa..c67feb8158 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -963,10 +963,10 @@ F32 LLFloaterWorldMap::getDistanceToDestination(const LLVector3d &destination,  } -void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui) +void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui, BOOL dest_reached)  {  	LLCtrlListInterface *list = mListSearchResults; -	if (list) +	if (list && (!dest_reached || (list->getItemCount() == 1)))  	{  		list->operateOnAll(LLCtrlListInterface::OP_DELETE);  	} diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 7ce8dae9a9..c5801c8819 100755 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -94,7 +94,7 @@ public:  	// A z_attenuation of 0.0f collapses the distance into the X-Y plane  	F32				getDistanceToDestination(const LLVector3d& pos_global, F32 z_attenuation = 0.5f) const; -	void			clearLocationSelection(BOOL clear_ui = FALSE); +	void			clearLocationSelection(BOOL clear_ui = FALSE, BOOL dest_reached = FALSE);  	void			clearAvatarSelection(BOOL clear_ui = FALSE);  	void			clearLandmarkSelection(BOOL clear_ui = FALSE); diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index e3cb4d57ef..d8f019374e 100755 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -287,7 +287,11 @@ void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistenc                  LL_INFOS("SLM") << "Unlist and clear version folder as the version folder is not at the right place anymore!!" << LL_ENDL;                  LLMarketplaceData::instance().setVersionFolder(listing_uuid, LLUUID::null,1);              } -            else if (version_folder_uuid.notNull() && LLMarketplaceData::instance().getActivationState(version_folder_uuid) && (count_descendants_items(version_folder_uuid) == 0) && !LLMarketplaceData::instance().isUpdating(version_folder_uuid,version_depth)) +            else if (version_folder_uuid.notNull() +                     && gInventory.isCategoryComplete(version_folder_uuid) +                     && LLMarketplaceData::instance().getActivationState(version_folder_uuid) +                     && (count_descendants_items(version_folder_uuid) == 0) +                     && !LLMarketplaceData::instance().isUpdating(version_folder_uuid,version_depth))              {                  LL_INFOS("SLM") << "Unlist as the version folder is empty of any item!!" << LL_ENDL;                  LLNotificationsUtil::add("AlertMerchantVersionFolderEmpty"); diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 8d21fda8f9..53b2ca2b74 100755 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -64,6 +64,9 @@  #include "llurllineeditorctrl.h"  #include "llagentui.h" +#include "llmenuoptionpathfindingrebakenavmesh.h" +#include "llpathfindingmanager.h" +  //============================================================================  /*   * "ADD LANDMARK" BUTTON UPDATING LOGIC @@ -1194,6 +1197,18 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata)  	return false;  } +void LLLocationInputCtrl::callbackRebakeRegion(const LLSD& notification, const LLSD& response) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (option == 0) // OK +	{ +		if (LLPathfindingManager::getInstance() != NULL) +		{ +			LLMenuOptionPathfindingRebakeNavmesh::getInstance()->sendRequestRebakeNavmesh(); +		} +	} +} +  void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)  {  	switch (icon) @@ -1211,6 +1226,16 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)  		LLNotificationsUtil::add("NoBuild");  		break;  	case PATHFINDING_DIRTY_ICON: +		if (LLPathfindingManager::getInstance() != NULL) +		{ +			LLMenuOptionPathfindingRebakeNavmesh *rebakeInstance = LLMenuOptionPathfindingRebakeNavmesh::getInstance(); +			if (rebakeInstance && rebakeInstance->canRebakeRegion() && (rebakeInstance->getMode() == LLMenuOptionPathfindingRebakeNavmesh::kRebakeNavMesh_Available)) +			{ +				LLNotificationsUtil::add("PathfindingDirtyRebake", LLSD(), LLSD(), +										 boost::bind(&LLLocationInputCtrl::callbackRebakeRegion, this, _1, _2)); +				break; +			} +		}  		LLNotificationsUtil::add("PathfindingDirty");  		break;  	case PATHFINDING_DISABLED_ICON: diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index cd6fd24077..da71bab6c1 100755 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -166,6 +166,7 @@ private:  	// callbacks  	bool					onLocationContextMenuItemEnabled(const LLSD& userdata);  	void 					onLocationContextMenuItemClicked(const LLSD& userdata); +	void					callbackRebakeRegion(const LLSD& notification, const LLSD& response);  	void					onParcelIconClick(EParcelIcon icon);  	void                    createNavMeshStatusListenerForCurrentRegion(); diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 4116e38f11..639641d1c2 100755 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -904,7 +904,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params  	std::string stuff = matches[IDX_STUFF];  	boost::match_results<std::string::const_iterator> name_and_text;  	if (!boost::regex_match(stuff, name_and_text, NAME_AND_TEXT)) return false; -	 +  	bool has_name = name_and_text[IDX_NAME].matched;  	std::string name = name_and_text[IDX_NAME]; @@ -956,7 +956,6 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params  		im[LL_IM_FROM] = name;  	} -  	im[LL_IM_TEXT] = name_and_text[IDX_TEXT];  	return true;  //parsed name and message text, maybe have a timestamp too  } diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 4229419fce..973e1f7705 100755 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -150,6 +150,7 @@ BOOL LLPanelMainInventory::postBuild()  	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");  	if (recent_items_panel)  	{ +		// assign default values until we will be sure that we have setting to restore  		recent_items_panel->setSinceLogoff(TRUE);  		recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);  		recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS); @@ -181,6 +182,7 @@ BOOL LLPanelMainInventory::postBuild()  				LLParamSDParser parser;  				parser.readSD(recent_items, p);  				recent_items_panel->getFilter().fromParams(p); +				recent_items_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));  			}  		} @@ -372,7 +374,14 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata)  	}  	getActivePanel()->setSortOrder(sort_order_mask); -	gSavedSettings.setU32("InventorySortOrder", sort_order_mask); +    if ("Recent Items" == getActivePanel()->getName()) +    { +        gSavedSettings.setU32("RecentItemsSortOrder", sort_order_mask); +    } +    else +    { +        gSavedSettings.setU32("InventorySortOrder", sort_order_mask); +    }  }  // static diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index a5f59dbf4a..65769ff526 100755 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -38,9 +38,14 @@  #include "llavataractions.h"  #include "llcallingcard.h"			// for LLAvatarTracker  #include "lllogchat.h" +#include "llparcel.h"  #include "llviewermenu.h"			// for gMenuHolder  #include "llconversationmodel.h"  #include "llviewerobjectlist.h" +#include "llviewerparcelmgr.h" +#include "llviewerregion.h" +#include "llvoavatarself.h" +#include "roles_constants.h"  namespace LLPanelPeopleMenus  { @@ -77,9 +82,13 @@ LLContextMenu* PeopleContextMenu::createMenu()  		registrar.add("Avatar.InviteToGroup",	boost::bind(&LLAvatarActions::inviteToGroup,			id));  		registrar.add("Avatar.TeleportRequest",	boost::bind(&PeopleContextMenu::requestTeleport,		this));  		registrar.add("Avatar.Calllog",			boost::bind(&LLAvatarActions::viewChatHistory,			id)); +		registrar.add("Avatar.Freeze",			boost::bind(&LLAvatarActions::freezeAvatar,					id)); +		registrar.add("Avatar.Eject",			boost::bind(&PeopleContextMenu::eject,					this)); +  		enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2));  		enable_registrar.add("Avatar.CheckItem",  boost::bind(&PeopleContextMenu::checkContextMenuItem,	this, _2)); +		enable_registrar.add("Avatar.EnableFreezeEject", boost::bind(&PeopleContextMenu::enableFreezeEject, this, _2));  		// create the context menu from the XUI  		menu = createFromFile("menu_people_nearby.xml"); @@ -258,6 +267,50 @@ bool PeopleContextMenu::checkContextMenuItem(const LLSD& userdata)  	return false;  } +bool PeopleContextMenu::enableFreezeEject(const LLSD& userdata) +{ +    if((gAgent.getID() == mUUIDs.front()) || (mUUIDs.size() != 1)) +    { +        return false; +    } + +    const LLUUID& id = mUUIDs.front(); + +    // Use avatar_id if available, otherwise default to right-click avatar +    LLVOAvatar* avatar = NULL; +    if (id.notNull()) +    { +        LLViewerObject* object = gObjectList.findObject(id); +        if (object) +        { +            if( !object->isAvatar() ) +            { +                object = NULL; +            } +            avatar = (LLVOAvatar*) object; +        } +    } +    if (!avatar) return false; + +    // Gods can always freeze +    if (gAgent.isGodlike()) return true; + +    // Estate owners / managers can freeze +    // Parcel owners can also freeze +    const LLVector3& pos = avatar->getPositionRegion(); +    const LLVector3d& pos_global = avatar->getPositionGlobal(); +    LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel(); +    LLViewerRegion* region = avatar->getRegion(); +    if (!region) return false; + +    bool new_value = region->isOwnedSelf(pos); +    if (!new_value || region->isOwnedGroup(pos)) +    { +        new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN); +    } +    return new_value; +} +  void PeopleContextMenu::requestTeleport()  {  	// boost::bind cannot recognize overloaded method LLAvatarActions::teleportRequest(), @@ -272,6 +325,39 @@ void PeopleContextMenu::offerTeleport()  	LLAvatarActions::offerTeleport(mUUIDs);  } +void PeopleContextMenu::eject() +{ +	if((gAgent.getID() == mUUIDs.front()) || (mUUIDs.size() != 1)) +	{ +		return; +	} + +	const LLUUID& id = mUUIDs.front(); + +	// Use avatar_id if available, otherwise default to right-click avatar +	LLVOAvatar* avatar = NULL; +	if (id.notNull()) +	{ +		LLViewerObject* object = gObjectList.findObject(id); +		if (object) +		{ +			if( !object->isAvatar() ) +			{ +				object = NULL; +			} +			avatar = (LLVOAvatar*) object; +		} +	} +	if (!avatar) return; +	LLSD payload; +	payload["avatar_id"] = avatar->getID(); +	std::string fullname = avatar->getFullname(); + +	const LLVector3d& pos = avatar->getPositionGlobal(); +	LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel(); +	LLAvatarActions::ejectAvatar(id ,LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_MANAGE_BANNED)); +} +  void PeopleContextMenu::startConference()  {  	uuid_vec_t uuids; @@ -320,6 +406,8 @@ void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)  		items.push_back(std::string("share"));  		items.push_back(std::string("pay"));  		items.push_back(std::string("block_unblock")); +		items.push_back(std::string("freeze")); +		items.push_back(std::string("eject"));  	}      hide_context_entries(menu, items, disabled_items); diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h index 9767bab89f..5ed20e0064 100755 --- a/indra/newview/llpanelpeoplemenus.h +++ b/indra/newview/llpanelpeoplemenus.h @@ -46,7 +46,9 @@ protected:  private:  	bool enableContextMenuItem(const LLSD& userdata);  	bool checkContextMenuItem(const LLSD& userdata); +	bool enableFreezeEject(const LLSD& userdata);  	void offerTeleport(); +	void eject();  	void startConference();  	void requestTeleport();  }; diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp index c55e230b5e..a2d1752c6a 100755 --- a/indra/newview/llpanelsnapshotinventory.cpp +++ b/indra/newview/llpanelsnapshotinventory.cpp @@ -34,6 +34,8 @@  #include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model  #include "llpanelsnapshot.h"  #include "llviewercontrol.h" // gSavedSettings +#include "llstatusbar.h"	// can_afford_transaction() +#include "llnotificationsutil.h"  /**   * The panel provides UI for saving snapshot as an inventory texture. @@ -102,6 +104,17 @@ void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)  void LLPanelSnapshotInventory::onSend()  { -	LLFloaterSnapshot::saveTexture(); -	LLFloaterSnapshot::postSave(); +    S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); +    if (can_afford_transaction(expected_upload_cost)) +    { +        LLFloaterSnapshot::saveTexture(); +        LLFloaterSnapshot::postSave(); +    } +    else +    { +        LLSD args; +        args["COST"] = llformat("%d", expected_upload_cost); +        LLNotificationsUtil::add("ErrorPhotoCannotAfford", args); +        LLFloaterSnapshot::inventorySaveFailed(); +    }  } diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index d86a8b4480..d0353259a5 100755 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -94,6 +94,7 @@ protected:  		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;  		registrar.add("Wearing.Edit", boost::bind(&edit_outfit)); +		registrar.add("Wearing.ShowOriginal", boost::bind(show_item_original, mUUIDs.front()));  		registrar.add("Wearing.TakeOff",  					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));  		registrar.add("Wearing.Detach",  @@ -144,6 +145,7 @@ protected:  		menu->setItemVisible("take_off",	allow_take_off);  		menu->setItemVisible("detach",		allow_detach);  		menu->setItemVisible("edit_outfit_separator", allow_take_off || allow_detach); +		menu->setItemVisible("show_original", mUUIDs.size() == 1);  	}  }; diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index 20c43bc432..ba9845ef04 100755 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -94,7 +94,8 @@ BOOL LLPreviewNotecard::postBuild()  	if (item)  	{  		getChild<LLUICtrl>("desc")->setValue(item->getDescription()); -		getChildView("Delete")->setEnabled(true); +		BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID()); +		getChildView("Delete")->setEnabled(!source_library);  	}  	getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); @@ -219,6 +220,7 @@ void LLPreviewNotecard::loadAsset()  		BOOL is_owner = gAgent.allowOperation(PERM_OWNER, perm, GP_OBJECT_MANIPULATE);  		BOOL allow_copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);  		BOOL allow_modify = canModify(mObjectUUID, item); +		BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(mItemUUID, gInventory.getLibraryRootFolderID());  		if (allow_copy || gAgent.isGodlike())  		{ @@ -288,7 +290,7 @@ void LLPreviewNotecard::loadAsset()  			getChildView("lock")->setVisible( TRUE);  		} -		if(allow_modify || is_owner) +		if((allow_modify || is_owner) && !source_library)  		{  			getChildView("Delete")->setEnabled(TRUE);  		} diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 2a2c51be40..645a77e42a 100755 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -38,6 +38,7 @@  #include "llimagetga.h"  #include "llimagepng.h"  #include "llinventory.h" +#include "llinventorymodel.h"  #include "llnotificationsutil.h"  #include "llresmgr.h"  #include "lltrans.h" @@ -120,18 +121,22 @@ BOOL LLPreviewTexture::postBuild()  	childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this);  	getChildView("save_tex_btn")->setVisible( true);  	getChildView("save_tex_btn")->setEnabled(canSaveAs()); -	 -	if (!mCopyToInv)  -	{ -		const LLInventoryItem* item = getItem(); -		 -		if (item) -		{ -			childSetCommitCallback("desc", LLPreview::onText, this); -			getChild<LLUICtrl>("desc")->setValue(item->getDescription()); -			getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); -		} -	} + +    const LLInventoryItem* item = getItem(); +    if (item) +    { +        if (!mCopyToInv) +        { +            childSetCommitCallback("desc", LLPreview::onText, this); +            getChild<LLUICtrl>("desc")->setValue(item->getDescription()); +            getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe); +        } +        BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID()); +        if (source_library) +        { +            getChildView("Discard")->setEnabled(false); +        } +    }  	// Fill in ratios list with common aspect ratio values  	mRatiosList.clear(); @@ -526,6 +531,15 @@ void LLPreviewTexture::loadAsset()  		// check that we can copy inworld items into inventory  		getChildView("Keep")->setEnabled(mIsCopyable);  	} +	else +	{ +		// check that we can remove item +		BOOL source_library = gInventory.isObjectDescendentOf(mItemUUID, gInventory.getLibraryRootFolderID()); +		if (source_library) +		{ +			getChildView("Discard")->setEnabled(false); +		} +	}  }  LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus() diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 98ed2f0fc4..1a8ade5b10 100755 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -103,7 +103,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt  		p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));  	}  	// for the scriptdialog buttons we use fixed button size. This  is a limit! -	if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > BUTTON_WIDTH) +	if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > (BUTTON_WIDTH-2*HPAD))  	{  		p.rect.width = 1;  		p.auto_resize = true; @@ -160,7 +160,11 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair  		}  		LLButton* btn = it->second;  		LLRect btn_rect(btn->getRect()); -		if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel +		if (buttons.size() == 1) // for the one-button forms, center that button +		{ +			left = (max_width - btn_rect.getWidth()) / 2; +		} +		else if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel  		{  			// looks like we need to add button to the next row  			left = 0; diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index 2f8e464b71..b0e3b5bf89 100755 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -83,6 +83,7 @@ LLToolMgr::LLToolMgr()  	// Not a panel, register these callbacks globally.  	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Active", boost::bind(&LLToolMgr::inEdit, this));  	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Enabled", boost::bind(&LLToolMgr::canEdit, this)); +	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.EnabledOrActive", boost::bind(&LLToolMgr::buildEnabledOrActive, this));  	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Build.Toggle", boost::bind(&LLToolMgr::toggleBuildMode, this, _2));  	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Marketplace.Enabled", boost::bind(&LLToolMgr::canAccessMarketplace, this));  	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Marketplace.Toggle", boost::bind(&LLToolMgr::toggleMarketplace, this, _2)); @@ -264,17 +265,21 @@ bool LLToolMgr::canEdit()  	return LLViewerParcelMgr::getInstance()->allowAgentBuild();  } +bool LLToolMgr::buildEnabledOrActive() +{ +	return inEdit() || canEdit(); +} +  void LLToolMgr::toggleBuildMode(const LLSD& sdname)  {  	const std::string& param = sdname.asString(); +	LLFloaterReg::toggleInstanceOrBringToFront("build");  	if (param == "build" && !canEdit())  	{  		return;  	} -	LLFloaterReg::toggleInstanceOrBringToFront("build"); -  	bool build_visible = LLFloaterReg::instanceVisible("build");  	if (build_visible)  	{ diff --git a/indra/newview/lltoolmgr.h b/indra/newview/lltoolmgr.h index a3c1045aac..e5b45750d9 100755 --- a/indra/newview/lltoolmgr.h +++ b/indra/newview/lltoolmgr.h @@ -54,6 +54,7 @@ public:  	bool			inEdit();  	bool			canEdit(); +	bool 			buildEnabledOrActive();      bool            canAccessMarketplace();  	void			toggleBuildMode(const LLSD& sdname);  	void			toggleMarketplace(const LLSD& sdname); diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index f611d0503f..b015cde45d 100755 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -183,7 +183,7 @@ void LLTracker::render3D()  		F32 dist = gFloaterWorldMap->getDistanceToDestination(pos_global, 0.5f);  		if (dist < DESTINATION_REACHED_RADIUS)  		{ -			instance()->stopTrackingLocation(); +			instance()->stopTrackingLocation(FALSE,TRUE);  		}  		else  		{ @@ -655,13 +655,13 @@ void LLTracker::stopTrackingLandmark(BOOL clear_ui)  } -void LLTracker::stopTrackingLocation(BOOL clear_ui) +void LLTracker::stopTrackingLocation(BOOL clear_ui, BOOL dest_reached)  {  	purgeBeaconText();  	mTrackedLocationName.assign("");  	mIsTrackingLocation = FALSE;  	mTrackedPositionGlobal.zeroVec(); -	gFloaterWorldMap->clearLocationSelection(clear_ui); +	gFloaterWorldMap->clearLocationSelection(clear_ui, dest_reached);  	mTrackingStatus = TRACKING_NOTHING;  	mTrackingLocationType = LOCATION_NOTHING;  } diff --git a/indra/newview/lltracker.h b/indra/newview/lltracker.h index 218f3430a6..a1c5052c1b 100755 --- a/indra/newview/lltracker.h +++ b/indra/newview/lltracker.h @@ -116,7 +116,7 @@ protected:  	void stopTrackingAll(BOOL clear_ui = FALSE);  	void stopTrackingAvatar(BOOL clear_ui = FALSE); -	void stopTrackingLocation(BOOL clear_ui = FALSE); +	void stopTrackingLocation(BOOL clear_ui = FALSE, BOOL dest_reached = FALSE);  	void stopTrackingLandmark(BOOL clear_ui = FALSE);  	void drawMarker(const LLVector3d& pos_global, const LLColor4& color); diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp index f0dafec240..497ff4d2bf 100644 --- a/indra/newview/llviewerassetupload.cpp +++ b/indra/newview/llviewerassetupload.cpp @@ -837,5 +837,12 @@ void LLViewerAssetUpload::HandleUploadError(LLCore::HttpStatus status, LLSD &res          }      } +    // Let the Snapshot floater know we have failed uploading. +    LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot"); +    if (uploadInfo->getAssetType() == LLAssetType::AT_TEXTURE && floater_snapshot) +    { +        floater_snapshot->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "inventory"))); +    } +  } diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml index 170b7177fb..5d05ecf127 100755 --- a/indra/newview/skins/default/xui/en/fonts.xml +++ b/indra/newview/skins/default/xui/en/fonts.xml @@ -12,6 +12,7 @@      <os name="Mac">        <file>ヒラギノ角ゴ Pro W3.otf</file>        <file>ヒラギノ角ゴ ProN W3.otf</file> +      <file>ヒラギノ明朝 ProN W3.ttc</file>        <file>AppleGothic.dfont</file>        <file>AppleGothic.ttf</file>        <file>AppleSDGothicNeo-Regular.otf</file> diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml index 419ec359a6..dcf2da52f1 100755 --- a/indra/newview/skins/default/xui/en/menu_login.xml +++ b/indra/newview/skins/default/xui/en/menu_login.xml @@ -140,13 +140,6 @@               function="Advanced.ShowDebugSettings"               parameter="all" />          </menu_item_call> -        <menu_item_call -         label="UI/Color Settings" -         name="UI/Color Settings"> -            <menu_item_call.on_click -             function="Advanced.ShowDebugSettings" -             parameter="skin" /> -        </menu_item_call>          <menu_item_separator />          <menu_item_call           label="XUI Preview Tool" diff --git a/indra/newview/skins/default/xui/en/menu_object_icon.xml b/indra/newview/skins/default/xui/en/menu_object_icon.xml index 2d4f1792c2..93093014eb 100755 --- a/indra/newview/skins/default/xui/en/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/en/menu_object_icon.xml @@ -23,6 +23,9 @@          <menu_item_call.on_click           function="ObjectIcon.Action"           parameter="block" /> +        <menu_item_call.on_enable +         function="ObjectIcon.Enable" +         parameter="is_blocked" />      </menu_item_call>      <menu_item_separator       layout="topleft" /> diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml index f12226ebeb..c1500d4e7c 100755 --- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml @@ -143,4 +143,20 @@           function="Avatar.EnableItem"           parameter="can_block" />      </menu_item_check> +    <menu_item_call +         label="Freeze" +         name="freeze"> +        <menu_item_call.on_click +         function="Avatar.Freeze" /> +        <menu_item_call.on_visible +         function="Avatar.EnableFreezeEject"/> +    </menu_item_call> +    <menu_item_call +         label="Eject" +         name="eject"> +        <menu_item_call.on_click +         function="Avatar.Eject" /> +        <menu_item_call.on_visible +         function="Avatar.EnableFreezeEject"/> +    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml index 2d54e69601..44b2727671 100755 --- a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml +++ b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml @@ -27,4 +27,11 @@          <on_click           function="Wearing.Edit" />      </menu_item_call> +    <menu_item_call +     label="Show Original" +     layout="topleft" +     name="show_original"> +        <on_click +         function="Wearing.ShowOriginal" /> +    </menu_item_call>  </context_menu> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index f8e346afb9..589c05de99 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1166,6 +1166,22 @@ Error encoding snapshot.    <notification     icon="alertmodal.tga" +   name="ErrorPhotoCannotAfford" +   type="alertmodal"> +    You need L$[COST] to save a photo to your inventory. You may either buy L$ or save the photo to your computer instead. +    <tag>fail</tag> +  </notification> +   +  <notification +   icon="alertmodal.tga" +   name="ErrorTextureCannotAfford" +   type="alertmodal"> +    You need L$[COST] to save a texture to your inventory. You may either buy L$ or save the photo to your computer instead. +    <tag>fail</tag> +  </notification> + +  <notification +   icon="alertmodal.tga"     name="ErrorUploadingPostcard"     type="alertmodal">  There was a problem sending a snapshot due to the following reason: [REASON] @@ -6908,6 +6924,19 @@ This area has building disabled. You can't build or rez objects here.    </notification>    <notification +   icon="notify.tga" +   name="PathfindingDirtyRebake" +   persist="true" +   type="notify"> +   <unique/> +   The region has pending pathfinding changes.  If you have build rights, you may rebake the region by clicking on the “Rebake region” button. +   <usetemplate +     name="okbutton" +     yestext="Rebake region" +   /> +  </notification> + +  <notification       icon="notify.tga"       name="DynamicPathfindingDisabled"       persist="true" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 3e96160834..4a5117adac 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -138,7 +138,7 @@     initial_value="1"     layout="topleft"     left_pad="0" -   max_val="1.5" +   max_val="2.0"     min_val="0.75"     name="ui_scale_slider"     top_pad="-14"  | 
