diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 690aeb1e..7986f2cd 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -277,6 +277,12 @@ void SwitcherData::setPreconditions() } } currentTitle = title; + + // Cursor + std::pair cursorPos = getCursorPos(); + cursorPosChanged = cursorPos.first != switcher->lastCursorPos.first || + cursorPos.second != switcher->lastCursorPos.second; + lastCursorPos = getCursorPos(); } bool SwitcherData::checkForMatch(OBSWeakSource &scene, diff --git a/src/headers/macro-condition-cursor.hpp b/src/headers/macro-condition-cursor.hpp index 907c4544..2a6e1f91 100644 --- a/src/headers/macro-condition-cursor.hpp +++ b/src/headers/macro-condition-cursor.hpp @@ -3,6 +3,11 @@ #include #include +enum class CursorCondition { + REGION, + MOVING, +}; + class MacroConditionCursor : public MacroCondition { public: bool CheckCondition(); @@ -14,6 +19,7 @@ public: return std::make_shared(); } + CursorCondition _condition = CursorCondition::REGION; int _minX = 0, _minY = 0, _maxX = 0, _maxY = 0; private: @@ -38,6 +44,7 @@ public: } private slots: + void ConditionChanged(int cond); void MinXChanged(int pos); void MinYChanged(int pos); void MaxXChanged(int pos); @@ -48,8 +55,10 @@ protected: QSpinBox *_minY; QSpinBox *_maxX; QSpinBox *_maxY; + QComboBox *_conditions; std::shared_ptr _entryData; private: + void SetRegionSelectionVisible(bool); bool _loading = true; }; diff --git a/src/headers/switcher-data-structs.hpp b/src/headers/switcher-data-structs.hpp index c3bdd67f..d757fe63 100644 --- a/src/headers/switcher-data-structs.hpp +++ b/src/headers/switcher-data-structs.hpp @@ -101,6 +101,8 @@ struct SwitcherData { std::string currentTitle; std::deque screenRegionSwitches; + std::pair lastCursorPos = {0, 0}; + bool cursorPosChanged = false; std::vector ignoreWindowsSwitches; diff --git a/src/macro-condition-cursor.cpp b/src/macro-condition-cursor.cpp index 9c66c38c..5b7a8c93 100644 --- a/src/macro-condition-cursor.cpp +++ b/src/macro-condition-cursor.cpp @@ -14,18 +14,34 @@ bool MacroConditionCursor::_registered = MacroConditionFactory::Register( static const std::string idOld = "region"; static bool oldRegisterd = MacroConditionFactory::Register( idOld, {MacroConditionCursor::Create, MacroConditionCursorEdit::Create, - "AdvSceneSwitcher.condition.region"}); + "AdvSceneSwitcher.condition.cursor"}); + +static std::map cursorConditionTypes = { + {CursorCondition::REGION, + "AdvSceneSwitcher.condition.cursor.type.region"}, + {CursorCondition::MOVING, + "AdvSceneSwitcher.condition.cursor.type.moving"}, +}; bool MacroConditionCursor::CheckCondition() { std::pair cursorPos = getCursorPos(); - return cursorPos.first >= _minX && cursorPos.second >= _minY && - cursorPos.first <= _maxX && cursorPos.second <= _maxY; + switch (_condition) { + case CursorCondition::REGION: + return cursorPos.first >= _minX && cursorPos.second >= _minY && + cursorPos.first <= _maxX && cursorPos.second <= _maxY; + case CursorCondition::MOVING: + return switcher->cursorPosChanged; + default: + break; + } + return false; } bool MacroConditionCursor::Save(obs_data_t *obj) { MacroCondition::Save(obj); + obs_data_set_int(obj, "condition", static_cast(_condition)); obs_data_set_int(obj, "minX", _minX); obs_data_set_int(obj, "minY", _minY); obs_data_set_int(obj, "maxX", _maxX); @@ -36,6 +52,8 @@ bool MacroConditionCursor::Save(obs_data_t *obj) bool MacroConditionCursor::Load(obs_data_t *obj) { MacroCondition::Load(obj); + _condition = static_cast( + obs_data_get_int(obj, "condition")); _minX = obs_data_get_int(obj, "minX"); _minY = obs_data_get_int(obj, "minY"); _maxX = obs_data_get_int(obj, "maxX"); @@ -43,15 +61,25 @@ bool MacroConditionCursor::Load(obs_data_t *obj) return true; } +static inline void populateConditionSelection(QComboBox *list) +{ + for (auto entry : cursorConditionTypes) { + list->addItem(obs_module_text(entry.second.c_str())); + } +} + MacroConditionCursorEdit::MacroConditionCursorEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent) { + _conditions = new QComboBox(); _minX = new QSpinBox(); _minY = new QSpinBox(); _maxX = new QSpinBox(); _maxY = new QSpinBox(); + populateConditionSelection(_conditions); + _minX->setPrefix("Min X: "); _minY->setPrefix("Min Y: "); _maxX->setPrefix("Max X: "); @@ -67,6 +95,8 @@ MacroConditionCursorEdit::MacroConditionCursorEdit( _maxX->setMaximum(1000000); _maxY->setMaximum(1000000); + QWidget::connect(_conditions, SIGNAL(currentIndexChanged(int)), this, + SLOT(ConditionChanged(int))); QWidget::connect(_minX, SIGNAL(valueChanged(int)), this, SLOT(MinXChanged(int))); QWidget::connect(_minY, SIGNAL(valueChanged(int)), this, @@ -79,6 +109,7 @@ MacroConditionCursorEdit::MacroConditionCursorEdit( QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { + {"{{conditions}}", _conditions}, {"{{minX}}", _minX}, {"{{minY}}", _minY}, {"{{maxX}}", _maxX}, @@ -93,6 +124,18 @@ MacroConditionCursorEdit::MacroConditionCursorEdit( _loading = false; } +void MacroConditionCursorEdit::ConditionChanged(int index) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_condition = static_cast(index); + SetRegionSelectionVisible(_entryData->_condition == + CursorCondition::REGION); +} + void MacroConditionCursorEdit::MinXChanged(int pos) { if (_loading || !_entryData) { @@ -133,14 +176,27 @@ void MacroConditionCursorEdit::MaxYChanged(int pos) _entryData->_maxY = pos; } +void MacroConditionCursorEdit::SetRegionSelectionVisible(bool visible) +{ + _minX->setVisible(visible); + _minY->setVisible(visible); + _maxX->setVisible(visible); + _maxY->setVisible(visible); + + adjustSize(); +} + void MacroConditionCursorEdit::UpdateEntryData() { if (!_entryData) { return; } + _conditions->setCurrentIndex(static_cast(_entryData->_condition)); _minX->setValue(_entryData->_minX); _minY->setValue(_entryData->_minY); _maxX->setValue(_entryData->_maxX); _maxY->setValue(_entryData->_maxY); + SetRegionSelectionVisible(_entryData->_condition == + CursorCondition::REGION); }