summaryrefslogtreecommitdiff
path: root/indra/newview/llfilepicker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llfilepicker.cpp')
-rw-r--r--indra/newview/llfilepicker.cpp1588
1 files changed, 794 insertions, 794 deletions
diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp
index 3704a5253c..d6f3727643 100644
--- a/indra/newview/llfilepicker.cpp
+++ b/indra/newview/llfilepicker.cpp
@@ -34,7 +34,7 @@
#include "llframetimer.h"
#include "lltrans.h"
#include "llviewercontrol.h"
-#include "llwindow.h" // beforeDialog()
+#include "llwindow.h" // beforeDialog()
#if LL_SDL
#include "llwindowsdl.h" // for some X/GTK utils to help with filepickers
@@ -80,149 +80,149 @@ LLFilePicker LLFilePicker::sInstance;
// Implementation
//
LLFilePicker::LLFilePicker()
- : mCurrentFile(0),
- mLocked(false)
+ : mCurrentFile(0),
+ mLocked(false)
{
- reset();
+ reset();
#if LL_WINDOWS
- mOFN.lStructSize = sizeof(OPENFILENAMEW);
- mOFN.hwndOwner = NULL; // Set later
- mOFN.hInstance = NULL;
- mOFN.lpstrCustomFilter = NULL;
- mOFN.nMaxCustFilter = 0;
- mOFN.lpstrFile = NULL; // set in open and close
- mOFN.nMaxFile = LL_MAX_PATH;
- mOFN.lpstrFileTitle = NULL;
- mOFN.nMaxFileTitle = 0;
- mOFN.lpstrInitialDir = NULL;
- mOFN.lpstrTitle = NULL;
- mOFN.Flags = 0; // set in open and close
- mOFN.nFileOffset = 0;
- mOFN.nFileExtension = 0;
- mOFN.lpstrDefExt = NULL;
- mOFN.lCustData = 0L;
- mOFN.lpfnHook = NULL;
- mOFN.lpTemplateName = NULL;
- mFilesW[0] = '\0';
+ mOFN.lStructSize = sizeof(OPENFILENAMEW);
+ mOFN.hwndOwner = NULL; // Set later
+ mOFN.hInstance = NULL;
+ mOFN.lpstrCustomFilter = NULL;
+ mOFN.nMaxCustFilter = 0;
+ mOFN.lpstrFile = NULL; // set in open and close
+ mOFN.nMaxFile = LL_MAX_PATH;
+ mOFN.lpstrFileTitle = NULL;
+ mOFN.nMaxFileTitle = 0;
+ mOFN.lpstrInitialDir = NULL;
+ mOFN.lpstrTitle = NULL;
+ mOFN.Flags = 0; // set in open and close
+ mOFN.nFileOffset = 0;
+ mOFN.nFileExtension = 0;
+ mOFN.lpstrDefExt = NULL;
+ mOFN.lCustData = 0L;
+ mOFN.lpfnHook = NULL;
+ mOFN.lpTemplateName = NULL;
+ mFilesW[0] = '\0';
#elif LL_DARWIN
- mPickOptions = 0;
+ mPickOptions = 0;
#endif
}
LLFilePicker::~LLFilePicker()
{
- // nothing
+ // nothing
}
// utility function to check if access to local file system via file browser
// is enabled and if not, tidy up and indicate we're not allowed to do this.
bool LLFilePicker::check_local_file_access_enabled()
{
- // if local file browsing is turned off, return without opening dialog
- bool local_file_system_browsing_enabled = gSavedSettings.getBOOL("LocalFileSystemBrowsingEnabled");
- if ( ! local_file_system_browsing_enabled )
- {
- mFiles.clear();
- return false;
- }
-
- return true;
+ // if local file browsing is turned off, return without opening dialog
+ bool local_file_system_browsing_enabled = gSavedSettings.getBOOL("LocalFileSystemBrowsingEnabled");
+ if ( ! local_file_system_browsing_enabled )
+ {
+ mFiles.clear();
+ return false;
+ }
+
+ return true;
}
const std::string LLFilePicker::getFirstFile()
{
- mCurrentFile = 0;
- return getNextFile();
+ mCurrentFile = 0;
+ return getNextFile();
}
const std::string LLFilePicker::getNextFile()
{
- if (mCurrentFile >= getFileCount())
- {
- mLocked = false;
- return std::string();
- }
- else
- {
- return mFiles[mCurrentFile++];
- }
+ if (mCurrentFile >= getFileCount())
+ {
+ mLocked = false;
+ return std::string();
+ }
+ else
+ {
+ return mFiles[mCurrentFile++];
+ }
}
const std::string LLFilePicker::getCurFile()
{
- if (mCurrentFile >= getFileCount())
- {
- mLocked = false;
- return std::string();
- }
- else
- {
- return mFiles[mCurrentFile];
- }
+ if (mCurrentFile >= getFileCount())
+ {
+ mLocked = false;
+ return std::string();
+ }
+ else
+ {
+ return mFiles[mCurrentFile];
+ }
}
void LLFilePicker::reset()
{
- mLocked = false;
- mFiles.clear();
- mCurrentFile = 0;
+ mLocked = false;
+ mFiles.clear();
+ mCurrentFile = 0;
}
#if LL_WINDOWS
BOOL LLFilePicker::setupFilter(ELoadFilter filter)
{
- BOOL res = TRUE;
- switch (filter)
- {
+ BOOL res = TRUE;
+ switch (filter)
+ {
case FFLOAD_ALL:
case FFLOAD_EXE:
- mOFN.lpstrFilter = L"All Files (*.*)\0*.*\0" \
- SOUND_FILTER \
- IMAGE_FILTER \
- ANIM_FILTER \
- MATERIAL_FILTER \
- L"\0";
- break;
- case FFLOAD_WAV:
- mOFN.lpstrFilter = SOUND_FILTER \
- L"\0";
- break;
- case FFLOAD_IMAGE:
- mOFN.lpstrFilter = IMAGE_FILTER \
- L"\0";
- break;
- case FFLOAD_ANIM:
- mOFN.lpstrFilter = ANIM_FILTER \
- L"\0";
- break;
- case FFLOAD_GLTF:
- mOFN.lpstrFilter = GLTF_FILTER \
- L"\0";
- break;
- case FFLOAD_COLLADA:
- mOFN.lpstrFilter = COLLADA_FILTER \
- L"\0";
- break;
- case FFLOAD_XML:
- mOFN.lpstrFilter = XML_FILTER \
- L"\0";
- break;
- case FFLOAD_SLOBJECT:
- mOFN.lpstrFilter = SLOBJECT_FILTER \
- L"\0";
- break;
- case FFLOAD_RAW:
- mOFN.lpstrFilter = RAW_FILTER \
- L"\0";
- break;
- case FFLOAD_MODEL:
- mOFN.lpstrFilter = MODEL_FILTER \
- L"\0";
- break;
+ mOFN.lpstrFilter = L"All Files (*.*)\0*.*\0" \
+ SOUND_FILTER \
+ IMAGE_FILTER \
+ ANIM_FILTER \
+ MATERIAL_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_WAV:
+ mOFN.lpstrFilter = SOUND_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_IMAGE:
+ mOFN.lpstrFilter = IMAGE_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_ANIM:
+ mOFN.lpstrFilter = ANIM_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_GLTF:
+ mOFN.lpstrFilter = GLTF_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_COLLADA:
+ mOFN.lpstrFilter = COLLADA_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_XML:
+ mOFN.lpstrFilter = XML_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_SLOBJECT:
+ mOFN.lpstrFilter = SLOBJECT_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_RAW:
+ mOFN.lpstrFilter = RAW_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_MODEL:
+ mOFN.lpstrFilter = MODEL_FILTER \
+ L"\0";
+ break;
case FFLOAD_MATERIAL:
mOFN.lpstrFilter = MATERIAL_FILTER \
L"\0";
@@ -233,70 +233,70 @@ BOOL LLFilePicker::setupFilter(ELoadFilter filter)
IMAGE_FILTER \
L"\0";
break;
- case FFLOAD_SCRIPT:
- mOFN.lpstrFilter = SCRIPT_FILTER \
- L"\0";
- break;
- case FFLOAD_DICTIONARY:
- mOFN.lpstrFilter = DICTIONARY_FILTER \
- L"\0";
- break;
- default:
- res = FALSE;
- break;
- }
- return res;
+ case FFLOAD_SCRIPT:
+ mOFN.lpstrFilter = SCRIPT_FILTER \
+ L"\0";
+ break;
+ case FFLOAD_DICTIONARY:
+ mOFN.lpstrFilter = DICTIONARY_FILTER \
+ L"\0";
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ return res;
}
BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
{
- if( mLocked )
- {
- return FALSE;
- }
- BOOL success = FALSE;
-
- // if local file browsing is turned off, return without opening dialog
- if ( check_local_file_access_enabled() == false )
- {
- return FALSE;
- }
-
- // don't provide default file selection
- mFilesW[0] = '\0';
-
- mOFN.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
- mOFN.lpstrFile = mFilesW;
- mOFN.nMaxFile = SINGLE_FILENAME_BUFFER_SIZE;
- mOFN.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR ;
- mOFN.nFilterIndex = 1;
-
- setupFilter(filter);
-
- if (blocking)
- {
- // Modal, so pause agent
- send_agent_pause();
- }
-
- reset();
-
- // NOTA BENE: hitting the file dialog triggers a window focus event, destroying the selection manager!!
- success = GetOpenFileName(&mOFN);
- if (success)
- {
- std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
- mFiles.push_back(filename);
- }
-
- if (blocking)
- {
- send_agent_resume();
- // Account for the fact that the app has been stalled.
- LLFrameTimer::updateFrameTime();
- }
-
- return success;
+ if( mLocked )
+ {
+ return FALSE;
+ }
+ BOOL success = FALSE;
+
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
+ // don't provide default file selection
+ mFilesW[0] = '\0';
+
+ mOFN.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
+ mOFN.lpstrFile = mFilesW;
+ mOFN.nMaxFile = SINGLE_FILENAME_BUFFER_SIZE;
+ mOFN.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR ;
+ mOFN.nFilterIndex = 1;
+
+ setupFilter(filter);
+
+ if (blocking)
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
+
+ reset();
+
+ // NOTA BENE: hitting the file dialog triggers a window focus event, destroying the selection manager!!
+ success = GetOpenFileName(&mOFN);
+ if (success)
+ {
+ std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
+ mFiles.push_back(filename);
+ }
+
+ if (blocking)
+ {
+ send_agent_resume();
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ }
+
+ return success;
}
BOOL LLFilePicker::getOpenFileModeless(ELoadFilter filter,
@@ -310,79 +310,79 @@ BOOL LLFilePicker::getOpenFileModeless(ELoadFilter filter,
BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking)
{
- if( mLocked )
- {
- return FALSE;
- }
- BOOL success = FALSE;
-
- // if local file browsing is turned off, return without opening dialog
- if ( check_local_file_access_enabled() == false )
- {
- return FALSE;
- }
-
- // don't provide default file selection
- mFilesW[0] = '\0';
-
- mOFN.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
- mOFN.lpstrFile = mFilesW;
- mOFN.nFilterIndex = 1;
- mOFN.nMaxFile = FILENAME_BUFFER_SIZE;
- mOFN.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR |
- OFN_EXPLORER | OFN_ALLOWMULTISELECT;
-
- setupFilter(filter);
-
- reset();
-
- 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 )
- {
- // The getopenfilename api doesn't tell us if we got more than
- // one file, so we have to test manually by checking string
- // lengths.
- if( wcslen(mOFN.lpstrFile) > mOFN.nFileOffset ) /*Flawfinder: ignore*/
- {
- std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
- mFiles.push_back(filename);
- }
- else
- {
- mLocked = true;
- WCHAR* tptrw = mFilesW;
- std::string dirname;
- while(1)
- {
- if (*tptrw == 0 && *(tptrw+1) == 0) // double '\0'
- break;
- if (*tptrw == 0)
- tptrw++; // shouldn't happen?
- std::string filename = utf16str_to_utf8str(llutf16string(tptrw));
- if (dirname.empty())
- dirname = filename + "\\";
- else
- mFiles.push_back(dirname + filename);
- tptrw += wcslen(tptrw);
- }
- }
- }
-
- if (blocking)
- {
- send_agent_resume();
- }
-
- // Account for the fact that the app has been stalled.
- LLFrameTimer::updateFrameTime();
- return success;
+ if( mLocked )
+ {
+ return FALSE;
+ }
+ BOOL success = FALSE;
+
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
+ // don't provide default file selection
+ mFilesW[0] = '\0';
+
+ mOFN.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
+ mOFN.lpstrFile = mFilesW;
+ mOFN.nFilterIndex = 1;
+ mOFN.nMaxFile = FILENAME_BUFFER_SIZE;
+ mOFN.Flags = OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR |
+ OFN_EXPLORER | OFN_ALLOWMULTISELECT;
+
+ setupFilter(filter);
+
+ reset();
+
+ 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 )
+ {
+ // The getopenfilename api doesn't tell us if we got more than
+ // one file, so we have to test manually by checking string
+ // lengths.
+ if( wcslen(mOFN.lpstrFile) > mOFN.nFileOffset ) /*Flawfinder: ignore*/
+ {
+ std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
+ mFiles.push_back(filename);
+ }
+ else
+ {
+ mLocked = true;
+ WCHAR* tptrw = mFilesW;
+ std::string dirname;
+ while(1)
+ {
+ if (*tptrw == 0 && *(tptrw+1) == 0) // double '\0'
+ break;
+ if (*tptrw == 0)
+ tptrw++; // shouldn't happen?
+ std::string filename = utf16str_to_utf8str(llutf16string(tptrw));
+ if (dirname.empty())
+ dirname = filename + "\\";
+ else
+ mFiles.push_back(dirname + filename);
+ tptrw += wcslen(tptrw);
+ }
+ }
+ }
+
+ if (blocking)
+ {
+ send_agent_resume();
+ }
+
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ return success;
}
BOOL LLFilePicker::getMultipleOpenFilesModeless(ELoadFilter filter,
@@ -396,222 +396,222 @@ BOOL LLFilePicker::getMultipleOpenFilesModeless(ELoadFilter filter,
BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, bool blocking)
{
- if( mLocked )
- {
- return FALSE;
- }
- BOOL success = FALSE;
-
- // if local file browsing is turned off, return without opening dialog
- if ( check_local_file_access_enabled() == false )
- {
- return FALSE;
- }
-
- mOFN.lpstrFile = mFilesW;
- if (!filename.empty())
- {
- llutf16string tstring = utf8str_to_utf16str(filename);
- wcsncpy(mFilesW, tstring.c_str(), FILENAME_BUFFER_SIZE); } /*Flawfinder: ignore*/
- else
- {
- mFilesW[0] = '\0';
- }
- mOFN.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
-
- switch( filter )
- {
- case FFSAVE_ALL:
- mOFN.lpstrDefExt = NULL;
- mOFN.lpstrFilter =
- L"All Files (*.*)\0*.*\0" \
- L"WAV Sounds (*.wav)\0*.wav\0" \
- L"Targa, Bitmap Images (*.tga; *.bmp)\0*.tga;*.bmp\0" \
- L"\0";
- break;
- case FFSAVE_WAV:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.wav", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
- mOFN.lpstrDefExt = L"wav";
- mOFN.lpstrFilter =
- L"WAV Sounds (*.wav)\0*.wav\0" \
- L"\0";
- break;
- case FFSAVE_TGA:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.tga", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
- mOFN.lpstrDefExt = L"tga";
- mOFN.lpstrFilter =
- L"Targa Images (*.tga)\0*.tga\0" \
- L"\0";
- break;
- case FFSAVE_BMP:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.bmp", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
- mOFN.lpstrDefExt = L"bmp";
- mOFN.lpstrFilter =
- L"Bitmap Images (*.bmp)\0*.bmp\0" \
- L"\0";
- break;
- case FFSAVE_PNG:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.png", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
- mOFN.lpstrDefExt = L"png";
- mOFN.lpstrFilter =
- L"PNG Images (*.png)\0*.png\0" \
- L"\0";
- break;
- case FFSAVE_TGAPNG:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.png", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- //PNG by default
- }
- mOFN.lpstrDefExt = L"png";
- mOFN.lpstrFilter =
- L"PNG Images (*.png)\0*.png\0" \
- L"Targa Images (*.tga)\0*.tga\0" \
- L"\0";
- break;
-
- case FFSAVE_JPEG:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.jpeg", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
- mOFN.lpstrDefExt = L"jpg";
- mOFN.lpstrFilter =
- L"JPEG Images (*.jpg *.jpeg)\0*.jpg;*.jpeg\0" \
- L"\0";
- break;
- case FFSAVE_AVI:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.avi", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
- mOFN.lpstrDefExt = L"avi";
- mOFN.lpstrFilter =
- L"AVI Movie File (*.avi)\0*.avi\0" \
- L"\0";
- break;
- case FFSAVE_ANIM:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.xaf", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
- mOFN.lpstrDefExt = L"xaf";
- mOFN.lpstrFilter =
- L"XAF Anim File (*.xaf)\0*.xaf\0" \
- L"\0";
- break;
- case FFSAVE_GLTF:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.glb", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
- mOFN.lpstrDefExt = L"glb";
- mOFN.lpstrFilter =
- L"glTF Asset File (*.gltf *.glb)\0*.gltf;*.glb\0" \
- L"\0";
- break;
- case FFSAVE_XML:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.xml", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
-
- mOFN.lpstrDefExt = L"xml";
- mOFN.lpstrFilter =
- L"XML File (*.xml)\0*.xml\0" \
- L"\0";
- break;
- case FFSAVE_COLLADA:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.collada", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
- mOFN.lpstrDefExt = L"collada";
- mOFN.lpstrFilter =
- L"COLLADA File (*.collada)\0*.collada\0" \
- L"\0";
- break;
- case FFSAVE_RAW:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.raw", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
- }
- mOFN.lpstrDefExt = L"raw";
- mOFN.lpstrFilter = RAW_FILTER \
- L"\0";
- break;
- case FFSAVE_J2C:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.j2c", FILENAME_BUFFER_SIZE);
- }
- mOFN.lpstrDefExt = L"j2c";
- mOFN.lpstrFilter =
- L"Compressed Images (*.j2c)\0*.j2c\0" \
- L"\0";
- break;
- case FFSAVE_SCRIPT:
- if (filename.empty())
- {
- wcsncpy( mFilesW,L"untitled.lsl", FILENAME_BUFFER_SIZE);
- }
- mOFN.lpstrDefExt = L"txt";
- mOFN.lpstrFilter = L"LSL Files (*.lsl)\0*.lsl\0" L"\0";
- break;
- default:
- return FALSE;
- }
-
-
- mOFN.nMaxFile = SINGLE_FILENAME_BUFFER_SIZE;
- mOFN.Flags = OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST;
-
- reset();
-
- if (blocking)
- {
- // Modal, so pause agent
- send_agent_pause();
- }
-
- {
- // NOTA BENE: hitting the file dialog triggers a window focus event, destroying the selection manager!!
- try
- {
- success = GetSaveFileName(&mOFN);
- if (success)
- {
- std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
- mFiles.push_back(filename);
- }
- }
- catch (...)
- {
- LOG_UNHANDLED_EXCEPTION("");
- }
- gKeyboard->resetKeys();
- }
-
- if (blocking)
- {
- send_agent_resume();
- }
-
- // Account for the fact that the app has been stalled.
- LLFrameTimer::updateFrameTime();
- return success;
+ if( mLocked )
+ {
+ return FALSE;
+ }
+ BOOL success = FALSE;
+
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
+ mOFN.lpstrFile = mFilesW;
+ if (!filename.empty())
+ {
+ llutf16string tstring = utf8str_to_utf16str(filename);
+ wcsncpy(mFilesW, tstring.c_str(), FILENAME_BUFFER_SIZE); } /*Flawfinder: ignore*/
+ else
+ {
+ mFilesW[0] = '\0';
+ }
+ mOFN.hwndOwner = (HWND)gViewerWindow->getPlatformWindow();
+
+ switch( filter )
+ {
+ case FFSAVE_ALL:
+ mOFN.lpstrDefExt = NULL;
+ mOFN.lpstrFilter =
+ L"All Files (*.*)\0*.*\0" \
+ L"WAV Sounds (*.wav)\0*.wav\0" \
+ L"Targa, Bitmap Images (*.tga; *.bmp)\0*.tga;*.bmp\0" \
+ L"\0";
+ break;
+ case FFSAVE_WAV:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.wav", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+ mOFN.lpstrDefExt = L"wav";
+ mOFN.lpstrFilter =
+ L"WAV Sounds (*.wav)\0*.wav\0" \
+ L"\0";
+ break;
+ case FFSAVE_TGA:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.tga", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+ mOFN.lpstrDefExt = L"tga";
+ mOFN.lpstrFilter =
+ L"Targa Images (*.tga)\0*.tga\0" \
+ L"\0";
+ break;
+ case FFSAVE_BMP:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.bmp", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+ mOFN.lpstrDefExt = L"bmp";
+ mOFN.lpstrFilter =
+ L"Bitmap Images (*.bmp)\0*.bmp\0" \
+ L"\0";
+ break;
+ case FFSAVE_PNG:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.png", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+ mOFN.lpstrDefExt = L"png";
+ mOFN.lpstrFilter =
+ L"PNG Images (*.png)\0*.png\0" \
+ L"\0";
+ break;
+ case FFSAVE_TGAPNG:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.png", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ //PNG by default
+ }
+ mOFN.lpstrDefExt = L"png";
+ mOFN.lpstrFilter =
+ L"PNG Images (*.png)\0*.png\0" \
+ L"Targa Images (*.tga)\0*.tga\0" \
+ L"\0";
+ break;
+
+ case FFSAVE_JPEG:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.jpeg", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+ mOFN.lpstrDefExt = L"jpg";
+ mOFN.lpstrFilter =
+ L"JPEG Images (*.jpg *.jpeg)\0*.jpg;*.jpeg\0" \
+ L"\0";
+ break;
+ case FFSAVE_AVI:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.avi", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+ mOFN.lpstrDefExt = L"avi";
+ mOFN.lpstrFilter =
+ L"AVI Movie File (*.avi)\0*.avi\0" \
+ L"\0";
+ break;
+ case FFSAVE_ANIM:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.xaf", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+ mOFN.lpstrDefExt = L"xaf";
+ mOFN.lpstrFilter =
+ L"XAF Anim File (*.xaf)\0*.xaf\0" \
+ L"\0";
+ break;
+ case FFSAVE_GLTF:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.glb", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+ mOFN.lpstrDefExt = L"glb";
+ mOFN.lpstrFilter =
+ L"glTF Asset File (*.gltf *.glb)\0*.gltf;*.glb\0" \
+ L"\0";
+ break;
+ case FFSAVE_XML:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.xml", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+
+ mOFN.lpstrDefExt = L"xml";
+ mOFN.lpstrFilter =
+ L"XML File (*.xml)\0*.xml\0" \
+ L"\0";
+ break;
+ case FFSAVE_COLLADA:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.collada", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+ mOFN.lpstrDefExt = L"collada";
+ mOFN.lpstrFilter =
+ L"COLLADA File (*.collada)\0*.collada\0" \
+ L"\0";
+ break;
+ case FFSAVE_RAW:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.raw", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/
+ }
+ mOFN.lpstrDefExt = L"raw";
+ mOFN.lpstrFilter = RAW_FILTER \
+ L"\0";
+ break;
+ case FFSAVE_J2C:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.j2c", FILENAME_BUFFER_SIZE);
+ }
+ mOFN.lpstrDefExt = L"j2c";
+ mOFN.lpstrFilter =
+ L"Compressed Images (*.j2c)\0*.j2c\0" \
+ L"\0";
+ break;
+ case FFSAVE_SCRIPT:
+ if (filename.empty())
+ {
+ wcsncpy( mFilesW,L"untitled.lsl", FILENAME_BUFFER_SIZE);
+ }
+ mOFN.lpstrDefExt = L"txt";
+ mOFN.lpstrFilter = L"LSL Files (*.lsl)\0*.lsl\0" L"\0";
+ break;
+ default:
+ return FALSE;
+ }
+
+
+ mOFN.nMaxFile = SINGLE_FILENAME_BUFFER_SIZE;
+ mOFN.Flags = OFN_OVERWRITEPROMPT | OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST;
+
+ reset();
+
+ if (blocking)
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
+
+ {
+ // NOTA BENE: hitting the file dialog triggers a window focus event, destroying the selection manager!!
+ try
+ {
+ success = GetSaveFileName(&mOFN);
+ if (success)
+ {
+ std::string filename = utf16str_to_utf8str(llutf16string(mFilesW));
+ mFiles.push_back(filename);
+ }
+ }
+ catch (...)
+ {
+ LOG_UNHANDLED_EXCEPTION("");
+ }
+ gKeyboard->resetKeys();
+ }
+
+ if (blocking)
+ {
+ send_agent_resume();
+ }
+
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ return success;
}
BOOL LLFilePicker::getSaveFileModeless(ESaveFilter filter,
@@ -632,6 +632,9 @@ std::unique_ptr<std::vector<std::string>> LLFilePicker::navOpenFilterProc(ELoadF
switch(filter)
{
case FFLOAD_ALL:
+ case FFLOAD_EXE:
+ allowedv->push_back("app");
+ allowedv->push_back("exe");
allowedv->push_back("wav");
allowedv->push_back("bvh");
allowedv->push_back("anim");
@@ -652,9 +655,6 @@ std::unique_ptr<std::vector<std::string>> LLFilePicker::navOpenFilterProc(ELoadF
allowedv->push_back("tpic");
allowedv->push_back("png");
break;
- case FFLOAD_EXE:
- allowedv->push_back("app");
- allowedv->push_back("exe");
break;
case FFLOAD_WAV:
allowedv->push_back("wav");
@@ -691,25 +691,25 @@ std::unique_ptr<std::vector<std::string>> LLFilePicker::navOpenFilterProc(ELoadF
LL_WARNS() << "Unsupported format." << LL_ENDL;
}
- return allowedv;
+ return allowedv;
}
-bool LLFilePicker::doNavChooseDialog(ELoadFilter filter)
+bool LLFilePicker::doNavChooseDialog(ELoadFilter filter)
{
- // if local file browsing is turned off, return without opening dialog
- if ( check_local_file_access_enabled() == false )
- {
- return false;
- }
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return false;
+ }
- gViewerWindow->getWindow()->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
std::unique_ptr<std::vector<std::string>> allowed_types = navOpenFilterProc(filter);
std::unique_ptr<std::vector<std::string>> filev = doLoadDialog(allowed_types.get(),
mPickOptions);
- gViewerWindow->getWindow()->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
if (filev && filev->size() > 0)
@@ -718,7 +718,7 @@ bool LLFilePicker::doNavChooseDialog(ELoadFilter filter)
return true;
}
- return false;
+ return false;
}
bool LLFilePicker::doNavChooseDialogModeless(ELoadFilter filter,
@@ -825,34 +825,34 @@ void set_nav_save_data(LLFilePicker::ESaveFilter filter, std::string &extension,
}
}
-bool LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filename)
+bool LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filename)
{
- // Setup the type, creator, and extension
- std::string extension, type, creator;
+ // Setup the type, creator, and extension
+ std::string extension, type, creator;
set_nav_save_data(filter, extension, type, creator);
std::string namestring = filename;
if (namestring.empty()) namestring="Untitled";
- gViewerWindow->getWindow()->beforeDialog();
+ gViewerWindow->getWindow()->beforeDialog();
- // Run the dialog
+ // Run the dialog
std::unique_ptr<std::string> filev = doSaveDialog(&namestring,
&type,
&creator,
&extension,
mPickOptions);
- gViewerWindow->getWindow()->afterDialog();
+ gViewerWindow->getWindow()->afterDialog();
- if ( filev && !filev->empty() )
- {
+ if ( filev && !filev->empty() )
+ {
mFiles.push_back(*filev);
- return true;
+ return true;
}
- return false;
+ return false;
}
bool LLFilePicker::doNavSaveDialogModeless(ESaveFilter filter,
@@ -881,18 +881,18 @@ bool LLFilePicker::doNavSaveDialogModeless(ESaveFilter filter,
BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
{
- if( mLocked )
- return FALSE;
+ if( mLocked )
+ return FALSE;
- BOOL success = FALSE;
+ BOOL success = FALSE;
- // if local file browsing is turned off, return without opening dialog
- if ( check_local_file_access_enabled() == false )
- {
- return FALSE;
- }
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
- reset();
+ reset();
mPickOptions &= ~F_MULTIPLE;
mPickOptions |= F_FILE;
@@ -904,34 +904,34 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking)
mPickOptions &= ~F_FILE;
}
- if (filter == FFLOAD_ALL) // allow application bundles etc. to be traversed; important for DEV-16869, but generally useful
- {
+ if (filter == FFLOAD_ALL) // allow application bundles etc. to be traversed; important for DEV-16869, but generally useful
+ {
mPickOptions |= F_NAV_SUPPORT;
- }
+ }
- if (blocking) // always true for linux/mac
- {
- // Modal, so pause agent
- send_agent_pause();
- }
+ if (blocking) // always true for linux/mac
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
- success = doNavChooseDialog(filter);
+ success = doNavChooseDialog(filter);
- if (success)
- {
- if (!getFileCount())
- success = false;
- }
+ if (success)
+ {
+ if (!getFileCount())
+ success = false;
+ }
- if (blocking)
- {
- 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;
+ return success;
}
@@ -970,47 +970,47 @@ BOOL LLFilePicker::getOpenFileModeless(ELoadFilter filter,
BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter, bool blocking)
{
- if( mLocked )
- return FALSE;
+ if( mLocked )
+ return FALSE;
- // if local file browsing is turned off, return without opening dialog
- if ( check_local_file_access_enabled() == false )
- {
- return FALSE;
- }
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
BOOL success = FALSE;
- reset();
+ reset();
mPickOptions |= F_FILE;
mPickOptions |= F_MULTIPLE;
- if (blocking) // always true for linux/mac
- {
- // Modal, so pause agent
- send_agent_pause();
- }
-
- success = doNavChooseDialog(filter);
-
- if (blocking)
- {
- send_agent_resume();
- }
-
- if (success)
- {
- if (!getFileCount())
- success = false;
- if (getFileCount() > 1)
- mLocked = true;
- }
-
- // Account for the fact that the app has been stalled.
- LLFrameTimer::updateFrameTime();
- return success;
+ if (blocking) // always true for linux/mac
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
+
+ success = doNavChooseDialog(filter);
+
+ if (blocking)
+ {
+ send_agent_resume();
+ }
+
+ if (success)
+ {
+ if (!getFileCount())
+ success = false;
+ if (getFileCount() > 1)
+ mLocked = true;
+ }
+
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ return success;
}
@@ -1039,42 +1039,42 @@ BOOL LLFilePicker::getMultipleOpenFilesModeless(ELoadFilter filter,
BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename, bool blocking)
{
- if( mLocked )
- return false;
- BOOL success = false;
+ if( mLocked )
+ return false;
+ BOOL success = false;
- // if local file browsing is turned off, return without opening dialog
- if ( check_local_file_access_enabled() == false )
- {
- return false;
- }
+ // if local file browsing is turned off, return without opening dialog
+ if ( check_local_file_access_enabled() == false )
+ {
+ return false;
+ }
- reset();
+ reset();
mPickOptions &= ~F_MULTIPLE;
- if (blocking)
- {
- // Modal, so pause agent
- send_agent_pause();
- }
+ if (blocking)
+ {
+ // Modal, so pause agent
+ send_agent_pause();
+ }
success = doNavSaveDialog(filter, filename);
if (success)
- {
- if (!getFileCount())
- success = false;
- }
-
- if (blocking)
- {
- send_agent_resume();
- }
-
- // Account for the fact that the app has been stalled.
- LLFrameTimer::updateFrameTime();
- return success;
+ {
+ if (!getFileCount())
+ success = false;
+ }
+
+ if (blocking)
+ {
+ send_agent_resume();
+ }
+
+ // Account for the fact that the app has been stalled.
+ LLFrameTimer::updateFrameTime();
+ return success;
}
BOOL LLFilePicker::getSaveFileModeless(ESaveFilter filter,
@@ -1132,195 +1132,195 @@ BOOL LLFilePicker::getMultipleOpenFilesModeless(ELoadFilter filter,
BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename, bool blocking )
{
- return openFileDialog( filter, blocking, eSaveFile );
+ return openFileDialog( filter, blocking, eSaveFile );
}
BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking )
{
- return openFileDialog( filter, blocking, eOpenFile );
+ return openFileDialog( filter, blocking, eOpenFile );
}
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking)
{
- return openFileDialog( filter, blocking, eOpenMultiple );
+ return openFileDialog( filter, blocking, eOpenMultiple );
}
bool LLFilePicker::openFileDialog( int32_t filter, bool blocking, EType aType )
{
- if ( check_local_file_access_enabled() == false )
- return false;
- gViewerWindow->getWindow()->beforeDialog();
- reset();
- Fl_Native_File_Chooser::Type flType = Fl_Native_File_Chooser::BROWSE_FILE;
- if( aType == eOpenMultiple )
- flType = Fl_Native_File_Chooser::BROWSE_MULTI_FILE;
- else if( aType == eSaveFile )
- flType = Fl_Native_File_Chooser::BROWSE_SAVE_FILE;
- Fl_Native_File_Chooser flDlg;
- std::string file_dialog_title;
- std::string file_dialog_filter;
- if (aType == EType::eSaveFile)
- {
- std::string file_type("all_files");
- switch ((ESaveFilter) filter)
- {
- case FFSAVE_ALL:
- break;
- case FFSAVE_TGA:
- file_type = "targa_image_files";
- file_dialog_filter = "*.tga";
- break;
- case FFSAVE_BMP:
- file_type = "bitmap_image_files";
- file_dialog_filter = "*.bmp";
- break;
- case FFSAVE_AVI:
- file_type = "avi_movie_file";
- file_dialog_filter = "*.avi";
- break;
- case FFSAVE_ANIM:
- file_type = "xaf_animation_file";
- file_dialog_filter = "*.xaf";
- break;
- case FFSAVE_XML:
- file_type = "xml_file";
- file_dialog_filter = "*.xml";
- break;
- case FFSAVE_COLLADA:
- file_type = "collada_files";
- file_dialog_filter = "*.dae";
- break;
- case FFSAVE_RAW:
- file_type = "raw_file";
- file_dialog_filter = "*.raw";
- break;
- case FFSAVE_J2C:
- file_type = "compressed_image_files";
- file_dialog_filter = "*.j2c";
- break;
- case FFSAVE_PNG:
- file_type = "png_image_files";
- file_dialog_filter = "*.png";
- break;
- case FFSAVE_JPEG:
- file_type = "jpeg_image_files";
- file_dialog_filter = "*.{jpg,jpeg}";
- break;
- case FFSAVE_SCRIPT:
- file_type = "script_files";
- file_dialog_filter = "*.lsl";
- break;
- case FFSAVE_TGAPNG:
- file_type = "save_texture_image_files";
- file_dialog_filter = "*.{tga,png}";
- break;
- case FFSAVE_WAV:
- file_type = "sound_files";
- file_dialog_filter = "*.wav";
- break;
- case FFSAVE_GLTF:
- file_type = "gltf_asset_file";
- file_dialog_filter = "*.{gltf,glb}";
- break;
- }
- file_dialog_title = LLTrans::getString("save_file_verb") + " " + LLTrans::getString(file_type);
- file_dialog_filter = LLTrans::getString(file_type) + " \t" + file_dialog_filter;
- }
- else
- {
- std::string file_type("all_files");
- switch ((ELoadFilter) filter)
- {
- case FFLOAD_ALL:
- break;
- case FFLOAD_WAV:
- file_type = "sound_files";
- file_dialog_filter = "*.wav";
- break;
- case FFLOAD_IMAGE:
- file_type = "image_files";
- file_dialog_filter = "*.{tga,bmp,jpg,jpeg,png}";
- break;
- case FFLOAD_ANIM:
- file_type = "animation_files";
- file_dialog_filter = "*.{bvh,anim}";
- break;
- case FFLOAD_XML:
- file_type = "xml_file";
- file_dialog_filter = "*.xml";
- break;
- case FFLOAD_SLOBJECT:
- file_type = "xml_file";
- file_dialog_filter = "*.slobject";
- break;
- case FFLOAD_RAW:
- file_type = "raw_file";
- file_dialog_filter = "*.raw";
- break;
- case FFLOAD_MODEL:
- case FFLOAD_COLLADA:
- file_type = "collada_files";
- file_dialog_filter = "*.dae";
- break;
- case FFLOAD_SCRIPT:
- file_type = "script_files";
- file_dialog_filter = "*.lsl";
- break;
- case FFLOAD_DICTIONARY:
- file_type = "dictionary_files";
- file_dialog_filter = "*.{dic,xcu}";
- break;
- case FFLOAD_DIRECTORY:
- file_type = "choose_the_directory";
- break;
- case FFLOAD_EXE:
- file_type = "executable_files";
- break;
- case FFLOAD_GLTF:
- case FFLOAD_MATERIAL:
- file_type = "gltf_asset_file";
- file_dialog_filter = "*.{gltg,glb}";
- break;
- case FFLOAD_MATERIAL_TEXTURE:
- file_dialog_filter = "*.{gltf,glb,tga,bmp,jpg,jpeg,png}";
- file_type = "image_files";
-
- }
- if (aType == EType::eOpenMultiple)
- {
- file_dialog_title = LLTrans::getString("load_files");
- }
- else
- {
- file_dialog_title = LLTrans::getString("load_file_verb") + " " + LLTrans::getString(file_type);
- file_dialog_filter = LLTrans::getString(file_type) + " \t" + file_dialog_filter;
- }
- }
- flDlg.title(file_dialog_title.c_str());
- flDlg.type(flType);
- if (!file_dialog_filter.empty())
- {
- flDlg.filter(file_dialog_filter.c_str());
- }
- int res = flDlg.show();
- gViewerWindow->getWindow()->afterDialog();
- if( res == 0 )
- {
- int32_t count = flDlg.count();
- if( count < 0 )
- count = 0;
- for( int32_t i = 0; i < count; ++i )
- {
- char const *pFile = flDlg.filename(i);
- if( pFile && strlen(pFile) > 0 )
- mFiles.push_back( pFile );
- }
- }
- else if( res == -1 )
- {
- LL_WARNS() << "FLTK failed: " << flDlg.errmsg() << LL_ENDL;
- }
- return mFiles.empty()?FALSE:TRUE;
+ if ( check_local_file_access_enabled() == false )
+ return false;
+ gViewerWindow->getWindow()->beforeDialog();
+ reset();
+ Fl_Native_File_Chooser::Type flType = Fl_Native_File_Chooser::BROWSE_FILE;
+ if( aType == eOpenMultiple )
+ flType = Fl_Native_File_Chooser::BROWSE_MULTI_FILE;
+ else if( aType == eSaveFile )
+ flType = Fl_Native_File_Chooser::BROWSE_SAVE_FILE;
+ Fl_Native_File_Chooser flDlg;
+ std::string file_dialog_title;
+ std::string file_dialog_filter;
+ if (aType == EType::eSaveFile)
+ {
+ std::string file_type("all_files");
+ switch ((ESaveFilter) filter)
+ {
+ case FFSAVE_ALL:
+ break;
+ case FFSAVE_TGA:
+ file_type = "targa_image_files";
+ file_dialog_filter = "*.tga";
+ break;
+ case FFSAVE_BMP:
+ file_type = "bitmap_image_files";
+ file_dialog_filter = "*.bmp";
+ break;
+ case FFSAVE_AVI:
+ file_type = "avi_movie_file";
+ file_dialog_filter = "*.avi";
+ break;
+ case FFSAVE_ANIM:
+ file_type = "xaf_animation_file";
+ file_dialog_filter = "*.xaf";
+ break;
+ case FFSAVE_XML:
+ file_type = "xml_file";
+ file_dialog_filter = "*.xml";
+ break;
+ case FFSAVE_COLLADA:
+ file_type = "collada_files";
+ file_dialog_filter = "*.dae";
+ break;
+ case FFSAVE_RAW:
+ file_type = "raw_file";
+ file_dialog_filter = "*.raw";
+ break;
+ case FFSAVE_J2C:
+ file_type = "compressed_image_files";
+ file_dialog_filter = "*.j2c";
+ break;
+ case FFSAVE_PNG:
+ file_type = "png_image_files";
+ file_dialog_filter = "*.png";
+ break;
+ case FFSAVE_JPEG:
+ file_type = "jpeg_image_files";
+ file_dialog_filter = "*.{jpg,jpeg}";
+ break;
+ case FFSAVE_SCRIPT:
+ file_type = "script_files";
+ file_dialog_filter = "*.lsl";
+ break;
+ case FFSAVE_TGAPNG:
+ file_type = "save_texture_image_files";
+ file_dialog_filter = "*.{tga,png}";
+ break;
+ case FFSAVE_WAV:
+ file_type = "sound_files";
+ file_dialog_filter = "*.wav";
+ break;
+ case FFSAVE_GLTF:
+ file_type = "gltf_asset_file";
+ file_dialog_filter = "*.{gltf,glb}";
+ break;
+ }
+ file_dialog_title = LLTrans::getString("save_file_verb") + " " + LLTrans::getString(file_type);
+ file_dialog_filter = LLTrans::getString(file_type) + " \t" + file_dialog_filter;
+ }
+ else
+ {
+ std::string file_type("all_files");
+ switch ((ELoadFilter) filter)
+ {
+ case FFLOAD_ALL:
+ break;
+ case FFLOAD_WAV:
+ file_type = "sound_files";
+ file_dialog_filter = "*.wav";
+ break;
+ case FFLOAD_IMAGE:
+ file_type = "image_files";
+ file_dialog_filter = "*.{tga,bmp,jpg,jpeg,png}";
+ break;
+ case FFLOAD_ANIM:
+ file_type = "animation_files";
+ file_dialog_filter = "*.{bvh,anim}";
+ break;
+ case FFLOAD_XML:
+ file_type = "xml_file";
+ file_dialog_filter = "*.xml";
+ break;
+ case FFLOAD_SLOBJECT:
+ file_type = "xml_file";
+ file_dialog_filter = "*.slobject";
+ break;
+ case FFLOAD_RAW:
+ file_type = "raw_file";
+ file_dialog_filter = "*.raw";
+ break;
+ case FFLOAD_MODEL:
+ case FFLOAD_COLLADA:
+ file_type = "collada_files";
+ file_dialog_filter = "*.dae";
+ break;
+ case FFLOAD_SCRIPT:
+ file_type = "script_files";
+ file_dialog_filter = "*.lsl";
+ break;
+ case FFLOAD_DICTIONARY:
+ file_type = "dictionary_files";
+ file_dialog_filter = "*.{dic,xcu}";
+ break;
+ case FFLOAD_DIRECTORY:
+ file_type = "choose_the_directory";
+ break;
+ case FFLOAD_EXE:
+ file_type = "executable_files";
+ break;
+ case FFLOAD_GLTF:
+ case FFLOAD_MATERIAL:
+ file_type = "gltf_asset_file";
+ file_dialog_filter = "*.{gltg,glb}";
+ break;
+ case FFLOAD_MATERIAL_TEXTURE:
+ file_dialog_filter = "*.{gltf,glb,tga,bmp,jpg,jpeg,png}";
+ file_type = "image_files";
+
+ }
+ if (aType == EType::eOpenMultiple)
+ {
+ file_dialog_title = LLTrans::getString("load_files");
+ }
+ else
+ {
+ file_dialog_title = LLTrans::getString("load_file_verb") + " " + LLTrans::getString(file_type);
+ file_dialog_filter = LLTrans::getString(file_type) + " \t" + file_dialog_filter;
+ }
+ }
+ flDlg.title(file_dialog_title.c_str());
+ flDlg.type(flType);
+ if (!file_dialog_filter.empty())
+ {
+ flDlg.filter(file_dialog_filter.c_str());
+ }
+ int res = flDlg.show();
+ gViewerWindow->getWindow()->afterDialog();
+ if( res == 0 )
+ {
+ int32_t count = flDlg.count();
+ if( count < 0 )
+ count = 0;
+ for( int32_t i = 0; i < count; ++i )
+ {
+ char const *pFile = flDlg.filename(i);
+ if( pFile && strlen(pFile) > 0 )
+ mFiles.push_back( pFile );
+ }
+ }
+ else if( res == -1 )
+ {
+ LL_WARNS() << "FLTK failed: " << flDlg.errmsg() << LL_ENDL;
+ }
+ return mFiles.empty()?FALSE:TRUE;
}
#else
// Hacky stubs designed to facilitate fake getSaveFile and getOpenFile with
@@ -1328,23 +1328,23 @@ bool LLFilePicker::openFileDialog( int32_t filter, bool blocking, EType aType )
BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename, 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)
- if ( check_local_file_access_enabled() == false )
- {
- return FALSE;
- }
-
- reset();
-
- LL_INFOS() << "getSaveFile suggested filename is [" << filename
- << "]" << LL_ENDL;
- if (!filename.empty())
- {
- mFiles.push_back(gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + filename);
- return TRUE;
- }
- return FALSE;
+ // 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)
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
+ reset();
+
+ LL_INFOS() << "getSaveFile suggested filename is [" << filename
+ << "]" << LL_ENDL;
+ if (!filename.empty())
+ {
+ mFiles.push_back(gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + filename);
+ return TRUE;
+ }
+ return FALSE;
}
BOOL LLFilePicker::getSaveFileModeless(ESaveFilter filter,
@@ -1358,27 +1358,27 @@ BOOL LLFilePicker::getSaveFileModeless(ESaveFilter 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)
- if ( check_local_file_access_enabled() == false )
- {
- return FALSE;
- }
-
- reset();
-
- // HACK: Static filenames for 'open' until we implement filepicker
- std::string filename = gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + "upload";
- switch (filter)
- {
- case FFLOAD_WAV: filename += ".wav"; break;
- case FFLOAD_IMAGE: filename += ".tga"; break;
- case FFLOAD_ANIM: filename += ".bvh"; break;
- default: break;
- }
- mFiles.push_back(filename);
- LL_INFOS() << "getOpenFile: Will try to open file: " << filename << LL_ENDL;
- return TRUE;
+ // 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)
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
+ reset();
+
+ // HACK: Static filenames for 'open' until we implement filepicker
+ std::string filename = gDirUtilp->getLindenUserDir() + gDirUtilp->getDirDelimiter() + "upload";
+ switch (filter)
+ {
+ case FFLOAD_WAV: filename += ".wav"; break;
+ case FFLOAD_IMAGE: filename += ".tga"; break;
+ case FFLOAD_ANIM: filename += ".bvh"; break;
+ default: break;
+ }
+ mFiles.push_back(filename);
+ LL_INFOS() << "getOpenFile: Will try to open file: " << filename << LL_ENDL;
+ return TRUE;
}
BOOL LLFilePicker::getOpenFileModeless(ELoadFilter filter,
@@ -1391,15 +1391,15 @@ BOOL LLFilePicker::getOpenFileModeless(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)
- if ( check_local_file_access_enabled() == false )
- {
- return FALSE;
- }
-
- reset();
- return FALSE;
+ // 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)
+ if ( check_local_file_access_enabled() == false )
+ {
+ return FALSE;
+ }
+
+ reset();
+ return FALSE;
}
BOOL LLFilePicker::getMultipleOpenFilesModeless(ELoadFilter filter,
@@ -1416,20 +1416,20 @@ BOOL LLFilePicker::getMultipleOpenFilesModeless(ELoadFilter filter,
BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename )
{
- reset();
- return FALSE;
+ reset();
+ return FALSE;
}
BOOL LLFilePicker::getOpenFile( ELoadFilter filter )
{
- reset();
- return FALSE;
+ reset();
+ return FALSE;
}
BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter, bool blocking)
{
- reset();
- return FALSE;
+ reset();
+ return FALSE;
}
#endif // LL_LINUX