Centralize legacy cloud bridge
This commit is contained in:
@@ -1,9 +1,8 @@
|
||||
#include "pch.h"
|
||||
#include "app.h"
|
||||
#include "app_core/document_cloud.h"
|
||||
#include "legacy_cloud_services.h"
|
||||
#include "util.h"
|
||||
#include "node_progress_bar.h"
|
||||
#include "node_dialog_cloud.h"
|
||||
|
||||
void App::cloud_upload()
|
||||
{
|
||||
@@ -13,45 +12,9 @@ void App::cloud_upload()
|
||||
has_canvas && Canvas::I->m_newdoc,
|
||||
has_canvas && Canvas::I->m_unsaved);
|
||||
|
||||
switch (plan.action)
|
||||
{
|
||||
case pp::app::CloudUploadAction::unavailable_no_canvas:
|
||||
return;
|
||||
case pp::app::CloudUploadAction::show_save_required_warning:
|
||||
message_box("Warning", "This document needs to be saved before upload.");
|
||||
return;
|
||||
case pp::app::CloudUploadAction::prompt_publish:
|
||||
break;
|
||||
}
|
||||
|
||||
auto upload_thread = [this] {
|
||||
BT_SetTerminate();
|
||||
|
||||
if (Canvas::I->m_unsaved)
|
||||
{
|
||||
Canvas::I->project_save_thread(doc_path, true);
|
||||
}
|
||||
|
||||
auto pb = show_progress("Uploading");
|
||||
|
||||
upload(doc_path, doc_filename, [this,pb](float p){
|
||||
pb->set_progress(p);
|
||||
});
|
||||
|
||||
pb->destroy();
|
||||
message_box("Success", "This document has been succesfully uploaded.");
|
||||
};
|
||||
|
||||
auto m = message_box("Publish document", "Would you like to upload to the public domain?");
|
||||
m->btn_ok->m_text->set_text("Yes");
|
||||
m->btn_cancel->m_text->set_text("No");
|
||||
m->btn_ok->on_click = [this, m, upload_thread](Node*) {
|
||||
std::thread(upload_thread).detach();
|
||||
m->destroy();
|
||||
};
|
||||
m->btn_cancel->on_click = [this, m, upload_thread](Node*) {
|
||||
m->destroy();
|
||||
};
|
||||
const auto status = pp::panopainter::execute_legacy_cloud_upload_plan(*this, plan);
|
||||
if (!status.ok())
|
||||
LOG("Cloud upload action failed: %s", status.message);
|
||||
}
|
||||
|
||||
void App::cloud_upload_all()
|
||||
@@ -62,76 +25,16 @@ void App::cloud_upload_all()
|
||||
auto names = Asset::list_files(data_path, ".*\\.ppi");
|
||||
const auto plan = pp::app::plan_cloud_bulk_upload(names.size(), layout.m_loaded);
|
||||
|
||||
gl_state gl;
|
||||
std::shared_ptr<NodeProgressBar> pb;
|
||||
if (plan.show_progress)
|
||||
pb = show_progress("Export Pano Image", plan.progress_total);
|
||||
|
||||
for (const auto& n : names)
|
||||
{
|
||||
std::string path = data_path + "/" + n;
|
||||
upload(path);
|
||||
|
||||
if (plan.show_progress)
|
||||
pb->increment();
|
||||
}
|
||||
|
||||
if (plan.show_progress)
|
||||
pb->destroy();
|
||||
|
||||
const auto status = pp::panopainter::execute_legacy_cloud_bulk_upload_plan(*this, plan);
|
||||
if (!status.ok())
|
||||
LOG("Cloud bulk upload action failed: %s", status.message);
|
||||
}).detach();
|
||||
}
|
||||
|
||||
void App::cloud_browse()
|
||||
{
|
||||
const auto browse_plan = pp::app::plan_cloud_browse(canvas != nullptr);
|
||||
switch (browse_plan)
|
||||
{
|
||||
case pp::app::CloudBrowseAction::unavailable_no_canvas:
|
||||
return;
|
||||
case pp::app::CloudBrowseAction::show_browser:
|
||||
break;
|
||||
}
|
||||
|
||||
// load thumbnail test
|
||||
auto dialog = std::make_shared<NodeDialogCloud>();
|
||||
dialog->set_manager(&layout);
|
||||
dialog->init();
|
||||
dialog->create();
|
||||
dialog->loaded();
|
||||
|
||||
layout[main_id]->add_child(dialog);
|
||||
|
||||
dialog->btn_ok->on_click = [this, dialog](Node*)
|
||||
{
|
||||
const auto selection_plan = pp::app::plan_cloud_download_selection(dialog->selected_file);
|
||||
if (selection_plan == pp::app::CloudDownloadSelectionAction::wait_for_selection)
|
||||
return;
|
||||
dialog->destroy();
|
||||
std::thread([this, dialog] {
|
||||
BT_SetTerminate();
|
||||
|
||||
auto* m = layout[main_id]->add_child<NodeMessageBox>();
|
||||
m->m_title->set_text("Downloading");
|
||||
m->m_message->set_text("Download in progress");
|
||||
std::string url = "https://panopainter.com/cloud/cloud-dwl.php?file=" + dialog->selected_file;
|
||||
download(url, dialog->selected_path, [this,m](float p){
|
||||
static char progress[256];
|
||||
sprintf(progress, "Download in progress %.2f%%", p * 100.f);
|
||||
m->m_message->set_text(progress);
|
||||
});
|
||||
|
||||
canvas->reset_camera();
|
||||
layers->clear();
|
||||
|
||||
canvas->m_canvas->project_open_thread(dialog->selected_path);
|
||||
|
||||
doc_name = dialog->selected_name;
|
||||
title_update();
|
||||
for (auto& l : canvas->m_canvas->m_layers)
|
||||
layers->add_layer(l->m_name.c_str(), false);
|
||||
ActionManager::clear();
|
||||
m->destroy();
|
||||
}).detach();
|
||||
};
|
||||
const auto status = pp::panopainter::execute_legacy_cloud_browse_action(*this, browse_plan);
|
||||
if (!status.ok())
|
||||
LOG("Cloud browse action failed: %s", status.message);
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#include "foundation/result.h"
|
||||
|
||||
#include <cstddef>
|
||||
#include <limits>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
|
||||
namespace pp::app {
|
||||
@@ -33,6 +36,25 @@ struct CloudBulkUploadPlan {
|
||||
bool show_progress = false;
|
||||
};
|
||||
|
||||
struct CloudDownloadRequest {
|
||||
std::string selected_file;
|
||||
std::string selected_path;
|
||||
std::string selected_name;
|
||||
};
|
||||
|
||||
class CloudServices {
|
||||
public:
|
||||
virtual ~CloudServices() = default;
|
||||
|
||||
virtual void show_save_required_warning() = 0;
|
||||
virtual void prompt_publish(bool save_before_upload) = 0;
|
||||
virtual void begin_bulk_upload(int progress_total, bool show_progress) = 0;
|
||||
virtual void upload_all_bulk_files() = 0;
|
||||
virtual void end_bulk_upload() = 0;
|
||||
virtual void show_browser() = 0;
|
||||
virtual void start_download(const CloudDownloadRequest& request) = 0;
|
||||
};
|
||||
|
||||
[[nodiscard]] constexpr CloudUploadPlan plan_cloud_upload(
|
||||
bool has_canvas,
|
||||
bool is_new_document,
|
||||
@@ -76,4 +98,66 @@ struct CloudBulkUploadPlan {
|
||||
};
|
||||
}
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Status execute_cloud_upload_plan(
|
||||
const CloudUploadPlan& plan,
|
||||
CloudServices& services)
|
||||
{
|
||||
switch (plan.action) {
|
||||
case CloudUploadAction::unavailable_no_canvas:
|
||||
return pp::foundation::Status::success();
|
||||
case CloudUploadAction::show_save_required_warning:
|
||||
services.show_save_required_warning();
|
||||
return pp::foundation::Status::success();
|
||||
case CloudUploadAction::prompt_publish:
|
||||
services.prompt_publish(plan.save_before_upload);
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
return pp::foundation::Status::invalid_argument("unknown cloud upload action");
|
||||
}
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Status execute_cloud_bulk_upload_plan(
|
||||
const CloudBulkUploadPlan& plan,
|
||||
CloudServices& services)
|
||||
{
|
||||
services.begin_bulk_upload(plan.progress_total, plan.show_progress);
|
||||
services.upload_all_bulk_files();
|
||||
services.end_bulk_upload();
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Status execute_cloud_browse_action(
|
||||
CloudBrowseAction action,
|
||||
CloudServices& services)
|
||||
{
|
||||
switch (action) {
|
||||
case CloudBrowseAction::unavailable_no_canvas:
|
||||
return pp::foundation::Status::success();
|
||||
case CloudBrowseAction::show_browser:
|
||||
services.show_browser();
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
return pp::foundation::Status::invalid_argument("unknown cloud browse action");
|
||||
}
|
||||
|
||||
[[nodiscard]] inline pp::foundation::Status execute_cloud_download_selection_action(
|
||||
CloudDownloadSelectionAction action,
|
||||
CloudServices& services,
|
||||
const CloudDownloadRequest& request)
|
||||
{
|
||||
switch (action) {
|
||||
case CloudDownloadSelectionAction::wait_for_selection:
|
||||
return pp::foundation::Status::success();
|
||||
case CloudDownloadSelectionAction::start_download:
|
||||
if (request.selected_file.empty()) {
|
||||
return pp::foundation::Status::invalid_argument("cloud download requires a selected file");
|
||||
}
|
||||
services.start_download(request);
|
||||
return pp::foundation::Status::success();
|
||||
}
|
||||
|
||||
return pp::foundation::Status::invalid_argument("unknown cloud download selection action");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
187
src/legacy_cloud_services.cpp
Normal file
187
src/legacy_cloud_services.cpp
Normal file
@@ -0,0 +1,187 @@
|
||||
#include "pch.h"
|
||||
|
||||
#include "legacy_cloud_services.h"
|
||||
|
||||
#include "app.h"
|
||||
#include "canvas.h"
|
||||
#include "node_dialog_cloud.h"
|
||||
#include "node_progress_bar.h"
|
||||
#include "util.h"
|
||||
|
||||
namespace pp::panopainter {
|
||||
namespace {
|
||||
|
||||
class LegacyCloudServices final : public pp::app::CloudServices {
|
||||
public:
|
||||
explicit LegacyCloudServices(App& app) noexcept
|
||||
: app_(app)
|
||||
{
|
||||
}
|
||||
|
||||
void show_save_required_warning() override
|
||||
{
|
||||
app_.message_box("Warning", "This document needs to be saved before upload.");
|
||||
}
|
||||
|
||||
void prompt_publish(bool save_before_upload) override
|
||||
{
|
||||
auto* app = &app_;
|
||||
auto upload_thread = [app, save_before_upload] {
|
||||
BT_SetTerminate();
|
||||
|
||||
if (save_before_upload)
|
||||
{
|
||||
Canvas::I->project_save_thread(app->doc_path, true);
|
||||
}
|
||||
|
||||
auto pb = app->show_progress("Uploading");
|
||||
|
||||
app->upload(app->doc_path, app->doc_filename, [pb](float p) {
|
||||
pb->set_progress(p);
|
||||
});
|
||||
|
||||
pb->destroy();
|
||||
app->message_box("Success", "This document has been succesfully uploaded.");
|
||||
};
|
||||
|
||||
auto m = app_.message_box("Publish document", "Would you like to upload to the public domain?");
|
||||
m->btn_ok->m_text->set_text("Yes");
|
||||
m->btn_cancel->m_text->set_text("No");
|
||||
m->btn_ok->on_click = [m, upload_thread](Node*) {
|
||||
std::thread(upload_thread).detach();
|
||||
m->destroy();
|
||||
};
|
||||
m->btn_cancel->on_click = [m](Node*) {
|
||||
m->destroy();
|
||||
};
|
||||
}
|
||||
|
||||
void begin_bulk_upload(int progress_total, bool show_progress) override
|
||||
{
|
||||
bulk_progress_.reset();
|
||||
if (show_progress) {
|
||||
bulk_progress_ = app_.show_progress("Export Pano Image", progress_total);
|
||||
}
|
||||
}
|
||||
|
||||
void upload_all_bulk_files() override
|
||||
{
|
||||
auto names = Asset::list_files(app_.data_path, ".*\\.ppi");
|
||||
[[maybe_unused]] gl_state gl;
|
||||
for (const auto& n : names)
|
||||
{
|
||||
std::string path = app_.data_path + "/" + n;
|
||||
app_.upload(path);
|
||||
|
||||
if (bulk_progress_) {
|
||||
bulk_progress_->increment();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void end_bulk_upload() override
|
||||
{
|
||||
if (bulk_progress_) {
|
||||
bulk_progress_->destroy();
|
||||
}
|
||||
bulk_progress_.reset();
|
||||
}
|
||||
|
||||
void show_browser() override
|
||||
{
|
||||
auto dialog = std::make_shared<NodeDialogCloud>();
|
||||
dialog->set_manager(&app_.layout);
|
||||
dialog->init();
|
||||
dialog->create();
|
||||
dialog->loaded();
|
||||
|
||||
app_.layout[app_.main_id]->add_child(dialog);
|
||||
|
||||
auto* app = &app_;
|
||||
dialog->btn_ok->on_click = [app, dialog](Node*) {
|
||||
const auto selection_plan = pp::app::plan_cloud_download_selection(dialog->selected_file);
|
||||
const auto status = execute_legacy_cloud_download_selection_action(*app, selection_plan, *dialog);
|
||||
if (!status.ok())
|
||||
LOG("Cloud download selection action failed: %s", status.message);
|
||||
};
|
||||
}
|
||||
|
||||
void start_download(const pp::app::CloudDownloadRequest& request) override
|
||||
{
|
||||
auto* app = &app_;
|
||||
std::thread([app, request] {
|
||||
BT_SetTerminate();
|
||||
|
||||
auto* m = app->layout[app->main_id]->add_child<NodeMessageBox>();
|
||||
m->m_title->set_text("Downloading");
|
||||
m->m_message->set_text("Download in progress");
|
||||
std::string url = "https://panopainter.com/cloud/cloud-dwl.php?file=" + request.selected_file;
|
||||
app->download(url, request.selected_path, [m](float p) {
|
||||
static char progress[256];
|
||||
sprintf(progress, "Download in progress %.2f%%", p * 100.f);
|
||||
m->m_message->set_text(progress);
|
||||
});
|
||||
|
||||
app->canvas->reset_camera();
|
||||
app->layers->clear();
|
||||
|
||||
app->canvas->m_canvas->project_open_thread(request.selected_path);
|
||||
|
||||
app->doc_name = request.selected_name;
|
||||
app->title_update();
|
||||
for (auto& l : app->canvas->m_canvas->m_layers)
|
||||
app->layers->add_layer(l->m_name.c_str(), false);
|
||||
ActionManager::clear();
|
||||
m->destroy();
|
||||
}).detach();
|
||||
}
|
||||
|
||||
private:
|
||||
App& app_;
|
||||
std::shared_ptr<NodeProgressBar> bulk_progress_;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
pp::foundation::Status execute_legacy_cloud_upload_plan(
|
||||
App& app,
|
||||
const pp::app::CloudUploadPlan& plan)
|
||||
{
|
||||
LegacyCloudServices services(app);
|
||||
return pp::app::execute_cloud_upload_plan(plan, services);
|
||||
}
|
||||
|
||||
pp::foundation::Status execute_legacy_cloud_bulk_upload_plan(
|
||||
App& app,
|
||||
const pp::app::CloudBulkUploadPlan& plan)
|
||||
{
|
||||
LegacyCloudServices services(app);
|
||||
return pp::app::execute_cloud_bulk_upload_plan(plan, services);
|
||||
}
|
||||
|
||||
pp::foundation::Status execute_legacy_cloud_browse_action(
|
||||
App& app,
|
||||
pp::app::CloudBrowseAction action)
|
||||
{
|
||||
LegacyCloudServices services(app);
|
||||
return pp::app::execute_cloud_browse_action(action, services);
|
||||
}
|
||||
|
||||
pp::foundation::Status execute_legacy_cloud_download_selection_action(
|
||||
App& app,
|
||||
pp::app::CloudDownloadSelectionAction action,
|
||||
NodeDialogCloud& dialog)
|
||||
{
|
||||
pp::app::CloudDownloadRequest request {
|
||||
.selected_file = dialog.selected_file,
|
||||
.selected_path = dialog.selected_path,
|
||||
.selected_name = dialog.selected_name,
|
||||
};
|
||||
if (action == pp::app::CloudDownloadSelectionAction::start_download) {
|
||||
dialog.destroy();
|
||||
}
|
||||
LegacyCloudServices services(app);
|
||||
return pp::app::execute_cloud_download_selection_action(action, services, request);
|
||||
}
|
||||
|
||||
} // namespace pp::panopainter
|
||||
25
src/legacy_cloud_services.h
Normal file
25
src/legacy_cloud_services.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
|
||||
#include "app_core/document_cloud.h"
|
||||
#include "foundation/result.h"
|
||||
|
||||
class App;
|
||||
class NodeDialogCloud;
|
||||
|
||||
namespace pp::panopainter {
|
||||
|
||||
[[nodiscard]] pp::foundation::Status execute_legacy_cloud_upload_plan(
|
||||
App& app,
|
||||
const pp::app::CloudUploadPlan& plan);
|
||||
[[nodiscard]] pp::foundation::Status execute_legacy_cloud_bulk_upload_plan(
|
||||
App& app,
|
||||
const pp::app::CloudBulkUploadPlan& plan);
|
||||
[[nodiscard]] pp::foundation::Status execute_legacy_cloud_browse_action(
|
||||
App& app,
|
||||
pp::app::CloudBrowseAction action);
|
||||
[[nodiscard]] pp::foundation::Status execute_legacy_cloud_download_selection_action(
|
||||
App& app,
|
||||
pp::app::CloudDownloadSelectionAction action,
|
||||
NodeDialogCloud& dialog);
|
||||
|
||||
} // namespace pp::panopainter
|
||||
Reference in New Issue
Block a user