From b6ed0e6930b7bd49deb25bedd4b668ebb23b8891 Mon Sep 17 00:00:00 2001 From: Cinder Roxley Date: Sat, 6 Oct 2012 12:29:16 -0600 Subject: [PATCH] FIRE-5782 - Threaded filepickers for uploads --- indra/newview/llfilepicker.cpp | 87 ++++++++++---- indra/newview/llfilepicker.h | 8 +- indra/newview/llfloatermodelpreview.cpp | 5 +- indra/newview/llfloatermodelpreview.h | 5 +- indra/newview/llviewermenufile.cpp | 144 +++++++++++++++++++----- indra/newview/llviewermenufile.h | 82 +++++++++++++- 6 files changed, 277 insertions(+), 54 deletions(-) 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