diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2023-01-25 20:53:01 +0200 |
|---|---|---|
| committer | akleshchev <117672381+akleshchev@users.noreply.github.com> | 2023-01-27 17:25:18 +0200 |
| commit | 2398a28af6f6c225c77b77bef422d1d2dec4a2bb (patch) | |
| tree | 518dd7f9e6bb477d74016e8b787594bf9299e9c1 /indra/newview/llviewermenufile.cpp | |
| parent | e3a90ba4c1b7fffbb27361155dd67f86097f9a4d (diff) | |
SL-18996 [WIP] MacOS make picker dialogs non-modal to avoid disconnects #1
Diffstat (limited to 'indra/newview/llviewermenufile.cpp')
| -rw-r--r-- | indra/newview/llviewermenufile.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index fdf1d04c09..259ae7c1fb 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -124,6 +124,16 @@ void LLFilePickerThread::getFile() { #if LL_WINDOWS start(); +#elif LL_DARWIN + if (!mIsSaveDialog) + { + runModeless(); + } + else + { + // Todo: implement Modeless + run(); + } #else run(); #endif @@ -166,7 +176,70 @@ void LLFilePickerThread::run() LLMutexLock lock(sMutex); sDeadQ.push(this); } +} + +void LLFilePickerThread::runModeless() +{ + BOOL result = FALSE; + LLFilePicker picker; + if (mIsSaveDialog) + { + // TODO: not implemented + /*if (picker.getSaveFile(mSaveFilter, mProposedName, blocking)) + { + mResponses.push_back(picker.getFirstFile()); + }*/ + } + else + { + if (mIsGetMultiple) + { + result = picker.getMultipleOpenFilesModeless(mLoadFilter, modelessCallback, this); + } + else + { + result = picker.getOpenFileModeless(mLoadFilter, modelessCallback, this); + } + } + + if (!result) + { + LLMutexLock lock(sMutex); + sDeadQ.push(this); + } +} + +void LLFilePickerThread::modelessCallback(bool result, + std::vector<std::string> &responses, + void *user_data) +{ + LLFilePickerThread *picker = (LLFilePickerThread*)user_data; + if (result) + { + if (picker->mIsGetMultiple) + { + picker->mResponses = responses; + } + else + { + std::vector<std::string>::iterator iter = responses.begin(); + while (iter != responses.end()) + { + if (!iter->empty()) + { + picker->mResponses.push_back(*iter); + break; + } + iter++; + } + } + } + + { + LLMutexLock lock(sMutex); + sDeadQ.push(picker); + } } //static |
