You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.8 KiB

#ifdef _WIN32
#include "dialogs.h"
// { WIN_STRING
WinString::WinString(const std::string &string) {
std::wstringstream ss;
ss << s2ws(string);
ss >> str;
}
WinString::operator()() {
std::string res;
if (str != nullptr) {
std::wstring ss(str);
res = ws2s(ss);
}
return res;
}
// WIN_STRING }
// { COMMON_DIALOG
CommonDialog::CommonDialog(CLSID type) : dialog(nullptr) {
check(CoCreateInstance(type, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&dialog)), "Failed to create instance");
check(dialog->GetOptions(&options), "Failed to get options from instance");
}
void CommonDialog::set_title(const std::string &title) {
auto tmp = std::wstring(title.begin(), title.end());
auto t = tmp.data();
check(dialog->SetTitle(t), "Failed to set dialog title");
}
void CommonDialog::add_option(unsigned option) {
check(dialog->SetOptions(options | option), "Failed to set options");
}
std::string CommonDialog::show() {
try {
check(dialog->Show(nullptr), "Failed to show dialog");
IShellItem *result = nullptr;
check(dialog->GetResult(&result), "Failed to get result from dialog");
win_string str;
check(result->GetDisplayName(SIGDN_FILESYSPATH, &str), "Failed to get display name from dialog");
result->Release();
return str();
} catch (std::exception e) {
return "";
}
}
// COMMON_DIALOG }}
std::string Dialog::select_folder() {
return (OpenDialog("Select folder", FOS_PICKFOLDERS)).show();
}
std::string Dialog::new_file() {
return (SaveDialog("Please choose your destination", 0)).show();
}
std::string Dialog::new_folder() {
return Dialog::select_folder();
}
std::string Dialog::select_file() {
return (OpenDialog("Open file", 0)).show();
}
std::string Dialog::save_file() {
return (SaveDialog("Please choose your destination", 0)).show();
}
#endif