mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
texturev: Added open file dialog.
This commit is contained in:
@@ -223,6 +223,85 @@ static const InputBinding* s_binding[] =
|
||||
};
|
||||
BX_STATIC_ASSERT(Binding::Count == BX_COUNTOF(s_binding) );
|
||||
|
||||
static const char* s_filter = ""
|
||||
"All texture files (bmp, dds, exr, gif, gnf, jpg, jpeg, hdr, ktx, pgm, png, ppm, psd, pvr, tga) | *.bmp *.dds *.exr *.gif *.gnf *.jpg *.jpeg *.hdr *.ktx *.pgm *.png *.ppm *.psd *.pvr *.tga\n"
|
||||
"Windows Bitmap (bmp) | *.bmp\n"
|
||||
"Direct Draw Surface (dds) | *.dds\n"
|
||||
"OpenEXR (exr) | *.exr\n"
|
||||
"Graphics Interchange Format (gif) | *.gif\n"
|
||||
"JPEG Interchange Format (jpg, jpeg) | *.jpg *.jpeg\n"
|
||||
"Radiance RGBE (hdr) | *.hdr\n"
|
||||
"Khronos Texture (ktx) | *.ktx\n"
|
||||
"Portable Graymap/Pixmap Format (pgm, ppm) | *.pgm *.ppm\n"
|
||||
"Portable Network Graphics (png) | *.png\n"
|
||||
"Photoshop Document (psd) | *.psd\n"
|
||||
"PowerVR (pvr) | *.pvr\n"
|
||||
"Truevision TGA (tga) | *.tga\n"
|
||||
;
|
||||
|
||||
struct FileSelectionDialogType
|
||||
{
|
||||
enum Enum
|
||||
{
|
||||
Open,
|
||||
Save,
|
||||
|
||||
Count
|
||||
};
|
||||
};
|
||||
|
||||
bool openFileSelectionDialog(
|
||||
bx::FilePath& _inOutfilePath
|
||||
, FileSelectionDialogType::Enum _type
|
||||
, const bx::StringView& _title
|
||||
, const bx::StringView& _filter = "All Files | *"
|
||||
)
|
||||
{
|
||||
#if BX_PLATFORM_LINUX || BX_PLATFORM_OSX
|
||||
char tmp[4096];
|
||||
bx::StaticMemoryBlockWriter writer(tmp, sizeof(tmp) );
|
||||
|
||||
bx::Error err;
|
||||
bx::write(&writer, &err
|
||||
, "--file-selection%s --title \"%.*s\" --filename \"%s\""
|
||||
, FileSelectionDialogType::Save == _type ? " --save" : ""
|
||||
, _title.getLength(), _title.getPtr()
|
||||
, _inOutfilePath.get()
|
||||
);
|
||||
|
||||
bx::LineReader lr(_filter);
|
||||
while (!lr.isDone() )
|
||||
{
|
||||
const bx::StringView line = lr.next();
|
||||
|
||||
bx::write(&writer, &err
|
||||
, " --file-filter \"%.*s\""
|
||||
, line.getLength(), line.getPtr()
|
||||
);
|
||||
}
|
||||
|
||||
if (err.isOk() )
|
||||
{
|
||||
bx::ProcessReader pr;
|
||||
|
||||
if (bx::open(&pr, "zenity", tmp, &err) )
|
||||
{
|
||||
char buffer[1024];
|
||||
int32_t total = bx::read(&pr, buffer, sizeof(buffer), &err);
|
||||
bx::close(&pr);
|
||||
|
||||
if (0 == pr.getExitCode() )
|
||||
{
|
||||
_inOutfilePath.set(bx::strRTrim(bx::StringView(buffer, total), "\n\r") );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif // BX_PLATFORM_LINUX || BX_PLATFORM_OSX
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
struct View
|
||||
{
|
||||
View()
|
||||
@@ -687,6 +766,8 @@ struct View
|
||||
|
||||
bx::Error err;
|
||||
|
||||
m_fileList.clear();
|
||||
|
||||
while (err.isOk() )
|
||||
{
|
||||
bx::FileInfo fi;
|
||||
@@ -713,7 +794,8 @@ struct View
|
||||
|
||||
if (supported)
|
||||
{
|
||||
m_fileList.push_back(fi.filePath.get() );
|
||||
const bx::StringView fileName = fi.filePath.getFileName();
|
||||
m_fileList.push_back(std::string(fileName.getPtr(), fileName.getTerm() ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -725,15 +807,18 @@ struct View
|
||||
|
||||
m_fileIndex = 0;
|
||||
uint32_t idx = 0;
|
||||
|
||||
const bx::StringView fileName = _filePath.getFileName();
|
||||
|
||||
for (FileList::const_iterator it = m_fileList.begin(); it != m_fileList.end(); ++it, ++idx)
|
||||
{
|
||||
if (0 == bx::strCmpI(it->c_str(), _filePath.getFileName() ) )
|
||||
if (0 == bx::strCmpI(it->c_str(), fileName) )
|
||||
{
|
||||
// If it is case-insensitive match then might be correct one, but keep
|
||||
// searching.
|
||||
m_fileIndex = idx;
|
||||
|
||||
if (0 == bx::strCmp(it->c_str(), _filePath.getFileName() ) )
|
||||
if (0 == bx::strCmp(it->c_str(), fileName) )
|
||||
{
|
||||
// If it is exact match we're done.
|
||||
break;
|
||||
@@ -1447,6 +1532,20 @@ int _main_(int _argc, char** _argv)
|
||||
{
|
||||
if (ImGui::BeginMenu("File"))
|
||||
{
|
||||
if (ImGui::MenuItem("Open File") )
|
||||
{
|
||||
bx::FilePath tmp = view.m_path;
|
||||
if (openFileSelectionDialog(
|
||||
tmp
|
||||
, FileSelectionDialogType::Open
|
||||
, "texturev: Open File"
|
||||
, s_filter
|
||||
) )
|
||||
{
|
||||
view.updateFileList(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
if (ImGui::MenuItem("Show File List", NULL, view.m_files) )
|
||||
{
|
||||
cmdExec("view files");
|
||||
|
||||
Reference in New Issue
Block a user