add js save dialog

This commit is contained in:
2019-10-10 01:33:59 +02:00
parent a669d1313b
commit fd3eba69b8
5 changed files with 105 additions and 19 deletions

View File

@@ -14,15 +14,20 @@ GLFWwindow* wnd;
float theta = 0;
glm::vec2 g_cursor_pos;
template<typename F>
class TaskCallback
{
std::function<void(std::string)> fn;
std::function<F> fn;
public:
template<typename T> TaskCallback(T callback) : fn(callback) {}
void call(const std::string& tmp_file_path)
{
fn(tmp_file_path);
}
void call(bool success)
{
fn(success);
}
TaskCallback()
{
printf("callback created\n");
@@ -33,36 +38,64 @@ public:
}
};
void TaskCallback_call(uintptr_t tc, std::string tmp_file_path)
void TaskCallback_open_call(uintptr_t tc, std::string tmp_file_path)
{
auto x = reinterpret_cast<TaskCallback*>(tc);
auto x = reinterpret_cast<TaskCallback<void(std::string)>*>(tc);
x->call(tmp_file_path);
}
void TaskCallback_delete(uintptr_t tc)
void TaskCallback_open_delete(uintptr_t tc)
{
auto x = reinterpret_cast<TaskCallback*>(tc);
auto x = reinterpret_cast<TaskCallback<void(std::string)>*>(tc);
delete x;
}
void TaskCallback_save_call(uintptr_t tc, bool success)
{
auto x = reinterpret_cast<TaskCallback<void(bool)>*>(tc);
x->call(success);
}
void TaskCallback_save_delete(uintptr_t tc)
{
auto x = reinterpret_cast<TaskCallback<void(bool)>*>(tc);
delete x;
}
std::string UtilityGetString(uintptr_t s)
{
return *reinterpret_cast<std::string*>(s);
}
EMSCRIPTEN_BINDINGS(TaskCallback_bind) {
class_<TaskCallback>("TaskCallback");
function("TaskCallback_call", &TaskCallback_call);
function("TaskCallback_delete", &TaskCallback_delete);
class_<TaskCallback<void(std::string)>>("TaskCallbackOpen");
class_<TaskCallback<void(bool)>>("TaskCallbackSave");
function("TaskCallback_save_call", &TaskCallback_save_call);
function("TaskCallback_save_delete", &TaskCallback_save_delete);
function("TaskCallback_open_call", &TaskCallback_open_call);
function("TaskCallback_open_delete", &TaskCallback_open_delete);
function("UtilityGetString", &UtilityGetString);
}
extern "C" {
extern void js_pick_file(TaskCallback* tc);
extern void js_pick_file(TaskCallback<void(std::string)>* tc);
extern void js_pick_file_save(std::string path, std::string name, TaskCallback<void(bool)>* tc);
}
void webgl_pick_file(std::function<void(std::string)> callback)
{
js_pick_file(new TaskCallback([callback](std::string tmp_file_path){
js_pick_file(new TaskCallback<void(std::string)>([callback](std::string tmp_file_path){
printf("callback called: %s\n", tmp_file_path.c_str());
callback(tmp_file_path);
}));
}
void webgl_pick_file_save(const std::string& path,
const std::string& name, std::function<void(bool)> callback)
{
js_pick_file_save(path, name, new TaskCallback<void(bool)>([callback](bool success){
printf("save callback called: %s\n", success ? "ok" : "failed");
callback(success);
}));
}
void main_loop()
{
app.render_thread_tick();