#include "dialogs.h" #include #include #include #include #include "singletons.h" #include #ifndef check #define MESSAGE "An error occurred when trying open windows dialog" HRESULT __hr__; #define check(__fun__) __hr__ = __fun__; if(FAILED(__hr__)) Singleton::terminal()->print(MESSAGE) #endif class win_string { public: win_string() : str(nullptr) { } ~win_string() { CoTaskMemFree(static_cast(str)); } std::string operator()(){ std::string res; if (str != nullptr) { std::wstringstream ss; ss << str; res = std::string(ss.str().begin(), ss.str().end()); } return res; } wchar_t** operator&() { return &str; } private: wchar_t* str; }; class CommonDialog { public: CommonDialog() : dialog(nullptr) { check(CoCreateInstance(CLSID_FileOpenDialog, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&dialog))); check(dialog->GetOptions(&options)); } CommonDialog(const std::string &title, unsigned option) : CommonDialog() { set_title(title); add_option(option); } void set_title(const std::string &title) { check(dialog->SetTitle(title)); } void add_option(unsigned option) { check(dialog->SetOptions(options | option)); } std::string show() { check(dialog->Show(nullptr)); IShellItem *result = nullptr; check(dialog->GetResult(&result)); win_string str; check(result->GetDisplayName(SIGDN_FILESYSPATH, &str));; result->Release(); return str(); } private: IFileOpenDialog * dialog; DWORD options; }; std::string Dialog::select_folder() { return (CommonDialog("Please select a folder", FOS_PICKFOLDERS)).show(); } std::string Dialog::new_file() { return (CommonDialog("Please select a folder", FOS_PICKFOLDERS)).show(); } std::string Dialog::new_folder() { return (CommonDialog("Please select a folder", FOS_PICKFOLDERS)).show(); } std::string Dialog::select_file() { return (CommonDialog("Please select a folder", FOS_PICKFOLDERS)).show(); } std::string Dialog::save_file() { return (CommonDialog("Please select a folder", FOS_PICKFOLDERS)).show(); }