SourceToolbar.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "SourceToolbar.hpp"
  2. #include <widgets/OBSBasic.hpp>
  3. #include "moc_SourceToolbar.cpp"
  4. SourceToolbar::SourceToolbar(QWidget *parent, OBSSource source)
  5. : QWidget(parent),
  6. weakSource(OBSGetWeakRef(source)),
  7. props(obs_source_properties(source), obs_properties_destroy)
  8. {
  9. }
  10. void SourceToolbar::SaveOldProperties(obs_source_t *source)
  11. {
  12. oldData = obs_data_create();
  13. OBSDataAutoRelease oldSettings = obs_source_get_settings(source);
  14. obs_data_apply(oldData, oldSettings);
  15. obs_data_set_string(oldData, "undo_suuid", obs_source_get_uuid(source));
  16. }
  17. void SourceToolbar::SetUndoProperties(obs_source_t *source, bool repeatable)
  18. {
  19. if (!oldData) {
  20. blog(LOG_ERROR, "%s: somehow oldData was null.", __FUNCTION__);
  21. return;
  22. }
  23. OBSBasic *main = OBSBasic::Get();
  24. OBSSource currentSceneSource = main->GetCurrentSceneSource();
  25. if (!currentSceneSource)
  26. return;
  27. std::string scene_uuid = obs_source_get_uuid(currentSceneSource);
  28. auto undo_redo = [scene_uuid = std::move(scene_uuid), main](const std::string &data) {
  29. OBSDataAutoRelease settings = obs_data_create_from_json(data.c_str());
  30. OBSSourceAutoRelease source = obs_get_source_by_uuid(obs_data_get_string(settings, "undo_suuid"));
  31. obs_source_reset_settings(source, settings);
  32. OBSSourceAutoRelease scene_source = obs_get_source_by_uuid(scene_uuid.c_str());
  33. main->SetCurrentScene(scene_source.Get(), true);
  34. main->UpdateContextBar();
  35. };
  36. OBSDataAutoRelease new_settings = obs_data_create();
  37. OBSDataAutoRelease curr_settings = obs_source_get_settings(source);
  38. obs_data_apply(new_settings, curr_settings);
  39. obs_data_set_string(new_settings, "undo_suuid", obs_source_get_uuid(source));
  40. std::string undo_data(obs_data_get_json(oldData));
  41. std::string redo_data(obs_data_get_json(new_settings));
  42. if (undo_data.compare(redo_data) != 0)
  43. main->undo_s.add_action(QTStr("Undo.Properties").arg(obs_source_get_name(source)), undo_redo, undo_redo,
  44. undo_data, redo_data, repeatable);
  45. oldData = nullptr;
  46. }