#pragma once #include "opencv-helpers.hpp" #include "area-selection.hpp" #include "parameter-wrappers.hpp" #include "preview-dialog.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace advss { class PreviewDialog; class MacroConditionVideo : public QObject, public MacroCondition { Q_OBJECT public: MacroConditionVideo(Macro *m); bool CheckCondition(); bool Save(obs_data_t *obj) const; bool Load(obs_data_t *obj); std::string GetShortDesc() const; std::string GetId() const { return id; }; static std::shared_ptr Create(Macro *m) { return std::make_shared(m); } QImage GetMatchImage() const { return _matchImage; }; void GetScreenshot(bool blocking = false); bool LoadImageFromFile(); void ResetLastMatch() { _lastMatchResult = false; } double GetCurrentBrightness() const { return _currentBrightness; } void SetPageSegMode(tesseract::PageSegMode); bool SetLanguageCode(const std::string &); bool SetTesseractBaseDir(const std::string &); void SetCondition(VideoCondition); VideoCondition GetCondition() const { return _condition; } void SetupTempVars(); VideoInput _video; std::string _file = obs_module_text("AdvSceneSwitcher.enterPath"); // Enabling this will reduce matching latency, but slow down the // the condition checks of all macros overall. // // If not set the screenshot will be gathered in one interval and // checked in the next one. // If set both operations will happen in the same interval. // // TODO: Remove this option in a future release as it has become // superfluous with "short circuit" evaluation. bool _blockUntilScreenshotDone = true; NumberVariable _brightnessThreshold = 0.5; PatternMatchParameters _patternMatchParameters; ObjDetectParameters _objMatchParameters; OCRParameters _ocrParameters; ColorParameters _colorParameters; AreaParameters _areaParameters; // TODO: Remove this option in a future release as it has become // superfluous with "short circuit" evaluation. bool _throttleEnabled = false; int _throttleCount = 3; signals: void InputFileChanged(); private: bool FileInputIsUpToDate() const; bool OutputChanged(); bool ScreenshotContainsPattern(); bool ScreenshotContainsObject(); bool CheckBrightnessThreshold(); bool CheckOCR(); bool CheckColor(); bool Compare(); bool CheckShouldBeSkipped(); VideoCondition _condition = VideoCondition::MATCH; bool _getNextScreenshot = true; Screenshot _screenshotData; QImage _matchImage; PatternImageData _patternImageData; bool _lastMatchResult = false; int _runCount = 0; double _currentBrightness = 0.; std::string _loadedFile; QDateTime _loadedFileLastModified; static bool _registered; static const std::string id; }; class BrightnessEdit : public QWidget { Q_OBJECT public: BrightnessEdit(QWidget *parent, const std::shared_ptr &); private slots: void BrightnessThresholdChanged(const NumberVariable &); void UpdateCurrentBrightness(); private: SliderSpinBox *_threshold; QLabel *_current; QTimer _timer; std::shared_ptr _entryData; bool _loading = true; }; class OCREdit : public QWidget { Q_OBJECT public: OCREdit(QWidget *parent, PreviewDialog *, const std::shared_ptr &); private slots: void SelectColorClicked(); void ColorThresholdChanged(const NumberVariable &); void MatchTextChanged(); void RegexChanged(const RegexConfig &conf); void PageSegModeChanged(int); void TesseractBaseDirChanged(const QString &); void LanguageChanged(); void UseConfigChanged(int); void ConfigFileChanged(const QString &); private: void SetupColorLabel(const QColor &); VariableTextEdit *_matchText; RegexConfigWidget *_regex; QLabel *_textColor; QPushButton *_selectColor; SliderSpinBox *_colorThreshold; QComboBox *_pageSegMode; FileSelection *_tesseractBaseDir; VariableLineEdit *_languageCode; QCheckBox *_useConfig; FileSelection *_configFile; QPushButton *_openConfigFile; QPushButton *_reloadConfig; QHBoxLayout *_configLayout; PreviewDialog *_previewDialog; std::shared_ptr _entryData; bool _loading = true; }; class ObjectDetectEdit : public QWidget { Q_OBJECT public: ObjectDetectEdit(QWidget *parent, PreviewDialog *, const std::shared_ptr &); private slots: void ModelPathChanged(const QString &text); void ObjectScaleThresholdChanged(const NumberVariable &); void MinNeighborsChanged(int value); void MinSizeChanged(Size value); void MaxSizeChanged(Size value); private: FileSelection *_modelDataPath; SliderSpinBox *_objectScaleThreshold; QSpinBox *_minNeighbors; QLabel *_minNeighborsDescription; SizeSelection *_minSize; SizeSelection *_maxSize; PreviewDialog *_previewDialog; std::shared_ptr _entryData; bool _loading = true; }; class ColorEdit : public QWidget { Q_OBJECT public: ColorEdit(QWidget *parent, const std::shared_ptr &); private slots: void SelectColorClicked(); void MatchThresholdChanged(const NumberVariable &); void ColorThresholdChanged(const NumberVariable &); private: void SetupColorLabel(const QColor &); SliderSpinBox *_matchThreshold; SliderSpinBox *_colorThreshold; QLabel *_color; QPushButton *_selectColor; std::shared_ptr _entryData; bool _loading = true; }; class AreaEdit : public QWidget { Q_OBJECT public: AreaEdit(QWidget *parent, PreviewDialog *, const std::shared_ptr &); private slots: void CheckAreaEnableChanged(int value); void CheckAreaChanged(Area); void CheckAreaChanged(QRect area); void SelectAreaClicked(); signals: void Resized(); private: void SetWidgetVisibility(); QCheckBox *_checkAreaEnable; AreaSelection *_checkArea; QPushButton *_selectArea; PreviewDialog *_previewDialog; std::shared_ptr _entryData; bool _loading = true; }; class MacroConditionVideoEdit : public QWidget { Q_OBJECT public: MacroConditionVideoEdit( QWidget *parent, std::shared_ptr cond = nullptr); void UpdateEntryData(); static QWidget *Create(QWidget *parent, std::shared_ptr cond) { return new MacroConditionVideoEdit( parent, std::dynamic_pointer_cast(cond)); } private slots: void VideoInputTypeChanged(int); void SourceChanged(const SourceSelection &); void SceneChanged(const SceneSelection &); void ConditionChanged(int cond); void ReduceLatencyChanged(int value); void ImagePathChanged(const QString &text); void ImageBrowseButtonClicked(); void UsePatternForChangedCheckChanged(int value); void PatternThresholdChanged(const NumberVariable &); void UseAlphaAsMaskChanged(int value); void PatternMatchModeChanged(int value); void ThrottleEnableChanged(int value); void ThrottleCountChanged(int value); void ShowMatchClicked(); void SetWidgetVisibility(); void Resize(); signals: void VideoSelectionChanged(const VideoInput &); void HeaderInfoChanged(const QString &); private: void UpdatePreviewTooltip(); void HandleVideoInputUpdate(); void SetupPreviewDialogParams(); QComboBox *_videoInputTypes; SceneSelectionWidget *_scenes; SourceSelectionWidget *_sources; QComboBox *_condition; QCheckBox *_reduceLatency; QCheckBox *_usePatternForChangedCheck; FileSelection *_imagePath; SliderSpinBox *_patternThreshold; QCheckBox *_useAlphaAsMask; QHBoxLayout *_patternMatchModeLayout; QComboBox *_patternMatchMode; QPushButton *_showMatch; PreviewDialog _previewDialog; BrightnessEdit *_brightness; OCREdit *_ocr; ObjectDetectEdit *_objectDetect; ColorEdit *_color; AreaEdit *_area; QHBoxLayout *_throttleControlLayout; QCheckBox *_throttleEnable; QSpinBox *_throttleCount; std::shared_ptr _entryData; bool _loading = true; }; } // namespace advss