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:
Aleric Inglewood
2011-05-10 04:27:57 +02:00
parent 81550aa6de
commit e0b0fa4f58
49 changed files with 1097 additions and 564 deletions

View File

@@ -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++ )
{

View File

@@ -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 )

View File

@@ -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

View File

@@ -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,

View File

@@ -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);

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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");

View File

@@ -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 );

View File

@@ -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);

View File

@@ -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:

View File

@@ -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");
}

View File

@@ -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);
};

View File

@@ -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);
}*/

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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();

View File

@@ -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(); }

View File

@@ -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;

View File

@@ -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;
};

View File

@@ -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;

View File

@@ -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.

View File

@@ -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

View File

@@ -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 );

View File

@@ -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();

View File

@@ -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>
};

View File

@@ -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>

View File

@@ -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);

View File

@@ -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

View File

@@ -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:

View File

@@ -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.

View File

@@ -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();

View File

@@ -161,10 +161,6 @@ void LLUploadDialog::setMessage( const std::string& msg)
LLUploadDialog::~LLUploadDialog()
{
gFocusMgr.releaseFocusIfNeeded( this );
// LLFilePicker::instance().reset();
LLUploadDialog::sDialog = NULL;
}

View File

@@ -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);
}

View File

@@ -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,

View File

@@ -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

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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