#pragma once #include "macro-action.hpp" #include "macro-condition.hpp" #include "macro-ref.hpp" #include #include #include #include #include #include #include #include #include namespace advss { constexpr auto macro_func = 10; class MacroDock; class Macro { public: Macro(const std::string &name = "", const bool addHotkey = false); virtual ~Macro(); bool CeckMatch(); bool PerformActions(bool forceParallel = false, bool ignorePause = false); bool Matched() { return _matched; } int64_t MsSinceLastCheck(); std::string Name() { return _name; } void SetName(const std::string &name); void SetRunInParallel(bool parallel) { _runInParallel = parallel; } bool RunInParallel() { return _runInParallel; } void SetPaused(bool pause = true); bool Paused() { return _paused; } void SetMatchOnChange(bool onChange) { _matchOnChange = onChange; } bool MatchOnChange() { return _matchOnChange; } int RunCount() { return _runCount; }; void ResetRunCount() { _runCount = 0; }; void AddHelperThread(std::thread &&); bool GetStop() { return _stop; } void Stop(); std::deque> &Conditions() { return _conditions; } std::deque> &Actions() { return _actions; } void UpdateActionIndices(); void UpdateConditionIndices(); // Group controls static std::shared_ptr CreateGroup(const std::string &name, std::vector> &children); static void RemoveGroup(std::shared_ptr); static void PrepareMoveToGroup(Macro *group, std::shared_ptr item); static void PrepareMoveToGroup(std::shared_ptr group, std::shared_ptr item); bool IsGroup() { return _isGroup; } uint32_t GroupSize() { return _groupSize; } bool IsSubitem() { return !_parent.expired(); } void SetCollapsed(bool val) { _isCollapsed = val; } bool IsCollapsed() { return _isCollapsed; } void SetParent(std::shared_ptr m) { _parent = m; } Macro *Parent(); bool Save(obs_data_t *obj) const; bool Load(obs_data_t *obj); // Some macros can refer to other macros, which are not yet loaded. // Use this function to set these references after loading is complete. bool PostLoad(); // Helper function for plugin state condition regarding scene change bool SwitchesScene(); // UI helpers for the macro tab bool WasExecutedRecently(); bool OnChangePreventedActionsRecently(); void ResetUIHelpers(); void EnablePauseHotkeys(bool); bool PauseHotkeysEnabled(); void EnableDock(bool); bool DockEnabled() { return _registerDock; } void SetDockHasRunButton(bool value); bool DockHasRunButton() { return _dockHasRunButton; } void SetDockHasPauseButton(bool value); bool DockHasPauseButton() { return _dockHasPauseButton; } void ResetTimers(); private: void SetupHotkeys(); void ClearHotkeys(); void SetHotkeysDesc(); void RunActions(bool &ret, bool ignorePause); void RunActions(bool ignorePause); void SetOnChangeHighlight(); bool DockIsVisible() const; void SetDockWidgetName() const; void SaveDockSettings(obs_data_t *obj) const; void LoadDockSettings(obs_data_t *obj); void RemoveDock(); std::string _name = ""; std::deque> _conditions; std::deque> _actions; std::weak_ptr _parent; uint32_t _groupSize = 0; bool _runInParallel = false; bool _matched = false; bool _lastMatched = false; bool _matchOnChange = false; bool _paused = false; int _runCount = 0; bool _registerHotkeys = true; obs_hotkey_id _pauseHotkey = OBS_INVALID_HOTKEY_ID; obs_hotkey_id _unpauseHotkey = OBS_INVALID_HOTKEY_ID; obs_hotkey_id _togglePauseHotkey = OBS_INVALID_HOTKEY_ID; // UI helpers for the macro tab bool _isGroup = false; bool _isCollapsed = false; bool _wasExecutedRecently = false; bool _onChangeTriggered = false; bool _registerDock = false; bool _dockHasRunButton = true; bool _dockHasPauseButton = true; bool _dockIsFloating = true; bool _dockIsVisible = false; Qt::DockWidgetArea _dockArea; QByteArray _dockGeo; MacroDock *_dock = nullptr; QAction *_dockAction = nullptr; std::chrono::high_resolution_clock::time_point _lastCheckTime{}; bool _die = false; bool _stop = false; bool _done = true; std::thread _backgroundThread; std::vector _helperThreads; }; Macro *GetMacroByName(const char *name); Macro *GetMacroByQString(const QString &name); std::weak_ptr GetWeakMacroByName(const char *name); } // namespace advss