diff options
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 11 | ||||
| -rw-r--r-- | indra/newview/llinventorybridge.cpp | 36 | ||||
| -rw-r--r-- | indra/newview/llinventoryfunctions.cpp | 31 | ||||
| -rw-r--r-- | indra/newview/llinventoryfunctions.h | 2 | ||||
| -rw-r--r-- | indra/newview/llpreviewtexture.cpp | 39 | ||||
| -rw-r--r-- | indra/newview/llpreviewtexture.h | 1 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/menu_inventory.xml | 8 | 
7 files changed, 123 insertions, 5 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 52dc4744f2..96da0743a4 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12641,6 +12641,17 @@        <key>Value</key>        <integer>50</integer>      </map> +    <key>TextureSaveLocation</key> +    <map> +      <key>Comment</key> +      <string>Current location for bulk saving textures to disk</string> +      <key>Persist</key> +      <integer>0</integer> +      <key>Type</key> +      <string>String</string> +      <key>Value</key> +      <string /> +    </map>      <key>ThrottleBandwidthKBPS</key>      <map>        <key>Comment</key> diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 539d80532c..8fbc3c52ab 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -5469,11 +5469,20 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)  		getClipboardEntries(true, items, disabled_items, flags);  		items.push_back(std::string("Texture Separator")); -		items.push_back(std::string("Save As")); -		if (!canSaveTexture()) -		{ -			disabled_items.push_back(std::string("Save As")); -		} +		 +        if ((flags & ITEM_IN_MULTI_SELECTION) != 0) +        { +            items.push_back(std::string("Save Selected As")); +        } +        else +        { +            items.push_back(std::string("Save As")); +            if (!canSaveTexture()) +            { +                disabled_items.push_back(std::string("Save As")); +            } +        } +  	}  	addLinkReplaceMenuOption(items, disabled_items);  	hide_context_entries(menu, items, disabled_items);	 @@ -5491,6 +5500,23 @@ void LLTextureBridge::performAction(LLInventoryModel* model, std::string action)  			preview_texture->saveAs();  		}  	} +    else if ("save_selected_as" == action) +    { +        openItem(); +        if (canSaveTexture()) +        { +            LLPreviewTexture* preview_texture = LLFloaterReg::getTypedInstance<LLPreviewTexture>("preview_texture", mUUID); +            if (preview_texture) +            { +                preview_texture->saveMultipleToFile(); +            } +        } +        else +        { +            LL_WARNS() << "You don't have permission to save " << getName() << " to disk." << LL_ENDL; +        } + +    }  	else LLItemBridge::performAction(model, action);  } diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 646d92b9e1..9f54feb3d7 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -47,6 +47,7 @@  #include "llappviewer.h"  #include "llavataractions.h"  #include "llclipboard.h" +#include "lldirpicker.h"  #include "lldonotdisturbnotificationstorage.h"  #include "llfloatersidepanelcontainer.h"  #include "llfocusmgr.h" @@ -2444,6 +2445,10 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root      {          LLAppearanceMgr::instance().removeItemsFromAvatar(ids);      } +    else if ("save_selected_as" == action) +    { +        (new LLDirPickerThread(boost::bind(&LLInventoryAction::saveMultipleTextures, _1, selected_items, model), std::string()))->getFile(); +    }      else      {          std::set<LLFolderViewItem*>::iterator set_iter; @@ -2471,6 +2476,32 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root  	}  } +void LLInventoryAction::saveMultipleTextures(const std::vector<std::string>& filenames, std::set<LLFolderViewItem*> selected_items, LLInventoryModel* model) +{ +    gSavedSettings.setString("TextureSaveLocation", filenames[0]); +  +    LLMultiPreview* multi_previewp = new LLMultiPreview(); +    gFloaterView->addChild(multi_previewp); + +    LLFloater::setFloaterHost(multi_previewp); + +    std::set<LLFolderViewItem*>::iterator set_iter; +    for (set_iter = selected_items.begin(); set_iter != selected_items.end(); ++set_iter) +    { +        LLFolderViewItem* folder_item = *set_iter; +        if(!folder_item) continue; +        LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getViewModelItem(); +        if(!bridge) continue; +        bridge->performAction(model, "save_selected_as"); +    } + +    LLFloater::setFloaterHost(NULL); +    if (multi_previewp) +    { +        multi_previewp->openFloater(LLSD()); +    } +} +  void LLInventoryAction::removeItemFromDND(LLFolderView* root)  {      if(gAgent.isDoNotDisturb()) diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h index fd106bc2d8..75db1efba8 100644 --- a/indra/newview/llinventoryfunctions.h +++ b/indra/newview/llinventoryfunctions.h @@ -462,6 +462,8 @@ struct LLInventoryAction  	static void onItemsRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle<LLFolderView> root);  	static void removeItemFromDND(LLFolderView* root); +    static void saveMultipleTextures(const std::vector<std::string>& filenames, std::set<LLFolderViewItem*> selected_items, LLInventoryModel* model); +  	static const int sConfirmOnDeleteItemsNumber;  private: diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 9d8be4b2fe..303034ca3d 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -50,6 +50,7 @@  #include "llviewertexture.h"  #include "llviewertexturelist.h"  #include "lluictrlfactory.h" +#include "llviewercontrol.h"  #include "llviewerwindow.h"  #include "lllineeditor.h" @@ -317,6 +318,44 @@ void LLPreviewTexture::saveTextureToFile(const std::vector<std::string>& filenam  		0, TRUE, FALSE, new LLUUID(mItemUUID), &mCallbackTextureList);  } + +void LLPreviewTexture::saveMultipleToFile() +{ +    std::string texture_location(gSavedSettings.getString("TextureSaveLocation"));	 +    std::string texture_name = getItem()->getName(); +     +    std::string filepath; +    S32 i = 0; +    S32 err = 0; +    std::string extension(".png"); +    do +    { +        filepath = texture_location; +        filepath += gDirUtilp->getDirDelimiter(); +        filepath += texture_name; + +        if (i != 0) +        { +            filepath += llformat("_%.3d", i); +        } + +        filepath += extension; + +        llstat stat_info; +        err = LLFile::stat( filepath, &stat_info ); +        i++; +    } while (-1 != err);  // Search until the file is not found (i.e., stat() gives an error). +     +     +    mSaveFileName = filepath; +    mLoadingFullImage = TRUE; +    getWindow()->incBusyCount(); + +    mImage->forceToSaveRawImage(0);//re-fetch the raw image if the old one is removed. +    mImage->setLoadedCallback(LLPreviewTexture::onFileLoadedForSave, +        0, TRUE, FALSE, new LLUUID(mItemUUID), &mCallbackTextureList); +} +  // virtual  void LLPreviewTexture::reshape(S32 width, S32 height, BOOL called_from_parent)  { diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index ad77d9e118..cc6c7854b6 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -63,6 +63,7 @@ public:  	void 				openToSave();  	void				saveTextureToFile(const std::vector<std::string>& filenames); +    void                saveMultipleToFile();  	static void			onSaveAsBtn(void* data); diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 9aa84c1bac..71a780bf7e 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -807,6 +807,14 @@           function="Inventory.DoToSelected"           parameter="save_as" />      </menu_item_call> +  <menu_item_call + label="Save Selected As" + layout="topleft" + name="Save Selected As"> +    <menu_item_call.on_click +     function="Inventory.DoToSelected" +     parameter="save_selected_as" /> +  </menu_item_call>      <menu_item_separator       layout="topleft"        name="Wearable And Object Separator"/> | 
