From c842595214fd246f198950cce10e1d7e1bd3b826 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Mon, 23 Aug 2021 20:43:54 +0200 Subject: [PATCH] Add "size" section to scene item transform info --- src/headers/utility.hpp | 10 +----- src/macro-action-scene-transform.cpp | 44 ++++++++++--------------- src/macro-condition-scene-transform.cpp | 24 ++------------ src/utility.cpp | 29 ++++++++++++++++ 4 files changed, 50 insertions(+), 57 deletions(-) diff --git a/src/headers/utility.hpp b/src/headers/utility.hpp index b5fc02fa..a60684d1 100644 --- a/src/headers/utility.hpp +++ b/src/headers/utility.hpp @@ -39,15 +39,7 @@ void loadTransformState(obs_data_t *obj, struct obs_transform_info &info, struct obs_sceneitem_crop &crop); bool saveTransformState(obs_data_t *obj, struct obs_transform_info &info, struct obs_sceneitem_crop &crop); - -/** - * Populate layout with labels and widgets based on provided text - * - * @param text Text based on which labels are generated and widgets are placed. - * @param layout Layout in which the widgets and labels will be placed. - * @param placeholders Map containing a mapping of placeholder strings to widgets. - * @param addStretch Add addStretch() to layout. - */ +std::string getSceneItemTransform(obs_scene_item *item); void placeWidgets(std::string text, QBoxLayout *layout, std::unordered_map placeholders, bool addStretch = true); diff --git a/src/macro-action-scene-transform.cpp b/src/macro-action-scene-transform.cpp index dea5754a..4f46fe3f 100644 --- a/src/macro-action-scene-transform.cpp +++ b/src/macro-action-scene-transform.cpp @@ -18,24 +18,10 @@ bool MacroActionSceneTransform::PerformAction() auto items = getSceneItemsWithName(scene, name); for (auto &item : items) { - // Merge new settings with current settings - struct obs_transform_info info; - struct obs_sceneitem_crop crop; - obs_sceneitem_get_info(item, &info); - obs_sceneitem_get_crop(item, &crop); - auto temp = obs_data_create(); - saveTransformState(temp, info, crop); - auto temp2 = obs_data_create(); - saveTransformState(temp, _info, _crop); - obs_data_apply(temp, temp2); - loadTransformState(temp, info, crop); - obs_data_release(temp); - obs_data_release(temp2); - // Apply settings obs_sceneitem_defer_update_begin(item); - obs_sceneitem_set_info(item, &info); - obs_sceneitem_set_crop(item, &crop); + obs_sceneitem_set_info(item, &_info); + obs_sceneitem_set_crop(item, &_crop); obs_sceneitem_defer_update_end(item); obs_sceneitem_release(item); @@ -95,6 +81,21 @@ void MacroActionSceneTransform::SetSettings(std::string &settings) return; } loadTransformState(data, _info, _crop); + if (obs_data_has_user_value(data, "size")) { + auto obj = obs_data_get_obj(data, "size"); + auto source = obs_weak_source_get_source(_source); + if (double h = obs_data_get_double(obj, "height")) { + _info.scale.y = + h / double(obs_source_get_height(source)); + } + if (double w = obs_data_get_double(obj, "width")) { + _info.scale.x = + w / double(obs_source_get_width(source)); + } + obs_data_release(obj); + obs_source_release(source); + } + obs_data_release(data); } @@ -202,16 +203,7 @@ void MacroActionSceneTransformEdit::GetSettingsClicked() return; } - struct obs_transform_info info; - struct obs_sceneitem_crop crop; - obs_sceneitem_get_info(item, &info); - obs_sceneitem_get_crop(item, &crop); - - auto data = obs_data_create(); - saveTransformState(data, info, crop); - auto json = obs_data_get_json(data); - _settings->setPlainText(formatJsonString(json)); - obs_data_release(data); + _settings->setPlainText(formatJsonString(getSceneItemTransform(item))); } void MacroActionSceneTransformEdit::SettingsChanged() diff --git a/src/macro-condition-scene-transform.cpp b/src/macro-condition-scene-transform.cpp index c3efe065..818cf54e 100644 --- a/src/macro-condition-scene-transform.cpp +++ b/src/macro-condition-scene-transform.cpp @@ -21,20 +21,10 @@ bool MacroConditionSceneTransform::CheckCondition() auto items = getSceneItemsWithName(scene, name); for (auto &item : items) { - struct obs_transform_info info; - struct obs_sceneitem_crop crop; - obs_sceneitem_get_info(item, &info); - obs_sceneitem_get_crop(item, &crop); - - auto data = obs_data_create(); - saveTransformState(data, info, crop); - auto json = obs_data_get_json(data); - + auto json = getSceneItemTransform(item); if (matchJson(json, _settings, _regex)) { ret = true; } - - obs_data_release(data); obs_sceneitem_release(item); } @@ -187,21 +177,11 @@ void MacroConditionSceneTransformEdit::GetSettingsClicked() return; } - struct obs_transform_info info; - struct obs_sceneitem_crop crop; - obs_sceneitem_get_info(item, &info); - obs_sceneitem_get_crop(item, &crop); - - auto data = obs_data_create(); - saveTransformState(data, info, crop); - - QString json = formatJsonString(obs_data_get_json(data)); + QString json = formatJsonString(getSceneItemTransform(item)); if (_entryData->_regex) { json = escapeForRegex(json); } - _settings->setPlainText(json); - obs_data_release(data); } void MacroConditionSceneTransformEdit::SettingsChanged() diff --git a/src/utility.cpp b/src/utility.cpp index 91e8b9f6..06721c73 100644 --- a/src/utility.cpp +++ b/src/utility.cpp @@ -140,6 +140,35 @@ getNextDelim(const std::string &text, return res; } +std::pair getSceneItemSize(obs_scene_item *item) +{ + std::pair size; + obs_source_t *source = obs_sceneitem_get_source(item); + size.first = double(obs_source_get_width(source)); + size.second = double(obs_source_get_height(source)); + return size; +} + +std::string getSceneItemTransform(obs_scene_item *item) +{ + struct obs_transform_info info; + struct obs_sceneitem_crop crop; + obs_sceneitem_get_info(item, &info); + obs_sceneitem_get_crop(item, &crop); + auto size = getSceneItemSize(item); + + auto data = obs_data_create(); + saveTransformState(data, info, crop); + obs_data_t *obj = obs_data_create(); + obs_data_set_double(obj, "width", size.first * info.scale.x); + obs_data_set_double(obj, "height", size.second * info.scale.y); + obs_data_set_obj(data, "size", obj); + obs_data_release(obj); + auto json = std::string(obs_data_get_json(data)); + obs_data_release(data); + return json; +} + void placeWidgets(std::string text, QBoxLayout *layout, std::unordered_map placeholders, bool addStretch)