hiro: use modern file browser dialog on Windows

This is supported on Vista+, meaning that Hiro no longer supports Windows XP
このコミットが含まれているのは:
Luke Usher 2023-06-29 13:13:49 +01:00
コミット cc81fd1015
2個のファイルの変更40行の追加24行の削除

ファイルの表示

@ -62,32 +62,47 @@ static auto BrowserWindow_fileDialog(bool save, BrowserWindow::State& state) ->
}
auto pBrowserWindow::directory(BrowserWindow::State& state) -> string {
wchar_t wname[PATH_MAX + 1] = L"";
using namespace Microsoft::WRL; // For ComPtr
BROWSEINFO bi;
bi.hwndOwner = state.parent ? state.parent->self()->hwnd : 0;
bi.pidlRoot = NULL;
bi.pszDisplayName = wname;
bi.lpszTitle = L"\nChoose a directory:";
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_RETURNONLYFSDIRS;
bi.lpfn = BrowserWindowCallbackProc;
bi.lParam = (LPARAM)&state;
bi.iImage = 0;
bool result = false;
LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
if(pidl) {
if(SHGetPathFromIDList(pidl, wname)) {
result = true;
IMalloc *imalloc = 0;
if(SUCCEEDED(SHGetMalloc(&imalloc))) {
imalloc->Free(pidl);
imalloc->Release();
}
}
ComPtr<IFileDialog> pfd;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd));
if (FAILED(hr)) {
return "";
}
if(result == false) return "";
string name = (const char*)utf8_t(wname);
if(!name) return "";
DWORD dwOptions;
hr = pfd->GetOptions(&dwOptions);
if (FAILED(hr)) {
return "";
}
hr = pfd->SetOptions(dwOptions | FOS_PICKFOLDERS);
if (FAILED(hr)) {
return "";
}
hr = pfd->Show(NULL);
if (FAILED(hr)) {
return "";
}
ComPtr<IShellItem> psi;
hr = pfd->GetResult(&psi);
if (FAILED(hr)) {
return "";
}
PWSTR pszPath;
hr = psi->GetDisplayName(SIGDN_FILESYSPATH, &pszPath);
if (FAILED(hr)) {
return "";
}
string name = (const char*)utf8_t(pszPath);
CoTaskMemFree(pszPath);
if (!name) return "";
name.transform("\\", "/");
if(name.endsWith("/") == false) name.append("/");
return name;

ファイルの表示

@ -8,6 +8,7 @@
#include <shlobj.h>
#include <shellapi.h>
#include <dwmapi.h>
#include <wrl/client.h> // for ComPtr
#include <nall/windows/registry.hpp>
#include <nall/windows/utf8.hpp>