File: macro-segment-script.hpp

package info (click to toggle)
obs-advanced-scene-switcher 1.31.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 43,252 kB
  • sloc: xml: 297,593; cpp: 142,370; python: 387; sh: 189; ansic: 170; makefile: 31
file content (102 lines) | stat: -rw-r--r-- 2,941 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#pragma once
#include "duration-control.hpp"
#include "macro-script-handler.hpp"
#include "sync-helpers.hpp"

#include <atomic>
#include <obs-data.h>

namespace advss {

class Macro;
class MacroAction;
class MacroCondition;

class MacroSegmentScript : public Lockable {
public:
	MacroSegmentScript(obs_data_t *defaultSettings,
			   const std::string &propertiesSignalName,
			   const std::string &triggerSignalName,
			   const std::string &completionSignalName,
			   const std::string &newInstanceSignalName,
			   const std::string &deletedInstanceSignalName);
	MacroSegmentScript(const advss::MacroSegmentScript &);
	virtual ~MacroSegmentScript();

	static void RegisterTempVar(const std::string &variableId,
				    const std::string &name,
				    const std::string &helpText,
				    int instanceId);
	static void DeregisterAllTempVars(int instanceId);
	static void SetTempVarValue(const std::string &variableId,
				    const std::string &value, int instanceId);

protected:
	bool Save(obs_data_t *obj) const;
	bool Load(obs_data_t *obj);

	obs_properties_t *GetProperties() const;
	OBSData GetSettings() const { return _settings.Get(); }
	void UpdateSettings(obs_data_t *newSettings) const;

	bool SendTriggerSignal();
	double GetTimeoutSeconds() const { return _timeout.Seconds(); };
	bool TriggerIsCompleted() const { return _triggerIsComplete; }

	virtual void RegisterTempVarHelper(const std::string &variableId,
					   const std::string &name,
					   const std::string &helpText) = 0;
	virtual void DeregisterAllTempVarsHelper() = 0;
	virtual void SetTempVarValueHelper(const std::string &variableId,
					   const std::string &value) = 0;

	const int64_t _instanceId;

private:
	virtual void WaitForCompletion() const = 0;
	static void CompletionSignalReceived(void *param, calldata_t *data);
	void SignalNewInstance() const;

	OBSDataAutoRelease _settings;
	std::string _propertiesSignal = "";

	std::string _triggerSignal = "";
	std::string _completionSignal = "";
	std::string _newInstanceSignal = "";
	std::string _deletedInstanceSignal = "";
	std::atomic_bool _triggerIsComplete = {false};
	bool _triggerResult = false;
	int64_t _completionId = 0;

	Duration _timeout = Duration(10.0);

	friend class MacroSegmentScriptEdit;
};

class MacroSegmentScriptEdit : public QWidget {
	Q_OBJECT

public:
	MacroSegmentScriptEdit(
		QWidget *parent,
		std::shared_ptr<MacroSegmentScript> entryData = nullptr);
	void UpdateEntryData();
	static QWidget *Create(QWidget *parent,
			       std::shared_ptr<MacroAction> segment);
	static QWidget *Create(QWidget *parent,
			       std::shared_ptr<MacroCondition> segment);

private slots:
	void TimeoutChanged(const Duration &);

private:
	static obs_properties_t *GetProperties(void *obj);
	static void UpdateSettings(void *obj, obs_data_t *settings);

	DurationSelection *_timeout;

	std::shared_ptr<MacroSegmentScript> _entryData;
	bool _loading = true;
};

} // namespace advss