From e5f2d5f76eb5df66d39008fa8ecd06d995e1b72f Mon Sep 17 00:00:00 2001 From: Inusaito Sayori Date: Sat, 14 Sep 2013 21:21:36 -0400 Subject: [PATCH] Fix Save Preview As... for textures, now save as any type we can encode to! Removes the previous method and condenses the menu entries back into one. - Translations have been updated except for German, German will need to update the translation for "Save Preview As..." since the name hasn't changed. Adds FFSAVE_IMAGE to the filepicker enums Crossplatformity: - The Windows version works nicely - The Linux version may not work or even compile but it should.. - The Mac version hasn't been added, instead it will default to accept any(all filter), should the provided file extension be invalid a notification will display. --- indra/llui/llfloater.h | 1 - indra/newview/llpreviewtexture.cpp | 28 +++++------------ indra/newview/llpreviewtexture.h | 3 +- indra/newview/llviewermenufile.cpp | 14 --------- .../skins/default/xui/en-us/menu_viewer.xml | 7 +---- .../skins/default/xui/es/menu_viewer.xml | 3 +- .../skins/default/xui/fr/menu_viewer.xml | 3 +- indra/newview/statemachine/aifilepicker.cpp | 3 ++ indra/newview/statemachine/aifilepicker.h | 3 +- .../filepicker/basic_plugin_filepicker.cpp | 2 ++ indra/plugins/filepicker/llfilepicker.cpp | 31 +++++++++++++++++++ indra/plugins/filepicker/llfilepicker.h | 1 + 12 files changed, 50 insertions(+), 49 deletions(-) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index bd826a936..0aeb11501 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -218,7 +218,6 @@ public: virtual BOOL canSaveAs() const { return FALSE; } virtual void saveAs() {} - virtual void saveAsType(BOOL type=false) {} void setSnapTarget(LLHandle handle) { mSnappedTo = handle; } void clearSnapTarget() { mSnappedTo.markDead(); } diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index d2929d7a6..6d686b252 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -40,8 +40,7 @@ #include "llcombobox.h" #include "statemachine/aifilepicker.h" #include "llfloaterinventory.h" -#include "llimagepng.h" -#include "llimagetga.h" +#include "llimage.h" #include "llinventory.h" #include "llnotificationsutil.h" #include "llresmgr.h" @@ -377,27 +376,16 @@ BOOL LLPreviewTexture::canSaveAs() const return mIsCopyable && !mLoadingFullImage && mImage.notNull() && !mImage->isMissingAsset(); } -static bool sPng(false); - // virtual -void LLPreviewTexture::saveAsType(BOOL png) +void LLPreviewTexture::saveAs() { if( mLoadingFullImage ) return; const LLViewerInventoryItem* item = getItem() ; AIFilePicker* filepicker = AIFilePicker::create(); - sPng = png; - if(png) - { - filepicker->open(item ? LLDir::getScrubbedFileName(item->getName()) + ".png" : LLStringUtil::null, FFSAVE_PNG, "", "image"); - filepicker->run(boost::bind(&LLPreviewTexture::saveAs_continued, this, item, filepicker)); - } - else - { - filepicker->open(item ? LLDir::getScrubbedFileName(item->getName()) + ".tga" : LLStringUtil::null, FFSAVE_TGA, "", "image"); - filepicker->run(boost::bind(&LLPreviewTexture::saveAs_continued, this, item, filepicker)); - } + filepicker->open(item ? LLDir::getScrubbedFileName(item->getName()) + ".png" : LLStringUtil::null, FFSAVE_IMAGE, "", "image"); + filepicker->run(boost::bind(&LLPreviewTexture::saveAs_continued, this, item, filepicker)); } void LLPreviewTexture::saveAs_continued(LLViewerInventoryItem const* item, AIFilePicker* filepicker) @@ -446,16 +434,14 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success, if( self && final && success ) { - //FIXME: There has to be a better way - LLPointer image_png = new LLImagePNG; - LLPointer image_tga = new LLImageTGA; - if( sPng ? !image_png->encode( src, 0.0 ) : !image_tga->encode( src ) ) + LLPointer image = LLImageFormatted::createFromExtension(self->mSaveFileName); + if (!image || !image->encode(src, 0.0)) { LLSD args; args["FILE"] = self->mSaveFileName; LLNotificationsUtil::add("CannotEncodeFile", args); } - else if( sPng ? !image_png->save( self->mSaveFileName ) : !image_tga->save( self->mSaveFileName ) ) + else if (!image->save(self->mSaveFileName)) { LLSD args; args["FILE"] = self->mSaveFileName; diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index 02dc4f94e..073f76bfa 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -63,8 +63,7 @@ public: virtual void draw(); virtual BOOL canSaveAs() const; - virtual void saveAs(){ saveAsType(false); } - void saveAsType(BOOL png); + virtual void saveAs(); void saveAs_continued(LLViewerInventoryItem const* item, AIFilePicker* filepicker); virtual LLUUID getItemID(); virtual std::string getItemCreatorName(); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 46cebc7b5..5eb158997 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -541,19 +541,6 @@ class LLFileSavePreview : public view_listener_t } }; -class LLFileSavePreviewPNG : public view_listener_t -{ - bool handleEvent(LLPointer event, const LLSD& userdata) - { - LLFloater* top = gFloaterView->getFrontmost(); - if (top) - { - top->saveAsType(true); - } - return true; - } -}; - class LLFileTakeSnapshot : public view_listener_t { bool handleEvent(LLPointer event, const LLSD& userdata) @@ -1384,7 +1371,6 @@ void init_menu_file() (new LLFileLocalAssetBrowser())->registerListener(gMenuHolder, "File.LocalAssetBrowser"); // (new LLFileSavePreview())->registerListener(gMenuHolder, "File.SavePreview"); - (new LLFileSavePreviewPNG())->registerListener(gMenuHolder, "File.SavePreviewPNG"); (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot"); (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk"); (new LLFileQuit())->registerListener(gMenuHolder, "File.Quit"); diff --git a/indra/newview/skins/default/xui/en-us/menu_viewer.xml b/indra/newview/skins/default/xui/en-us/menu_viewer.xml index 192d3ff7b..cc86cd35f 100644 --- a/indra/newview/skins/default/xui/en-us/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en-us/menu_viewer.xml @@ -67,16 +67,11 @@ - - - - - - - + diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 21e7d6395..ab449a3d3 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -12,8 +12,7 @@ - - + diff --git a/indra/newview/statemachine/aifilepicker.cpp b/indra/newview/statemachine/aifilepicker.cpp index 735c1d7ec..636fc2343 100644 --- a/indra/newview/statemachine/aifilepicker.cpp +++ b/indra/newview/statemachine/aifilepicker.cpp @@ -329,6 +329,9 @@ void AIFilePicker::open(std::string const& filename, ESaveFilter filter, std::st case FFSAVE_PHYSICS: mFilter = "physics"; break; + case FFSAVE_IMAGE: + mFilter = "image"; + break; } } diff --git a/indra/newview/statemachine/aifilepicker.h b/indra/newview/statemachine/aifilepicker.h index 5c6512899..cd1c7fe86 100644 --- a/indra/newview/statemachine/aifilepicker.h +++ b/indra/newview/statemachine/aifilepicker.h @@ -91,7 +91,8 @@ enum ESaveFilter FFSAVE_LANDMARK, FFSAVE_AO, FFSAVE_BLACKLIST, - FFSAVE_PHYSICS + FFSAVE_PHYSICS, + FFSAVE_IMAGE, }; /* diff --git a/indra/plugins/filepicker/basic_plugin_filepicker.cpp b/indra/plugins/filepicker/basic_plugin_filepicker.cpp index 6a5e20b33..113c9b49a 100644 --- a/indra/plugins/filepicker/basic_plugin_filepicker.cpp +++ b/indra/plugins/filepicker/basic_plugin_filepicker.cpp @@ -134,6 +134,8 @@ static LLFilePicker::ESaveFilter str2savefilter(std::string const& filter) return LLFilePicker::FFSAVE_BLACKLIST; else if (filter == "physics") return LLFilePicker::FFSAVE_PHYSICS; + else if (filter == "image") + return LLFilePicker::FFSAVE_IMAGE; else return LLFilePicker::FFSAVE_ALL; } diff --git a/indra/plugins/filepicker/llfilepicker.cpp b/indra/plugins/filepicker/llfilepicker.cpp index 8146b298d..3650fb0cf 100644 --- a/indra/plugins/filepicker/llfilepicker.cpp +++ b/indra/plugins/filepicker/llfilepicker.cpp @@ -692,6 +692,18 @@ bool LLFilePickerBase::getSaveFile(ESaveFilter filter, std::string const& filena L"Landmarks (*.phy)\0*.phy\0" \ L"\0"; break; + case FFSAVE_IMAGE: + mOFN.lpstrDefExt = NULL; + mOFN.lpstrFilter = + L"Image (*.bmp *.dxt *.jpg *.jpeg *.j2c *.mip *.png *.tga)\0*.bmp;*.dxt;*.jpg;*.jpeg;*.j2c;*.mip;*.png;*.tga\0" \ + L"PNG Image (*.png)\0*.png\0" \ + L"Targa Image (*.tga)\0*.tga\0" \ + L"Bitmap Image (*.bmp)\0*.bmp\0" \ + L"JPEG Image (*.jpg *.jpeg)\0*.jpg;*.jpeg\0" \ + L"Compressed Image (*.j2c)\0*.j2c\0" \ + L"DXT Image (*.dxt *.mip)\0*.dxt;*.mip\0" \ + L"\0"; + break; // default: return FALSE; @@ -1423,6 +1435,21 @@ static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker) return filtername; } +static std::string add_imagesave_filter_to_gtkchooser(GTKWindow *picker) +{ + GtkFileFilter *gfilter = gtk_file_filter_new(); + gtk_file_filter_add_mime_type(gfilter, "image/bmp"); + gtk_file_filter_add_pattern(gfilter, "*.dxt"); + gtk_file_filter_add_mime_type(gfilter, "image/jpeg"); + gtk_file_filter_add_pattern(gfilter, "*.j2c"); + gtk_file_filter_add_pattern(gfilter, "*.mip"); + gtk_file_filter_add_mime_type(gfilter, "image/png"); + gtk_file_filter_add_pattern(gfilter, "*.tga"); + std::string filtername = LLTrans::getString("image_files") + "(*.bmp; *.dxt; *.jpg; *.jpeg; *.j2c; *.mip; *.png; *.tga)"; + add_common_filters_to_gtkchooser(gfilter, picker, filtername); + return filtername; +} + static std::string add_script_filter_to_gtkchooser(GtkWindow *picker) { return add_simple_mime_filter_to_gtkchooser(picker, "text/plain", @@ -1497,6 +1524,10 @@ bool LLFilePickerBase::getSaveFile(ESaveFilter filter, std::string const& filena caption += add_script_filter_to_gtkchooser(picker); suggest_ext = ".lsl"; break; + case FFSAVE_IMAGE: + caption += add_imagesave_filter_to_gtkchooser(picker); + suggest_ext = ".png"; + break; default:; break; } diff --git a/indra/plugins/filepicker/llfilepicker.h b/indra/plugins/filepicker/llfilepicker.h index cb5a5f24d..38b3aca22 100644 --- a/indra/plugins/filepicker/llfilepicker.h +++ b/indra/plugins/filepicker/llfilepicker.h @@ -113,6 +113,7 @@ public: FFSAVE_AO = 35, FFSAVE_BLACKLIST = 36, FFSAVE_PHYSICS = 37, + FFSAVE_IMAGE = 38, // };