File: macro-segment-copy-paste.cpp

package info (click to toggle)
obs-advanced-scene-switcher 1.32.8-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 43,492 kB
  • sloc: xml: 297,593; cpp: 147,875; python: 387; sh: 280; ansic: 170; makefile: 33
file content (126 lines) | stat: -rw-r--r-- 3,316 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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include "macro-segment-copy-paste.hpp"
#include "advanced-scene-switcher.hpp"
#include "macro.hpp"

#include <QShortcut>

namespace advss {

struct MacroSegmentCopyInfo {
	enum class Type { NONE, CONDITION, ACTION, ELSE };
	Type type = Type::NONE;
	std::shared_ptr<MacroSegment> segment;
};
static MacroSegmentCopyInfo copyInfo;

void MacroEdit::CopyMacroSegment()
{
	copyInfo.segment.reset();
	copyInfo.type = MacroSegmentCopyInfo::Type::NONE;

	if (currentConditionIdx == -1 && currentActionIdx == -1 &&
	    currentElseActionIdx == -1) {
		return;
	}

	auto macro = _currentMacro;
	if (!macro) {
		return;
	}

	if (currentConditionIdx != -1) {
		copyInfo.type = MacroSegmentCopyInfo::Type::CONDITION;
		copyInfo.segment = macro->Conditions().at(currentConditionIdx);
	} else if (currentActionIdx != -1) {
		copyInfo.type = MacroSegmentCopyInfo::Type::ACTION;
		copyInfo.segment = macro->Actions().at(currentActionIdx);
	} else if (currentElseActionIdx != -1) {
		copyInfo.type = MacroSegmentCopyInfo::Type::ELSE;
		copyInfo.segment =
			macro->ElseActions().at(currentElseActionIdx);
	} else {
		assert(false);
	}
}

void MacroEdit::PasteMacroSegment()
{
	if (copyInfo.type == MacroSegmentCopyInfo::Type::NONE) {
		return;
	}

	auto macro = _currentMacro;
	if (!macro || !copyInfo.segment) {
		return;
	}

	OBSDataAutoRelease data = obs_data_create();
	copyInfo.segment->Save(data);

	switch (copyInfo.type) {
	case MacroSegmentCopyInfo::Type::CONDITION: {
		const auto condition = std::static_pointer_cast<MacroCondition>(
			copyInfo.segment);
		auto logic = condition->GetLogicType();
		if (logic > Logic::Type::ROOT_LAST &&
		    macro->Conditions().empty()) {
			logic = Logic::Type::ROOT_NONE;
		}
		if (logic < Logic::Type::ROOT_LAST &&
		    !macro->Conditions().empty()) {
			logic = Logic::Type::OR;
		}
		AddMacroCondition(macro.get(), macro->Conditions().size(),
				  copyInfo.segment->GetId(), data.Get(), logic);
		break;
	}
	case MacroSegmentCopyInfo::Type::ACTION:
		AddMacroAction(macro.get(), macro->Actions().size(),
			       copyInfo.segment->GetId(), data.Get());
		break;
	case MacroSegmentCopyInfo::Type::ELSE:
		AddMacroElseAction(macro.get(), macro->ElseActions().size(),
				   copyInfo.segment->GetId(), data.Get());
		break;
	default:
		break;
	}
}

bool MacroSegmentIsInClipboard()
{
	return copyInfo.type != MacroSegmentCopyInfo::Type::NONE;
}

bool MacroActionIsInClipboard()
{
	return copyInfo.type == MacroSegmentCopyInfo::Type::ACTION ||
	       copyInfo.type == MacroSegmentCopyInfo::Type::ELSE;
}

void SetCopySegmentTargetActionType(bool setToElseAction)
{
	if (copyInfo.type == MacroSegmentCopyInfo::Type::ACTION &&
	    setToElseAction) {
		copyInfo.type = MacroSegmentCopyInfo::Type::ELSE;
		return;
	}

	if (copyInfo.type == MacroSegmentCopyInfo::Type::ELSE &&
	    !setToElseAction) {
		copyInfo.type = MacroSegmentCopyInfo::Type::ACTION;
		return;
	}
}

void SetupSegmentCopyPasteShortcutHandlers(MacroEdit *edit)
{
	auto copyShortcut = new QShortcut(QKeySequence("Ctrl+C"), edit);
	QWidget::connect(copyShortcut, &QShortcut::activated, edit,
			 &MacroEdit::CopyMacroSegment);
	auto pasteShortcut = new QShortcut(QKeySequence("Ctrl+V"), edit);
	QWidget::connect(pasteShortcut, &QShortcut::activated, edit,
			 &MacroEdit::PasteMacroSegment);
}

} // namespace advss