diff options
-rw-r--r-- | indra/newview/llpanelmaininventory.cpp | 73 | ||||
-rw-r--r-- | indra/newview/llpanelmaininventory.h | 2 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml | 22 |
3 files changed, 85 insertions, 12 deletions
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 9f0eed2cbe..bdfff9b2ab 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -34,6 +34,7 @@ #include "llpanelmaininventory.h"
#include "lldndbutton.h"
+#include "llfilepicker.h"
#include "llfloaterinventory.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
@@ -45,9 +46,18 @@ #include "llspinctrl.h"
#include "lltooldraganddrop.h"
#include "llviewermenu.h"
+#include "llviewertexturelist.h"
static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); // Seraph is this redundant with constructor?
+void on_file_loaded_for_save(BOOL success,
+ LLViewerFetchedTexture *src_vi,
+ LLImageRaw* src,
+ LLImageRaw* aux_src,
+ S32 discard_level,
+ BOOL final,
+ void* userdata);
+
///----------------------------------------------------------------------------
/// LLFloaterInventoryFinder
///----------------------------------------------------------------------------
@@ -906,6 +916,9 @@ void LLPanelMainInventory::onClipboardAction(const LLSD& userdata) void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
{
+ if (!isActionEnabled(userdata))
+ return;
+
const std::string command_name = userdata.asString();
if (command_name == "new_window")
{
@@ -945,6 +958,25 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata) }
if (command_name == "save_texture")
{
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+
+ 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) )
+ {
+ // User canceled or we failed to acquire save file.
+ return;
+ }
+ // 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()) );
}
}
@@ -971,6 +1003,14 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) return can_delete;
}
}
+ if (command_name == "save_texture")
+ {
+ LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
+ if (current_item)
+ {
+ return (current_item->getListener()->getInventoryType() == LLInventoryType::IT_TEXTURE);
+ }
+ }
return FALSE;
}
@@ -987,3 +1027,36 @@ 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/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index f7b9fd383e..29e9baa6cf 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -89,6 +89,7 @@ protected: void startSearch();
void toggleFindOptions();
+ void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action);
static BOOL filtersVisible(void* user_data);
void onClearSearch();
@@ -121,7 +122,6 @@ protected: void onCustomAction(const LLSD& command_name);
bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
- void onSelectionChange(LLInventoryPanel *panel, const std::deque<LLFolderViewItem*>& items, BOOL user_action);
private:
LLFloaterInventoryFinder* getFinder();
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml index 1592ba7bc7..435a3e6d34 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml @@ -76,15 +76,15 @@ function="Inventory.GearDefault.Custom.Action" parameter="empty_lostnfound" /> </menu_item_call> - <menu_item_call - label="Save Texture As" - layout="topleft" - name="save_texture"> - <on_click - function="Inventory.GearDefault.Custom.Action" - parameter="save_texture" /> - <on_enable - function="Inventory.GearDefault.Enable" - parameter="save_texture" /> - </menu_item_call> + <menu_item_call + label="Save Texture As" + layout="topleft" + name="Save Texture As"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="save_texture" /> + <on_enable + function="Inventory.GearDefault.Enable" + parameter="save_texture" /> + </menu_item_call> </menu> |