#pragma once #include "export-symbol-helper.hpp" #include "item-selection-helpers.hpp" #include "resizing-text-edit.hpp" #include #include #include #include namespace advss { class VariableSelection; class VariableSettingsDialog; class Variable : public Item { public: Variable(); ~Variable(); static std::shared_ptr Create() { return std::make_shared(); } enum class SaveAction { DONT_SAVE, SAVE, SET_DEFAULT, }; void Load(obs_data_t *obj); void Save(obs_data_t *obj) const; EXPORT std::string Value(bool updateLastUsed = true) const; EXPORT std::optional DoubleValue() const; EXPORT std::optional IntValue() const; std::string GetPreviousValue() const { return _previousValue; }; std::string GetDefaultValue() const { return _defaultValue; } void SetValue(const std::string &value); void SetValue(double value); SaveAction GetSaveAction() const { return _saveAction; } int GetValueChangeCount() const { return _valueChangeCount; } std::optional GetSecondsSinceLastUse() const; std::optional GetSecondsSinceLastChange() const; void UpdateLastUsed() const; void UpdateLastChanged(); private: SaveAction _saveAction = SaveAction::DONT_SAVE; std::string _value = ""; std::string _previousValue = ""; std::string _defaultValue = ""; int _valueChangeCount = 0; mutable std::chrono::high_resolution_clock::time_point _lastUsed; mutable std::chrono::high_resolution_clock::time_point _lastChanged; friend VariableSelection; friend VariableSettingsDialog; }; class ADVSS_EXPORT VariableSettingsDialog : public ItemSettingsDialog { Q_OBJECT public: VariableSettingsDialog(QWidget *parent, const Variable &); static bool AskForSettings(QWidget *parent, Variable &settings); private slots: void SaveActionChanged(int); private: ResizingPlainTextEdit *_value; ResizingPlainTextEdit *_defaultValue; QComboBox *_save; }; class ADVSS_EXPORT VariableSelection : public ItemSelection { Q_OBJECT public: VariableSelection(QWidget *parent = 0); void SetVariable(const std::string &); void SetVariable(const std::weak_ptr &); }; class ADVSS_EXPORT VariableSignalManager : public QObject { Q_OBJECT public: VariableSignalManager(QObject *parent = nullptr); static VariableSignalManager *Instance(); signals: void Rename(const QString &, const QString &); void Add(const QString &); void Remove(const QString &); }; std::deque> &GetVariables(); EXPORT Variable *GetVariableByName(const std::string &name); EXPORT Variable *GetVariableByQString(const QString &name); EXPORT std::weak_ptr GetWeakVariableByName(const std::string &name); EXPORT std::weak_ptr GetWeakVariableByQString(const QString &name); std::string GetWeakVariableName(std::weak_ptr); EXPORT QStringList GetVariablesNameList(); void SaveVariables(obs_data_t *obj); void LoadVariables(obs_data_t *obj); void ImportVariables(obs_data_t *obj); std::chrono::high_resolution_clock::time_point GetLastVariableChangeTime(); } // namespace advss