diff options
| author | Loren Shih <seraph@lindenlab.com> | 2009-11-06 17:35:05 -0500 | 
|---|---|---|
| committer | Loren Shih <seraph@lindenlab.com> | 2009-11-06 17:35:05 -0500 | 
| commit | 2aa981ac23bbdf2fd609e04434179be0cfec79ce (patch) | |
| tree | fbc2c18218ea6b6994261a5a7a6b7ec59394c7f6 /indra/newview | |
| parent | 98eb085b6439091fa16fb42dfbd3d78839a31240 (diff) | |
EXT-2278 : "Save Texture As" for bottom panel
EXT-2310 : "Save Texture As" for inventory right-click menu
"Save Texture As" now works properly and brings up the texture preview while saving.
Also added "Save Texture As" to the right-click inventory context menu.
--HG--
branch : avatar-pipeline
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 45 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.h | 2 | ||||
| -rw-r--r-- | indra/newview/llpanellandmarks.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llpanellandmarks.h | 2 | ||||
| -rw-r--r-- | indra/newview/llpanelmaininventory.cpp | 51 | ||||
| -rw-r--r-- | indra/newview/llpreviewtexture.cpp | 24 | ||||
| -rw-r--r-- | indra/newview/llpreviewtexture.h | 12 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/menu_inventory.xml | 10 | 
8 files changed, 92 insertions, 56 deletions
| diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index f46bbbe188..9c7be2fcf5 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3086,6 +3086,49 @@ void LLTextureBridge::openItem()  	}
  }
 +void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
 +{
 +	lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;
 +	std::vector<std::string> items;
 +	std::vector<std::string> disabled_items;
 +	if(isInTrash())
 +	{
 +		items.push_back(std::string("Purge Item"));
 +		if (!isItemRemovable())
 +		{
 +			disabled_items.push_back(std::string("Purge Item"));
 +		}
 +
 +		items.push_back(std::string("Restore Item"));
 +	}
 +	else
 +	{
 +		items.push_back(std::string("Open"));
 +		items.push_back(std::string("Properties"));
 +
 +		getClipboardEntries(true, items, disabled_items, flags);
 +
 +		items.push_back(std::string("Texture Separator"));
 +		items.push_back(std::string("Save As"));
 +	}
 +	hide_context_entries(menu, items, disabled_items);	
 +}
 +
 +// virtual
 +void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
 +{
 +	if ("save_as" == action)
 +	{
 +		LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
 +		LLPreviewTexture* preview_texture = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", mUUID);
 +		if (preview_texture)
 +		{
 +			preview_texture->openToSave();
 +		}
 +	}
 +	else LLItemBridge::performAction(folder, model, action);
 +}
 +
  // +=================================================+
  // |        LLSoundBridge                            |
  // +=================================================+
 @@ -3134,7 +3177,7 @@ void LLSoundBridge::openSoundPreview(void* which)  void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
  {
 -	lldebugs << "LLTextureBridge::buildContextMenu()" << llendl;
 +	lldebugs << "LLSoundBridge::buildContextMenu()" << llendl;
  	std::vector<std::string> items;
  	std::vector<std::string> disabled_items;
 diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 3f3513a665..cce06813b7 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -383,6 +383,8 @@ class LLTextureBridge : public LLItemBridge  public:  	virtual LLUIImagePtr getIcon() const;  	virtual void openItem(); +	virtual void buildContextMenu(LLMenuGL& menu, U32 flags); +	virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);  protected:  	LLTextureBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type) : diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 91e1590dc3..cb5f471837 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -265,7 +265,7 @@ LLLandmark* LLLandmarksPanel::getCurSelectedLandmark() const  	return NULL;  } -LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem () const  +LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem() const   {  	return mCurrentSelectedList ?  mCurrentSelectedList->getRootFolder()->getCurSelectedItem() : NULL;  } diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 0e7abb4865..6498f2c778 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -69,7 +69,7 @@ protected:  	bool isLandmarkSelected() const;  	bool isReceivedFolderSelected() const;  	LLLandmark* getCurSelectedLandmark() const; -	LLFolderViewItem* getCurSelectedItem () const; +	LLFolderViewItem* getCurSelectedItem() const;  	void updateSortOrder(LLInventoryPanel* panel, bool byDate);  	//LLRemoteParcelInfoObserver interface diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index bdfff9b2ab..f4c88b9f82 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -41,6 +41,7 @@  #include "llinventorypanel.h"
  #include "llfiltereditor.h"
  #include "llfloaterreg.h"
 +#include "llpreviewtexture.h"
  #include "llscrollcontainer.h"
  #include "llsdserialize.h"
  #include "llspinctrl.h"
 @@ -965,18 +966,11 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)  		}
  		const LLUUID& item_id = current_item->getListener()->getUUID();
 -		LLFilePicker& file_picker = LLFilePicker::instance();
 -		const LLInventoryItem* item = gInventory.getItem(item_id);
 -		if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGA, item ? LLDir::getScrubbedFileName(item->getName()) : LLStringUtil::null) )
 +		LLPreviewTexture* preview_texture = LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", LLSD(item_id), TAKE_FOCUS_YES);
 +		if (preview_texture)
  		{
 -			// User canceled or we failed to acquire save file.
 -			return;
 +			preview_texture->openToSave();
  		}
 -		// remember the user-approved/edited file name.
 -		const LLUUID& asset_id = item->getAssetUUID();
 -		LLPointer<LLViewerFetchedTexture> image = LLViewerTextureManager::getFetchedTexture(asset_id, MIPMAP_TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
 -		image->setLoadedCallback( on_file_loaded_for_save, 
 -								  0, TRUE, FALSE, new std::string(file_picker.getFirstFile()) );
  	}
  }
 @@ -1002,6 +996,7 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)  			}
  			return can_delete;
  		}
 +		return FALSE;
  	}
  	if (command_name == "save_texture")
  	{
 @@ -1010,8 +1005,9 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)  		{
  			return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE);
  		}
 +		return FALSE;
  	}
 -	return FALSE;
 +	return TRUE;
  }
  bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
 @@ -1027,36 +1023,3 @@ bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType  	}
  	return true;
  }
 -
 -void on_file_loaded_for_save(BOOL success, 
 -							 LLViewerFetchedTexture *src_vi,
 -							 LLImageRaw* src, 
 -							 LLImageRaw* aux_src, 
 -							 S32 discard_level,
 -							 BOOL final,
 -							 void* userdata)
 -{
 -	std::string *filename = (std::string*) userdata;
 -
 -	if (final && success)
 -	{
 -		LLPointer<LLImageTGA> image_tga = new LLImageTGA;
 -		if( !image_tga->encode( src ) )
 -		{
 -			LLSD args;
 -			args["FILE"] = *filename;
 -			LLNotifications::instance().add("CannotEncodeFile", args);
 -		}
 -		else if( !image_tga->save( *filename ) )
 -		{
 -			LLSD args;
 -			args["FILE"] = *filename;
 -			LLNotifications::instance().add("CannotWriteFile", args);
 -		}
 -	}
 -	
 -	if(!success )
 -	{
 -		LLNotifications::instance().add("CannotDownloadFile");
 -	}
 -}
 diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 9c21faa3be..6324b0adf9 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -48,6 +48,7 @@  #include "lltextbox.h"  #include "lltextureview.h"  #include "llui.h" +#include "llviewerinventory.h"  #include "llviewertexture.h"  #include "llviewertexturelist.h"  #include "lluictrlfactory.h" @@ -63,7 +64,7 @@ const F32 PREVIEW_TEXTURE_MIN_ASPECT = 0.005f;  LLPreviewTexture::LLPreviewTexture(const LLSD& key) -	: LLPreview( key ), +	: LLPreview(key),  	  mLoadingFullImage( FALSE ),  	  mShowKeepDiscard(FALSE),  	  mCopyToInv(FALSE), @@ -71,7 +72,8 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)  	  mUpdateDimensions(TRUE),  	  mLastHeight(0),  	  mLastWidth(0), -	  mAspectRatio(0.f) +	  mAspectRatio(0.f), +	  mPreviewToSave(FALSE)  {  	const LLInventoryItem *item = getItem();  	if(item) @@ -104,6 +106,10 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key)  		mIsCopyable = TRUE;  	} +	if (key.has("save_as")) +	{ +		mPreviewToSave = TRUE; +	}  	//Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_texture.xml", FALSE);  } @@ -181,6 +187,12 @@ void LLPreviewTexture::draw()  		if ( mImage.notNull() )  		{ +			// Automatically bring up SaveAs dialog if we opened this to save the texture. +			if (mPreviewToSave) +			{ +				mPreviewToSave = FALSE; +				saveAs(); +			}  			// Draw the texture  			glColor3f( 1.f, 1.f, 1.f );  			gl_draw_scaled_image(interior.mLeft, @@ -209,7 +221,7 @@ void LLPreviewTexture::draw()  			if( mLoadingFullImage )  			{ -				LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("Receiving:"), 0, +				LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("Receiving"), 0,  					interior.mLeft + 4,   					interior.mBottom + 4,  					LLColor4::white, LLFontGL::LEFT, LLFontGL::BOTTOM, @@ -304,6 +316,11 @@ void LLPreviewTexture::onFocusReceived()  	LLPreview::onFocusReceived();  } +void LLPreviewTexture::openToSave() +{ +	mPreviewToSave = TRUE; +} +  // static  void LLPreviewTexture::onFileLoadedForSave(BOOL success,   											LLViewerFetchedTexture *src_vi, @@ -356,6 +373,7 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,  	{  		LLNotifications::instance().add("CannotDownloadFile");  	} +  } diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index 520626b49f..9b3c91d831 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -67,8 +67,7 @@ public:  							S32 discard_level,   							BOOL final,  							void* userdata ); - - +	void 				openToSave();  protected:  	void				init();  	/* virtual */ BOOL	postBuild(); @@ -77,14 +76,17 @@ protected:  private:  	void				updateDimensions(); -	LLUUID						mImageID; +	LLUUID				mImageID;  	LLPointer<LLViewerFetchedTexture>		mImage;  	BOOL				mLoadingFullImage;  	std::string			mSaveFileName;  	LLFrameTimer		mSavedFileTimer;  	BOOL                mShowKeepDiscard;  	BOOL                mCopyToInv; -	 + +	// Save the image once it's loaded. +	BOOL                mPreviewToSave; +  	// This is stored off in a member variable, because the save-as  	// button and drag and drop functionality need to know.  	BOOL mIsCopyable; @@ -94,6 +96,4 @@ private:  	F32 mAspectRatio;  	BOOL mUpdateDimensions;  }; - -  #endif  // LL_LLPREVIEWTEXTURE_H diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 62940b87dc..8b6ab4e4d8 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -553,6 +553,16 @@      <menu_item_separator       layout="topleft" />      <menu_item_call +     label="Save As" +     layout="topleft" +     name="Save As"> +        <menu_item_call.on_click +         function="Inventory.DoToSelected" +         parameter="save_as" /> +    </menu_item_call> +    <menu_item_separator +     layout="topleft" /> +    <menu_item_call       label="Detach From Yourself"       layout="topleft"       name="Detach From Yourself"> | 
