From 0bdb879e76c6044505f256736dd62a3ca65672c0 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Tue, 9 Jan 2018 03:27:15 +0000 Subject: [PATCH] upload progresso bar --- engine/app.cpp | 27 ++++++++++++++++---- engine/app.h | 7 ++++-- engine/app_cloud.cpp | 57 ++++++++++++++++++++++++------------------ engine/app_dialogs.cpp | 13 ++++++++++ 4 files changed, 72 insertions(+), 32 deletions(-) diff --git a/engine/app.cpp b/engine/app.cpp index ea1bd7b..583b3af 100644 --- a/engine/app.cpp +++ b/engine/app.cpp @@ -63,7 +63,7 @@ void App::initLog() LogRemote::I.file_init(); } -int progress_callback(void *clientp, curl_off_t dltotal, +int progress_callback_download(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) { std::function progress = *(std::function*)clientp; @@ -71,6 +71,14 @@ int progress_callback(void *clientp, curl_off_t dltotal, return 0; } +int progress_callback_upload(void *clientp, curl_off_t dltotal, + curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) +{ + std::function progress = *(std::function*)clientp; + progress((float)ulnow / (float)ultotal); + return 0; +} + void App::download(std::string filename, std::function progress) { CURL *curl = curl_easy_init(); @@ -82,16 +90,19 @@ void App::download(std::string filename, std::function progress) curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_data_write); - curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progress_callback); - curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &progress); - curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); + if (progress) + { + curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progress_callback_download); + curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &progress); + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); + } auto err = curl_easy_perform(curl); curl_easy_cleanup(curl); fclose(fp); } } -void App::upload(std::string filename, std::string name) +void App::upload(std::string filename, std::string name, std::function progress) { CURL *curl; @@ -116,6 +127,12 @@ void App::upload(std::string filename, std::string name) curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &res); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_data_handler); + if (progress) + { + curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progress_callback_upload); + curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &progress); + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); + } auto err = curl_easy_perform(curl); std::cout << "\n\nUPLOAD RESULT\n" << res << "\n\n\n"; curl_easy_cleanup(curl); diff --git a/engine/app.h b/engine/app.h index eebe0d2..6e32394 100644 --- a/engine/app.h +++ b/engine/app.h @@ -16,6 +16,7 @@ #include "node_scroll.h" #include "node_canvas.h" #include "node_dialog_layer_rename.h" +#include "node_progress_bar.h" #if defined(__OBJC__) && defined(__IOS__) #import @@ -129,8 +130,10 @@ public: void cloud_upload(); void cloud_upload_all(); void cloud_browse(); - void upload(std::string filename, std::string name = ""); - void download(std::string filename, std::function progress); + void upload(std::string filename, std::string name = "", std::function progress = nullptr); + void download(std::string filename, std::function progress = nullptr); + + std::shared_ptr show_progress(const std::string& title); void brush_update(); void title_update(std::string name, int resolution); diff --git a/engine/app_cloud.cpp b/engine/app_cloud.cpp index b0933a2..864dbb7 100644 --- a/engine/app_cloud.cpp +++ b/engine/app_cloud.cpp @@ -25,8 +25,21 @@ void App::cloud_upload() std::thread([this] { std::string path = data_path + "/" + doc_name + ".pano"; Canvas::I->project_save_thread(path); - upload(path); + async_start(); + auto pb = show_progress("Uploading"); + async_redraw(); + async_end(); + + upload(path, doc_name, [this,pb](float p){ + async_start(); + pb->m_progress->SetWidthP(p * 100.f); + async_redraw(); + async_end(); + }); + + async_start(); + pb->destroy(); auto msgbox = new NodeMessageBox(); msgbox->m_manager = &layout; msgbox->init(); @@ -34,6 +47,7 @@ void App::cloud_upload() msgbox->m_message->set_text("This document has been succesfully uploaded."); layout[main_id]->add_child(msgbox); layout[main_id]->update(); + async_redraw(); async_end(); }).detach(); } @@ -41,24 +55,17 @@ void App::cloud_upload() void App::cloud_upload_all() { - std::thread([] { - auto names = Asset::list_files(App::I.data_path, false, ".*\\.pano"); + std::thread([this] { + auto names = Asset::list_files(data_path, false, ".*\\.pano"); gl_state gl; std::shared_ptr pb; - if (App::I.layout.m_loaded) + if (layout.m_loaded) { - App::I.async_start(); - pb = std::make_shared(); - pb->m_manager = &App::I.layout; - pb->init(); - pb->create(); - pb->loaded(); - pb->m_progress->SetWidthP(0); - pb->m_title->set_text("Export Pano Image"); - App::I.layout[App::I.main_id]->add_child(pb); - App::I.async_update(); - App::I.async_end(); + async_start(); + pb = show_progress("Export Pano Image"); + async_redraw(); + async_end(); } int progress = 0; @@ -66,30 +73,30 @@ void App::cloud_upload_all() for (const auto& n : names) { - std::string path = App::I.data_path + "/" + n; - App::I.upload(path); + std::string path = data_path + "/" + n; + upload(path); progress++; float p = (float)progress / total * 100.f; LOG("progress: %f", p); - if (App::I.layout.m_loaded) + if (layout.m_loaded) { - App::I.async_start(); + async_start(); pb->m_progress->SetWidthP(p); gl.save(); - App::I.async_update(); + async_redraw(); gl.restore(); - App::I.async_end(); + async_end(); } } - if (App::I.layout.m_loaded) + if (layout.m_loaded) { - App::I.async_start(); + async_start(); pb->destroy(); - App::I.async_update(); - App::I.async_end(); + async_redraw(); + async_end(); } }).detach(); } diff --git a/engine/app_dialogs.cpp b/engine/app_dialogs.cpp index ce6fd48..6dc5c0f 100644 --- a/engine/app_dialogs.cpp +++ b/engine/app_dialogs.cpp @@ -4,6 +4,19 @@ #include "node_dialog_browse.h" #include "node_dialog_cloud.h" +std::shared_ptr App::show_progress(const std::string& title) +{ + auto pb = std::make_shared(); + pb->m_manager = &layout; + pb->init(); + pb->create(); + pb->loaded(); + pb->m_progress->SetWidthP(0); + pb->m_title->set_text(title.c_str()); + layout[main_id]->add_child(pb); + return pb; +} + void App::dialog_newdoc() { if (canvas)