diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 2d769b25a5..14949ef2b5 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -281,7 +281,10 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
return success;
}
-BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
+//
+//BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
+BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking)
+//
{
if( mLocked )
{
@@ -309,8 +312,13 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
reset();
- // Modal, so pause agent
- send_agent_pause();
+//
+ if (blocking)
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
+//
// 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();
+//
+ if (blocking)
+ {
+ send_agent_resume();
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ }
+//
return success;
}
-BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
+//
+//BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
+BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, bool blocking)
+//
{
if( mLocked )
{
@@ -535,8 +550,13 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename)
reset();
- // Modal, so pause agent
- send_agent_pause();
+//
+ if (blocking)
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
+//
{
// 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();
+//
+ if (blocking)
+ {
+ send_agent_resume();
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ }
+//
return success;
}
@@ -991,11 +1015,19 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter)
mNavOptions.optionFlags |= kNavAllowMultipleFiles;
// Modal, so pause agent
- send_agent_pause();
+//
+ {
+ send_agent_pause();
+ }
+//
{
error = doNavChooseDialog(filter);
}
- send_agent_resume();
+//
+ {
+ send_agent_resume();
+ }
+//
if (error == noErr)
{
if (getFileCount())
@@ -1424,7 +1456,10 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
return rtn;
}
-BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
+//
+//BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
+BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking )
+//
{
BOOL rtn = FALSE;
@@ -1483,7 +1518,10 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename
return FALSE;
}
-BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
+//
+//BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
+BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
+//
{
// 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;
}
+//
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
+BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking )
+//
{
// 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 )
+//
+//BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
+BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
+//
{
reset();
return FALSE;
}
-BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
+//
+//BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter )
+BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking )
+//
{
reset();
return FALSE;
diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h
index 367c1669a2..3b0f4d3054 100644
--- a/indra/newview/llfilepicker.h
+++ b/indra/newview/llfilepicker.h
@@ -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 );
+//
+ //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 );
+//
// Get the filename(s) found. getFirstFile() sets the pointer to
// the start of the structure and allows the start of iteration.
diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp
index acd7140049..439b5f1271 100644
--- a/indra/newview/llfloatermodelpreview.cpp
+++ b/indra/newview/llfloatermodelpreview.cpp
@@ -375,7 +375,10 @@ BOOL stop_gloderror()
LLMeshFilePicker::LLMeshFilePicker(LLModelPreview* mp, S32 lod)
- : LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
+//
+ //: LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
+ : LLLoadFilePickerThread(LLFilePicker::FFLOAD_COLLADA)
+//
{
mMP = mp;
mLOD = lod;
diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h
index ab319c30d5..c86c532049 100644
--- a/indra/newview/llfloatermodelpreview.h
+++ b/indra/newview/llfloatermodelpreview.h
@@ -292,7 +292,10 @@ private:
LLButton* mCalculateBtn;
};
-class LLMeshFilePicker : public LLFilePickerThread
+//
+//class LLMeshFilePicker : public LLFilePickerThread
+class LLMeshFilePicker : public LLLoadFilePickerThread
+//
{
public:
LLMeshFilePicker(LLModelPreview* mp, S32 lod);
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index c1bb8ab6ed..3b11ad2df0 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -127,8 +127,19 @@ void LLFilePickerThread::getFile()
#endif
}
+//
+//static
+void LLFilePickerThread::initClass()
+{
+ sMutex = new LLMutex(NULL);
+}
+//
+
//virtual
-void LLFilePickerThread::run()
+//
+//void LLFilePickerThread::run()
+void LLLoadFilePickerThread::run()
+//
{
LLFilePicker picker;
#if LL_WINDOWS
@@ -150,12 +161,46 @@ void LLFilePickerThread::run()
}
-//static
-void LLFilePickerThread::initClass()
+//
+////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);
+}
+//
+
//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.
**/
+
+//
+//! upload_pick has been superceded by threaded filepickers
+#if 0
+//
+
const std::string upload_pick(void* data)
{
if( gAgentCamera.cameraMouselook() )
@@ -341,16 +392,48 @@ const std::string upload_pick(void* data)
return filename;
}
+//
+#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));
+ }
+ }
+}
+
+//
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));
- }
+//
+ //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();
+//
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));
- }
+//
+ //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();
+//
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));
- }
- }
+//
+ /// 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();
+//
return true;
}
};
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 3136358b83..ce205b5eaf 100644
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -32,6 +32,8 @@
#include "llinventorytype.h"
#include "llfilepicker.h"
+#include //
+
class LLTransactionID;
@@ -111,20 +113,92 @@ public:
std::string mFile;
- LLFilePicker::ELoadFilter mFilter;
-
- LLFilePickerThread(LLFilePicker::ELoadFilter filter)
- : LLThread("file picker"), mFilter(filter)
+//
+ //LLFilePicker::ELoadFilter mFilter;
+ //
+ //LLFilePickerThread(LLFilePicker::ELoadFilter filter)
+ // : LLThread("file picker"), mFilter(filter)
+ LLFilePickerThread()
+ : LLThread("file picker")
+//
{
}
void getFile();
+//
+ 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)
+ {
+
+ }
+//
+
virtual void run();
virtual void notify(const std::string& filename) = 0;
};
+//
+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 notify_slot)
+ : LLLoadFilePickerThread(filter)
+ {
+ mSignal.connect(notify_slot);
+ }
+ virtual void notify(const std::string& filename);
+protected:
+ boost::signals2::signal mSignal;
+};
+
+class LLGenericSaveFilePicker : public LLSaveFilePickerThread
+{
+public:
+ LLGenericSaveFilePicker::LLGenericSaveFilePicker(LLFilePicker::ESaveFilter filter, const std::string& default_name, boost::function notify_slot)
+ : LLSaveFilePickerThread(filter, default_name)
+ {
+ mSignal.connect(notify_slot);
+ }
+ virtual void notify(const std::string& filename);
+protected:
+ boost::signals2::signal mSignal;
+};
+
+static void show_floater_callback(const std::string& floater, const std::string& filename);
+static void show_floater_anim_callback(const std::string& filename);
+//
#endif