diff options
Diffstat (limited to 'indra')
22 files changed, 549 insertions, 495 deletions
| diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index cba8cf85b0..0272c55db2 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -77,72 +77,72 @@ static const S32 CPUINFO_BUFFER_SIZE = 16383;  LLCPUInfo gSysCPU;  #if LL_WINDOWS -#ifndef DLLVERSIONINFO
 -typedef struct _DllVersionInfo
 -{
 -    DWORD cbSize;
 -    DWORD dwMajorVersion;
 -    DWORD dwMinorVersion;
 -    DWORD dwBuildNumber;
 -    DWORD dwPlatformID;
 -}DLLVERSIONINFO;
 -#endif
 -
 -#ifndef DLLGETVERSIONPROC
 -typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
 -#endif
 -
 -bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
 -{
 -	bool result = false;
 -	const U32 BUFF_SIZE = 32767;
 -	WCHAR tempBuf[BUFF_SIZE];
 -	if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
 -	{
 -		
 -		std::basic_string<WCHAR> shell32_path(tempBuf);
 -
 -		// Shell32.dll contains the DLLGetVersion function. 
 -		// according to msdn its not part of the API
 -		// so you have to go in and get it.
 -		// http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
 -		shell32_path += TEXT("\\shell32.dll");
 -
 -		HMODULE hDllInst = LoadLibrary(shell32_path.c_str());   //load the DLL
 -		if(hDllInst) 
 -		{  // Could successfully load the DLL
 -			DLLGETVERSIONPROC pDllGetVersion;
 -			/*
 -			You must get this function explicitly because earlier versions of the DLL
 -			don't implement this function. That makes the lack of implementation of the
 -			function a version marker in itself.
 -			*/
 -			pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst, 
 -																"DllGetVersion");
 -
 -			if(pDllGetVersion) 
 -			{    
 -				// DLL supports version retrieval function
 -				DLLVERSIONINFO    dvi;
 -
 -				ZeroMemory(&dvi, sizeof(dvi));
 -				dvi.cbSize = sizeof(dvi);
 -				HRESULT hr = (*pDllGetVersion)(&dvi);
 -
 -				if(SUCCEEDED(hr)) 
 -				{ // Finally, the version is at our hands
 -					major = dvi.dwMajorVersion;
 -					minor = dvi.dwMinorVersion;
 -					build_number = dvi.dwBuildNumber;
 -					result = true;
 -				} 
 -			} 
 -
 -			FreeLibrary(hDllInst);  // Release DLL
 -		} 
 -	}
 -	return result;
 -}
 +#ifndef DLLVERSIONINFO +typedef struct _DllVersionInfo +{ +    DWORD cbSize; +    DWORD dwMajorVersion; +    DWORD dwMinorVersion; +    DWORD dwBuildNumber; +    DWORD dwPlatformID; +}DLLVERSIONINFO; +#endif + +#ifndef DLLGETVERSIONPROC +typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *); +#endif + +bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number) +{ +	bool result = false; +	const U32 BUFF_SIZE = 32767; +	WCHAR tempBuf[BUFF_SIZE]; +	if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE)) +	{ +		 +		std::basic_string<WCHAR> shell32_path(tempBuf); + +		// Shell32.dll contains the DLLGetVersion function.  +		// according to msdn its not part of the API +		// so you have to go in and get it. +		// http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx +		shell32_path += TEXT("\\shell32.dll"); + +		HMODULE hDllInst = LoadLibrary(shell32_path.c_str());   //load the DLL +		if(hDllInst)  +		{  // Could successfully load the DLL +			DLLGETVERSIONPROC pDllGetVersion; +			/* +			You must get this function explicitly because earlier versions of the DLL +			don't implement this function. That makes the lack of implementation of the +			function a version marker in itself. +			*/ +			pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst,  +																"DllGetVersion"); + +			if(pDllGetVersion)  +			{     +				// DLL supports version retrieval function +				DLLVERSIONINFO    dvi; + +				ZeroMemory(&dvi, sizeof(dvi)); +				dvi.cbSize = sizeof(dvi); +				HRESULT hr = (*pDllGetVersion)(&dvi); + +				if(SUCCEEDED(hr))  +				{ // Finally, the version is at our hands +					major = dvi.dwMajorVersion; +					minor = dvi.dwMinorVersion; +					build_number = dvi.dwBuildNumber; +					result = true; +				}  +			}  + +			FreeLibrary(hDllInst);  // Release DLL +		}  +	} +	return result; +}  #endif // LL_WINDOWS  LLOSInfo::LLOSInfo() : diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 18a8396451..b52b58f9e2 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -50,6 +50,10 @@  #include "llgesturemgr.h"  #include "llappearancemgr.h"  #include "lltexlayer.h" +#include "llsidetray.h" +#include "llpaneloutfitsinventory.h" +#include "llfolderview.h" +#include "llaccordionctrltab.h"  #include <boost/scoped_ptr.hpp> @@ -409,7 +413,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B  			return;  		} -		gAgent.getAvatarObject()->wearableUpdated( type ); +		gAgent.getAvatarObject()->wearableUpdated( type, TRUE );  		if (send_update)  		{ @@ -699,7 +703,7 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl  void LLAgentWearables::wearableUpdated(LLWearable *wearable)  { -	mAvatarObject->wearableUpdated(wearable->getType()); +	mAvatarObject->wearableUpdated(wearable->getType(), TRUE);  	wearable->setLabelUpdated();  	// Hack pt 2. If the wearable we just loaded has definition version 24, @@ -740,7 +744,7 @@ void LLAgentWearables::popWearable(const EWearableType type, U32 index)  	if (wearable)  	{  		mWearableDatas[type].erase(mWearableDatas[type].begin() + index); -		mAvatarObject->wearableUpdated(wearable->getType()); +		mAvatarObject->wearableUpdated(wearable->getType(), TRUE);  		wearable->setLabelUpdated();  	}  } @@ -1296,6 +1300,41 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,  	}   } +class LLAutoRenameFolder: public LLInventoryCallback +{ +public: +	LLAutoRenameFolder(LLUUID& folder_id): +		mFolderID(folder_id) +	{ +	} + +	virtual ~LLAutoRenameFolder() +	{ +		LLSD key; +		LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key); +		LLPanelOutfitsInventory *outfit_panel = +			dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory")); +		if (outfit_panel) +		{ +			outfit_panel->getRootFolder()->clearSelection(); +			outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE); +			outfit_panel->getRootFolder()->setNeedsAutoRename(TRUE); +		} +		LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0; +		if (tab_outfits && !tab_outfits->getDisplayChildren()) +		{ +			tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren()); +		} +	} +	 +	virtual void fire(const LLUUID&) +	{ +	} +	 +private: +	LLUUID mFolderID; +}; +  LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)  {  	if (mAvatarObject.isNull()) @@ -1310,17 +1349,9 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)  		LLFolderType::FT_OUTFIT,  		new_folder_name); -	LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, NULL); +	LLPointer<LLInventoryCallback> cb = new LLAutoRenameFolder(folder_id); +	LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, cb); -#if 0  // BAP - fix to go into rename state automatically after outfit is created. -	LLViewerInventoryCategory *parent_category = gInventory.getCategory(parent_id); -	if (parent_category) -	{ -		parent_category->setSelectionByID(folder_id,TRUE); -		parent_category->setNeedsAutoRename(TRUE); -	} -#endif -  	return folder_id;  } diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 9d05d9de34..5072bc8c82 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -168,6 +168,7 @@ LLFloaterGesture::~LLFloaterGesture()  	LLGestureManager::instance().removeObserver(mObserver);  	delete mObserver;  	mObserver = NULL; +	gInventory.removeObserver(this);  }  // virtual diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index db38fc0fb3..4a2e1913cd 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -107,10 +107,14 @@ LLInventoryPanel* LLFloaterInventory::getPanel()  // static  LLFloaterInventory* LLFloaterInventory::showAgentInventory()  { +	// Hack to generate semi-unique key for each inventory floater. +	static S32 instance_num = 0; +	instance_num = (instance_num + 1) % S32_MAX; +  	LLFloaterInventory* iv = NULL;  	if (!gAgent.cameraMouselook())  	{ -		iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD()); +		iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD(instance_num));  	}  	return iv;  } diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 6e4b3ae214..2d7333f7e4 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -1,96 +1,96 @@ -/** 
 - * @file llimfloatercontainer.cpp
 - * @brief Multifloater containing active IM sessions in separate tab container tabs
 - *
 - * $LicenseInfo:firstyear=2009&license=viewergpl$
 - * 
 - * Copyright (c) 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 "llimfloatercontainer.h"
 -
 -//
 -// LLIMFloaterContainer
 -//
 -LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
 -:	LLMultiFloater(seed),
 -	mActiveVoiceFloater(NULL)
 -{
 -	mAutoResize = FALSE;
 -}
 -
 -LLIMFloaterContainer::~LLIMFloaterContainer()
 -{
 -}
 -
 -BOOL LLIMFloaterContainer::postBuild()
 -{
 -	// Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
 -	// mTabContainer will be initialized in LLMultiFloater::addChild()
 -	return TRUE;
 -}
 -
 -void LLIMFloaterContainer::onOpen(const LLSD& key)
 -{
 -	LLMultiFloater::onOpen(key);
 -/*
 -	if (key.isDefined())
 -	{
 -		LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID());
 -		if (im_floater)
 -		{
 -			im_floater->openFloater();
 -		}
 -	}
 -*/
 -}
 -
 -void LLIMFloaterContainer::addFloater(LLFloater* floaterp, 
 -									BOOL select_added_floater, 
 -									LLTabContainer::eInsertionPoint insertion_point)
 -{
 -	if(!floaterp) return;
 -
 -	// already here
 -	if (floaterp->getHost() == this)
 -	{
 -		openFloater(floaterp->getKey());
 -		return;
 -	}
 -
 -	LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
 -
 -	// make sure active voice icon shows up for new tab
 -	if (floaterp == mActiveVoiceFloater)
 -	{
 -		mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");	
 -	}
 -}
 -
 -// EOF
 +/**  + * @file llimfloatercontainer.cpp + * @brief Multifloater containing active IM sessions in separate tab container tabs + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 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 "llimfloatercontainer.h" + +// +// LLIMFloaterContainer +// +LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed) +:	LLMultiFloater(seed), +	mActiveVoiceFloater(NULL) +{ +	mAutoResize = FALSE; +} + +LLIMFloaterContainer::~LLIMFloaterContainer() +{ +} + +BOOL LLIMFloaterContainer::postBuild() +{ +	// Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button +	// mTabContainer will be initialized in LLMultiFloater::addChild() +	return TRUE; +} + +void LLIMFloaterContainer::onOpen(const LLSD& key) +{ +	LLMultiFloater::onOpen(key); +/* +	if (key.isDefined()) +	{ +		LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID()); +		if (im_floater) +		{ +			im_floater->openFloater(); +		} +	} +*/ +} + +void LLIMFloaterContainer::addFloater(LLFloater* floaterp,  +									BOOL select_added_floater,  +									LLTabContainer::eInsertionPoint insertion_point) +{ +	if(!floaterp) return; + +	// already here +	if (floaterp->getHost() == this) +	{ +		openFloater(floaterp->getKey()); +		return; +	} + +	LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point); + +	// make sure active voice icon shows up for new tab +	if (floaterp == mActiveVoiceFloater) +	{ +		mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");	 +	} +} + +// EOF diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h index 10cde56c6e..ead7cf4730 100644 --- a/indra/newview/llimfloatercontainer.h +++ b/indra/newview/llimfloatercontainer.h @@ -1,61 +1,61 @@ -/** 
 - * @file llimfloatercontainer.h
 - * @brief Multifloater containing active IM sessions in separate tab container tabs
 - *
 - * $LicenseInfo:firstyear=2009&license=viewergpl$
 - * 
 - * Copyright (c) 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_LLIMFLOATERCONTAINER_H
 -#define LL_LLIMFLOATERCONTAINER_H
 -
 -#include "llfloater.h"
 -#include "llmultifloater.h"
 -
 -class LLTabContainer;
 -
 -class LLIMFloaterContainer : public LLMultiFloater
 -{
 -public:
 -	LLIMFloaterContainer(const LLSD& seed);
 -	virtual ~LLIMFloaterContainer();
 -	
 -	/*virtual*/ BOOL postBuild();
 -	/*virtual*/ void onOpen(const LLSD& key);
 -
 -	/*virtual*/ void addFloater(LLFloater* floaterp, 
 -								BOOL select_added_floater, 
 -								LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
 -
 -	static LLFloater* getCurrentVoiceFloater();
 -	
 -protected:
 -	
 -	LLFloater* mActiveVoiceFloater;
 -};
 -
 -#endif // LL_LLIMFLOATERCONTAINER_H
 +/**  + * @file llimfloatercontainer.h + * @brief Multifloater containing active IM sessions in separate tab container tabs + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 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_LLIMFLOATERCONTAINER_H +#define LL_LLIMFLOATERCONTAINER_H + +#include "llfloater.h" +#include "llmultifloater.h" + +class LLTabContainer; + +class LLIMFloaterContainer : public LLMultiFloater +{ +public: +	LLIMFloaterContainer(const LLSD& seed); +	virtual ~LLIMFloaterContainer(); +	 +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void onOpen(const LLSD& key); + +	/*virtual*/ void addFloater(LLFloater* floaterp,  +								BOOL select_added_floater,  +								LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END); + +	static LLFloater* getCurrentVoiceFloater(); +	 +protected: +	 +	LLFloater* mActiveVoiceFloater; +}; + +#endif // LL_LLIMFLOATERCONTAINER_H diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index d216872363..a44ce07d76 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2387,6 +2387,8 @@ void LLFolderBridge::folderOptionsMenu()  	if (is_sidepanel)  	{  		mItems.clear(); +		mItems.push_back("Rename"); +		mItems.push_back("Delete");  	}  	// Only enable calling-card related options for non-default folders. diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 944676ad7a..2d9ea21b5f 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -63,6 +63,15 @@  #include "llsdutil.h"  #include <deque> +LLInventoryObserver::LLInventoryObserver() +{ +} + +// virtual +LLInventoryObserver::~LLInventoryObserver() +{ +} +  void LLInventoryCompletionObserver::changed(U32 mask)  {  	// scan through the incomplete items and move or erase them as diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index 73b25a8ed0..4ee6c48cb1 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -63,7 +63,8 @@ public:  		CALLING_CARD = 32,	// online, grant status, cancel, etc change  		ALL = 0xffffffff  	}; -	virtual ~LLInventoryObserver() {}; +	LLInventoryObserver(); +	virtual ~LLInventoryObserver();  	virtual void changed(U32 mask) = 0;  	std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]  }; diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index fd23b375fa..fd83729630 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -192,6 +192,7 @@ protected:  	//--------------------------------------------------------------------  public:  	BOOL 				getIsViewsInitialized() const { return mViewsInitialized; } +	const LLUUID&		getStartFolderID() const { return mStartFolderID; }  private:  	// Builds the UI.  Call this once the inventory is usable.  	void 				initializeViews(); diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index dafb970b30..413d8ed756 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -264,11 +264,14 @@ void LLLandmarksPanel::updateFilteredAccordions()  		accordion_tab = *iter;  		inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView());  		if (NULL == inventory_list) continue; +		// This doesn't seem to work correctly.  Disabling for now. -Seraph +		/*  		LLFolderView* fv = inventory_list->getRootFolder(); -  		bool has_descendants = fv->hasFilteredDescendants();  		accordion_tab->setVisible(has_descendants); +		*/ +		accordion_tab->setVisible(TRUE);  	}  	// we have to arrange accordion tabs for cases when filter string is less restrictive but @@ -457,6 +460,19 @@ void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLInvento  		mCurrentSelectedList = NULL;  		updateVerbs();  	} + +	// Start background fetch, mostly for My Inventory and Library +	if (expanded) +	{ +		const LLUUID &cat_id = inventory_list->getStartFolderID(); +		// Just because the category itself has been fetched, doesn't mean its child folders have. +		/* +		  if (!gInventory.isCategoryComplete(cat_id)) +		*/ +		{ +			gInventory.startBackgroundFetch(cat_id); +		} +	}  }  void LLLandmarksPanel::deselectOtherThan(const LLInventorySubTreePanel* inventory_list) diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index 5af26c1ad9..951e74abf9 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -144,16 +144,13 @@ void LLPanelOutfitsInventory::onNew()  {  	const std::string& outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT);  	LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name); - -	getRootFolder()->setSelectionByID(outfit_folder, TRUE); -	getRootFolder()->setNeedsAutoRename(TRUE);  }  void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)  {  	updateListCommands();  	updateParent(); -	if (getRootFolder()->needsAutoRename()) +	if (getRootFolder()->needsAutoRename() && items.size())  	{  		getRootFolder()->startRenamingSelectedItem();  		getRootFolder()->setNeedsAutoRename(FALSE); diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index 7769a7d172..aa0ab4efbc 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -65,10 +65,12 @@ public:  	// Otherwise, return NULL.  	LLFolderViewEventListener* getCorrectListenerForAction();  	void setParent(LLSidepanelAppearance *parent); + +	LLFolderView* getRootFolder(); +  protected:  	void updateParent();  	bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const; -	LLFolderView* getRootFolder();  private:  	LLSidepanelAppearance*      mParent; diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp index a90f3ee181..8d3dcf8a99 100644 --- a/indra/newview/lltexlayer.cpp +++ b/indra/newview/lltexlayer.cpp @@ -689,24 +689,24 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )  		}  	} +	LLGLSUIDefault gls_ui; +	LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE); +	gGL.setColorMask(true, true); + +	// clear buffer area to ensure we don't pick up UI elements +	{ +		gGL.flush(); +		LLGLDisable no_alpha(GL_ALPHA_TEST); +		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +		gGL.color4f( 0.f, 0.f, 0.f, 1.f ); + +		gl_rect_2d_simple( width, height ); + +		gGL.flush(); +	} +  	if (mIsVisible)  	{ -		LLGLSUIDefault gls_ui; -		LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE); -		gGL.setColorMask(true, true); -	 -		// clear buffer area to ensure we don't pick up UI elements -		{ -			gGL.flush(); -			LLGLDisable no_alpha(GL_ALPHA_TEST); -			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); -			gGL.color4f( 0.f, 0.f, 0.f, 1.f ); -			 -			gl_rect_2d_simple( width, height ); -			 -			gGL.flush(); -		} -	  		// composite color layers  		for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )  		{ @@ -723,6 +723,21 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )  		stop_glerror();  	} +	else +	{ +		gGL.flush(); + +		gGL.setSceneBlendType(LLRender::BT_REPLACE); +		LLGLDisable no_alpha(GL_ALPHA_TEST); +		gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +		gGL.color4f( 0.f, 0.f, 0.f, 0.f ); + +		gl_rect_2d_simple( width, height ); +		gGL.setSceneBlendType(LLRender::BT_ALPHA); + +		gGL.flush(); + +	}  	return success;  } diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index 266fa4dd74..81dcfb6a4f 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -31,53 +31,37 @@   */  #include "llviewerprecompiledheaders.h" - -#include "message.h"  #include "lltooldraganddrop.h"  // library headers -#include "llfloaterreg.h" -#include "llinstantmessage.h" -#include "lldir.h"  #include "llnotificationsutil.h" -  // project headers  #include "llagent.h" +#include "llagentui.h"  #include "llagentwearables.h" -#include "llviewercontrol.h" +#include "llappearancemgr.h" +#include "lldictionary.h"  #include "llfirstuse.h" -#include "llfloater.h" +#include "llfloaterreg.h"  #include "llfloatertools.h" -#include "llfocusmgr.h"  #include "llgesturemgr.h" -#include "llhudeffecttrail.h"  #include "llhudmanager.h" +#include "llhudeffecttrail.h" +#include "llimview.h"  #include "llinventorybridge.h" -#include "llinventorymodel.h"  #include "llmutelist.h" -#include "llnotify.h"  #include "llpreviewnotecard.h"  #include "llrecentpeople.h" +#include "llrootview.h"  #include "llselectmgr.h"  #include "lltoolmgr.h"  #include "lltooltip.h"  #include "lltrans.h" -#include "llui.h" -#include "llviewertexturelist.h" -#include "llviewerinventory.h" -#include "llviewerobject.h"  #include "llviewerobjectlist.h" -#include "llviewerregion.h"  #include "llviewerstats.h"  #include "llviewerwindow.h"  #include "llvoavatarself.h" -#include "llvolume.h"  #include "llworld.h" -#include "object_flags.h" -#include "llimview.h" -#include "llrootview.h" -#include "llagentui.h" -#include "llappearancemgr.h"  // MAX ITEMS is based on (sizeof(uuid)+2) * count must be < MTUBYTES  // or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a @@ -358,134 +342,51 @@ void LLCategoryDropDescendentsObserver::done()  	delete this;  } -// This array is used to more easily control what happens when a 3d -// drag and drop event occurs. Since there's an array of drop target -// and cargo type, it's implemented as an array of pointers to member -// functions which correctly carry out the actual drop. -LLToolDragAndDrop::dragOrDrop3dImpl LLToolDragAndDrop::sDragAndDrop3d[DAD_COUNT][LLToolDragAndDrop::DT_COUNT] = -{ -	//	Source: DAD_NONE -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND -	}, -	//	Source: DAD_TEXTURE -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dTextureObject, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_SOUND -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_CALLINGCARD -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND -	}, -	//	Source: DAD_LANDMARK -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_SCRIPT -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dRezScript, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_CLOTHING -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dWearItem, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_OBJECT -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dRezAttachmentFromInv, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventoryObject, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dRezObjectOnObject, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dRezObjectOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_NOTECARD -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_CATEGORY -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dWearCategory, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventoryCategory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dUpdateInventoryCategory, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dCategoryOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_ROOT -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND -	}, -	//	Source: DAD_BODYPART -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dWearItem, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_ANIMATION -	// TODO: animation on self could play it?  edit it? +LLToolDragAndDrop::DragAndDropEntry::DragAndDropEntry(dragOrDrop3dImpl f_none, +													  dragOrDrop3dImpl f_self, +													  dragOrDrop3dImpl f_avatar, +													  dragOrDrop3dImpl f_object, +													  dragOrDrop3dImpl f_land) : +	LLDictionaryEntry("") +{ +	mFunctions[DT_NONE] = f_none; +	mFunctions[DT_SELF] = f_self; +	mFunctions[DT_AVATAR] = f_avatar; +	mFunctions[DT_OBJECT] = f_object; +	mFunctions[DT_LAND] = f_land; +} + +LLToolDragAndDrop::dragOrDrop3dImpl LLToolDragAndDrop::LLDragAndDropDictionary::get(EDragAndDropType dad_type, LLToolDragAndDrop::EDropTarget drop_target) +{ +	const DragAndDropEntry *entry = lookup(dad_type); +	if (entry)  	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_GESTURE +		return (entry->mFunctions[(U8)drop_target]); +	} +	return &dad3dNULL; +} + +LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary() +{ + 	//       										 DT_NONE        DT_SELF                     DT_AVATAR                   DT_OBJECT                       DT_LAND		 +	//      										|--------------|---------------------------|---------------------------|-------------------------------|--------------| +	addEntry(DAD_NONE, 			new DragAndDropEntry(&dad3dNULL,	&dad3dNULL,					&dad3dNULL,					&dad3dNULL,						&dad3dNULL)); +	addEntry(DAD_TEXTURE, 		new DragAndDropEntry(&dad3dNULL,	&dad3dNULL,					&dad3dGiveInventory,		&dad3dTextureObject,			&dad3dNULL)); +	addEntry(DAD_SOUND, 		new DragAndDropEntry(&dad3dNULL,	&dad3dNULL,					&dad3dGiveInventory,		&dad3dUpdateInventory,			&dad3dNULL)); +	addEntry(DAD_CALLINGCARD, 	new DragAndDropEntry(&dad3dNULL,	&dad3dNULL,					&dad3dGiveInventory, 		&dad3dUpdateInventory, 			&dad3dNULL)); +	addEntry(DAD_LANDMARK, 		new DragAndDropEntry(&dad3dNULL, 	&dad3dNULL, 				&dad3dGiveInventory, 		&dad3dUpdateInventory, 			&dad3dNULL)); +	addEntry(DAD_SCRIPT, 		new DragAndDropEntry(&dad3dNULL, 	&dad3dNULL, 				&dad3dGiveInventory, 		&dad3dRezScript, 				&dad3dNULL)); +	addEntry(DAD_CLOTHING, 		new DragAndDropEntry(&dad3dNULL, 	&dad3dWearItem, 			&dad3dGiveInventory, 		&dad3dUpdateInventory, 			&dad3dNULL)); +	addEntry(DAD_OBJECT, 		new DragAndDropEntry(&dad3dNULL, 	&dad3dRezAttachmentFromInv,	&dad3dGiveInventoryObject,	&dad3dRezObjectOnObject, 		&dad3dRezObjectOnLand)); +	addEntry(DAD_NOTECARD, 		new DragAndDropEntry(&dad3dNULL, 	&dad3dNULL, 				&dad3dGiveInventory, 		&dad3dUpdateInventory, 			&dad3dNULL)); +	addEntry(DAD_CATEGORY, 		new DragAndDropEntry(&dad3dNULL, 	&dad3dWearCategory,			&dad3dGiveInventoryCategory,&dad3dUpdateInventoryCategory,	&dad3dNULL)); +	addEntry(DAD_ROOT_CATEGORY, new DragAndDropEntry(&dad3dNULL,	&dad3dNULL,					&dad3dNULL,					&dad3dNULL,						&dad3dNULL)); +	addEntry(DAD_BODYPART, 		new DragAndDropEntry(&dad3dNULL,	&dad3dWearItem,				&dad3dGiveInventory,		&dad3dUpdateInventory,			&dad3dNULL)); +	addEntry(DAD_ANIMATION, 	new DragAndDropEntry(&dad3dNULL,	&dad3dNULL,					&dad3dGiveInventory,		&dad3dUpdateInventory,			&dad3dNULL)); +	addEntry(DAD_GESTURE, 		new DragAndDropEntry(&dad3dNULL,	&dad3dActivateGesture,		&dad3dGiveInventory,		&dad3dUpdateInventory,			&dad3dNULL)); +	addEntry(DAD_LINK, 			new DragAndDropEntry(&dad3dNULL,	&dad3dNULL,					&dad3dNULL,					&dad3dNULL,						&dad3dNULL)); +	// TODO: animation on self could play it?  edit it?  	// TODO: gesture on self could play it?  edit it? -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dActivateGesture, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND -	}, -	//	Source: DAD_LINK -	{ -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR -		&LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT -		&LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND -	},  };  LLToolDragAndDrop::LLToolDragAndDrop() @@ -928,7 +829,7 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep  	if (mDrop)  	{  		// don't allow drag and drop onto transparent objects -		pickCallback(gViewerWindow->pickImmediate(x, y, FALSE)); +		pick(gViewerWindow->pickImmediate(x, y, FALSE));  	}  	else  	{ @@ -941,6 +842,14 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep  void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)  { +	if (getInstance() != NULL) +	{ +		getInstance()->pick(pick_info); +	} +} + +void LLToolDragAndDrop::pick(const LLPickInfo& pick_info) +{  	EDropTarget target = DT_NONE;  	S32	hit_face = -1; @@ -948,31 +857,30 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)  	LLSelectMgr::getInstance()->unhighlightAll();  	// Treat attachments as part of the avatar they are attached to. -	if (hit_obj) +	if (hit_obj != NULL)  	{  		// don't allow drag and drop on grass, trees, etc. -		if(pick_info.mPickType == LLPickInfo::PICK_FLORA) +		if (pick_info.mPickType == LLPickInfo::PICK_FLORA)  		{ -			LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NO; -			gViewerWindow->getWindow()->setCursor( LLToolDragAndDrop::getInstance()->mCursor ); +			mCursor = UI_CURSOR_NO; +			gViewerWindow->getWindow()->setCursor( mCursor );  			return;  		} -		if(hit_obj->isAttachment() && !hit_obj->isHUDAttachment()) +		if (hit_obj->isAttachment() && !hit_obj->isHUDAttachment())  		{  			LLVOAvatar* avatar = LLVOAvatar::findAvatarFromAttachment( hit_obj );  			if( !avatar )  			{ -				LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_NO; -				LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NO; -				gViewerWindow->getWindow()->setCursor( LLToolDragAndDrop::getInstance()->mCursor ); +				mLastAccept = ACCEPT_NO; +				mCursor = UI_CURSOR_NO; +				gViewerWindow->getWindow()->setCursor( mCursor );  				return;  			} -			  			hit_obj = avatar;  		} -		if(hit_obj->isAvatar()) +		if (hit_obj->isAvatar())  		{  			if(((LLVOAvatar*) hit_obj)->isSelf())  			{ @@ -991,9 +899,9 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)  			hit_face = pick_info.mObjectFace;  			// if any item being dragged will be applied to the object under our cursor  			// highlight that object -			for (S32 i = 0; i < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size(); i++) +			for (S32 i = 0; i < (S32)mCargoIDs.size(); i++)  			{ -				if (LLToolDragAndDrop::getInstance()->mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL)) +				if (mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL))  				{  					LLSelectMgr::getInstance()->highlightObjectAndFamily(hit_obj);  					break; @@ -1001,55 +909,54 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)  			}  		}  	} -	else if(pick_info.mPickType == LLPickInfo::PICK_LAND) +	else if (pick_info.mPickType == LLPickInfo::PICK_LAND)  	{  		target = DT_LAND;  		hit_face = -1;  	} -	LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_YES_MULTI; +	mLastAccept = ACCEPT_YES_MULTI; -	for (LLToolDragAndDrop::getInstance()->mCurItemIndex = 0; LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size();  -		LLToolDragAndDrop::getInstance()->mCurItemIndex++) +	for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)  	{ +		const S32 item_index = mCurItemIndex; +		const EDragAndDropType dad_type = mCargoTypes[item_index];  		// Call the right implementation function -		LLToolDragAndDrop::getInstance()->mLastAccept = (EAcceptance)llmin( -			(U32)LLToolDragAndDrop::getInstance()->mLastAccept, -			(U32)callMemberFunction((*LLToolDragAndDrop::getInstance()),  -				LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target]) -				(hit_obj, hit_face, pick_info.mKeyMask, FALSE)); +		mLastAccept = (EAcceptance)llmin( +			(U32)mLastAccept, +			(U32)callMemberFunction(*this,  +									LLDragAndDropDictionary::instance().get(dad_type, target)) +			(hit_obj, hit_face, pick_info.mKeyMask, FALSE));  	} -	if (LLToolDragAndDrop::getInstance()->mDrop && -	    (U32)LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_SINGLE) +	if (mDrop && ((U32)mLastAccept >= ACCEPT_YES_COPY_SINGLE))  	{  		// if target allows multi-drop or there is only one item being dropped, go ahead -		if (LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_MULTI || -		    LLToolDragAndDrop::getInstance()->mCargoIDs.size() == 1) +		if ((mLastAccept >= ACCEPT_YES_COPY_MULTI) || (mCargoIDs.size() == 1))  		{  			// Target accepts multi, or cargo is a single-drop -			for (LLToolDragAndDrop::getInstance()->mCurItemIndex = 0; -			     LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size();  -			     LLToolDragAndDrop::getInstance()->mCurItemIndex++) +			for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)  			{ +				const S32 item_index = mCurItemIndex; +				const EDragAndDropType dad_type = mCargoTypes[item_index];  				// Call the right implementation function -				(U32)callMemberFunction((*LLToolDragAndDrop::getInstance()),  -							LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target]) +				(U32)callMemberFunction(*this, +										LLDragAndDropDictionary::instance().get(dad_type, target))  					(hit_obj, hit_face, pick_info.mKeyMask, TRUE);  			}  		}  		else  		{  			// Target does not accept multi, but cargo is multi -			LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_NO; +			mLastAccept = ACCEPT_NO;  		}  	} -	ECursorType cursor = LLToolDragAndDrop::getInstance()->acceptanceToCursor( LLToolDragAndDrop::getInstance()->mLastAccept ); +	ECursorType cursor = acceptanceToCursor( mLastAccept );  	gViewerWindow->getWindow()->setCursor( cursor ); -	LLToolDragAndDrop::getInstance()->mLastHitPos = pick_info.mPosGlobal; -	LLToolDragAndDrop::getInstance()->mLastCameraPos = gAgent.getCameraPositionGlobal(); +	mLastHitPos = pick_info.mPosGlobal; +	mLastCameraPos = gAgent.getCameraPositionGlobal();  }  // static @@ -1923,10 +1830,11 @@ BOOL LLToolDragAndDrop::isInventoryGroupGiveAcceptable(LLInventoryItem* item)  EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item)  {  	// check the basics -	if(!item || !obj) return ACCEPT_NO; +	if (!item || !obj) return ACCEPT_NO;  	// HACK: downcast  	LLViewerInventoryItem* vitem = (LLViewerInventoryItem*)item; -	if(!vitem->isComplete()) return ACCEPT_NO; +	if (!vitem->isComplete()) return ACCEPT_NO; +	if (vitem->getIsLinkType()) return ACCEPT_NO; // No giving away links  	// deny attempts to drop from an object onto itself. This is to  	// help make sure that drops that are from an object to an object @@ -1936,7 +1844,7 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL  	{  		return ACCEPT_NO;  	} - +	  	//BOOL copy = (perm.allowCopyBy(gAgent.getID(),  	//							  gAgent.getGroupID())  	//			 && (obj->mPermModify || obj->mFlagAllowInventoryAdd)); @@ -2575,24 +2483,30 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(  	LLViewerObject* obj, S32 face, MASK mask, BOOL drop)  {  	lldebugs << "LLToolDragAndDrop::dad3dUpdateInventoryCategory()" << llendl; -	if (NULL==obj) +	if (obj == NULL)  	{  		llwarns << "obj is NULL; aborting func with ACCEPT_NO" << llendl;  		return ACCEPT_NO;  	} -	if (mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY) +	if ((mSource != SOURCE_AGENT) && (mSource != SOURCE_LIBRARY))  	{  		return ACCEPT_NO;  	} -	if(obj->isAttachment()) return ACCEPT_NO_LOCKED; -	LLViewerInventoryItem* item; -	LLViewerInventoryCategory* cat; +	if (obj->isAttachment()) +	{ +		return ACCEPT_NO_LOCKED; +	} + +	LLViewerInventoryItem* item = NULL; +	LLViewerInventoryCategory* cat = NULL;  	locateInventory(item, cat); -	if(!cat) return ACCEPT_NO; -	EAcceptance rv = ACCEPT_NO; +	if (!cat)  +	{ +		return ACCEPT_NO; +	} -	// find all the items in the category +	// Find all the items in the category  	LLDroppableItem droppable(!obj->permYouOwner());  	LLInventoryModel::cat_array_t cats;  	LLInventoryModel::item_array_t items; @@ -2602,7 +2516,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(  					LLInventoryModel::EXCLUDE_TRASH,  					droppable);  	cats.put(cat); - 	if(droppable.countNoCopy() > 0) + 	if (droppable.countNoCopy() > 0)   	{   		llwarns << "*** Need to confirm this step" << llendl;   	} @@ -2616,46 +2530,57 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(  		}  	} +	EAcceptance rv = ACCEPT_NO; +  	// Check for accept -	S32 i; -	S32 count = cats.count(); -	for(i = 0; i < count; ++i) +	for (LLInventoryModel::cat_array_t::const_iterator cat_iter = cats.begin(); +		 cat_iter != cats.end(); +		 ++cat_iter)  	{ -		rv = gInventory.isCategoryComplete(cats.get(i)->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO; +		const LLViewerInventoryCategory *cat = (*cat_iter); +		rv = gInventory.isCategoryComplete(cat->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO;  		if(rv < ACCEPT_YES_SINGLE)  		{ -			lldebugs << "Category " << cats.get(i)->getUUID() -					 << "is not complete." << llendl; +			lldebugs << "Category " << cat->getUUID() << "is not complete." << llendl;  			break;  		}  	} -	if(ACCEPT_YES_COPY_SINGLE <= rv) +	if (ACCEPT_YES_COPY_SINGLE <= rv)  	{ -		count = items.count(); -		for(i = 0; i < count; ++i) +		for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin(); +			 item_iter != items.end(); +			 ++item_iter)  		{ -			rv = willObjectAcceptInventory(root_object, items.get(i)); -			if(rv < ACCEPT_YES_COPY_SINGLE) +			LLViewerInventoryItem *item = (*item_iter); +			/* +			// Pass the base objects, not the links. +			if (item && item->getIsLinkType()) +			{ +				item = item->getLinkedItem(); +				(*item_iter) = item; +			} +			*/ +			rv = willObjectAcceptInventory(root_object, item); +			if (rv < ACCEPT_YES_COPY_SINGLE)  			{ -				lldebugs << "Object will not accept " -						 << items.get(i)->getUUID() << llendl; +				lldebugs << "Object will not accept " << item->getUUID() << llendl;  				break;  			}  		}  	} -	// if every item is accepted, go ahead and send it on. -	if(drop && (ACCEPT_YES_COPY_SINGLE <= rv)) +	// If every item is accepted, send it on +	if (drop && (ACCEPT_YES_COPY_SINGLE <= rv))  	{ -		S32 count = items.count();  		LLInventoryFetchObserver::item_ref_t ids; -		for(i = 0; i < count; ++i) +		for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin(); +			 item_iter != items.end(); +			 ++item_iter)  		{ -			//dropInventory(root_object, items.get(i), mSource, mSourceID); -			ids.push_back(items.get(i)->getUUID()); +			const LLViewerInventoryItem *item = (*item_iter); +			ids.push_back(item->getUUID());  		} -		LLCategoryDropObserver* dropper; -		dropper = new LLCategoryDropObserver(obj->getID(), mSource); +		LLCategoryDropObserver* dropper = new LLCategoryDropObserver(obj->getID(), mSource);  		dropper->fetchItems(ids);  		if(dropper->isEverythingComplete())  		{ diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index e1536acf75..79b2bc32a3 100644 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -33,6 +33,7 @@  #ifndef LL_TOOLDRAGANDDROP_H  #define LL_TOOLDRAGANDDROP_H +#include "lldictionary.h"  #include "lltool.h"  #include "llview.h"  #include "lluuid.h" @@ -102,6 +103,7 @@ protected:  		DT_COUNT = 5  	}; +protected:  	// dragOrDrop3dImpl points to a member of LLToolDragAndDrop that  	// takes parameters (LLViewerObject* obj, S32 face, MASK, BOOL  	// drop) and returns a BOOL if drop is ok @@ -112,7 +114,9 @@ protected:  					EAcceptance* acceptance);  	void dragOrDrop3D(S32 x, S32 y, MASK mask, BOOL drop,  					  EAcceptance* acceptance); +	  	static void pickCallback(const LLPickInfo& pick_info); +	void pick(const LLPickInfo& pick_info);  protected: @@ -137,10 +141,6 @@ protected:  	enddrag_signal_t	mEndDragSignal; -	// array of pointers to functions that implement the logic to -	// dragging and dropping into the simulator. -	static dragOrDrop3dImpl sDragAndDrop3d[DAD_COUNT][DT_COUNT]; -  protected:  	// 3d drop functions. these call down into the static functions  	// named drop<ThingToDrop> if drop is TRUE and permissions allow @@ -272,6 +272,25 @@ public:  									  EDragAndDropType cargo_type,  									  void* cargo_data,  									  EAcceptance* accept); + +	// Classes used for determining 3d drag and drop types. +private: +	struct DragAndDropEntry : public LLDictionaryEntry +	{ +		DragAndDropEntry(dragOrDrop3dImpl f_none, +						 dragOrDrop3dImpl f_self, +						 dragOrDrop3dImpl f_avatar, +						 dragOrDrop3dImpl f_object, +						 dragOrDrop3dImpl f_land); +		dragOrDrop3dImpl mFunctions[DT_COUNT]; +	};	 +	class LLDragAndDropDictionary : public LLSingleton<LLDragAndDropDictionary>, +									public LLDictionary<EDragAndDropType, DragAndDropEntry> +	{ +	public: +		LLDragAndDropDictionary(); +		dragOrDrop3dImpl get(EDragAndDropType dad_type, EDropTarget drop_target); +	};  };  // utility functions diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 9882dcd6af..a9194c0c3b 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3621,6 +3621,16 @@ void LLVOAvatar::updateVisibility()  	mVisible = visible;  } +// private +bool LLVOAvatar::shouldAlphaMask() +{ +	const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked +							&& !LLDrawPoolAvatar::sSkipTransparent; + +	return should_alpha_mask; + +} +  //-----------------------------------------------------------------------------  // renderSkinned()  //----------------------------------------------------------------------------- @@ -3754,9 +3764,8 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)  	if (pass == AVATAR_RENDER_PASS_SINGLE)  	{ -		const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked -								&& !LLDrawPoolAvatar::sSkipTransparent; +		bool should_alpha_mask = shouldAlphaMask();  		LLGLState test(GL_ALPHA_TEST, should_alpha_mask);  		if (should_alpha_mask) @@ -3825,6 +3834,15 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)  			gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);  		} +		bool should_alpha_mask = shouldAlphaMask(); + +		LLGLState test(GL_ALPHA_TEST, should_alpha_mask); + +		if (should_alpha_mask) +		{ +			gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); +		} +  		if (isTextureVisible(TEX_HEAD_BAKED))  		{  			num_indices += mMeshLOD[MESH_ID_EYELASH]->render(mAdjustedPixelArea, first_pass, mIsDummy); @@ -3868,11 +3886,21 @@ U32 LLVOAvatar::renderRigid()  		return 0;  	} +	bool should_alpha_mask = shouldAlphaMask(); +	LLGLState test(GL_ALPHA_TEST, should_alpha_mask); + +	if (should_alpha_mask) +	{ +		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); +	} +  	if (isTextureVisible(TEX_EYES_BAKED)  || mIsDummy)  	{  		num_indices += mMeshLOD[MESH_ID_EYEBALL_LEFT]->render(mAdjustedPixelArea, TRUE, mIsDummy);  		num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy);  	} + +	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);  	return num_indices;  } @@ -5943,6 +5971,9 @@ void LLVOAvatar::updateMeshTextures()  	} +	// Turn on alpha masking correctly for yourself and other avatars on 1.23+ +	mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR]; +  	// Baked textures should be requested from the sim this avatar is on. JC  	const LLHost target_host = getObjectHost();  	if (!target_host.isOk()) @@ -5981,7 +6012,7 @@ void LLVOAvatar::updateMeshTextures()  		}  		else if (mBakedTextureDatas[i].mTexLayerSet   				 && !other_culled  -				 && (i != BAKED_HAIR || is_layer_baked[i] || isSelf())) // ! BACKWARDS COMPATIBILITY ! workaround for old viewers. +				 && (i != BAKED_HAIR || mSupportsAlphaLayers)) // ! BACKWARDS COMPATIBILITY ! workaround for old viewers.  		{  			mBakedTextureDatas[i].mTexLayerSet->createComposite();  			mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( TRUE ); @@ -5992,10 +6023,10 @@ void LLVOAvatar::updateMeshTextures()  			}  		}  	} -	 +  	// ! BACKWARDS COMPATIBILITY !  	// Workaround for viewing avatars from old viewers that haven't baked hair textures. -	if (!is_layer_baked[BAKED_HAIR] || self_customizing) +	if (!mSupportsAlphaLayers)  	{  		const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1);  		LLViewerTexture* hair_img = getImage( TEX_HAIR, 0 ); @@ -6006,8 +6037,6 @@ void LLVOAvatar::updateMeshTextures()  		}  	}  -	// Turn on alpha masking correctly for yourself and other avatars on 1.23+ -	mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR];  	for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();  		 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); @@ -6510,7 +6539,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )  	} -	if( !mFirstTEMessageReceived ) +	if( !is_first_appearance_message )  	{  		onFirstTEMessageReceived();  	} diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 4b3e850e7a..a5815df20a 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -347,6 +347,8 @@ public:  	BOOL 		mIsDummy; // for special views  	S32			mSpecialRenderMode; // special lighting  private: +	bool		shouldAlphaMask(); +  	BOOL 		mNeedsSkin; // avatar has been animated and verts have not been updated  	S32	 		mUpdatePeriod;  	S32  		mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer. diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index f3e787ae7e..7d6401acde 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -918,9 +918,9 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)  //-----------------------------------------------------------------------------  // updatedWearable( EWearableType type )  // forces an update to any baked textures relevant to type. -// Should be called only on saving the wearable +// will force an upload of the resulting bake if the second parameter is TRUE  //----------------------------------------------------------------------------- -void LLVOAvatarSelf::wearableUpdated( EWearableType type ) +void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result )  {  	for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();  		 baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end(); @@ -939,7 +939,7 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type )  				{  					if (mBakedTextureDatas[index].mTexLayerSet)  					{ -						invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, TRUE); +						invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, upload_result);  					}  					break;  				} diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index e376e5e9ef..6bf4ef5496 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -270,7 +270,7 @@ protected:  public:  	/*virtual*/ BOOL	isWearingWearableType(EWearableType type) const; -	void				wearableUpdated(EWearableType type); +	void				wearableUpdated(EWearableType type, BOOL upload_result);  protected:  	U32 getNumWearables(LLVOAvatarDefines::ETextureIndex i) const; diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp index 807434c397..3cb0ec4bad 100644 --- a/indra/newview/llwearable.cpp +++ b/indra/newview/llwearable.cpp @@ -704,7 +704,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake )  	}  	avatar->updateVisualParams(); -	avatar->wearableUpdated(type); +	avatar->wearableUpdated(type, TRUE);  //	if( upload_bake )  //	{ diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml index dca1692e4a..ff9f0daee6 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory.xml @@ -11,7 +11,7 @@   help_topic="inventory"   save_rect="true"   save_visibility="true" - single_instance="true" + single_instance="false"   title="INVENTORY"   width="467">      <floater.string | 
