Centralize legacy app shell services
This commit is contained in:
376
src/legacy_app_shell_services.cpp
Normal file
376
src/legacy_app_shell_services.cpp
Normal file
@@ -0,0 +1,376 @@
|
||||
#include "pch.h"
|
||||
|
||||
#include "legacy_app_shell_services.h"
|
||||
|
||||
#include "app.h"
|
||||
#include "app_core/document_import.h"
|
||||
#include "legacy_document_canvas_services.h"
|
||||
#include "legacy_history_services.h"
|
||||
|
||||
namespace pp::panopainter {
|
||||
namespace {
|
||||
|
||||
class LegacyDocumentExportMenuServices final : public pp::app::DocumentExportMenuServices {
|
||||
public:
|
||||
explicit LegacyDocumentExportMenuServices(App& app) noexcept
|
||||
: app_(app)
|
||||
{
|
||||
}
|
||||
|
||||
void show_jpeg_dialog() override { app_.dialog_export(".jpg"); }
|
||||
void show_png_dialog() override { app_.dialog_export(".png"); }
|
||||
void show_layers_dialog() override { app_.dialog_export_layers(); }
|
||||
void show_cube_faces_dialog() override { app_.dialog_export_cube_faces(); }
|
||||
void show_depth_dialog() override { app_.dialog_export_depth(); }
|
||||
void show_animation_frames_dialog() override { app_.dialog_export_anim_frames(); }
|
||||
void show_animation_mp4_dialog() override { app_.dialog_export_mp4(); }
|
||||
void show_timelapse_dialog() override { app_.dialog_timelapse_export(); }
|
||||
void show_license_disabled() override
|
||||
{
|
||||
app_.message_box("License", "This function is disabled in demo mode.");
|
||||
}
|
||||
|
||||
private:
|
||||
App& app_;
|
||||
};
|
||||
|
||||
class LegacyFileMenuServices final : public pp::app::FileMenuServices {
|
||||
public:
|
||||
explicit LegacyFileMenuServices(App& app) noexcept
|
||||
: app_(app)
|
||||
{
|
||||
}
|
||||
|
||||
void show_new_document_dialog() override
|
||||
{
|
||||
app_.dialog_newdoc();
|
||||
}
|
||||
|
||||
void pick_image_for_import() override
|
||||
{
|
||||
auto* app_ptr = &app_;
|
||||
app_.pick_image([app_ptr](std::string path) {
|
||||
Image img;
|
||||
img.load_file(path);
|
||||
const auto import_plan = pp::app::plan_document_image_import(img.width, img.height);
|
||||
if (!import_plan)
|
||||
return;
|
||||
|
||||
class LegacyDocumentImageImportServices final : public pp::app::DocumentImageImportServices {
|
||||
public:
|
||||
LegacyDocumentImageImportServices(App& app, Image& image) noexcept
|
||||
: app_(app)
|
||||
, image_(image)
|
||||
{
|
||||
}
|
||||
|
||||
void import_equirectangular(std::string_view import_path) override
|
||||
{
|
||||
if (Canvas::I)
|
||||
Canvas::I->import_equirectangular(std::string(import_path));
|
||||
}
|
||||
|
||||
void enter_transform_import(std::string_view) override
|
||||
{
|
||||
if (!app_.canvas || !app_.canvas->m_canvas)
|
||||
return;
|
||||
|
||||
auto* mode = static_cast<CanvasModeTransform*>(
|
||||
app_.canvas->m_canvas->modes[(int)kCanvasMode::Import][0]);
|
||||
mode->m_action = CanvasModeTransform::ActionType::Import;
|
||||
mode->m_source_image = std::move(image_);
|
||||
Canvas::set_mode(kCanvasMode::Import);
|
||||
}
|
||||
|
||||
private:
|
||||
App& app_;
|
||||
Image& image_;
|
||||
};
|
||||
|
||||
LegacyDocumentImageImportServices services(*app_ptr, img);
|
||||
const auto status = pp::app::execute_document_image_import_plan(
|
||||
import_plan.value(),
|
||||
path,
|
||||
services);
|
||||
if (!status.ok())
|
||||
LOG("Image import failed: %s", status.message);
|
||||
});
|
||||
}
|
||||
|
||||
void pick_project_file() override
|
||||
{
|
||||
auto* app_ptr = &app_;
|
||||
app_.pick_file({ "ppi" }, [app_ptr](std::string path) {
|
||||
app_ptr->open_document(path);
|
||||
});
|
||||
}
|
||||
|
||||
void show_cloud_browser_dialog() override
|
||||
{
|
||||
app_.dialog_browse();
|
||||
}
|
||||
|
||||
void save_document(pp::app::DocumentSaveIntent intent) override
|
||||
{
|
||||
app_.save_document(intent);
|
||||
}
|
||||
|
||||
void show_export_jpeg_dialog(pp::app::DocumentExportMenuKind kind) override
|
||||
{
|
||||
(void)apply_legacy_document_export_menu_plan(app_, kind);
|
||||
}
|
||||
|
||||
void show_export_submenu() override
|
||||
{
|
||||
}
|
||||
|
||||
void share_document() override
|
||||
{
|
||||
app_.share_file(app_.doc_path);
|
||||
}
|
||||
|
||||
void show_resize_dialog() override
|
||||
{
|
||||
app_.dialog_resize();
|
||||
}
|
||||
|
||||
void upload_to_cloud() override
|
||||
{
|
||||
app_.cloud_upload();
|
||||
}
|
||||
|
||||
void browse_cloud_documents() override
|
||||
{
|
||||
app_.cloud_browse();
|
||||
}
|
||||
|
||||
private:
|
||||
App& app_;
|
||||
};
|
||||
|
||||
class LegacyMainToolbarServices final : public pp::app::MainToolbarServices {
|
||||
public:
|
||||
explicit LegacyMainToolbarServices(App& app) noexcept
|
||||
: app_(app)
|
||||
{
|
||||
}
|
||||
|
||||
void show_open_dialog() override
|
||||
{
|
||||
app_.dialog_open();
|
||||
}
|
||||
|
||||
void show_save_dialog() override
|
||||
{
|
||||
app_.dialog_save();
|
||||
}
|
||||
|
||||
void invoke_undo(const pp::app::HistoryUiPlan& plan) override
|
||||
{
|
||||
execute_history_plan(plan);
|
||||
}
|
||||
|
||||
void invoke_redo(const pp::app::HistoryUiPlan& plan) override
|
||||
{
|
||||
execute_history_plan(plan);
|
||||
}
|
||||
|
||||
void clear_history(const pp::app::HistoryUiPlan& plan) override
|
||||
{
|
||||
execute_history_plan(plan);
|
||||
}
|
||||
|
||||
void clear_canvas(const pp::app::DocumentCanvasClearPlan& plan) override
|
||||
{
|
||||
const auto status = execute_legacy_document_canvas_clear_plan(app_, plan);
|
||||
if (!status.ok())
|
||||
LOG("Canvas clear failed: %s", status.message);
|
||||
}
|
||||
|
||||
void show_message_box() override
|
||||
{
|
||||
app_.msgbox = new NodeMessageBox();
|
||||
app_.msgbox->set_manager(&app_.layout);
|
||||
app_.msgbox->init();
|
||||
app_.layout[app_.main_id]->add_child(app_.msgbox);
|
||||
}
|
||||
|
||||
void show_settings_dialog() override
|
||||
{
|
||||
app_.settings = new NodeSettings();
|
||||
app_.settings->set_manager(&app_.layout);
|
||||
app_.settings->init();
|
||||
app_.layout[app_.main_id]->add_child(app_.settings);
|
||||
}
|
||||
|
||||
private:
|
||||
void execute_history_plan(const pp::app::HistoryUiPlan& plan)
|
||||
{
|
||||
const auto status = execute_legacy_history_plan(plan);
|
||||
if (!status.ok())
|
||||
LOG("History action failed: %s", status.message);
|
||||
}
|
||||
|
||||
App& app_;
|
||||
};
|
||||
|
||||
class LegacyAboutMenuServices final : public pp::app::AboutMenuServices {
|
||||
public:
|
||||
explicit LegacyAboutMenuServices(App& app) noexcept
|
||||
: app_(app)
|
||||
{
|
||||
}
|
||||
|
||||
void show_user_manual() override
|
||||
{
|
||||
app_.dialog_usermanual();
|
||||
}
|
||||
|
||||
void show_about_dialog() override
|
||||
{
|
||||
app_.dialog_about();
|
||||
}
|
||||
|
||||
void show_whats_new_dialog() override
|
||||
{
|
||||
app_.dialog_whatsnew(true);
|
||||
}
|
||||
|
||||
void trigger_crash_test() override
|
||||
{
|
||||
LOG("crashing");
|
||||
app_.crash_test();
|
||||
}
|
||||
|
||||
void run_performance_test(const pp::app::AboutMenuPlan& plan) override
|
||||
{
|
||||
if (!Canvas::I)
|
||||
return;
|
||||
|
||||
LOG("perf");
|
||||
std::string message;
|
||||
const int performance_iterations = plan.performance_iterations;
|
||||
app_.render_task([&]
|
||||
{
|
||||
auto start = std::chrono::high_resolution_clock::now();
|
||||
Canvas::I->stroke_start({ 0, 0, 0 }, 0.9f);
|
||||
for (int i = 0; i < performance_iterations; i++)
|
||||
{
|
||||
Canvas::I->stroke_update({ 100, 100, 0 }, 0.9f);
|
||||
Canvas::I->stroke_update({ 200, 200, 0 }, 0.9f);
|
||||
Canvas::I->stroke_update({ 200, 100, 0 }, 0.9f);
|
||||
Canvas::I->stroke_update({ 100, 200, 0 }, 0.9f);
|
||||
Canvas::I->stroke_update({ 300, 300, 0 }, 0.9f);
|
||||
Canvas::I->stroke_update({ 200, 500, 0 }, 0.9f);
|
||||
Canvas::I->stroke_update({ 500, 500, 0 }, 0.9f);
|
||||
Canvas::I->stroke_update({ 400, 400, 0 }, 0.9f);
|
||||
Canvas::I->stroke_update({ 0, 200, 0 }, 0.9f);
|
||||
Canvas::I->stroke_update({ 200, 0, 0 }, 0.9f);
|
||||
Canvas::I->stroke_draw();
|
||||
}
|
||||
Canvas::I->stroke_end();
|
||||
auto diff = std::chrono::high_resolution_clock::now() - start;
|
||||
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(diff).count();
|
||||
LOG("%lld ms", ms);
|
||||
message = "Time " + std::to_string(ms) + " ms";
|
||||
});
|
||||
app_.message_box("Performance test", message);
|
||||
}
|
||||
|
||||
private:
|
||||
App& app_;
|
||||
};
|
||||
|
||||
class LegacyToolsMenuServices final : public pp::app::ToolsMenuServices {
|
||||
public:
|
||||
explicit LegacyToolsMenuServices(App& app) noexcept
|
||||
: app_(app)
|
||||
{
|
||||
}
|
||||
|
||||
void show_panels_submenu() override
|
||||
{
|
||||
}
|
||||
|
||||
void show_options_submenu() override
|
||||
{
|
||||
}
|
||||
|
||||
void clear_grid_overlays() override
|
||||
{
|
||||
auto* mode = static_cast<CanvasModeGrid*>(Canvas::modes[(int)kCanvasMode::Grid][0]);
|
||||
mode->clear();
|
||||
}
|
||||
|
||||
void reset_camera() override
|
||||
{
|
||||
if (app_.canvas)
|
||||
app_.canvas->reset_camera();
|
||||
}
|
||||
|
||||
void show_shortcuts_dialog() override
|
||||
{
|
||||
app_.dialog_shortcuts();
|
||||
}
|
||||
|
||||
void start_sonarpen() override
|
||||
{
|
||||
#if __IOS__
|
||||
[app_.ios_app sonarpen_start];
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
App& app_;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
bool apply_legacy_document_export_menu_plan(App& app, pp::app::DocumentExportMenuKind kind)
|
||||
{
|
||||
const auto requires_license = pp::app::document_export_menu_requires_license(kind);
|
||||
const auto plan = pp::app::plan_document_export_menu_action(
|
||||
kind,
|
||||
app.canvas != nullptr,
|
||||
!requires_license || app.check_license());
|
||||
LegacyDocumentExportMenuServices services(app);
|
||||
const auto status = pp::app::execute_document_export_menu_plan(plan, services);
|
||||
if (!status.ok())
|
||||
LOG("Document export menu action failed: %s", status.message);
|
||||
return status.ok() && plan.opens_dialog;
|
||||
}
|
||||
|
||||
void apply_legacy_file_menu_command(App& app, pp::app::FileMenuCommand command)
|
||||
{
|
||||
const auto plan = pp::app::plan_file_menu_command(command);
|
||||
LegacyFileMenuServices services(app);
|
||||
const auto status = pp::app::execute_file_menu_plan(plan, services);
|
||||
if (!status.ok())
|
||||
LOG("File menu action failed: %s", status.message);
|
||||
}
|
||||
|
||||
void execute_legacy_main_toolbar_plan(App& app, const pp::app::MainToolbarPlan& plan)
|
||||
{
|
||||
LegacyMainToolbarServices services(app);
|
||||
const auto status = pp::app::execute_main_toolbar_plan(plan, services);
|
||||
if (!status.ok())
|
||||
LOG("Main toolbar action failed: %s", status.message);
|
||||
}
|
||||
|
||||
void execute_legacy_about_menu_plan(App& app, const pp::app::AboutMenuPlan& plan)
|
||||
{
|
||||
LegacyAboutMenuServices services(app);
|
||||
const auto status = pp::app::execute_about_menu_plan(plan, services);
|
||||
if (!status.ok())
|
||||
LOG("About menu action failed: %s", status.message);
|
||||
}
|
||||
|
||||
void execute_legacy_tools_menu_plan(App& app, const pp::app::ToolsMenuPlan& plan)
|
||||
{
|
||||
LegacyToolsMenuServices services(app);
|
||||
const auto status = pp::app::execute_tools_menu_plan(plan, services);
|
||||
if (!status.ok())
|
||||
LOG("Tools menu action failed: %s", status.message);
|
||||
}
|
||||
|
||||
} // namespace pp::panopainter
|
||||
Reference in New Issue
Block a user