SceneSwitcher/src/macro-core/macro-segment.hpp
WarmUpTill 9ec772f723 Restructure includes
The intention of this change is to reduce the interdependency of the
various components to reduce compile time when applying changes.
2023-04-30 13:13:18 -07:00

128 lines
3.3 KiB
C++

#pragma once
// The following helpers are used by all macro seements,
// so it makes sense to include them here:
#include "log-helper.hpp"
#include "obs-module-helper.hpp"
#include "sync-helper.hpp"
#include <QWidget>
#include <QFrame>
#include <QVBoxLayout>
#include <QTimer>
#include <obs.hpp>
class QLabel;
namespace advss {
class Macro;
class MacroSegment {
public:
MacroSegment(Macro *m, bool supportsVariableValue);
virtual ~MacroSegment() = default;
Macro *GetMacro() const { return _macro; }
void SetIndex(int idx) { _idx = idx; }
int GetIndex() const { return _idx; }
void SetCollapsed(bool collapsed) { _collapsed = collapsed; }
bool GetCollapsed() const { return _collapsed; }
virtual bool Save(obs_data_t *obj) const = 0;
virtual bool Load(obs_data_t *obj) = 0;
virtual bool PostLoad();
virtual std::string GetShortDesc() const;
virtual std::string GetId() const = 0;
void SetHighlight();
bool Highlight();
bool SupportsVariableValue() const { return _supportsVariableValue; }
virtual std::string GetVariableValue() const;
void IncrementVariableRef();
void DecrementVariableRef();
protected:
void SetVariableValue(const std::string &value);
bool IsReferencedInVars() { return _variableRefs != 0; }
private:
// Macro helpers
Macro *_macro = nullptr;
int _idx = 0;
// UI helper
bool _highlight = false;
bool _collapsed = false;
// Variable helpers
const bool _supportsVariableValue = false;
int _variableRefs = 0;
std::string _variableValue;
};
class Section;
class MacroSegmentEdit : public QWidget {
Q_OBJECT
public:
MacroSegmentEdit(bool highlight, QWidget *parent = nullptr);
// Use this function to avoid accidental edits when scrolling through
// list of actions and conditions
void SetFocusPolicyOfWidgets();
void SetCollapsed(bool collapsed);
void SetSelected(bool);
protected slots:
void HeaderInfoChanged(const QString &);
void Collapsed(bool);
void Highlight();
void EnableHighlight(bool);
signals:
void MacroAdded(const QString &name);
void MacroRemoved(const QString &name);
void MacroRenamed(const QString &oldName, const QString &newName);
void SceneGroupAdded(const QString &name);
void SceneGroupRemoved(const QString &name);
void SceneGroupRenamed(const QString &oldName, const QString newName);
protected:
bool eventFilter(QObject *obj, QEvent *ev) override;
Section *_section;
QLabel *_headerInfo;
QWidget *_frame;
QVBoxLayout *_contentLayout;
private:
enum class DropLineState {
NONE,
ABOVE,
BELOW,
};
virtual std::shared_ptr<MacroSegment> Data() = 0;
void ShowDropLine(DropLineState);
// The reason for using two separate frame widget each with their own
// stylesheet and changing their visibility vs. using a single frame
// and changing the stylesheet at runtime is that the operation of
// adjusting the stylesheet is very expensive and can take multiple
// hundred milliseconds per widget.
// This performance impact would hurt in areas like drag and drop or
// emitting the "SelectionChanged" signal.
QFrame *_noBorderframe;
QFrame *_borderFrame;
// In most cases the line above the widget will be used.
// The lower one will only be used if the segment is the last one in
// the list.
QFrame *_dropLineAbove;
QFrame *_dropLineBelow;
bool _showHighlight;
QTimer _timer;
friend class MacroSegmentList;
};
} // namespace advss