Use AIFilePicker everywhere.
Also upgrade the file picker filters with the new extensions found in the orginal file picker code of Singularity. Also improve AIFilePicker a bit: added hasFilename() and now deleting the statemachine automatically by default: it's no longer needed to call deleteMe from the callback.
This commit is contained in:
@@ -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++ )
|
||||
{
|
||||
|
||||
@@ -55,7 +55,7 @@ this feature is still a work in progress.
|
||||
#include <ctime>
|
||||
#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<std::string> const& filenames(filepicker->getFilenames());
|
||||
for(std::vector<std::string>::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 )
|
||||
|
||||
@@ -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<LLScrollListItem*>, S32 column = BITMAPLIST_COL_ID );
|
||||
|
||||
/* UpdateTextureCtrlList was made public cause texturectrl requests it once on spawn
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -185,13 +185,9 @@ private:
|
||||
|
||||
#if LL_DARWIN
|
||||
NavDialogCreationOptions mNavOptions;
|
||||
std::vector<std::string> 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
|
||||
|
||||
|
||||
@@ -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<LLUUID,LLSD>::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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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<LLScrollListItem*> 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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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<LLCheckBoxCtrl>("create_pretend_item")->get())
|
||||
self->add(file);
|
||||
/*if(self->getChild<LLCheckBoxCtrl>("create_pretend_item")->get())
|
||||
{
|
||||
LLLocalInventory::addItem(file.mName, (int)file.mType, file.mID, true);
|
||||
}*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -91,6 +91,7 @@
|
||||
#include "llinventorybackup.h"
|
||||
//#include "llcheats.h"
|
||||
//#include "llnotecardmagic.h"
|
||||
#include "statemachine/aifilepicker.h"
|
||||
// </edit>
|
||||
|
||||
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
|
||||
|
||||
@@ -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<LLImageTGA> 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<LLImageTGA> 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
|
||||
|
||||
@@ -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<LLInventoryCategory*>& cats,
|
||||
std::vector<LLInventoryItem*>& items);
|
||||
|
||||
@@ -99,6 +99,7 @@
|
||||
//#include "llcheats.h"
|
||||
#include "dofloaterhex.h"
|
||||
#include "hgfloatertexteditor.h"
|
||||
#include "statemachine/aifilepicker.h"
|
||||
// </edit>
|
||||
|
||||
// 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));
|
||||
}
|
||||
}
|
||||
// </edit>
|
||||
}
|
||||
|
||||
// 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();
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
@@ -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<LLTabContainer>("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<LLTabContainer>("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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
// </edit>
|
||||
static void endAnimCallback( void *userdata );
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
#include "lllineeditor.h"
|
||||
#include "lluictrlfactory.h"
|
||||
// <edit>
|
||||
#include "llfilepicker.h"
|
||||
#include "statemachine/aifilepicker.h"
|
||||
// </edit>
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
@@ -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<LLViewerTextEditor>("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();
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
class LLTextEditor;
|
||||
class LLViewerTextEditor;
|
||||
class LLButton;
|
||||
class AIFilePicker;
|
||||
|
||||
class LLPreviewNotecard : public LLPreview
|
||||
{
|
||||
@@ -128,6 +129,7 @@ protected:
|
||||
// <edit>
|
||||
virtual BOOL canSaveAs() const;
|
||||
virtual void saveAs();
|
||||
void saveAs_continued(AIFilePicker* filepicker);
|
||||
// </edit>
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
// </edit>
|
||||
/// ---------------------------------------------------------------------------
|
||||
@@ -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;
|
||||
}
|
||||
// </edit>
|
||||
|
||||
@@ -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:
|
||||
// <edit>
|
||||
virtual BOOL canSaveAs() const;
|
||||
virtual void saveAs();
|
||||
void saveAs_continued(AIFilePicker* filepicker);
|
||||
// </edit>
|
||||
|
||||
static void onSearchReplace(void* userdata);
|
||||
@@ -261,6 +263,7 @@ protected:
|
||||
// <edit>
|
||||
virtual BOOL canSaveAs() const;
|
||||
virtual void saveAs();
|
||||
void saveAs_continued(AIFilePicker* filepicker);
|
||||
// </edit>
|
||||
|
||||
static void onSearchReplace(void* userdata);
|
||||
|
||||
@@ -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"
|
||||
// </edit>
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
// </edit>
|
||||
|
||||
protected:
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -161,10 +161,6 @@ void LLUploadDialog::setMessage( const std::string& msg)
|
||||
LLUploadDialog::~LLUploadDialog()
|
||||
{
|
||||
gFocusMgr.releaseFocusIfNeeded( this );
|
||||
|
||||
// LLFilePicker::instance().reset();
|
||||
|
||||
|
||||
LLUploadDialog::sDialog = NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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<LLEvent> 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<LLEvent> 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<LLEvent> 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<LLEvent> 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())
|
||||
{
|
||||
// <edit>
|
||||
|
||||
//const std::string& filename = picker.getFirstFile();
|
||||
std::string filename;
|
||||
while(!(filename = picker.getNextFile()).empty())
|
||||
{
|
||||
// </edit>
|
||||
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<std::string> const& file_names(filepicker->getFilenames());
|
||||
for (std::vector<std::string>::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()
|
||||
// </edit> 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<std::string> const& filenames(filepicker->getFilenames());
|
||||
for(std::vector<std::string>::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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -4015,23 +4015,22 @@ void LLViewerWindow::saveImageNumbered(LLPointer<LLImageFormatted> 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<LLImageFormatted> image, std::string const& extension, AIFilePicker* filepicker, bool success)
|
||||
void LLViewerWindow::saveImageNumbered_continued1(LLPointer<LLImageFormatted> 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(LLPointer<LLImageForm
|
||||
LLViewerWindow::sSnapshotBaseName = gDirUtilp->getBaseFileName(filepath, true);
|
||||
LLViewerWindow::sSnapshotDir = gDirUtilp->getDirName(filepath);
|
||||
|
||||
saveImageNumbered_continued(image, extension);
|
||||
saveImageNumbered_continued2(image, extension);
|
||||
}
|
||||
filepicker->deleteMe();
|
||||
}
|
||||
|
||||
void LLViewerWindow::saveImageNumbered_continued(LLPointer<LLImageFormatted> image, std::string const& extension)
|
||||
void LLViewerWindow::saveImageNumbered_continued2(LLPointer<LLImageFormatted> image, std::string const& extension)
|
||||
{
|
||||
// Look for an unused file name
|
||||
std::string filepath;
|
||||
|
||||
@@ -296,8 +296,8 @@ public:
|
||||
BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); }
|
||||
void resetSnapshotLoc() const { sSnapshotDir.clear(); }
|
||||
void saveImageNumbered(LLPointer<LLImageFormatted> image);
|
||||
void saveImageNumbered_filepicker_callback(LLPointer<LLImageFormatted> image, std::string const& extension, AIFilePicker* filepicker, bool success);
|
||||
void saveImageNumbered_continued(LLPointer<LLImageFormatted> image, std::string const& extension);
|
||||
void saveImageNumbered_continued1(LLPointer<LLImageFormatted> image, std::string const& extension, AIFilePicker* filepicker);
|
||||
void saveImageNumbered_continued2(LLPointer<LLImageFormatted> image, std::string const& extension);
|
||||
|
||||
// Reset the directory where snapshots are saved.
|
||||
// Client will open directory picker on next snapshot save.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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<std::string> 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.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
// <edit>
|
||||
#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"
|
||||
// </edit>
|
||||
#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;
|
||||
// <edit>
|
||||
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;
|
||||
// </edit>
|
||||
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;
|
||||
// <edit>
|
||||
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;
|
||||
// </edit>
|
||||
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);
|
||||
|
||||
@@ -88,7 +88,11 @@ public:
|
||||
FFLOAD_XML = 6,
|
||||
FFLOAD_SLOBJECT = 7,
|
||||
FFLOAD_RAW = 8,
|
||||
FFLOAD_TEXT = 9,
|
||||
// <edit>
|
||||
FFLOAD_INVGZ = 9,
|
||||
FFLOAD_AO = 10,
|
||||
FFLOAD_BLACKLIST = 11
|
||||
// </edit>
|
||||
};
|
||||
|
||||
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
|
||||
// <edit>
|
||||
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,
|
||||
// </edit>
|
||||
};
|
||||
|
||||
// open the dialog. This is a modal operation
|
||||
@@ -164,13 +191,9 @@ private:
|
||||
|
||||
#if LL_DARWIN
|
||||
NavDialogCreationOptions mNavOptions;
|
||||
std::vector<std::string> 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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user