diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 29b50d7bc..28fcd7751 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -524,7 +524,11 @@ std::string LLDir::getTempFilename() const std::string LLDir::getScrubbedFileName(const std::string uncleanFileName) { std::string name(uncleanFileName); - const std::string illegalChars(getForbiddenFileChars()); + std::string illegalChars(getForbiddenFileChars()); +#if LL_LINUX || LL_SOLARIS + // Spaces in filenames are REALLY annoying on UNIX. + illegalChars += ' '; +#endif // replace any illegal file chars with and underscore '_' for( unsigned int i = 0; i < illegalChars.length(); i++ ) { diff --git a/indra/newview/floaterlocalassetbrowse.cpp b/indra/newview/floaterlocalassetbrowse.cpp index 76fa162b1..c643c636d 100644 --- a/indra/newview/floaterlocalassetbrowse.cpp +++ b/indra/newview/floaterlocalassetbrowse.cpp @@ -55,7 +55,7 @@ this feature is still a work in progress. #include #include "llviewertexturelist.h" #include "llviewerobjectlist.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "llviewermenufile.h" #include "llfloaterimagepreview.h" #include "llfile.h" @@ -453,23 +453,27 @@ LocalAssetBrowser::~LocalAssetBrowser() void LocalAssetBrowser::AddBitmap() { - LLFilePicker& picker = LLFilePicker::instance(); - if ( !picker.getMultipleOpenFiles(LLFilePicker::FFLOAD_IMAGE) ) - { return; } + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_IMAGE, "", "image", true); + filepicker->run(boost::bind(&LocalAssetBrowser::AddBitmap_continued, filepicker)); +} + +void LocalAssetBrowser::AddBitmap_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) + return; bool change_happened = false; - std::string filename = picker.getFirstFile(); - while( !filename.empty() ) + std::vector const& filenames(filepicker->getFilenames()); + for(std::vector::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) { - LocalBitmap* unit = new LocalBitmap( filename ); + LocalBitmap* unit = new LocalBitmap(*filename); if ( unit->getIfValidBool() ) { loaded_bitmaps.push_back( unit ); change_happened = true; } - - filename = picker.getNextFile(); } if ( change_happened ) diff --git a/indra/newview/floaterlocalassetbrowse.h b/indra/newview/floaterlocalassetbrowse.h index 6ee1c75a3..42620e314 100644 --- a/indra/newview/floaterlocalassetbrowse.h +++ b/indra/newview/floaterlocalassetbrowse.h @@ -169,6 +169,7 @@ class LocalBitmap */ +class AIFilePicker; class LocalAssetBrowser { @@ -181,6 +182,7 @@ class LocalAssetBrowser static void setLayerUpdated(bool toggle) { mLayerUpdated = toggle; } static void setSculptUpdated(bool toggle) { mSculptUpdated = toggle; } static void AddBitmap(void); + static void AddBitmap_continued(AIFilePicker* filepicker); static void DelBitmap( std::vector, S32 column = BITMAPLIST_COL_ID ); /* UpdateTextureCtrlList was made public cause texturectrl requests it once on spawn diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 042a53632..2992e60bd 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -293,7 +293,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) view->getPanel()->setSelection(content["new_inventory_item"].asUUID(), TAKE_FOCUS_NO); if((LLAssetType::AT_TEXTURE == asset_type || LLAssetType::AT_SOUND == asset_type) - && LLFilePicker::instance().getFileCount() <= FILE_COUNT_DISPLAY_THRESHOLD) + /* FIXME: && LLFilePicker::instance().getFileCount() <= FILE_COUNT_DISPLAY_THRESHOLD */) { view->getPanel()->openSelected(); } @@ -309,7 +309,8 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) // remove the "Uploading..." message LLUploadDialog::modalUploadFinished(); - + +#if 0 // FIXME: This needs to be done in some other way. // *FIX: This is a pretty big hack. What this does is check the // file picker if there are any more pending uploads. If so, // upload that file. @@ -339,6 +340,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) everyone_perms, display_name, callback, expected_upload_cost, userdata); } +#endif } LLSendTexLayerResponder::LLSendTexLayerResponder(const LLSD& post_data, diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index fb327e5a6..2a325c0bb 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -788,6 +788,15 @@ Boolean LLFilePickerBase::navOpenFilterProc(AEDesc *theItem, void *info, void *c result = false; } } + else if (filter == FFLOAD_XML) + { + if (fileInfo.filetype != 'XML ' && + (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("xml"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)) + ) + { + result = false; + } + } #ifdef _CORY_TESTING else if (filter == FFLOAD_GEOMETRY) { @@ -1327,6 +1336,12 @@ static std::string add_bvh_filter_to_gtkchooser(GtkWindow *picker) LLTrans::getString("animation_files") + " (*.bvh)"); } +static std::string add_xml_filter_to_gtkchooser(GtkWindow *picker) +{ + return add_simple_mime_filter_to_gtkchooser(picker, "text/xml", + LLTrans::getString("xml_file") + " (*.xml)"); +} + static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker) { GtkFileFilter *gfilter = gtk_file_filter_new(); @@ -1454,6 +1469,9 @@ BOOL LLFilePickerBase::getOpenFile( ELoadFilter filter ) case FFLOAD_IMAGE: filtername = add_imageload_filter_to_gtkchooser(picker); break; + case FFLOAD_XML: + filtername = add_xml_filter_to_gtkchooser(picker); + break; default:; break; } @@ -1530,6 +1548,7 @@ BOOL LLFilePickerBase::getOpenFile( ELoadFilter filter ) case FFLOAD_WAV: filename += ".wav"; break; case FFLOAD_IMAGE: filename += ".tga"; break; case FFLOAD_ANIM: filename += ".bvh"; break; + case FFLOAD_XML: filename += ".xml"; break; default: break; } mFiles.push_back(filename); diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h index 8063a7068..3be94f8e0 100644 --- a/indra/newview/llfilepicker.h +++ b/indra/newview/llfilepicker.h @@ -185,13 +185,9 @@ private: #if LL_DARWIN NavDialogCreationOptions mNavOptions; - std::vector mFileVector; - UInt32 mFileIndex; OSStatus doNavChooseDialog(ELoadFilter filter); OSStatus doNavSaveDialog(ESaveFilter filter, const std::string& filename); - void getFilePath(SInt32 index); - void getFileName(SInt32 index); static Boolean navOpenFilterProc(AEDesc *theItem, void *info, void *callBackUD, NavFilterModes filterMode); #endif diff --git a/indra/newview/llfloaterblacklist.cpp b/indra/newview/llfloaterblacklist.cpp index e565f1434..ff76ec407 100644 --- a/indra/newview/llfloaterblacklist.cpp +++ b/indra/newview/llfloaterblacklist.cpp @@ -7,7 +7,7 @@ #include "llsdserialize.h" #include "llscrolllistctrl.h" #include "llcheckboxctrl.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "llviewerwindow.h" #include "llviewercontrol.h" #include "lldate.h" @@ -241,10 +241,17 @@ void LLFloaterBlacklist::saveToDisk() //static void LLFloaterBlacklist::onClickSave(void* user_data) { - LLFilePicker& file_picker = LLFilePicker::instance(); - if(file_picker.getSaveFile( LLFilePicker::FFSAVE_BLACKLIST, LLDir::getScrubbedFileName("untitled.blacklist"))) + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open("untitled.blacklist", FFSAVE_BLACKLIST); + filepicker->run(boost::bind(&LLFloaterBlacklist::onClickSave_continued, filepicker)); +} + +//static +void LLFloaterBlacklist::onClickSave_continued(AIFilePicker* filepicker) +{ + if (filepicker->hasFilename()) { - std::string file_name = file_picker.getFirstFile(); + std::string file_name = filepicker->getFilename(); llofstream export_file(file_name); LLSD data; for(std::map::iterator iter = blacklist_entries.begin(); iter != blacklist_entries.end(); ++iter) @@ -259,10 +266,16 @@ void LLFloaterBlacklist::onClickSave(void* user_data) //static void LLFloaterBlacklist::onClickLoad(void* user_data) { - LLFilePicker& file_picker = LLFilePicker::instance(); - if(file_picker.getOpenFile(LLFilePicker::FFLOAD_BLACKLIST)) + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_BLACKLIST); + filepicker->run(boost::bind(&LLFloaterBlacklist::onClickLoad_continued, filepicker)); +} + +void LLFloaterBlacklist::onClickLoad_continued(AIFilePicker* filepicker) +{ + if (filepicker->hasFilename()) { - std::string file_name = file_picker.getFirstFile(); + std::string file_name = filepicker->getFilename(); llifstream xml_file(file_name); if(!xml_file.is_open()) return; LLSD data; diff --git a/indra/newview/llfloaterblacklist.h b/indra/newview/llfloaterblacklist.h index c35185721..c718fd71d 100644 --- a/indra/newview/llfloaterblacklist.h +++ b/indra/newview/llfloaterblacklist.h @@ -2,6 +2,9 @@ #ifndef LL_LLFLOATERBLACKLIST_H #define LL_LLFLOATERBLACKLIST_H #include "llfloater.h" + +class AIFilePicker; + class LLFloaterBlacklist : LLFloater { public: @@ -42,7 +45,9 @@ private: static void onClickAdd(void* user_data); static void onClickClear(void* user_data); static void onClickSave(void* user_data); + static void onClickSave_continued(AIFilePicker* filepicker); static void onClickLoad(void* user_data); + static void onClickLoad_continued(AIFilePicker* filepicker); static void onClickCopyUUID(void* user_data); static void onClickRemove(void* user_data); diff --git a/indra/newview/llfloatercustomize.cpp b/indra/newview/llfloatercustomize.cpp index 6a313c2bd..b8e23f387 100644 --- a/indra/newview/llfloatercustomize.cpp +++ b/indra/newview/llfloatercustomize.cpp @@ -75,7 +75,7 @@ #include "llviewercontrol.h" #include "lluictrlfactory.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "hippogridmanager.h" using namespace LLVOAvatarDefines; @@ -1846,14 +1846,20 @@ void LLFloaterCustomize::setCurrentWearableType( EWearableType type ) // reX: new function void LLFloaterCustomize::onBtnImport( void* userdata ) { - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getOpenFile( LLFilePicker::FFLOAD_XML ) ) - { - // User canceled import. - return; - } + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_XML); + filepicker->run(boost::bind(&LLFloaterCustomize::onBtnImport_continued, filepicker)); +} - const std::string filename = file_picker.getFirstFile(); +void LLFloaterCustomize::onBtnImport_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) + { + // User canceled import. + return; + } + + const std::string filename = filepicker->getFilename(); FILE* fp = LLFile::fopen(filename, "rb"); @@ -1900,8 +1906,14 @@ void LLFloaterCustomize::onBtnImport( void* userdata ) // reX: new function void LLFloaterCustomize::onBtnExport( void* userdata ) { - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_XML ) ) + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open("", FFSAVE_XML); + filepicker->run(boost::bind(&LLFloaterCustomize::onBtnExport_continued, filepicker)); +} + +void LLFloaterCustomize::onBtnExport_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) { // User canceled export. return; @@ -1910,7 +1922,7 @@ void LLFloaterCustomize::onBtnExport( void* userdata ) LLViewerInventoryItem* item; BOOL is_modifiable; - const std::string filename = file_picker.getFirstFile(); + const std::string filename = filepicker->getFilename(); FILE* fp = LLFile::fopen(filename, "wb"); diff --git a/indra/newview/llfloatercustomize.h b/indra/newview/llfloatercustomize.h index ceb49af01..84af37f70 100644 --- a/indra/newview/llfloatercustomize.h +++ b/indra/newview/llfloatercustomize.h @@ -64,6 +64,7 @@ class LLVisualParam; class LLVisualParamReset; class LLWearableSaveAsDialog; class LLPanelEditWearable; +class AIFilePicker; ///////////////////////////////////////////////////////////////////// // LLFloaterCustomize @@ -110,7 +111,9 @@ public: static void onBtnMakeOutfit( void* userdata ); static void onMakeOutfitCommit( LLMakeOutfitDialog* dialog, void* userdata ); static void onBtnImport( void* userdata ); + static void onBtnImport_continued(AIFilePicker* filepicker); static void onBtnExport( void* userdata ); + static void onBtnExport_continued(AIFilePicker* filepicker); static void onTabChanged( void* userdata, bool from_click ); static void onTabPrecommit( void* userdata, bool from_click ); diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp index 255547933..c210caa1c 100644 --- a/indra/newview/llfloaterfriends.cpp +++ b/indra/newview/llfloaterfriends.cpp @@ -67,7 +67,7 @@ #include "llvoiceclient.h" #include "llsdserialize.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "llviewermenufile.h" #include "llviewermenu.h" @@ -1080,17 +1080,22 @@ void LLPanelFriends::onClickRemove(void* user_data) void LLPanelFriends::onClickExport(void* user_data) { - LLPanelFriends* panelp = (LLPanelFriends*)user_data; std::string agn; gAgent.getName(agn); - std::string filename = agn+".friendlist"; - LLFilePicker& picker = LLFilePicker::instance(); - if(!picker.getSaveFile( LLFilePicker::FFSAVE_ALL, filename ) ) + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(agn + ".friendlist", FFSAVE_ALL); + filepicker->run(boost::bind(&LLPanelFriends::onClickExport_continued, user_data, filepicker)); +} + +void LLPanelFriends::onClickExport_continued(void* user_data, AIFilePicker* filepicker) +{ + if(!filepicker->hasFilename()) { // User canceled save. return; } - filename = picker.getFirstFile(); + std::string const filename = filepicker->getFilename(); + LLPanelFriends* panelp = (LLPanelFriends*)user_data; std::vector selected = panelp->mFriendsList->getAllData();//->getAllSelected(); LLSD llsd; @@ -1126,19 +1131,22 @@ void LLPanelFriends::onClickExport(void* user_data) bool LLPanelFriends::merging; void LLPanelFriends::onClickImport(void* user_data) +{ + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(); + filepicker->run(boost::bind(&LLPanelFriends::onClickImport_filepicker_continued, filepicker)); +} + //THIS CODE IS DESIGNED SO THAT EXP/IMP BETWEEN GRIDS WILL FAIL //because assuming someone having the same name on another grid is the same person is generally a bad idea //i might add the option to query the user as to intelligently detecting matching names on a alternative grid // jcool410 +void LLPanelFriends::onClickImport_filepicker_continued(AIFilePicker* filepicker) { - //LLPanelFriends* panelp = (LLPanelFriends*)user_data; - //is_agent_friend( - - const std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_ALL); - - if (filename.empty()) + if (!filepicker->hasFilename()) return; + std::string filename = filepicker->getFilename(); llifstream importer(filename); LLSD data; LLSDSerialize::fromXMLDocument(data, importer); diff --git a/indra/newview/llfloaterfriends.h b/indra/newview/llfloaterfriends.h index 20c996d23..e6223cfb2 100644 --- a/indra/newview/llfloaterfriends.h +++ b/indra/newview/llfloaterfriends.h @@ -45,6 +45,7 @@ class LLFriendObserver; class LLRelationship; class LLScrollListItem; class LLScrollListCtrl; +class AIFilePicker; /** * @class LLPanelFriends @@ -144,7 +145,9 @@ private: static void onClickAddFriend(void* user_data); static void onClickRemove(void* user_data); static void onClickExport(void* user_data); + static void onClickExport_continued(void* user_data, AIFilePicker* filepicker); static void onClickImport(void* user_data); + static void onClickImport_filepicker_continued(AIFilePicker* filepicker); public: static void FriendImportState(LLUUID id, bool accepted); private: diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 03f616af3..994fe3ad3 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -53,7 +53,7 @@ #include "llbutton.h" #include "llcheckboxctrl.h" #include "llcombobox.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "llfloaterdaycycle.h" #include "llfloatergodtools.h" // for send_sim_wide_deletes() #include "llfloatertopobjects.h" // added to fix SL-32336 @@ -1324,41 +1324,50 @@ void LLPanelRegionTerrainInfo::onChangeSunHour(LLUICtrl* ctrl, void*) // static void LLPanelRegionTerrainInfo::onClickDownloadRaw(void* data) { - LLFilePicker& picker = LLFilePicker::instance(); - if (!picker.getSaveFile(LLFilePicker::FFSAVE_RAW, "terrain.raw")) + LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data; + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open("terrain.raw", FFSAVE_RAW); + filepicker->run(boost::bind(&LLPanelRegionTerrainInfo::onClickUploadRaw_continued, self, filepicker)); +} + +void LLPanelRegionTerrainInfo::onClickDownloadRaw_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) { - llwarns << "No file" << llendl; return; } - std::string filepath = picker.getFirstFile(); + std::string filepath = filepicker->getFilename(); gXferManager->expectFileForRequest(filepath); - LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data; strings_t strings; strings.push_back("download filename"); strings.push_back(filepath); LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); - self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings); + sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings); } // static void LLPanelRegionTerrainInfo::onClickUploadRaw(void* data) { - LLFilePicker& picker = LLFilePicker::instance(); - if (!picker.getOpenFile(LLFilePicker::FFLOAD_RAW)) - { - llwarns << "No file" << llendl; + LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data; + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_RAW); + filepicker->run(boost::bind(&LLPanelRegionTerrainInfo::onClickUploadRaw_continued, self, filepicker)); +} + +void LLPanelRegionTerrainInfo::onClickUploadRaw_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) return; - } - std::string filepath = picker.getFirstFile(); + + std::string filepath = filepicker->getFilename(); gXferManager->expectFileForTransfer(filepath); - LLPanelRegionTerrainInfo* self = (LLPanelRegionTerrainInfo*)data; strings_t strings; strings.push_back("upload filename"); strings.push_back(filepath); LLUUID invoice(LLFloaterRegionInfo::getLastInvoice()); - self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings); + sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings); LLNotifications::instance().add("RawUploadStarted"); } diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index fd0d9ce63..5871e3525 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -51,6 +51,7 @@ class LLNameListCtrl; class LLSliderCtrl; class LLSpinCtrl; class LLTextBox; +class AIFilePicker; class LLPanelRegionGeneralInfo; class LLPanelRegionDebugInfo; @@ -242,7 +243,9 @@ protected: static void onChangeSunHour(LLUICtrl* ctrl, void*); static void onClickDownloadRaw(void*); + void onClickDownloadRaw_continued(AIFilePicker* filepicker); static void onClickUploadRaw(void*); + void onClickUploadRaw_continued(AIFilePicker* filepicker); static void onClickBakeTerrain(void*); bool callbackBakeTerrain(const LLSD& notification, const LLSD& response); }; diff --git a/indra/newview/llfloatervfs.cpp b/indra/newview/llfloatervfs.cpp index 2db5b3459..0192e76b9 100644 --- a/indra/newview/llfloatervfs.cpp +++ b/indra/newview/llfloatervfs.cpp @@ -4,7 +4,7 @@ #include "lluictrlfactory.h" #include "llscrolllistctrl.h" #include "llcheckboxctrl.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "lllocalinventory.h" #include "llviewerwindow.h" #include "llassetconverter.h" @@ -229,25 +229,32 @@ void LLFloaterVFS::setEditEnabled(bool enabled) childSetEnabled("reload_btn", enabled); // WORKS! childSetEnabled("remove_btn", enabled); } + // static void LLFloaterVFS::onClickAdd(void* user_data) { - LLFloaterVFS* floaterp = (LLFloaterVFS*)user_data; - if(!floaterp) return; - LLUUID asset_id; - LLAssetType::EType asset_type = LLAssetType::AT_NONE; - asset_id.generate(); - LLFilePicker& file_picker = LLFilePicker::instance(); - if(file_picker.getOpenFile(LLFilePicker::FFLOAD_ALL)) + if(!user_data) return; + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(); + filepicker->run(boost::bind(&LLFloaterVFS::onClickAdd_continued, user_data, filepicker)); +} + +// static +void LLFloaterVFS::onClickAdd_continued(void* user_data, AIFilePicker* filepicker) +{ + LLFloaterVFS* self = (LLFloaterVFS*)user_data; + if (filepicker->hasFilename()) { - std::string file_name = file_picker.getFirstFile(); + std::string file_name = filepicker->getFilename(); std::string temp_filename = file_name + ".tmp"; - asset_type = LLAssetConverter::convert(file_name, temp_filename); + LLAssetType::EType asset_type = LLAssetConverter::convert(file_name, temp_filename); if(asset_type == LLAssetType::AT_NONE) { // todo: show a warning return; } + LLUUID asset_id; + asset_id.generate(); S32 file_size; LLAPRFile fp; fp.open(temp_filename, LL_APR_RB, LLAPRFile::global, &file_size); @@ -302,8 +309,8 @@ void LLFloaterVFS::onClickAdd(void* user_data) file.mID = asset_id; file.mType = asset_type; file.mName = gDirUtilp->getBaseFileName(file_name, true); - floaterp->add(file); - /*if(floaterp->getChild("create_pretend_item")->get()) + self->add(file); + /*if(self->getChild("create_pretend_item")->get()) { LLLocalInventory::addItem(file.mName, (int)file.mType, file.mID, true); }*/ diff --git a/indra/newview/llfloatervfs.h b/indra/newview/llfloatervfs.h index 7218b1090..47d1d8755 100644 --- a/indra/newview/llfloatervfs.h +++ b/indra/newview/llfloatervfs.h @@ -3,6 +3,9 @@ #define LL_LLFLOATERVFS_H #include "llfloater.h" #include "llassettype.h" + +class AIFilePicker; + class LLFloaterVFS : LLFloater { typedef struct @@ -27,6 +30,7 @@ public: void reloadEntry(entry file); void removeEntry(); static void onClickAdd(void* user_data); + static void onClickAdd_continued(void* user_data, AIFilePicker* filepicker); static void onClickClear(void* user_data); static void onClickReloadAll(void* user_data); static void onCommitFileList(LLUICtrl* ctrl, void* user_data); diff --git a/indra/newview/llinventoryactions.cpp b/indra/newview/llinventoryactions.cpp index b770a531d..8b04a1744 100644 --- a/indra/newview/llinventoryactions.cpp +++ b/indra/newview/llinventoryactions.cpp @@ -91,6 +91,7 @@ #include "llinventorybackup.h" //#include "llcheats.h" //#include "llnotecardmagic.h" +#include "statemachine/aifilepicker.h" // const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not) @@ -569,14 +570,19 @@ class LLLoadInvCacheFloater : public inventory_listener_t { LLInventoryModel* model = mPtr->getPanel()->getModel(); if(!model) return false; - LLFilePicker& file_picker = LLFilePicker::instance(); - if(file_picker.getOpenFile( LLFilePicker::FFLOAD_INVGZ )) - { - std::string file_name = file_picker.getFirstFile(); - LLLocalInventory::loadInvCache(file_name); - } + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_INVGZ, "", "invgz"); + filepicker->run(boost::bind(&LLLoadInvCacheFloater::filepicker_callback, this, filepicker)); return true; } + + void filepicker_callback(AIFilePicker* filepicker) + { + if(filepicker->hasFilename()) + { + LLLocalInventory::loadInvCache(filepicker->getFilename()); + } + } }; class LLRefreshInvModel : public inventory_listener_t diff --git a/indra/newview/llinventorybackup.cpp b/indra/newview/llinventorybackup.cpp index a5ce38e59..c6f687272 100644 --- a/indra/newview/llinventorybackup.cpp +++ b/indra/newview/llinventorybackup.cpp @@ -4,7 +4,7 @@ #include "llinventorybackup.h" #include "llinventorymodel.h" #include "llviewerinventory.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "lldirpicker.h" #include "llviewertexturelist.h" // gTextureList #include "llagent.h" // gAgent @@ -158,64 +158,64 @@ bool LLInventoryBackup::itemIsFolder(LLInventoryItem* item) } // static -LLFilePicker::ESaveFilter LLInventoryBackup::getSaveFilter(LLInventoryItem* item) +ESaveFilter LLInventoryBackup::getSaveFilter(LLInventoryItem* item) { LLAssetType::EType type = item->getType(); EWearableType wear = (EWearableType)(item->getFlags() & 0xFF); switch(type) { case LLAssetType::AT_TEXTURE: - return LLFilePicker::FFSAVE_TGA; + return FFSAVE_TGA; case LLAssetType::AT_SOUND: - return LLFilePicker::FFSAVE_OGG; + return FFSAVE_OGG; case LLAssetType::AT_SCRIPT: case LLAssetType::AT_LSL_TEXT: - return LLFilePicker::FFSAVE_LSL; + return FFSAVE_LSL; case LLAssetType::AT_ANIMATION: - return LLFilePicker::FFSAVE_ANIMATN; + return FFSAVE_ANIMATN; case LLAssetType::AT_GESTURE: - return LLFilePicker::FFSAVE_GESTURE; + return FFSAVE_GESTURE; case LLAssetType::AT_NOTECARD: - return LLFilePicker::FFSAVE_NOTECARD; + return FFSAVE_NOTECARD; case LLAssetType::AT_LANDMARK: - return LLFilePicker::FFSAVE_LANDMARK; + return FFSAVE_LANDMARK; case LLAssetType::AT_BODYPART: case LLAssetType::AT_CLOTHING: switch(wear) { case WT_EYES: - return LLFilePicker::FFSAVE_EYES; + return FFSAVE_EYES; case WT_GLOVES: - return LLFilePicker::FFSAVE_GLOVES; + return FFSAVE_GLOVES; case WT_HAIR: - return LLFilePicker::FFSAVE_HAIR; + return FFSAVE_HAIR; case WT_JACKET: - return LLFilePicker::FFSAVE_JACKET; + return FFSAVE_JACKET; case WT_PANTS: - return LLFilePicker::FFSAVE_PANTS; + return FFSAVE_PANTS; case WT_SHAPE: - return LLFilePicker::FFSAVE_SHAPE; + return FFSAVE_SHAPE; case WT_SHIRT: - return LLFilePicker::FFSAVE_SHIRT; + return FFSAVE_SHIRT; case WT_SHOES: - return LLFilePicker::FFSAVE_SHOES; + return FFSAVE_SHOES; case WT_SKIN: - return LLFilePicker::FFSAVE_SKIN; + return FFSAVE_SKIN; case WT_SKIRT: - return LLFilePicker::FFSAVE_SKIRT; + return FFSAVE_SKIRT; case WT_SOCKS: - return LLFilePicker::FFSAVE_SOCKS; + return FFSAVE_SOCKS; case WT_UNDERPANTS: - return LLFilePicker::FFSAVE_UNDERPANTS; + return FFSAVE_UNDERPANTS; case WT_UNDERSHIRT: - return LLFilePicker::FFSAVE_UNDERSHIRT; + return FFSAVE_UNDERSHIRT; case WT_PHYSICS: - return LLFilePicker::FFSAVE_PHYSICS; + return FFSAVE_PHYSICS; default: - return LLFilePicker::FFSAVE_ALL; + return FFSAVE_ALL; } default: - return LLFilePicker::FFSAVE_ALL; + return FFSAVE_ALL; } } @@ -352,28 +352,9 @@ void LLInventoryBackup::imageCallback(BOOL success, return; } - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( getSaveFilter(item), LLDir::getScrubbedFileName(item->getName())) ) - { - // User canceled or we failed to acquire save file. - return; - } - // remember the user-approved/edited file name. - std::string filename = file_picker.getFirstFile(); - - LLPointer image_tga = new LLImageTGA; - if( !image_tga->encode( src ) ) - { - LLSD args; - args["ERROR_MESSAGE"] = "Couldn't encode file."; - LLNotifications::instance().add("ErrorMessage", args); - } - else if( !image_tga->save( filename ) ) - { - LLSD args; - args["ERROR_MESSAGE"] = "Couldn't write file."; - LLNotifications::instance().add("ErrorMessage", args); - } + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(LLDir::getScrubbedFileName(item->getName()), getSaveFilter(item)); + filepicker->run(boost::bind(&LLInventoryBackup::imageCallback_continued, src, filepicker)); } else { @@ -381,6 +362,28 @@ void LLInventoryBackup::imageCallback(BOOL success, } } +void LLInventoryBackup::imageCallback_continued(LLImageRaw* src, AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) + return; + + std::string filename = filepicker->getFilename(); + + LLPointer image_tga = new LLImageTGA; + if( !image_tga->encode( src ) ) + { + LLSD args; + args["ERROR_MESSAGE"] = "Couldn't encode file."; + LLNotifications::instance().add("ErrorMessage", args); + } + else if( !image_tga->save( filename ) ) + { + LLSD args; + args["ERROR_MESSAGE"] = "Couldn't write file."; + LLNotifications::instance().add("ErrorMessage", args); + } +} + // static void LLInventoryBackup::assetCallback(LLVFS *vfs, const LLUUID& asset_uuid, @@ -402,7 +405,7 @@ void LLInventoryBackup::assetCallback(LLVFS *vfs, LLVFile file(vfs, asset_uuid, type, LLVFile::READ); S32 size = file.getSize(); - char* buffer = new char[size]; + char* buffer = new char[size]; // Deleted in assetCallback_continued. if (buffer == NULL) { llerrs << "Memory Allocation Failed" << llendl; @@ -413,18 +416,22 @@ void LLInventoryBackup::assetCallback(LLVFS *vfs, // Write it back out... - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( getSaveFilter(item), LLDir::getScrubbedFileName(item->getName())) ) - { - // User canceled or we failed to acquire save file. - return; - } - // remember the user-approved/edited file name. - std::string filename = file_picker.getFirstFile(); + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(LLDir::getScrubbedFileName(item->getName()), getSaveFilter(item)); + filepicker->run(boost::bind(&LLInventoryBackup::assetCallback_continued, buffer, size, filepicker)); +} - std::ofstream export_file(filename.c_str(), std::ofstream::binary); - export_file.write(buffer, size); - export_file.close(); +// static +void LLInventoryBackup::assetCallback_continued(char* buffer, S32 size, AIFilePicker* filepicker) +{ + if (filepicker->hasFilename()) + { + std::string filename = filepicker->getFilename(); + std::ofstream export_file(filename.c_str(), std::ofstream::binary); + export_file.write(buffer, size); + export_file.close(); + } + delete [] buffer; } // static diff --git a/indra/newview/llinventorybackup.h b/indra/newview/llinventorybackup.h index 98664a9a5..16d9a3ad1 100644 --- a/indra/newview/llinventorybackup.h +++ b/indra/newview/llinventorybackup.h @@ -11,11 +11,10 @@ #include "llviewerinventory.h" #include "llfolderview.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "llviewertexture.h" #include "llfloater.h" - class LLInventoryBackupOrder { public: @@ -94,10 +93,12 @@ private: }; +class AIFilePicker; + class LLInventoryBackup { public: - static LLFilePicker::ESaveFilter getSaveFilter(LLInventoryItem* item); + static ESaveFilter getSaveFilter(LLInventoryItem* item); static std::string getExtension(LLInventoryItem* item); static std::string getUniqueFilename(std::string filename, std::string extension); static std::string getUniqueDirname(std::string dirname); @@ -120,10 +121,12 @@ private: S32 discard_level, BOOL final, void* userdata); + static void imageCallback_continued(LLImageRaw* src, AIFilePicker* filepicker); static void assetCallback(LLVFS *vfs, const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status); + static void assetCallback_continued(char* buffer, S32 size, AIFilePicker* filepicker); static void climb(LLInventoryCategory* cat, std::vector& cats, std::vector& items); diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 3455caf19..aa6dc78d5 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -99,6 +99,7 @@ //#include "llcheats.h" #include "dofloaterhex.h" #include "hgfloatertexteditor.h" +#include "statemachine/aifilepicker.h" // // Editing wearables from inventory is an include-hungry feature -.- -SG @@ -1106,30 +1107,26 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, else if("reupload" == action) { LLInventoryItem* item = model->getItem(mUUID); - if(!item) return; - - LLFilePicker& picker = LLFilePicker::instance(); - std::string filename; - - switch(item->getType()) + if (item && item->getType() == LLAssetType::AT_TEXTURE) { - case LLAssetType::AT_TEXTURE: - if(!picker.getOpenFile(LLFilePicker::FFLOAD_IMAGE)) - return; - filename = picker.getFirstFile(); - if(!filename.empty()) - { - LLFloaterImagePreview* floaterp = new LLFloaterImagePreview(filename, item); - LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_image_preview.xml"); - } - break; - default: - break; + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_IMAGE, "", "image"); + filepicker->run(boost::bind(&LLItemBridge::showFloaterImagePreview, item, filepicker)); } } // } +// static +void LLItemBridge::showFloaterImagePreview(LLInventoryItem* item, AIFilePicker* filepicker) +{ + if (filepicker->hasFilename()) + { + LLFloaterImagePreview* floaterp = new LLFloaterImagePreview(filepicker->getFilename(), item); + LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_image_preview.xml"); + } +} + void LLItemBridge::selectItem() { LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem(); diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index a3108d653..2a668e684 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -277,6 +277,7 @@ protected: LLInventoryType::EType mInvType; }; +class AIFilePicker; class LLItemBridge : public LLInvFVBridge { @@ -303,7 +304,7 @@ public: virtual BOOL hasChildren() const { return FALSE; } virtual BOOL isUpToDate() const { return TRUE; } - + static void showFloaterImagePreview(LLInventoryItem* item, AIFilePicker* filepicker); // override for LLInvFVBridge virtual void clearDisplayName() { mDisplayName.clear(); } diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 52e812924..9a3add526 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -1213,20 +1213,27 @@ void LLPanelAvatarPicks::onClickNew(void* data) } //Pick import and export - RK +// static void LLPanelAvatarPicks::onClickImport(void* data) { LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data; - LLPanelPick* panel_pick = new LLPanelPick(FALSE); - LLTabContainer* tabs = self->getChild("picks tab"); + self->mPanelPick = new LLPanelPick(FALSE); + self->mPanelPick->importNewPick(&LLPanelAvatarPicks::onClickImport_continued, data); +} - bool import = panel_pick->importNewPick(); - if(tabs && import) +// static +void LLPanelAvatarPicks::onClickImport_continued(void* data, bool import) +{ + LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data; + LLTabContainer* tabs = self->getChild("picks tab"); + if(tabs && import && self->mPanelPick) { - tabs->addTabPanel(panel_pick, panel_pick->getPickName()); + tabs->addTabPanel(self->mPanelPick, self->mPanelPick->getPickName()); tabs->selectLastTab(); } } +// static void LLPanelAvatarPicks::onClickExport(void* data) { LLPanelAvatarPicks* self = (LLPanelAvatarPicks*)data; diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index 24de55cb5..812da4571 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -57,6 +57,7 @@ class LLViewerObject; class LLMessageSystem; class LLIconCtrl; class LLMediaCtrl; +class LLPanelPick; enum EOnlineStatus { @@ -265,9 +266,13 @@ private: //Pick import and export - RK static void onClickImport(void* data); + static void onClickImport_continued(void* self, bool import); static void onClickExport(void* data); bool callbackDelete(const LLSD& notification, const LLSD& response); + + // Used to pass it from onClickImport to onClickImport_continued. + LLPanelPick* mPanelPick; }; diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index c7f31f1f9..9af829e9b 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -66,7 +66,7 @@ //For pick import and export - RK -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "llviewernetwork.h" #include "llsdserialize.h" #include "hippogridmanager.h" @@ -201,14 +201,19 @@ void LLPanelPick::initNewPick() } //Imports a new pick from an xml - RK -bool LLPanelPick::importNewPick() +void LLPanelPick::importNewPick(void (*callback)(void*, bool), void* data) { - LLFilePicker& file_picker = LLFilePicker::instance(); + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_XML, "", "export"); + filepicker->run(boost::bind(&LLPanelPick::importNewPick_continued, this, callback, data, filepicker)); +} - if(!file_picker.getOpenFile(LLFilePicker::FFLOAD_XML)) return false;// User canceled load. - else +void LLPanelPick::importNewPick_continued(void (*callback)(void*, bool), void* data, AIFilePicker* filepicker) +{ + bool result = false; + if (filepicker->hasFilename()) { - std::string file = file_picker.getFirstFile(); + std::string file = filepicker->getFilename(); llifstream importer(file); LLSD data; @@ -231,19 +236,25 @@ bool LLPanelPick::importNewPick() mImporting = true; sendPickInfoUpdate(); - return true; + result = true; } + (*callback)(data, result); } //Exports a pick to an XML - RK void LLPanelPick::exportPick() { - LLFilePicker& file_picker = LLFilePicker::instance(); - - if(!file_picker.getSaveFile(LLFilePicker::FFSAVE_XML)) - return;// User canceled save. + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open("", FFSAVE_XML, "", "export"); + filepicker->run(boost::bind(&LLPanelPick::exportPick_continued, this, filepicker)); +} - std::string destination = file_picker.getFirstFile(); +void LLPanelPick::exportPick_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) + return; + + std::string destination = filepicker->getFilename(); LLSD datas; diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h index 49b07924c..bfa702251 100644 --- a/indra/newview/llpanelpick.h +++ b/indra/newview/llpanelpick.h @@ -50,6 +50,7 @@ class LLTextEditor; class LLTextureCtrl; class LLUICtrl; class LLMessageSystem; +class AIFilePicker; class LLPanelPick : public LLPanel { @@ -70,8 +71,10 @@ public: void initNewPick(); //Pick import and export - RK - bool importNewPick(); + void importNewPick(void (*callback)(void*, bool), void* data); + void importNewPick_continued(void (*callback)(void*, bool), void* data, AIFilePicker* filepicker); void exportPick(); + void exportPick_continued(AIFilePicker* filepicker); // We need to know the creator id so the database knows which partition // to query for the pick data. diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp index f9cb5f210..85349883b 100644 --- a/indra/newview/llpreviewanim.cpp +++ b/indra/newview/llpreviewanim.cpp @@ -40,7 +40,7 @@ #include "llvoavatar.h" #include "llagent.h" // gAgent #include "llkeyframemotion.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "lllineeditor.h" #include "lluictrlfactory.h" #include "lluictrlfactory.h" @@ -392,21 +392,22 @@ void LLPreviewAnim::gotAssetForSave(LLVFS *vfs, // Write it back out... - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_ANIMATN, LLDir::getScrubbedFileName(self->getItem()->getName())) ) - { - // User canceled or we failed to acquire save file. - return; - } - // remember the user-approved/edited file name. - std::string filename = file_picker.getFirstFile(); + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(LLDir::getScrubbedFileName(self->getItem()->getName()) + ".animatn", FFSAVE_ANIMATN); + filepicker->run(boost::bind(&LLPreviewAnim::gotAssetForSave_continued, buffer, size, filepicker)); +} - std::ofstream export_file(filename.c_str(), std::ofstream::binary); - export_file.write(buffer, size); - export_file.close(); - +// static +void LLPreviewAnim::gotAssetForSave_continued(char* buffer, S32 size, AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) + { + std::string filename = filepicker->getFilename(); + std::ofstream export_file(filename.c_str(), std::ofstream::binary); + export_file.write(buffer, size); + export_file.close(); + } delete[] buffer; - buffer = NULL; } // virtual diff --git a/indra/newview/llpreviewanim.h b/indra/newview/llpreviewanim.h index 115419fb6..3b9c53025 100644 --- a/indra/newview/llpreviewanim.h +++ b/indra/newview/llpreviewanim.h @@ -36,6 +36,8 @@ #include "llpreview.h" #include "llcharacter.h" +class AIFilePicker; + class LLPreviewAnim : public LLPreview { public: @@ -59,6 +61,7 @@ public: const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status); + static void gotAssetForSave_continued(char* buffer, S32 size, AIFilePicker* filepicker); static void copyAnimID(void* userdata); // static void endAnimCallback( void *userdata ); diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index c2c3e8869..6acdc32ba 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -61,7 +61,7 @@ #include "lllineeditor.h" #include "lluictrlfactory.h" // -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" // ///---------------------------------------------------------------------------- @@ -717,17 +717,18 @@ void LLPreviewNotecard::saveAs() if(item) { // gAssetStorage->getAssetData(item->getAssetUUID(), LLAssetType::AT_NOTECARD, LLPreviewNotecard::gotAssetForSave, this, TRUE); - default_filename = LLDir::getScrubbedFileName(item->getName()); + default_filename = LLDir::getScrubbedFileName(item->getName()) + ".notecard"; } - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_NOTECARD, default_filename ) ) - { - // User canceled or we failed to acquire save file. + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(default_filename, FFSAVE_NOTECARD); + filepicker->run(boost::bind(&LLPreviewNotecard::saveAs_continued, this, filepicker)); +} + +void LLPreviewNotecard::saveAs_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) return; - } - // remember the user-approved/edited file name. - std::string filename = file_picker.getFirstFile(); LLViewerTextEditor* editor = getChild("Notecard Editor"); @@ -738,8 +739,9 @@ void LLPreviewNotecard::saveAs() return; } - S32 size = buffer.length() + 1; + S32 size = buffer.length(); + std::string filename = filepicker->getFilename(); std::ofstream export_file(filename.c_str(), std::ofstream::binary); export_file.write(buffer.c_str(), size); export_file.close(); diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h index c3bf0e2f9..04568bf65 100644 --- a/indra/newview/llpreviewnotecard.h +++ b/indra/newview/llpreviewnotecard.h @@ -46,6 +46,7 @@ class LLTextEditor; class LLViewerTextEditor; class LLButton; +class AIFilePicker; class LLPreviewNotecard : public LLPreview { @@ -128,6 +129,7 @@ protected: // virtual BOOL canSaveAs() const; virtual void saveAs(); + void saveAs_continued(AIFilePicker* filepicker); // }; diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 7b6bab72e..a58f1180e 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -54,6 +54,7 @@ #include "lltextbox.h" #include "lltooldraganddrop.h" #include "llvfile.h" +#include "statemachine/aifilepicker.h" #include "llagent.h" #include "llnotify.h" @@ -1700,23 +1701,23 @@ void LLPreviewLSL::saveAs() const LLInventoryItem *item = getItem(); if(item) { - default_filename = LLDir::getScrubbedFileName(item->getName()); + default_filename = LLDir::getScrubbedFileName(item->getName()) + ".lsl"; } - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_LSL, default_filename ) ) - { - // User canceled or we failed to acquire save file. + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(default_filename, FFSAVE_LSL); + filepicker->run(boost::bind(&LLPreviewLSL::saveAs_continued, this, filepicker)); +} + +void LLPreviewLSL::saveAs_continued(AIFilePicker* filepicker) +{ + if(!filepicker->hasFilename()) return; - } - // remember the user-approved/edited file name. - std::string filename = file_picker.getFirstFile(); std::string utf8text = mScriptEd->mEditor->getText(); - LLFILE* fp = LLFile::fopen(filename, "wb"); + LLFILE* fp = LLFile::fopen(filepicker->getFilename(), "wb"); fputs(utf8text.c_str(), fp); fclose(fp); - fp = NULL; } // /// --------------------------------------------------------------------------- @@ -2654,19 +2655,19 @@ void LLLiveLSLEditor::saveAs() default_filename = LLDir::getScrubbedFileName(item->getName()); } - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_LSL, default_filename ) ) - { - // User canceled or we failed to acquire save file. + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(default_filename, FFSAVE_LSL); + filepicker->run(boost::bind(&LLLiveLSLEditor::saveAs_continued, this, filepicker)); +} + +void LLLiveLSLEditor::saveAs_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) return; - } - // remember the user-approved/edited file name. - std::string filename = file_picker.getFirstFile(); std::string utf8text = mScriptEd->mEditor->getText(); - LLFILE* fp = LLFile::fopen(filename, "wb"); + LLFILE* fp = LLFile::fopen(filepicker->getFilename(), "wb"); fputs(utf8text.c_str(), fp); fclose(fp); - fp = NULL; } // diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index 58959e445..aa03a6c2e 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -53,6 +53,7 @@ struct LLEntryAndEdCore; class LLMenuBarGL; class LLFloaterScriptSearch; class LLKeywordToken; +class AIFilePicker; // Inner, implementation class. LLPreviewScript and LLLiveLSLEditor each own one of these. class LLScriptEdCore : public LLPanel, public LLEventTimer @@ -189,6 +190,7 @@ protected: // virtual BOOL canSaveAs() const; virtual void saveAs(); + void saveAs_continued(AIFilePicker* filepicker); // static void onSearchReplace(void* userdata); @@ -261,6 +263,7 @@ protected: // virtual BOOL canSaveAs() const; virtual void saveAs(); + void saveAs_continued(AIFilePicker* filepicker); // static void onSearchReplace(void* userdata); diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index e40dddbd2..890979578 100644 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -48,7 +48,7 @@ #include "llchat.h" #include "llfloaterchat.h" #include "llviewerwindow.h" // for alert -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" // for ambient play: #include "llviewerregion.h" // @@ -330,18 +330,22 @@ void LLPreviewSound::gotAssetForSave(LLVFS *vfs, // Write it back out... - LLFilePicker& file_picker = LLFilePicker::instance(); - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_OGG, LLDir::getScrubbedFileName(self->getItem()->getName())) ) - { - // User canceled or we failed to acquire save file. - return; - } - // remember the user-approved/edited file name. - std::string filename = file_picker.getFirstFile(); + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(LLDir::getScrubbedFileName(self->getItem()->getName()) + ".ogg", FFSAVE_OGG); + filepicker->run(boost::bind(&LLPreviewSound::gotAssetForSave_continued, buffer, size, filepicker)); +} - std::ofstream export_file(filename.c_str(), std::ofstream::binary); - export_file.write(buffer, size); - export_file.close(); +// static +void LLPreviewSound::gotAssetForSave_continued(char* buffer, S32 size, AIFilePicker* filepicker) +{ + if (filepicker->hasFilename()) + { + std::string filename = filepicker->getFilename(); + std::ofstream export_file(filename.c_str(), std::ofstream::binary); + export_file.write(buffer, size); + export_file.close(); + } + delete [] buffer; } // virtual diff --git a/indra/newview/llpreviewsound.h b/indra/newview/llpreviewsound.h index 535b233c9..bd8b9c0f0 100644 --- a/indra/newview/llpreviewsound.h +++ b/indra/newview/llpreviewsound.h @@ -35,6 +35,8 @@ #include "llpreview.h" +class AIFilePicker; + class LLPreviewSound : public LLPreview { public: @@ -59,6 +61,7 @@ public: const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status); + static void gotAssetForSave_continued(char* buffer, S32 size, AIFilePicker* filepicker); // protected: diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 8eb803401..2e52f3d47 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -37,7 +37,7 @@ #include "llagent.h" #include "llbutton.h" #include "llcombobox.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "llimagetga.h" #include "llinventoryview.h" #include "llinventory.h" @@ -380,15 +380,19 @@ void LLPreviewTexture::saveAs() if( mLoadingFullImage ) return; - LLFilePicker& file_picker = LLFilePicker::instance(); const LLViewerInventoryItem* item = getItem() ; - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGA, item ? LLDir::getScrubbedFileName(item->getName()) : LLStringUtil::null) ) - { - // User canceled or we failed to acquire save file. + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(item ? LLDir::getScrubbedFileName(item->getName()) + ".tga" : LLStringUtil::null, FFSAVE_TGA, "", "image"); + filepicker->run(boost::bind(&LLPreviewTexture::saveAs_continued, this, item, filepicker)); +} + +void LLPreviewTexture::saveAs_continued(LLViewerInventoryItem const* item, AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) return; - } + // remember the user-approved/edited file name. - mSaveFileName = file_picker.getFirstFile(); + mSaveFileName = filepicker->getFilename(); mLoadingFullImage = TRUE; getWindow()->incBusyCount(); mImage->forceToSaveRawImage(0) ;//re-fetch the raw image if the old one is removed. diff --git a/indra/newview/llpreviewtexture.h b/indra/newview/llpreviewtexture.h index fb75876fc..ce26d4dd4 100644 --- a/indra/newview/llpreviewtexture.h +++ b/indra/newview/llpreviewtexture.h @@ -40,6 +40,7 @@ class LLComboBox; class LLImageRaw; +class AIFilePicker; class LLPreviewTexture : public LLPreview { @@ -64,6 +65,7 @@ public: virtual BOOL canSaveAs() const; virtual void saveAs(); + void saveAs_continued(LLViewerInventoryItem const* item, AIFilePicker* filepicker); virtual LLUUID getItemID(); virtual std::string getItemCreatorName(); virtual std::string getItemCreationDate(); diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp index 2ba87f01b..a860e5303 100644 --- a/indra/newview/lluploaddialog.cpp +++ b/indra/newview/lluploaddialog.cpp @@ -161,10 +161,6 @@ void LLUploadDialog::setMessage( const std::string& msg) LLUploadDialog::~LLUploadDialog() { gFocusMgr.releaseFocusIfNeeded( this ); - -// LLFilePicker::instance().reset(); - - LLUploadDialog::sDialog = NULL; } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 873e6d1ae..2c898d300 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -69,6 +69,7 @@ #include "lltimer.h" #include "llvfile.h" #include "llvolumemgr.h" +#include "statemachine/aifilepicker.h" // newview includes #include "llagent.h" @@ -1223,19 +1224,21 @@ void init_debug_world_menu(LLMenuGL* menu) menu->createJumpKeys(); } - +static void handle_export_menus_to_xml_continued(AIFilePicker* filepicker); void handle_export_menus_to_xml(void*) { + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open("", FFSAVE_XML); + filepicker->run(boost::bind(&handle_export_menus_to_xml_continued, filepicker)); +} - LLFilePicker& picker = LLFilePicker::instance(); - if(!picker.getSaveFile(LLFilePicker::FFSAVE_XML)) +static void handle_export_menus_to_xml_continued(AIFilePicker* filepicker) +{ + if(!filepicker->hasFilename()) { - llwarns << "No file" << llendl; return; } - std::string filename = picker.getFirstFile(); - - llofstream out(filename); + llofstream out(filepicker->getFilename()); LLXMLNodePtr node = gMenuBarView->getXML(); node->writeToOstream(out); out.close(); @@ -8645,6 +8648,7 @@ const LLRect LLViewerMenuHolderGL::getMenuRect() const return LLRect(0, getRect().getHeight() - MENU_BAR_HEIGHT, getRect().getWidth(), STATUS_BAR_HEIGHT); } +static void handle_save_to_xml_continued(LLFloater* frontmost, AIFilePicker* filepicker); void handle_save_to_xml(void*) { LLFloater* frontmost = gFloaterView->getFrontmost(); @@ -8664,20 +8668,33 @@ void handle_save_to_xml(void*) LLStringUtil::replaceChar(default_name, ':', '_'); LLStringUtil::replaceChar(default_name, '"', '_'); - LLFilePicker& picker = LLFilePicker::instance(); - if (picker.getSaveFile(LLFilePicker::FFSAVE_XML, default_name)) + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(default_name, FFSAVE_XML); + filepicker->run(boost::bind(&handle_save_to_xml_continued, frontmost, filepicker)); +} + +static void handle_save_to_xml_continued(LLFloater* frontmost, AIFilePicker* filepicker) +{ + if (filepicker->hasFilename()) { - std::string filename = picker.getFirstFile(); + std::string filename = filepicker->getFilename(); LLUICtrlFactory::getInstance()->saveToXML(frontmost, filename); } } +static void handle_load_from_xml_continued(AIFilePicker* filepicker); void handle_load_from_xml(void*) { - LLFilePicker& picker = LLFilePicker::instance(); - if (picker.getOpenFile(LLFilePicker::FFLOAD_XML)) + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_XML); + filepicker->run(boost::bind(&handle_load_from_xml_continued, filepicker)); +} + +static void handle_load_from_xml_continued(AIFilePicker* filepicker) +{ + if (filepicker->hasFilename()) { - std::string filename = picker.getFirstFile(); + std::string filename = filepicker->getFilename(); LLFloater* floater = new LLFloater("sample_floater"); LLUICtrlFactory::getInstance()->buildFloater(floater, filename); } diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 7e276e51f..a8d78cd8d 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -41,7 +41,7 @@ #include "llimagepng.h" #include "llimagebmp.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "llfloateranimpreview.h" #include "llfloaterbuycurrency.h" @@ -125,26 +125,26 @@ static std::string SLOBJECT_EXTENSIONS = "slobject"; #endif static std::string ALL_FILE_EXTENSIONS = "*.*"; -std::string build_extensions_string(LLFilePicker::ELoadFilter filter) +std::string build_extensions_string(ELoadFilter filter) { switch(filter) { #if LL_WINDOWS - case LLFilePicker::FFLOAD_IMAGE: + case FFLOAD_IMAGE: return IMAGE_EXTENSIONS; - case LLFilePicker::FFLOAD_WAV: + case FFLOAD_WAV: return SOUND_EXTENSIONS; - case LLFilePicker::FFLOAD_ANIM: + case FFLOAD_ANIM: return ANIM_EXTENSIONS; - case LLFilePicker::FFLOAD_SLOBJECT: + case FFLOAD_SLOBJECT: return SLOBJECT_EXTENSIONS; #ifdef _CORY_TESTING - case LLFilePicker::FFLOAD_GEOMETRY: + case FFLOAD_GEOMETRY: return GEOMETRY_EXTENSIONS; #endif - case LLFilePicker::FFLOAD_XML: + case FFLOAD_XML: return XML_EXTENSIONS; - case LLFilePicker::FFLOAD_ALL: + case FFLOAD_ALL: return ALL_FILE_EXTENSIONS; #endif default: @@ -152,48 +152,51 @@ std::string build_extensions_string(LLFilePicker::ELoadFilter filter) } } -/** - char* upload_pick(void* data) +class AIFileUpload { + protected: + AIFilePicker* mPicker; - If applicable, brings up a file chooser in which the user selects a file - to upload for a particular task. If the file is valid for the given action, - returns the string to the full path filename, else returns NULL. - Data is the load filter for the type of file as defined in LLFilePicker. + public: + AIFileUpload(void) : mPicker(NULL) { } + virtual ~AIFileUpload() { llassert(!mPicker); if (mPicker) { mPicker->abort(); mPicker = NULL; } } - Eventually I'd really like to have a built-in browser that gave you all - valid filetypes, default permissions, "Temp when available", and a single - upload button. Maybe let it show the contents of multiple folders. The main - purpose of this features is to deal with the problem of SL just up and - disconnecting if you take more than like 30 seconds to look for a file. -HgB -**/ -const std::string upload_pick(void* data) + public: + bool is_valid(std::string const& filename, ELoadFilter type); + void filepicker_callback(ELoadFilter type); + void start_filepicker(ELoadFilter type, char const* context); + + protected: + virtual void handle_event(std::string const& filename) = 0; +}; + +void AIFileUpload::start_filepicker(ELoadFilter filter, char const* context) { - if( gAgent.cameraMouselook() ) + if( gAgent.cameraMouselook() ) { gAgent.changeCameraToDefault(); // This doesn't seem necessary. JC // display(); } - LLFilePicker::ELoadFilter type; - if(data) - { - type = (LLFilePicker::ELoadFilter)((intptr_t)data); - } - else - { - type = LLFilePicker::FFLOAD_ALL; - } + llassert(!mPicker); + mPicker = new AIFilePicker; + mPicker->open(filter, "", context); + mPicker->run(boost::bind(&AIFileUpload::filepicker_callback, this, filter)); +} - LLFilePicker& picker = LLFilePicker::instance(); - if (!picker.getOpenFile(type)) +void AIFileUpload::filepicker_callback(ELoadFilter type) +{ + if (mPicker->hasFilename()) { - llinfos << "Couldn't import objects from file" << llendl; - return std::string(); + std::string filename = mPicker->getFilename(); + if (is_valid(filename, type)) + handle_event(filename); } + mPicker = NULL; +} - - const std::string& filename = picker.getFirstFile(); +bool AIFileUpload::is_valid(std::string const& filename, ELoadFilter type) +{ std::string ext = gDirUtilp->getExtension(filename); //strincmp doesn't like NULL pointers @@ -205,7 +208,7 @@ const std::string upload_pick(void* data) LLSD args; args["FILE"] = short_name; LLNotifications::instance().add("NoFileExtension", args); - return std::string(); + return false; } else { @@ -248,7 +251,7 @@ const std::string upload_pick(void* data) args["EXTENSION"] = ext; args["VALIDS"] = valid_extensions; LLNotifications::instance().add("InvalidFileExtension", args); - return NULL; + return false; } }//end else (non-null extension) @@ -257,7 +260,7 @@ const std::string upload_pick(void* data) //now we check to see //if the file is actually a valid image/sound/etc. //Consider completely disabling this, see how SL handles it. Maybe we can get full song uploads again! -HgB - if (type == LLFilePicker::FFLOAD_WAV) + if (type == FFLOAD_WAV) { // pre-qualify wavs to make sure the format is acceptable std::string error_msg; @@ -267,103 +270,68 @@ const std::string upload_pick(void* data) LLSD args; args["FILE"] = filename; LLNotifications::instance().add( error_msg, args ); - return std::string(); + return false; } }//end if a wave/sound file - return filename; + return true; } -class LLFileUploadImage : public view_listener_t +class LLFileUploadImage : public view_listener_t, public AIFileUpload { + public: bool handleEvent(LLPointer event, const LLSD& userdata) { - std::string filename = upload_pick((void *)LLFilePicker::FFLOAD_IMAGE); - if (!filename.empty()) - { - LLFloaterImagePreview* floaterp = new LLFloaterImagePreview(filename); - LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_image_preview.xml"); - } - return TRUE; + start_filepicker(FFLOAD_IMAGE, "image"); + return true; + } + + protected: + // Inherited from AIFileUpload. + /*virtual*/ void handle_event(std::string const& filename) + { + LLFloaterImagePreview* floaterp = new LLFloaterImagePreview(filename); + LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_image_preview.xml"); } }; -class LLFileUploadSound : public view_listener_t +class LLFileUploadSound : public view_listener_t, public AIFileUpload { bool handleEvent(LLPointer event, const LLSD& userdata) { - std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_WAV); - if (!filename.empty()) - { - LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename); - LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_sound_preview.xml"); - floaterp->childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload() )); - } + start_filepicker(FFLOAD_WAV, "sound"); return true; } + + protected: + // Inherited from AIFileUpload. + /*virtual*/ void handle_event(std::string const& filename) + { + LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename); + LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_sound_preview.xml"); + floaterp->childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload() )); + } }; -class LLFileUploadAnim : public view_listener_t +class LLFileUploadAnim : public view_listener_t, public AIFileUpload { bool handleEvent(LLPointer event, const LLSD& userdata) { - const std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_ANIM); - if (!filename.empty()) - { - LLFloaterAnimPreview* floaterp = new LLFloaterAnimPreview(filename); - LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_animation_preview.xml"); - } + start_filepicker(FFLOAD_ANIM, "animations"); return true; } + + protected: + // Inherited from AIFileUpload. + /*virtual*/ void handle_event(std::string const& filename) + { + LLFloaterAnimPreview* floaterp = new LLFloaterAnimPreview(filename); + LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_animation_preview.xml"); + } }; class LLFileUploadBulk : public view_listener_t { - static bool onConfirmBulkUploadTemp(const LLSD& notification, const LLSD& response ) - { - S32 option = LLNotification::getSelectedOption(notification, response); - BOOL enabled; - if(option == 0) // yes - enabled = TRUE; - else if(option == 1) //no - enabled = FALSE; - else //cancel - return false; - - LLFilePicker& picker = LLFilePicker::instance(); - if (picker.getMultipleOpenFiles()) - { - //const std::string& filename = picker.getFirstFile(); - std::string filename; - while(!(filename = picker.getNextFile()).empty()) - { - std::string name = gDirUtilp->getBaseFileName(filename, true); - - std::string asset_name = name; - LLStringUtil::replaceNonstandardASCII( asset_name, '?' ); - LLStringUtil::replaceChar(asset_name, '|', '?'); - LLStringUtil::stripNonprintable(asset_name); - LLStringUtil::trim(asset_name); - - std::string display_name = LLStringUtil::null; - LLAssetStorage::LLStoreAssetCallback callback = NULL; - S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - void *userdata = NULL; - gSavedSettings.setBOOL("TemporaryUpload",enabled); - upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, - LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), - display_name, - callback, expected_upload_cost, userdata); - - } - } - else - { - llinfos << "Couldn't import objects from file" << llendl; - gSavedSettings.setBOOL("TemporaryUpload",FALSE); - } - return false; - } bool handleEvent(LLPointer event, const LLSD& userdata) { if( gAgent.cameraMouselook() ) @@ -388,45 +356,59 @@ class LLFileUploadBulk : public view_listener_t msg.append(llformat("\nWARNING: Each upload costs L$%d if it's not temporary.",expected_upload_cost)); args["MESSAGE"] = msg; LLNotifications::instance().add("GenericAlertYesNoCancel", args, LLSD(), onConfirmBulkUploadTemp); - /* moved to the callback for the above - LLFilePicker& picker = LLFilePicker::instance(); - if (picker.getMultipleOpenFiles()) - { - // - - //const std::string& filename = picker.getFirstFile(); - std::string filename; - while(!(filename = picker.getNextFile()).empty()) - { - // - std::string name = gDirUtilp->getBaseFileName(filename, true); - - std::string asset_name = name; - LLStringUtil::replaceNonstandardASCII( asset_name, '?' ); - LLStringUtil::replaceChar(asset_name, '|', '?'); - LLStringUtil::stripNonprintable(asset_name); - LLStringUtil::trim(asset_name); - - std::string display_name = LLStringUtil::null; - LLAssetStorage::LLStoreAssetCallback callback = NULL; - S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - void *userdata = NULL; - upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, - LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), - display_name, - callback, expected_upload_cost, userdata); + return true; + } + + static bool onConfirmBulkUploadTemp(const LLSD& notification, const LLSD& response ) + { + S32 option = LLNotification::getSelectedOption(notification, response); + bool enabled; + if (option == 0) // yes + enabled = true; + else if(option == 1) // no + enabled = false; + else // cancel + return false; + + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_ALL, "", "openfile", true); + filepicker->run(boost::bind(&LLFileUploadBulk::onConfirmBulkUploadTemp_continued, enabled, filepicker)); + return true; + } + + static void onConfirmBulkUploadTemp_continued(bool enabled, AIFilePicker* filepicker) + { + if (filepicker->hasFilename()) + { + std::vector const& file_names(filepicker->getFilenames()); + for (std::vector::const_iterator iter = file_names.begin(); iter != file_names.end(); ++iter) + { + std::string const& filename(*iter); + if (filename.empty()) + continue; + std::string name = gDirUtilp->getBaseFileName(filename, true); + + std::string asset_name = name; + LLStringUtil::replaceNonstandardASCII( asset_name, '?' ); + LLStringUtil::replaceChar(asset_name, '|', '?'); + LLStringUtil::stripNonprintable(asset_name); + LLStringUtil::trim(asset_name); + + std::string display_name = LLStringUtil::null; + LLAssetStorage::LLStoreAssetCallback callback = NULL; + S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + void *userdata = NULL; + gSavedSettings.setBOOL("TemporaryUpload", enabled); + upload_new_resource(filename, asset_name, asset_name, 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, + LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), + display_name, callback, expected_upload_cost, userdata); - // *NOTE: Ew, we don't iterate over the file list here, - // we handle the next files in upload_done_callback() - // not anymore! } } else { - llinfos << "Couldn't import objects from file" << llendl; + gSavedSettings.setBOOL("TemporaryUpload", FALSE); } - */ - return true; } }; @@ -601,44 +583,39 @@ class LLFileQuit : public view_listener_t } }; -void handle_upload(void* data) -{ - const std::string filename = upload_pick(data); - if (!filename.empty()) - { - LLFloaterNameDesc* floaterp = new LLFloaterNameDesc(filename); - LLUICtrlFactory::getInstance()->buildFloater(floaterp, "floater_name_description.xml"); - floaterp->childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload() )); - } -} - +static void handle_compress_image_continued(AIFilePicker* filepicker); void handle_compress_image(void*) { - LLFilePicker& picker = LLFilePicker::instance(); - if (picker.getMultipleOpenFiles(LLFilePicker::FFLOAD_IMAGE)) + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_IMAGE, "", "openfile", true); + filepicker->run(boost::bind(&handle_compress_image_continued, filepicker)); +} + +static void handle_compress_image_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) + return; + + std::vector const& filenames(filepicker->getFilenames()); + for(std::vector::const_iterator filename = filenames.begin(); filename != filenames.end(); ++filename) { - std::string infile = picker.getFirstFile(); - while (!infile.empty()) + std::string const& infile(*filename); + std::string outfile = infile + ".j2c"; + + llinfos << "Input: " << infile << llendl; + llinfos << "Output: " << outfile << llendl; + + BOOL success; + + success = LLViewerTextureList::createUploadFile(infile, outfile, IMG_CODEC_TGA); + + if (success) { - std::string outfile = infile + ".j2c"; - - llinfos << "Input: " << infile << llendl; - llinfos << "Output: " << outfile << llendl; - - BOOL success; - - success = LLViewerTextureList::createUploadFile(infile, outfile, IMG_CODEC_TGA); - - if (success) - { - llinfos << "Compression complete" << llendl; - } - else - { - llinfos << "Compression failed: " << LLImage::getLastError() << llendl; - } - - infile = picker.getNextFile(); + llinfos << "Compression complete" << llendl; + } + else + { + llinfos << "Compression failed: " << LLImage::getLastError() << llendl; } } } @@ -1137,32 +1114,6 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt LLUploadDialog::modalUploadFinished(); delete data; - - // *NOTE: This is a pretty big hack. What this does is check the - // file picker if there are any more pending uploads. If so, - // upload that file. - /* Agreed, let's not use it. -HgB - const std::string& next_file = LLFilePicker::instance().getNextFile(); - if(is_balance_sufficient && !next_file.empty()) - { - std::string asset_name = gDirUtilp->getBaseFileName(next_file, true); - LLStringUtil::replaceNonstandardASCII( asset_name, '?' ); - LLStringUtil::replaceChar(asset_name, '|', '?'); - LLStringUtil::stripNonprintable(asset_name); - LLStringUtil::trim(asset_name); - - std::string display_name = LLStringUtil::null; - LLAssetStorage::LLStoreAssetCallback callback = NULL; - void *userdata = NULL; - upload_new_resource(next_file, asset_name, asset_name, // file - 0, LLAssetType::AT_NONE, LLInventoryType::IT_NONE, - PERM_NONE, PERM_NONE, PERM_NONE, - display_name, - callback, - expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost - userdata); - } - */ } void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type, diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index 0e03429e9..c92e82da3 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -78,6 +78,4 @@ void upload_new_resource(const LLTransactionID &tid, S32 expected_upload_cost, void *userdata); -const std::string upload_pick(void* data); - #endif diff --git a/indra/newview/llviewerobjectbackup.cpp b/indra/newview/llviewerobjectbackup.cpp index c944780af..51d0a4336 100644 --- a/indra/newview/llviewerobjectbackup.cpp +++ b/indra/newview/llviewerobjectbackup.cpp @@ -56,7 +56,7 @@ #include "llagent.h" #include "llappviewer.h" #include "llassetuploadresponders.h" -#include "llfilepicker.h" +#include "statemachine/aifilepicker.h" #include "llfloateranimpreview.h" #include "llfloaterbuycurrency.h" #include "llfloaterimagepreview.h" @@ -341,14 +341,20 @@ void LLObjectBackup::exportObject() mThisGroup.clear(); // Open the file save dialog - LLFilePicker& file_picker = LLFilePicker::instance(); - if (!file_picker.getSaveFile(LLFilePicker::FFSAVE_XML)) + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open("", FFSAVE_XML); + filepicker->run(boost::bind(&LLObjectBackup::exportObject_continued, this, filepicker)); +} + +void LLObjectBackup::exportObject_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) { // User canceled save. return; } - mFileName = file_picker.getCurFile(); + mFileName = filepicker->getFilename(); mFolder = gDirUtilp->getDirName(mFileName); mNonExportedTextures = TEXTURE_OK; @@ -733,14 +739,19 @@ void LLObjectBackup::importObject(bool upload) mRetexture = upload; // Open the file open dialog - LLFilePicker& file_picker = LLFilePicker::instance(); - if (!file_picker.getOpenFile(LLFilePicker::FFLOAD_XML)) - { - // User canceled save. - return; - } + AIFilePicker* filepicker = new AIFilePicker; + filepicker->open(FFLOAD_XML, "", "import"); + filepicker->run(boost::bind(&LLObjectBackup::importObject_continued, this, filepicker)); - std::string file_name = file_picker.getFirstFile().c_str(); + return; +} + +void LLObjectBackup::importObject_continued(AIFilePicker* filepicker) +{ + if (!filepicker->hasFilename()) + return; + + std::string file_name = filepicker->getFilename(); mFolder = gDirUtilp->getDirName(file_name); llifstream import_file(file_name); LLSDSerialize::fromXML(mLLSD, import_file); @@ -762,7 +773,7 @@ void LLObjectBackup::importObject(bool upload) if (mObjects <= 0) { LLSD args; - args["MESSAGE"] = std::string("Object import failed.\nThe XML file has an incompatble format or does not contain any objects."); + args["MESSAGE"] = std::string("Object import failed.\nThe XML file has an incompatible format or does not contain any objects."); LLNotifications::instance().add("GenericAlert", args); llwarns << "Trying to import illegal XML object file." << llendl; return; diff --git a/indra/newview/llviewerobjectbackup.h b/indra/newview/llviewerobjectbackup.h index 46ca5f916..5ae33c382 100644 --- a/indra/newview/llviewerobjectbackup.h +++ b/indra/newview/llviewerobjectbackup.h @@ -56,9 +56,11 @@ public: // Import entry point void importObject(bool upload=FALSE); + void importObject_continued(AIFilePicker* filepicker); // Export entry point void exportObject(); + void exportObject_continued(AIFilePicker* filepicker); // Update map from texture worker void updateMap(LLUUID uploaded_asset); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 2e684633c..2e256db6b 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -4015,23 +4015,22 @@ void LLViewerWindow::saveImageNumbered(LLPointer image) { std::string proposed_name( sSnapshotBaseName ); - // getSaveFile will append an appropriate extension to the proposed name, based on the ESaveFilter constant passed in. + // AIFilePicker will append an appropriate extension to the proposed name, based on the ESaveFilter constant passed in. // pick a directory in which to save - AIFilePicker* filepicker = new AIFilePicker; // Deleted in LLViewerWindow::saveImageNumbered_filepicker_callback + AIFilePicker* filepicker = new AIFilePicker; // Deleted in LLViewerWindow::saveImageNumbered_continued1 filepicker->open(proposed_name, pick_type, "", "snapshot"); - filepicker->run(boost::bind(&LLViewerWindow::saveImageNumbered_filepicker_callback, this, image, extension, filepicker, _1)); + filepicker->run(boost::bind(&LLViewerWindow::saveImageNumbered_continued1, this, image, extension, filepicker)); return; } - // LLViewerWindow::sSnapshotBaseName and LLViewerWindow::sSnapshotDir already known. Go straight to saveImageNumbered_continued. - saveImageNumbered_continued(image, extension); + // LLViewerWindow::sSnapshotBaseName and LLViewerWindow::sSnapshotDir already known. Go straight to saveImageNumbered_continued2. + saveImageNumbered_continued2(image, extension); } -void LLViewerWindow::saveImageNumbered_filepicker_callback(LLPointer image, std::string const& extension, AIFilePicker* filepicker, bool success) +void LLViewerWindow::saveImageNumbered_continued1(LLPointer image, std::string const& extension, AIFilePicker* filepicker) { - llassert((bool)*filepicker == success); - if (success && !filepicker->isCanceled()) + if (filepicker->hasFilename()) { // Copy the directory + file name std::string filepath = filepicker->getFilename(); @@ -4039,12 +4038,11 @@ void LLViewerWindow::saveImageNumbered_filepicker_callback(LLPointergetBaseFileName(filepath, true); LLViewerWindow::sSnapshotDir = gDirUtilp->getDirName(filepath); - saveImageNumbered_continued(image, extension); + saveImageNumbered_continued2(image, extension); } - filepicker->deleteMe(); } -void LLViewerWindow::saveImageNumbered_continued(LLPointer image, std::string const& extension) +void LLViewerWindow::saveImageNumbered_continued2(LLPointer image, std::string const& extension) { // Look for an unused file name std::string filepath; diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index cbf3f0187..dec5a177c 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -296,8 +296,8 @@ public: BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); } void resetSnapshotLoc() const { sSnapshotDir.clear(); } void saveImageNumbered(LLPointer image); - void saveImageNumbered_filepicker_callback(LLPointer image, std::string const& extension, AIFilePicker* filepicker, bool success); - void saveImageNumbered_continued(LLPointer image, std::string const& extension); + void saveImageNumbered_continued1(LLPointer image, std::string const& extension, AIFilePicker* filepicker); + void saveImageNumbered_continued2(LLPointer image, std::string const& extension); // Reset the directory where snapshots are saved. // Client will open directory picker on next snapshot save. diff --git a/indra/newview/statemachine/aifilepicker.cpp b/indra/newview/statemachine/aifilepicker.cpp index 33ef0c16c..e0588a990 100644 --- a/indra/newview/statemachine/aifilepicker.cpp +++ b/indra/newview/statemachine/aifilepicker.cpp @@ -133,8 +133,14 @@ void AIFilePicker::open(ELoadFilter filter, std::string const& default_path, std case FFLOAD_RAW: mFilter = "raw"; break; - case FFLOAD_TEXT: - mFilter = "text"; + case FFLOAD_INVGZ: + mFilter = "invgz"; + break; + case FFLOAD_AO: + mFilter = "ao"; + break; + case FFLOAD_BLACKLIST: + mFilter = "blacklist"; break; } } @@ -188,15 +194,75 @@ void AIFilePicker::open(std::string const& filename, ESaveFilter filter, std::st case FFSAVE_JPEG: mFilter = "jpeg"; break; - case FFSAVE_HPA: - mFilter = "hpa"; + case FFSAVE_ANIMATN: + mFilter = "animatn"; break; - case FFSAVE_TEXT: - mFilter = "text"; + case FFSAVE_OGG: + mFilter = "ogg"; + break; + case FFSAVE_NOTECARD: + mFilter = "notecard"; + break; + case FFSAVE_GESTURE: + mFilter = "gesture"; break; case FFSAVE_LSL: mFilter = "lsl"; break; + case FFSAVE_SHAPE: + mFilter = "shape"; + break; + case FFSAVE_SKIN: + mFilter = "skin"; + break; + case FFSAVE_HAIR: + mFilter = "hair"; + break; + case FFSAVE_EYES: + mFilter = "eyes"; + break; + case FFSAVE_SHIRT: + mFilter = "shirt"; + break; + case FFSAVE_PANTS: + mFilter = "pants"; + break; + case FFSAVE_SHOES: + mFilter = "shoes"; + break; + case FFSAVE_SOCKS: + mFilter = "socks"; + break; + case FFSAVE_JACKET: + mFilter = "jacket"; + break; + case FFSAVE_GLOVES: + mFilter = "gloves"; + break; + case FFSAVE_UNDERSHIRT: + mFilter = "undershirt"; + break; + case FFSAVE_UNDERPANTS: + mFilter = "underpants"; + break; + case FFSAVE_SKIRT: + mFilter = "skirt"; + break; + case FFSAVE_INVGZ: + mFilter = "invgz"; + break; + case FFSAVE_LANDMARK: + mFilter = "landmark"; + break; + case FFSAVE_AO: + mFilter = "ao"; + break; + case FFSAVE_BLACKLIST: + mFilter = "blacklist"; + break; + case FFSAVE_PHYSICS: + mFilter = "physics"; + break; } } @@ -320,6 +386,9 @@ void AIFilePicker::finish_impl(void) mPluginManager = NULL; } mFilter.clear(); // Check that open is called before calling run (again). + // The default behavior is to delete the plugin. This can be overridden in + // the callback by calling run() again. + deleteMe(); } // This function is called when a new message is received from the plugin. diff --git a/indra/newview/statemachine/aifilepicker.h b/indra/newview/statemachine/aifilepicker.h index b1caf4701..d916055fe 100644 --- a/indra/newview/statemachine/aifilepicker.h +++ b/indra/newview/statemachine/aifilepicker.h @@ -45,7 +45,9 @@ enum ELoadFilter FFLOAD_XML, FFLOAD_SLOBJECT, FFLOAD_RAW, - FFLOAD_TEXT + FFLOAD_INVGZ, + FFLOAD_AO, + FFLOAD_BLACKLIST }; enum ESaveFilter @@ -62,9 +64,29 @@ enum ESaveFilter FFSAVE_J2C, FFSAVE_PNG, FFSAVE_JPEG, - FFSAVE_HPA, - FFSAVE_TEXT, - FFSAVE_LSL + FFSAVE_ANIMATN, + FFSAVE_OGG, + FFSAVE_NOTECARD, + FFSAVE_GESTURE, + FFSAVE_LSL, + FFSAVE_SHAPE, + FFSAVE_SKIN, + FFSAVE_HAIR, + FFSAVE_EYES, + FFSAVE_SHIRT, + FFSAVE_PANTS, + FFSAVE_SHOES, + FFSAVE_SOCKS, + FFSAVE_JACKET, + FFSAVE_GLOVES, + FFSAVE_UNDERSHIRT, + FFSAVE_UNDERPANTS, + FFSAVE_SKIRT, + FFSAVE_INVGZ, + FFSAVE_LANDMARK, + FFSAVE_AO, + FFSAVE_BLACKLIST, + FFSAVE_PHYSICS }; /* @@ -108,12 +130,9 @@ new AIFilePicker Termination happens by receiving the "canceled" or "done" message, which sets the state to AIFilePicker_canceled or AIFilePicker_done respectively, causing a call to AIStateMachine::finish(), which calls - AIFilePicker::finish_impl which destroys the plugin (mPluginBase) - and the plugin manager (mPluginManager). - - AIStateMachine::finish() also calls the registered callback function, - which should call AIStateMachine::deleteMe(), causing the AIFilePicker - to be deleted. + AIFilePicker::finish_impl which destroys the plugin (mPluginBase), + the plugin manager (mPluginManager) and calls AIStateMachine::deleteMe() + causing the AIFilePicker to be deleted. */ @@ -140,6 +159,7 @@ public: void open(ELoadFilter filter = FFLOAD_ALL, std::string const& default_path = "", std::string const& context = "openfile", bool multiple = false); bool isCanceled(void) const { return mCanceled; } + bool hasFilename(void) const { return *this && !mCanceled; } std::string const& getFilename(void) const; std::string getFolder(void) const; std::vector const& getFilenames(void) const { return mFilenames; } @@ -175,7 +195,7 @@ private: std::string get_folder(std::string const& default_path, std::string const& context); protected: - // Call deleteMe(), not delete. + // Call finish() (or abort()), not delete. /*virtual*/ ~AIFilePicker() { LL_DEBUGS("Plugin") << "Calling AIFilePicker::~AIFilePicker()" << LL_ENDL; } // Handle initializing the object. diff --git a/indra/newview/statemachine/aistatemachine.cpp b/indra/newview/statemachine/aistatemachine.cpp index ca1b5c61e..ce1a4149e 100644 --- a/indra/newview/statemachine/aistatemachine.cpp +++ b/indra/newview/statemachine/aistatemachine.cpp @@ -168,8 +168,16 @@ void AIStateMachine::finish(void) { DoutEntering(dc::statemachine, "AIStateMachine::finish() [" << (void*)this << "]"); llassert(mState == bs_run || mState == bs_abort); + // It is possible that mIdle is false when abort or finish was called from + // outside multiplex_impl. However, that only may be done by the main thread. + llassert(!mIdle || is_main_thread()); + if (!mIdle) + idle(); mState = bs_finish; finish_impl(); + // Did finish_impl call deleteMe? Then that is only the default. Remember it. + bool default_delete = (mState == bs_deleted); + mState = bs_finish; if (mParent) { // It is possible that the parent is not running when the parent is in fact aborting and called @@ -190,22 +198,21 @@ void AIStateMachine::finish(void) } // Set this already to bs_initialize now, so that (bool)*this evaluates to true. mState = bs_initialize; - // It is possible that mIdle is false when abort or finish was called from - // outside multiplex_impl. However, that only may be done by the main thread. - llassert(!mIdle || is_main_thread()); - if (!mIdle) - idle(); if (mCallback) { mCallback->callback(!mAborted); // This can/may call deleteMe(), in which case the whole AIStateMachine will be deleted from the mainloop. delete mCallback; mCallback = NULL; } + // Restore the request for deletion if we weren't started again from the callback. + if (default_delete && mState == bs_initialize) + mState = bs_deleted; } void AIStateMachine::deleteMe(void) { - llassert(mIdle && mState == bs_initialize); + // Should only be called from finish(). + llassert(mIdle && (mState == bs_initialize || mState == bs_finish)); mState = bs_deleted; } diff --git a/indra/plugins/filepicker/basic_plugin_filepicker.cpp b/indra/plugins/filepicker/basic_plugin_filepicker.cpp index b30131479..b954e27b4 100644 --- a/indra/plugins/filepicker/basic_plugin_filepicker.cpp +++ b/indra/plugins/filepicker/basic_plugin_filepicker.cpp @@ -87,12 +87,52 @@ static LLFilePicker::ESaveFilter str2savefilter(std::string const& filter) return LLFilePicker::FFSAVE_PNG; else if (filter == "jpeg") return LLFilePicker::FFSAVE_JPEG; - else if (filter == "hpa") - return LLFilePicker::FFSAVE_HPA; - else if (filter == "text") - return LLFilePicker::FFSAVE_TEXT; + else if (filter == "animatn") + return LLFilePicker::FFSAVE_ANIMATN; + else if (filter == "ogg") + return LLFilePicker::FFSAVE_OGG; + else if (filter == "notecard") + return LLFilePicker::FFSAVE_NOTECARD; + else if (filter == "gesture") + return LLFilePicker::FFSAVE_GESTURE; else if (filter == "lsl") return LLFilePicker::FFSAVE_LSL; + else if (filter == "shape") + return LLFilePicker::FFSAVE_SHAPE; + else if (filter == "skin") + return LLFilePicker::FFSAVE_SKIN; + else if (filter == "hair") + return LLFilePicker::FFSAVE_HAIR; + else if (filter == "eyes") + return LLFilePicker::FFSAVE_EYES; + else if (filter == "shirt") + return LLFilePicker::FFSAVE_SHIRT; + else if (filter == "pants") + return LLFilePicker::FFSAVE_PANTS; + else if (filter == "shoes") + return LLFilePicker::FFSAVE_SHOES; + else if (filter == "socks") + return LLFilePicker::FFSAVE_SOCKS; + else if (filter == "jacket") + return LLFilePicker::FFSAVE_JACKET; + else if (filter == "gloves") + return LLFilePicker::FFSAVE_GLOVES; + else if (filter == "undershirt") + return LLFilePicker::FFSAVE_UNDERSHIRT; + else if (filter == "underpants") + return LLFilePicker::FFSAVE_UNDERPANTS; + else if (filter == "skirt") + return LLFilePicker::FFSAVE_SKIRT; + else if (filter == "invgz") + return LLFilePicker::FFSAVE_INVGZ; + else if (filter == "landmark") + return LLFilePicker::FFSAVE_LANDMARK; + else if (filter == "ao") + return LLFilePicker::FFSAVE_AO; + else if (filter == "blacklist") + return LLFilePicker::FFSAVE_BLACKLIST; + else if (filter == "physics") + return LLFilePicker::FFSAVE_PHYSICS; else return LLFilePicker::FFSAVE_ALL; } @@ -116,8 +156,12 @@ static LLFilePicker::ELoadFilter str2loadfilter(std::string const& filter) return LLFilePicker::FFLOAD_SLOBJECT; else if (filter == "raw") return LLFilePicker::FFLOAD_RAW; - else if (filter == "text") - return LLFilePicker::FFLOAD_TEXT; + else if (filter == "invgz") + return LLFilePicker::FFLOAD_INVGZ; + else if (filter == "ao") + return LLFilePicker::FFLOAD_AO; + else if (filter == "blacklist") + return LLFilePicker::FFLOAD_BLACKLIST; else return LLFilePicker::FFLOAD_ALL; } diff --git a/indra/plugins/filepicker/llfilepicker.cpp b/indra/plugins/filepicker/llfilepicker.cpp index b9c616195..8028665e3 100644 --- a/indra/plugins/filepicker/llfilepicker.cpp +++ b/indra/plugins/filepicker/llfilepicker.cpp @@ -129,8 +129,13 @@ namespace LLWindowSDL { LLFilePicker LLFilePicker::sInstance; #if LL_WINDOWS -#define SOUND_FILTER L"Sounds (*.wav)\0*.wav\0" -#define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png)\0*.tga;*.bmp;*.jpg;*.jpeg;*.png\0" +// +#define SOUND_FILTER L"Sounds (*.wav; *.ogg)\0*.wav;*.ogg\0" +#define IMAGE_FILTER L"Images (*.tga; *.bmp; *.jpg; *.jpeg; *.png; *.jp2; *.j2k; *.j2c)\0*.tga;*.bmp;*.jpg;*.jpeg;*.png;*.jp2;*.j2k;*.j2c\0" +#define INVGZ_FILTER L"Inv cache (*.inv; *.inv.gz)\0*.inv;*.inv.gz\0" +#define AO_FILTER L"Animation Override (*.ao)\0*.ao\0" +#define BLACKLIST_FILTER L"Asset Blacklist (*.blacklist)\0*.blacklist\0" +// #define ANIM_FILTER L"Animations (*.bvh)\0*.bvh\0" #ifdef _CORY_TESTING #define GEOMETRY_FILTER L"SL Geometry (*.slg)\0*.slg\0" @@ -264,6 +269,20 @@ bool LLFilePickerBase::setupFilter(ELoadFilter filter) mOFN.lpstrFilter = RAW_FILTER \ L"\0"; break; + // + case FFLOAD_INVGZ: + mOFN.lpstrFilter = INVGZ_FILTER \ + L"\0"; + break; + case FFLOAD_AO: + mOFN.lpstrFilter = AO_FILTER \ + L"\0"; + break; + case FFLOAD_BLACKLIST: + mOFN.lpstrFilter = BLACKLIST_FILTER \ + L"\0"; + break; + // default: res = FALSE; break; @@ -401,28 +420,6 @@ bool LLFilePickerBase::getSaveFile(ESaveFilter filter, std::string const& filena L"Targa, Bitmap Images (*.tga; *.bmp)\0*.tga;*.bmp\0" \ L"\0"; break; - case FFSAVE_LSL: - if (filename.empty()) - { - wcsncpy( mFilesW,L"untitled.lsl", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/ - } - mOFN.lpstrDefExt = L"lsl"; - mOFN.lpstrFilter = - L"LSL Files (*.lsl)\0*.lsl\0" - L"Text files (*.txt)\0*.txt\0" - L"\0"; - break; - case FFSAVE_TEXT: - if (filename.empty()) - { - wcsncpy( mFilesW,L"untitled.txt", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/ - } - mOFN.lpstrDefExt = L"txt"; - mOFN.lpstrFilter = - L"Text files (*.txt)\0*.txt\0" - L"RTF Files (*.rtf)\0*.rtf\0" - L"\0"; - break; case FFSAVE_WAV: if (filename.empty()) { @@ -466,11 +463,11 @@ bool LLFilePickerBase::getSaveFile(ESaveFilter filter, std::string const& filena case FFSAVE_JPEG: if (filename.empty()) { - wcsncpy( mFilesW,L"untitled.jpeg", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/ + wcsncpy( mFilesW,L"untitled.jpg", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/ } - mOFN.lpstrDefExt = L"jpeg"; + mOFN.lpstrDefExt = L"jpg"; mOFN.lpstrFilter = - L"JPEG Images (*.jpeg)\0*.jpeg\0" \ + L"JPEG Images (*.jpg *.jpeg)\0*.jpg;*.jpeg\0" \ L"\0"; break; case FFSAVE_AVI: @@ -545,10 +542,241 @@ bool LLFilePickerBase::getSaveFile(ESaveFilter filter, std::string const& filena L"Compressed Images (*.j2c)\0*.j2c\0" \ L"\0"; break; + // + case FFSAVE_ANIMATN: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.animatn", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"animatn"; + mOFN.lpstrFilter = + L"SL Animations (*.animatn)\0*.animatn\0" \ + L"\0"; + break; + case FFSAVE_OGG: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.ogg", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"ogg"; + mOFN.lpstrFilter = + L"Ogg (*.ogg)\0*.ogg\0" \ + L"\0"; + break; + case FFSAVE_NOTECARD: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.notecard", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"notecard"; + mOFN.lpstrFilter = + L"Notecards (*.notecard)\0*.notecard\0" \ + L"\0"; + break; + case FFSAVE_GESTURE: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.gesture", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"gesture"; + mOFN.lpstrFilter = + L"Gestures (*.gesture)\0*.gesture\0" \ + L"\0"; + break; + case FFSAVE_LSL: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.lsl", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"lsl"; + mOFN.lpstrFilter = + L"LSL (*.lsl)\0*.lsl\0" \ + L"\0"; + break; + case FFSAVE_SHAPE: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.shape", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"shape"; + mOFN.lpstrFilter = + L"Shapes (*.shape)\0*.shape\0" \ + L"\0"; + break; + case FFSAVE_SKIN: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.skin", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"skin"; + mOFN.lpstrFilter = + L"Skins (*.skin)\0*.skin\0" \ + L"\0"; + break; + case FFSAVE_HAIR: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.hair", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"hair"; + mOFN.lpstrFilter = + L"Hair (*.hair)\0*.hair\0" \ + L"\0"; + break; + case FFSAVE_EYES: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.eyes", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"eyes"; + mOFN.lpstrFilter = + L"Eyes (*.eyes)\0*.eyes\0" \ + L"\0"; + break; + case FFSAVE_SHIRT: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.shirt", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"shirt"; + mOFN.lpstrFilter = + L"Shirts (*.shirt)\0*.shirt\0" \ + L"\0"; + break; + case FFSAVE_PANTS: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.pants", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"pants"; + mOFN.lpstrFilter = + L"Pants (*.pants)\0*.pants\0" \ + L"\0"; + break; + case FFSAVE_SHOES: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.shoes", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"shoes"; + mOFN.lpstrFilter = + L"Shoes (*.shoes)\0*.shoes\0" \ + L"\0"; + break; + case FFSAVE_SOCKS: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.socks", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"socks"; + mOFN.lpstrFilter = + L"Socks (*.socks)\0*.socks\0" \ + L"\0"; + break; + case FFSAVE_JACKET: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.jacket", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"jacket"; + mOFN.lpstrFilter = + L"Jackets (*.jacket)\0*.jacket\0" \ + L"\0"; + break; + case FFSAVE_GLOVES: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.gloves", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"gloves"; + mOFN.lpstrFilter = + L"Gloves (*.gloves)\0*.gloves\0" \ + L"\0"; + break; + case FFSAVE_UNDERSHIRT: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.undershirt", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"undershirt"; + mOFN.lpstrFilter = + L"Undershirts (*.undershirt)\0*.undershirt\0" \ + L"\0"; + break; + case FFSAVE_UNDERPANTS: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.underpants", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"underpants"; + mOFN.lpstrFilter = + L"Underpants (*.underpants)\0*.underpants\0" \ + L"\0"; + break; + case FFSAVE_SKIRT: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.skirt", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"skirt"; + mOFN.lpstrFilter = + L"Skirts (*.skirt)\0*.skirt\0" \ + L"\0"; + break; + case FFSAVE_LANDMARK: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.landmark", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"landmark"; + mOFN.lpstrFilter = + L"Landmarks (*.landmark)\0*.landmark\0" \ + L"\0"; + break; + case FFSAVE_AO: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.ao", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"ao"; + mOFN.lpstrFilter = + L"Animation overrides (*.ao)\0*.ao\0" \ + L"\0"; + break; + case FFSAVE_INVGZ: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.inv", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L".inv"; + mOFN.lpstrFilter = + L"InvCache (*.inv)\0*.inv\0" \ + L"\0"; + break; + case FFSAVE_BLACKLIST: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.blacklist", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L".blacklist"; + mOFN.lpstrFilter = + L"Asset Blacklists (*.blacklist)\0*.blacklist\0" \ + L"\0"; + break; + case FFSAVE_PHYSICS: + if(filename.empty()) + { + wcsncpy( mFilesW,L"untitled.phy", FILENAME_BUFFER_SIZE); + } + mOFN.lpstrDefExt = L"phy"; + mOFN.lpstrFilter = + L"Landmarks (*.phy)\0*.phy\0" \ + L"\0"; + break; + // default: return FALSE; } - mOFN.nMaxFile = SINGLE_FILENAME_BUFFER_SIZE; mOFN.Flags = OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST; @@ -604,16 +832,12 @@ Boolean LLFilePickerBase::navOpenFilterProc(AEDesc *theItem, void *info, void *c { if (fileInfo.filetype != 'JPEG' && fileInfo.filetype != 'JPG ' && fileInfo.filetype != 'BMP ' && fileInfo.filetype != 'TGA ' && - fileInfo.filetype != 'TIFF' && fileInfo.filetype != 'PSD ' && fileInfo.filetype != 'BMPf' && fileInfo.filetype != 'TPIC' && fileInfo.filetype != 'PNG ' && (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("jpeg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && CFStringCompare(fileInfo.extension, CFSTR("jpg"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && CFStringCompare(fileInfo.extension, CFSTR("bmp"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && CFStringCompare(fileInfo.extension, CFSTR("tga"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && - CFStringCompare(fileInfo.extension, CFSTR("psd"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && - CFStringCompare(fileInfo.extension, CFSTR("tiff"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && - CFStringCompare(fileInfo.extension, CFSTR("tif"), kCFCompareCaseInsensitive) != kCFCompareEqualTo && CFStringCompare(fileInfo.extension, CFSTR("png"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)) ) { @@ -639,6 +863,15 @@ Boolean LLFilePickerBase::navOpenFilterProc(AEDesc *theItem, void *info, void *c result = false; } } + else if (filter == FFLOAD_XML) + { + if (fileInfo.filetype != 'XML' && + (fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("xml"), kCFCompareCaseInsensitive) != kCFCompareEqualTo)) + ) + { + result = false; + } + } #ifdef _CORY_TESTING else if (filter == FFLOAD_GEOMETRY) { @@ -1158,13 +1391,8 @@ static std::string add_simple_mime_filter_to_gtkchooser(GtkWindow *picker, static std::string add_wav_filter_to_gtkchooser(GtkWindow *picker) { - GtkFileFilter *gfilter = gtk_file_filter_new(); - gtk_file_filter_add_pattern(gfilter, "*.wav"); - gtk_file_filter_add_mime_type(gfilter,"audio/x-wav");//not working - - std::string filtername = LLTrans::getString("sound_files") + " (*.wav)"; - add_common_filters_to_gtkchooser(gfilter, picker, filtername); - return filtername; + return add_simple_mime_filter_to_gtkchooser(picker, "audio/x-wav", + LLTrans::getString("sound_files") + " (*.wav)"); } static std::string add_bvh_filter_to_gtkchooser(GtkWindow *picker) @@ -1173,6 +1401,12 @@ static std::string add_bvh_filter_to_gtkchooser(GtkWindow *picker) LLTrans::getString("animation_files") + " (*.bvh)"); } +static std::string add_xml_filter_to_gtkchooser(GtkWindow *picker) +{ + return add_simple_mime_filter_to_gtkchooser(picker, "text/xml", + LLTrans::getString("xml_file") + " (*.xml)"); +} + static std::string add_imageload_filter_to_gtkchooser(GtkWindow *picker) { GtkFileFilter *gfilter = gtk_file_filter_new(); @@ -1300,6 +1534,9 @@ bool LLFilePickerBase::getLoadFile(ELoadFilter filter, std::string const& folder case FFLOAD_IMAGE: filtername = add_imageload_filter_to_gtkchooser(picker); break; + case FFLOAD_XML: + filtername = add_xml_filter_to_gtkchooser(picker); + break; default:; break; } @@ -1376,6 +1613,7 @@ bool LLFilePickerBase::getLoadFile(ELoadFilter filter, std::string const& folder case FFLOAD_WAV: filename += ".wav"; break; case FFLOAD_IMAGE: filename += ".tga"; break; case FFLOAD_ANIM: filename += ".bvh"; break; + case FFLOAD_XML: filename += ".xml"; break; default: break; } mFiles.push_back(filename); diff --git a/indra/plugins/filepicker/llfilepicker.h b/indra/plugins/filepicker/llfilepicker.h index d14612112..4e1a52a7e 100644 --- a/indra/plugins/filepicker/llfilepicker.h +++ b/indra/plugins/filepicker/llfilepicker.h @@ -88,7 +88,11 @@ public: FFLOAD_XML = 6, FFLOAD_SLOBJECT = 7, FFLOAD_RAW = 8, - FFLOAD_TEXT = 9, + // + FFLOAD_INVGZ = 9, + FFLOAD_AO = 10, + FFLOAD_BLACKLIST = 11 + // }; enum ESaveFilter @@ -108,9 +112,32 @@ public: FFSAVE_J2C = 12, FFSAVE_PNG = 13, FFSAVE_JPEG = 14, - FFSAVE_HPA = 15, - FFSAVE_TEXT = 16, - FFSAVE_LSL = 17 + // + FFSAVE_ANIMATN = 15, + FFSAVE_OGG = 16, + FFSAVE_NOTECARD = 17, + FFSAVE_GESTURE = 18, + FFSAVE_LSL = 19, + // good grief + FFSAVE_SHAPE = 20, + FFSAVE_SKIN = 21, + FFSAVE_HAIR = 22, + FFSAVE_EYES = 23, + FFSAVE_SHIRT = 24, + FFSAVE_PANTS = 25, + FFSAVE_SHOES = 26, + FFSAVE_SOCKS = 27, + FFSAVE_JACKET = 28, + FFSAVE_GLOVES = 29, + FFSAVE_UNDERSHIRT = 30, + FFSAVE_UNDERPANTS = 31, + FFSAVE_SKIRT = 32, + FFSAVE_INVGZ = 33, + FFSAVE_LANDMARK = 34, + FFSAVE_AO = 35, + FFSAVE_BLACKLIST = 36, + FFSAVE_PHYSICS = 37, + // }; // open the dialog. This is a modal operation @@ -164,13 +191,9 @@ private: #if LL_DARWIN NavDialogCreationOptions mNavOptions; - std::vector mFileVector; - UInt32 mFileIndex; OSStatus doNavChooseDialog(ELoadFilter filter); OSStatus doNavSaveDialog(ESaveFilter filter, const std::string& filename); - void getFilePath(SInt32 index); - void getFileName(SInt32 index); static Boolean navOpenFilterProc(AEDesc *theItem, void *info, void *callBackUD, NavFilterModes filterMode); #endif // LL_DARWIN