FIRE-5782 - Threaded filepickers for uploads
parent
8e136288c7
commit
b6ed0e6930
|
|
@ -281,7 +281,10 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
|
|||
return success;
|
||||
}
|
||||
|
||||
BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
|
||||
BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking)
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
if( mLocked )
|
||||
{
|
||||
|
|
@ -309,8 +312,13 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
|
|||
|
||||
reset();
|
||||
|
||||
// Modal, so pause agent
|
||||
send_agent_pause();
|
||||
// <FS:CR Threaded Filepickers>
|
||||
if (blocking)
|
||||
{
|
||||
// Modal, so pause agent
|
||||
send_agent_pause();
|
||||
}
|
||||
// </FS:CR Threaded Filepickers>
|
||||
// NOTA BENE: hitting the file dialog triggers a window focus event, destroying the selection manager!!
|
||||
success = GetOpenFileName(&mOFN); // pauses until ok or cancel.
|
||||
if( success )
|
||||
|
|
@ -343,14 +351,21 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
|
|||
}
|
||||
}
|
||||
}
|
||||
send_agent_resume();
|
||||
|
||||
// Account for the fact that the app has been stalled.
|
||||
LLFrameTimer::updateFrameTime();
|
||||
// <FS:CR Threaded Filepickers>
|
||||
if (blocking)
|
||||
{
|
||||
send_agent_resume();
|
||||
// Account for the fact that the app has been stalled.
|
||||
LLFrameTimer::updateFrameTime();
|
||||
}
|
||||
// </FS:CR Threaded Filepickers>
|
||||
return success;
|
||||
}
|
||||
|
||||
BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
|
||||
BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, bool blocking)
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
if( mLocked )
|
||||
{
|
||||
|
|
@ -535,8 +550,13 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
|
|||
|
||||
reset();
|
||||
|
||||
// Modal, so pause agent
|
||||
send_agent_pause();
|
||||
// <FS:CR Threaded Filepickers>
|
||||
if (blocking)
|
||||
{
|
||||
// Modal, so pause agent
|
||||
send_agent_pause();
|
||||
}
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
// NOTA BENE: hitting the file dialog triggers a window focus event, destroying the selection manager!!
|
||||
success = GetSaveFileName(&mOFN);
|
||||
|
|
@ -547,10 +567,14 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
|
|||
}
|
||||
gKeyboard->resetKeys();
|
||||
}
|
||||
send_agent_resume();
|
||||
|
||||
// Account for the fact that the app has been stalled.
|
||||
LLFrameTimer::updateFrameTime();
|
||||
// <FS:CR Threaded Filepickers>
|
||||
if (blocking)
|
||||
{
|
||||
send_agent_resume();
|
||||
// Account for the fact that the app has been stalled.
|
||||
LLFrameTimer::updateFrameTime();
|
||||
}
|
||||
// </FS:CR Threaded Filepickers>
|
||||
return success;
|
||||
}
|
||||
|
||||
|
|
@ -991,11 +1015,19 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
|
|||
|
||||
mNavOptions.optionFlags |= kNavAllowMultipleFiles;
|
||||
// Modal, so pause agent
|
||||
send_agent_pause();
|
||||
// <FS:CR Threaded Filepickers>
|
||||
{
|
||||
send_agent_pause();
|
||||
}
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
error = doNavChooseDialog(filter);
|
||||
}
|
||||
send_agent_resume();
|
||||
// <FS:CR Threaded Filepickers>
|
||||
{
|
||||
send_agent_resume();
|
||||
}
|
||||
// </FS:CR Threaded Filepickers>
|
||||
if (error == noErr)
|
||||
{
|
||||
if (getFileCount())
|
||||
|
|
@ -1424,7 +1456,10 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
|
|||
return rtn;
|
||||
}
|
||||
|
||||
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
|
||||
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking )
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
BOOL rtn = FALSE;
|
||||
|
||||
|
|
@ -1483,7 +1518,10 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
|
||||
BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
// (Even though this is a stub, I think we still should not return anything at all)
|
||||
|
|
@ -1508,7 +1546,10 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
// <FS:CR Threaded Filepickers>
|
||||
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
|
||||
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking )
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
// if local file browsing is turned off, return without opening dialog
|
||||
// (Even though this is a stub, I think we still should not return anything at all)
|
||||
|
|
@ -1531,13 +1572,19 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
|
||||
BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
reset();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
|
||||
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking )
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
reset();
|
||||
return FALSE;
|
||||
|
|
|
|||
|
|
@ -110,9 +110,13 @@ public:
|
|||
};
|
||||
|
||||
// open the dialog. This is a modal operation
|
||||
BOOL getSaveFile( ESaveFilter filter = FFSAVE_ALL, const std::string& filename = LLStringUtil::null );
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//BOOL getSaveFile( ESaveFilter filter = FFSAVE_ALL, const std::string& filename = LLStringUtil::null );
|
||||
BOOL getSaveFile( ESaveFilter filter = FFSAVE_ALL, const std::string& filename = LLStringUtil::null, bool blocking = true );
|
||||
BOOL getOpenFile( ELoadFilter filter = FFLOAD_ALL, bool blocking = true );
|
||||
BOOL getMultipleOpenFiles( ELoadFilter filter = FFLOAD_ALL );
|
||||
//BOOL getMultipleOpenFiles( ELoadFilter filter = FFLOAD_ALL );
|
||||
BOOL getMultipleOpenFiles( ELoadFilter filter = FFLOAD_ALL, bool blocking = true );
|
||||
// </FS:CR Threaded Filepickers>
|
||||
|
||||
// Get the filename(s) found. getFirstFile() sets the pointer to
|
||||
// the start of the structure and allows the start of iteration.
|
||||
|
|
|
|||
|
|
@ -375,7 +375,10 @@ BOOL stop_gloderror()
|
|||
|
||||
|
||||
LLMeshFilePicker::LLMeshFilePicker(LLModelPreview* mp, S32 lod)
|
||||
: LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//: LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
|
||||
: LLLoadFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
mMP = mp;
|
||||
mLOD = lod;
|
||||
|
|
|
|||
|
|
@ -292,7 +292,10 @@ private:
|
|||
LLButton* mCalculateBtn;
|
||||
};
|
||||
|
||||
class LLMeshFilePicker : public LLFilePickerThread
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//class LLMeshFilePicker : public LLFilePickerThread
|
||||
class LLMeshFilePicker : public LLLoadFilePickerThread
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
public:
|
||||
LLMeshFilePicker(LLModelPreview* mp, S32 lod);
|
||||
|
|
|
|||
|
|
@ -127,8 +127,19 @@ void LLFilePickerThread::getFile()
|
|||
#endif
|
||||
}
|
||||
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//static
|
||||
void LLFilePickerThread::initClass()
|
||||
{
|
||||
sMutex = new LLMutex(NULL);
|
||||
}
|
||||
// </FS:CR Threaded Filepickers>
|
||||
|
||||
//virtual
|
||||
void LLFilePickerThread::run()
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//void LLFilePickerThread::run()
|
||||
void LLLoadFilePickerThread::run()
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
LLFilePicker picker;
|
||||
#if LL_WINDOWS
|
||||
|
|
@ -150,12 +161,46 @@ void LLFilePickerThread::run()
|
|||
|
||||
}
|
||||
|
||||
//static
|
||||
void LLFilePickerThread::initClass()
|
||||
// <FS:CR Threaded Filepickers>
|
||||
////static
|
||||
//void LLFilePickerThread::initClass()
|
||||
//virtual
|
||||
void LLSaveFilePickerThread::run()
|
||||
{
|
||||
sMutex = new LLMutex(NULL);
|
||||
//sMutex = new LLMutex(NULL);
|
||||
LLFilePicker picker;
|
||||
#if LL_WINDOWS
|
||||
if (picker.getSaveFile(mFilter, mDefaultFilename, false))
|
||||
{
|
||||
mFile = picker.getFirstFile();
|
||||
}
|
||||
#else
|
||||
if (picker.getSaveFile(mFilter, mDefaultFilename, true))
|
||||
{
|
||||
mFile = picker.getFirstFile();
|
||||
}
|
||||
#endif
|
||||
|
||||
{
|
||||
LLMutexLock lock(sMutex);
|
||||
sDeadQ.push(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLGenericLoadFilePicker::notify(const std::string& filename)
|
||||
{
|
||||
mSignal(filename);
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLGenericSaveFilePicker::notify(const std::string& filename)
|
||||
{
|
||||
mSignal(filename);
|
||||
}
|
||||
// </FS:CR Threaded Filepickers>
|
||||
|
||||
//static
|
||||
void LLFilePickerThread::cleanupClass()
|
||||
{
|
||||
|
|
@ -234,6 +279,12 @@ std::string build_extensions_string(LLFilePicker::ELoadFilter filter)
|
|||
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.
|
||||
**/
|
||||
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//! upload_pick has been superceded by threaded filepickers
|
||||
#if 0
|
||||
// </FS:CR Threaded Filepickers>
|
||||
|
||||
const std::string upload_pick(void* data)
|
||||
{
|
||||
if( gAgentCamera.cameraMouselook() )
|
||||
|
|
@ -341,16 +392,48 @@ const std::string upload_pick(void* data)
|
|||
|
||||
return filename;
|
||||
}
|
||||
// <FS:CR Threaded Filepickers>
|
||||
#endif
|
||||
|
||||
//static
|
||||
void show_floater_callback(const std::string& floater, const std::string& filename)
|
||||
{
|
||||
if (!filename.empty() && !floater.empty())
|
||||
{
|
||||
LLFloaterReg::showInstance(floater, LLSD(filename));
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
void show_floater_anim_callback(const std::string& filename)
|
||||
{
|
||||
if (!filename.empty())
|
||||
{
|
||||
if (filename.rfind(".anim") != std::string::npos)
|
||||
{
|
||||
LLFloaterReg::showInstance("upload_anim_anim", LLSD(filename));
|
||||
}
|
||||
else
|
||||
{
|
||||
LLFloaterReg::showInstance("upload_anim_bvh", LLSD(filename));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// </FS:CR Threaded Filepickers>
|
||||
|
||||
class LLFileUploadImage : public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
std::string filename = upload_pick((void *)LLFilePicker::FFLOAD_IMAGE);
|
||||
if (!filename.empty())
|
||||
{
|
||||
LLFloaterReg::showInstance("upload_image", LLSD(filename));
|
||||
}
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//std::string filename = upload_pick((void *)LLFilePicker::FFLOAD_IMAGE);
|
||||
//if (!filename.empty())
|
||||
//{
|
||||
// LLFloaterReg::showInstance("upload_image", LLSD(filename));
|
||||
//}
|
||||
(new LLGenericLoadFilePicker(LLFilePicker::FFLOAD_IMAGE, boost::bind(&show_floater_callback,"upload_image",_1)))->getFile();
|
||||
// </FS:CR Threaded Filepickers>
|
||||
return TRUE;
|
||||
}
|
||||
};
|
||||
|
|
@ -373,11 +456,14 @@ class LLFileUploadSound : public view_listener_t
|
|||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_WAV);
|
||||
if (!filename.empty())
|
||||
{
|
||||
LLFloaterReg::showInstance("upload_sound", LLSD(filename));
|
||||
}
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_WAV);
|
||||
//if (!filename.empty())
|
||||
//{
|
||||
// LLFloaterReg::showInstance("upload_sound", LLSD(filename));
|
||||
//}
|
||||
(new LLGenericLoadFilePicker(LLFilePicker::FFLOAD_WAV, boost::bind(&show_floater_callback,"upload_sound",_1)))->getFile();
|
||||
// </FS:CR Threaded Filepickers>
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
|
@ -386,18 +472,24 @@ class LLFileUploadAnim : public view_listener_t
|
|||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
const std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_ANIM);
|
||||
if (!filename.empty())
|
||||
{
|
||||
if (filename.rfind(".anim") != std::string::npos)
|
||||
{
|
||||
LLFloaterReg::showInstance("upload_anim_anim", LLSD(filename));
|
||||
}
|
||||
else
|
||||
{
|
||||
LLFloaterReg::showInstance("upload_anim_bvh", LLSD(filename));
|
||||
}
|
||||
}
|
||||
// <FS:CR Threaded Filepickers>
|
||||
/// This logic has been moved to show_floater_anim_callback to conform
|
||||
/// with the rest of the threaded filepickers. -CR
|
||||
//
|
||||
//const std::string filename = upload_pick((void*)LLFilePicker::FFLOAD_ANIM);
|
||||
//if (!filename.empty())
|
||||
//{
|
||||
// if (filename.rfind(".anim") != std::string::npos)
|
||||
// {
|
||||
// LLFloaterReg::showInstance("upload_anim_anim", LLSD(filename));
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// LLFloaterReg::showInstance("upload_anim_bvh", LLSD(filename));
|
||||
// }
|
||||
//}
|
||||
(new LLGenericLoadFilePicker(LLFilePicker::FFLOAD_ANIM, boost::bind(&show_floater_anim_callback,_1)))->getFile();
|
||||
// </FS:CR Threaded Filepickers>
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -32,6 +32,8 @@
|
|||
#include "llinventorytype.h"
|
||||
#include "llfilepicker.h"
|
||||
|
||||
#include <boost\signals2.hpp> // <FS:CR Threaded Filepickers />
|
||||
|
||||
class LLTransactionID;
|
||||
|
||||
|
||||
|
|
@ -111,20 +113,92 @@ public:
|
|||
|
||||
std::string mFile;
|
||||
|
||||
LLFilePicker::ELoadFilter mFilter;
|
||||
|
||||
LLFilePickerThread(LLFilePicker::ELoadFilter filter)
|
||||
: LLThread("file picker"), mFilter(filter)
|
||||
// <FS:CR Threaded Filepickers>
|
||||
//LLFilePicker::ELoadFilter mFilter;
|
||||
//
|
||||
//LLFilePickerThread(LLFilePicker::ELoadFilter filter)
|
||||
// : LLThread("file picker"), mFilter(filter)
|
||||
LLFilePickerThread()
|
||||
: LLThread("file picker")
|
||||
// </FS:CR Threaded Filepickers>
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void getFile();
|
||||
|
||||
// <FS:CR Threaded Filepickers>
|
||||
virtual void run() = 0;
|
||||
|
||||
virtual void notify(const std::string& filename) = 0;
|
||||
};
|
||||
|
||||
class LLLoadFilePickerThread : public LLFilePickerThread
|
||||
{ //multi-threaded file picker (runs system specific file picker in background and calls "notify" from main thread)
|
||||
public:
|
||||
|
||||
LLFilePicker::ELoadFilter mFilter;
|
||||
|
||||
LLLoadFilePickerThread(LLFilePicker::ELoadFilter filter)
|
||||
: LLFilePickerThread(), mFilter(filter)
|
||||
{
|
||||
|
||||
}
|
||||
// <FS:CR Threaded Filepickers>
|
||||
|
||||
virtual void run();
|
||||
|
||||
virtual void notify(const std::string& filename) = 0;
|
||||
};
|
||||
|
||||
// <FS:CR Threaded Filepickers>
|
||||
class LLSaveFilePickerThread : public LLFilePickerThread
|
||||
{ //multi-threaded file picker (runs system specific file picker in background and calls "notify" from main thread)
|
||||
public:
|
||||
|
||||
LLFilePicker::ESaveFilter mFilter;
|
||||
|
||||
std::string mDefaultFilename;
|
||||
|
||||
LLSaveFilePickerThread(LLFilePicker::ESaveFilter filter, const std::string& default_name)
|
||||
: LLFilePickerThread(), mFilter(filter), mDefaultFilename(default_name)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
virtual void run();
|
||||
|
||||
virtual void notify(const std::string& filename) = 0;
|
||||
};
|
||||
|
||||
class LLGenericLoadFilePicker : public LLLoadFilePickerThread
|
||||
{
|
||||
public:
|
||||
LLGenericLoadFilePicker::LLGenericLoadFilePicker(LLFilePicker::ELoadFilter filter, boost::function<void (const std::string&)> notify_slot)
|
||||
: LLLoadFilePickerThread(filter)
|
||||
{
|
||||
mSignal.connect(notify_slot);
|
||||
}
|
||||
virtual void notify(const std::string& filename);
|
||||
protected:
|
||||
boost::signals2::signal<void (const std::string&)> mSignal;
|
||||
};
|
||||
|
||||
class LLGenericSaveFilePicker : public LLSaveFilePickerThread
|
||||
{
|
||||
public:
|
||||
LLGenericSaveFilePicker::LLGenericSaveFilePicker(LLFilePicker::ESaveFilter filter, const std::string& default_name, boost::function<void (const std::string&)> notify_slot)
|
||||
: LLSaveFilePickerThread(filter, default_name)
|
||||
{
|
||||
mSignal.connect(notify_slot);
|
||||
}
|
||||
virtual void notify(const std::string& filename);
|
||||
protected:
|
||||
boost::signals2::signal<void (const std::string&)> mSignal;
|
||||
};
|
||||
|
||||
static void show_floater_callback(const std::string& floater, const std::string& filename);
|
||||
static void show_floater_anim_callback(const std::string& filename);
|
||||
// <FS:CR Threaded Filepickers>
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue