#include "macro-condition-cursor.hpp" #include "cursor-helpers.hpp" #include "layout-helpers.hpp" #include "utility.hpp" #include #include namespace advss { const std::string MacroConditionCursor::id = "cursor"; bool MacroConditionCursor::_registered = MacroConditionFactory::Register( MacroConditionCursor::id, {MacroConditionCursor::Create, MacroConditionCursorEdit::Create, "AdvSceneSwitcher.condition.cursor"}); const static std::map cursorConditionTypes = { {MacroConditionCursor::Condition::REGION, "AdvSceneSwitcher.condition.cursor.type.region"}, {MacroConditionCursor::Condition::MOVING, "AdvSceneSwitcher.condition.cursor.type.moving"}, #ifdef _WIN32 // Not implemented for MacOS and Linux {MacroConditionCursor::Condition::CLICK, "AdvSceneSwitcher.condition.cursor.type.click"}, #endif }; const static std::map buttonTypes = { {MacroConditionCursor::Button::LEFT, "AdvSceneSwitcher.condition.cursor.button.left"}, {MacroConditionCursor::Button::MIDDLE, "AdvSceneSwitcher.condition.cursor.button.middle"}, {MacroConditionCursor::Button::RIGHT, "AdvSceneSwitcher.condition.cursor.button.right"}, }; bool MacroConditionCursor::CheckClick() { switch (_button) { case MacroConditionCursor::Button::LEFT: return _lastCheckTime < GetLastMouseLeftClickTime(); case MacroConditionCursor::Button::MIDDLE: return _lastCheckTime < GetLastMouseMiddleClickTime(); case MacroConditionCursor::Button::RIGHT: return _lastCheckTime < GetLastMouseRightClickTime(); } return false; } bool MacroConditionCursor::CheckCondition() { bool ret = false; const auto &[x, y] = GetCursorPos(); SetTempVarValue("x", std::to_string(x)); SetTempVarValue("y", std::to_string(y)); switch (_condition) { case Condition::REGION: ret = x >= _minX && y >= _minY && x <= _maxX && y <= _maxY; SetVariableValue(std::to_string(x) + " " + std::to_string(y)); break; case Condition::MOVING: ret = x != _lastX || y != _lastY; break; case Condition::CLICK: ret = CheckClick(); break; } _lastCheckTime = std::chrono::high_resolution_clock::now(); _lastX = x; _lastY = y; if (GetVariableValue().empty()) { SetVariableValue(ret ? "true" : "false"); } return ret; } bool MacroConditionCursor::Save(obs_data_t *obj) const { MacroCondition::Save(obj); obs_data_set_int(obj, "condition", static_cast(_condition)); obs_data_set_int(obj, "button", static_cast(_button)); _minX.Save(obj, "minX"); _minY.Save(obj, "minY"); _maxX.Save(obj, "maxX"); _maxY.Save(obj, "maxY"); obs_data_set_int(obj, "version", 1); return true; } bool MacroConditionCursor::Load(obs_data_t *obj) { MacroCondition::Load(obj); _condition = static_cast(obs_data_get_int(obj, "condition")); _button = static_cast