r5sdk/r5dev/thirdparty/cppnet/cppkore/SaveFileDialog.cpp
Kawe Mazidjatari 04bee896be Fix string/wstring type conflict
cppkore uses string/wstring as StringBase while we use std::string/std::wstring as string/wstring. Changed all types in cppkore to String/WString instead.
2022-05-21 21:51:35 +02:00

52 lines
1.6 KiB
C++

#include "stdafx.h"
#include "SaveFileDialog.h"
#include "Path.h"
#include <commdlg.h>
namespace Forms
{
const String BuildSaveFileFilter(const String& Filter)
{
String InitialFilter = (String::IsNullOrWhiteSpace(Filter)) ? String(" |*.*") : Filter;
auto Buffer = std::make_unique<int8_t[]>((size_t)InitialFilter.Length() + 2); // Final filter has two null chars
auto BufferMask = (char*)Buffer.get();
std::memcpy(Buffer.get(), InitialFilter.ToCString(), InitialFilter.Length());
for (uint32_t i = 0; i < InitialFilter.Length(); i++)
{
if (BufferMask[i] == '|')
BufferMask[i] = (char)0;
}
BufferMask[InitialFilter.Length() + 1] = (char)0;
return String((char*)Buffer.get(), (size_t)InitialFilter.Length() + 1);
}
String SaveFileDialog::ShowFileDialog(const String& Title, const String& BasePath, const String& Filter, Control* Owner)
{
HWND OwnerHandle = (Owner != nullptr) ? Owner->GetHandle() : NULL;
char Buffer[MAX_PATH]{};
OPENFILENAMEA oFileDialog{};
oFileDialog.lStructSize = sizeof(OPENFILENAMEA);
auto FilterBuffer = BuildSaveFileFilter(Filter);
oFileDialog.hwndOwner = OwnerHandle;
oFileDialog.lpstrFilter = (LPSTR)FilterBuffer.ToCString();
oFileDialog.lpstrInitialDir = (LPCSTR)BasePath.ToCString();
oFileDialog.lpstrFile = (LPSTR)Buffer;
oFileDialog.nMaxFile = MAX_PATH;
oFileDialog.lpstrTitle = Title.ToCString();
// Open the dialog with the config and then return result
if (GetSaveFileNameA(&oFileDialog))
return String(Buffer);
// We need nothing as a default because we don't get a return value
return "";
}
}