From 96345c7420a38ce6cf385bac644d5d243ff17395 Mon Sep 17 00:00:00 2001 From: Loren Shih Date: Thu, 5 Nov 2009 21:51:35 -0500 Subject: EXT-2278 : "Save Texture As" for bottom panel --HG-- branch : avatar-pipeline --- indra/newview/llpanelmaininventory.cpp | 73 ++++++++++++++++++++++ indra/newview/llpanelmaininventory.h | 2 +- .../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 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 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 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& 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& 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" /> - - - - + + + + -- cgit v1.2.3