From 2d3013ccdc447299a6a49a3fa6052d58479c0864 Mon Sep 17 00:00:00 2001 From: Exeldro Date: Wed, 1 Feb 2023 12:21:59 +0100 Subject: [PATCH] UI: Add obs_frontend_add_undo_redo_action --- UI/api-interface.cpp | 14 ++++++++++++++ UI/obs-frontend-api/obs-frontend-api.cpp | 11 +++++++++++ UI/obs-frontend-api/obs-frontend-api.h | 5 +++++ UI/obs-frontend-api/obs-frontend-internal.hpp | 7 +++++++ docs/sphinx/reference-frontend-api.rst | 16 ++++++++++++++++ 5 files changed, 53 insertions(+) diff --git a/UI/api-interface.cpp b/UI/api-interface.cpp index 34dd94d4d..10382b28b 100644 --- a/UI/api-interface.cpp +++ b/UI/api-interface.cpp @@ -670,6 +670,20 @@ struct OBSStudioAPI : obs_frontend_callbacks { return bstrdup(main->lastReplay.c_str()); } + void obs_frontend_add_undo_redo_action(const char *name, + const undo_redo_cb undo, + const undo_redo_cb redo, + const char *undo_data, + const char *redo_data, + bool repeatable) override + { + main->undo_s.add_action( + name, + [undo](const std::string &data) { undo(data.c_str()); }, + [redo](const std::string &data) { redo(data.c_str()); }, + undo_data, redo_data, repeatable); + } + void on_load(obs_data_t *settings) override { for (size_t i = saveCallbacks.size(); i > 0; i--) { diff --git a/UI/obs-frontend-api/obs-frontend-api.cpp b/UI/obs-frontend-api/obs-frontend-api.cpp index e5ca328fc..56b349da4 100644 --- a/UI/obs-frontend-api/obs-frontend-api.cpp +++ b/UI/obs-frontend-api/obs-frontend-api.cpp @@ -600,3 +600,14 @@ char *obs_frontend_get_last_replay(void) return !!callbacks_valid() ? c->obs_frontend_get_last_replay() : nullptr; } + +void obs_frontend_add_undo_redo_action(const char *name, + const undo_redo_cb undo, + const undo_redo_cb redo, + const char *undo_data, + const char *redo_data, bool repeatable) +{ + if (callbacks_valid()) + c->obs_frontend_add_undo_redo_action( + name, undo, redo, undo_data, redo_data, repeatable); +} diff --git a/UI/obs-frontend-api/obs-frontend-api.h b/UI/obs-frontend-api/obs-frontend-api.h index 797decb00..df00024c2 100644 --- a/UI/obs-frontend-api/obs-frontend-api.h +++ b/UI/obs-frontend-api/obs-frontend-api.h @@ -237,6 +237,11 @@ EXPORT char *obs_frontend_get_last_recording(void); EXPORT char *obs_frontend_get_last_screenshot(void); EXPORT char *obs_frontend_get_last_replay(void); +typedef void (*undo_redo_cb)(const char *data); +EXPORT void obs_frontend_add_undo_redo_action( + const char *name, const undo_redo_cb undo, const undo_redo_cb redo, + const char *undo_data, const char *redo_data, bool repeatable); + /* ------------------------------------------------------------------------- */ #ifdef __cplusplus diff --git a/UI/obs-frontend-api/obs-frontend-internal.hpp b/UI/obs-frontend-api/obs-frontend-internal.hpp index bb0bbec9a..e0cd9a7b7 100644 --- a/UI/obs-frontend-api/obs-frontend-internal.hpp +++ b/UI/obs-frontend-api/obs-frontend-internal.hpp @@ -153,6 +153,13 @@ struct obs_frontend_callbacks { virtual char *obs_frontend_get_last_recording(void) = 0; virtual char *obs_frontend_get_last_screenshot(void) = 0; virtual char *obs_frontend_get_last_replay(void) = 0; + + virtual void obs_frontend_add_undo_redo_action(const char *name, + const undo_redo_cb undo, + const undo_redo_cb redo, + const char *undo_data, + const char *redo_data, + bool repeatable) = 0; }; EXPORT void diff --git a/docs/sphinx/reference-frontend-api.rst b/docs/sphinx/reference-frontend-api.rst index 7fc93f820..47eb89cc7 100644 --- a/docs/sphinx/reference-frontend-api.rst +++ b/docs/sphinx/reference-frontend-api.rst @@ -226,6 +226,10 @@ Structures/Enumerations Translation callback +.. type:: void (*undo_redo_cb)(const char *data) + + Undo redo callback + Functions --------- @@ -846,3 +850,15 @@ Functions :c:func:`bfree()` .. versionadded:: 29.0.0 + +--------------------------------------- + +.. function:: void obs_frontend_add_undo_redo_action(const char *name, const undo_redo_cb undo, const undo_redo_cb redo, const char *undo_data, const char *redo_data, bool repeatable) + + :param name: The name of the undo redo action + :param undo: Callback to use for undo + :param redo: Callback to use for redo + :param undo_data: String with data for the undo callback + :param redo_data: String with data for the redo callback + :param repeatable: Allow multiple actions with the same name to be merged to 1 undo redo action. + This uses the undo action from the first and the redo action from the last action.