123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- #pragma once
- #include <QList>
- #include <QVector>
- #include <QPointer>
- #include <QListView>
- #include <QCheckBox>
- #include <QStaticText>
- #include <QSvgRenderer>
- #include <QAbstractListModel>
- #include <QStyledItemDelegate>
- #include <obs.hpp>
- #include <obs-frontend-api.h>
- class QLabel;
- class OBSSourceLabel;
- class QCheckBox;
- class QLineEdit;
- class SourceTree;
- class QSpacerItem;
- class QHBoxLayout;
- class VisibilityItemWidget;
- class SourceTreeItem : public QFrame {
- Q_OBJECT
- friend class SourceTree;
- friend class SourceTreeModel;
- void mouseDoubleClickEvent(QMouseEvent *event) override;
- void enterEvent(QEnterEvent *event) override;
- void leaveEvent(QEvent *event) override;
- virtual bool eventFilter(QObject *object, QEvent *event) override;
- void Update(bool force);
- enum class Type {
- Unknown,
- Item,
- Group,
- SubItem,
- };
- void DisconnectSignals();
- void ReconnectSignals();
- Type type = Type::Unknown;
- public:
- explicit SourceTreeItem(SourceTree *tree, OBSSceneItem sceneitem);
- bool IsEditing();
- private:
- QSpacerItem *spacer = nullptr;
- QCheckBox *expand = nullptr;
- QLabel *iconLabel = nullptr;
- QCheckBox *vis = nullptr;
- QCheckBox *lock = nullptr;
- QHBoxLayout *boxLayout = nullptr;
- OBSSourceLabel *label = nullptr;
- QLineEdit *editor = nullptr;
- std::string newName;
- SourceTree *tree;
- OBSSceneItem sceneitem;
- std::vector<OBSSignal> sigs;
- virtual void paintEvent(QPaintEvent *event) override;
- void ExitEditModeInternal(bool save);
- private slots:
- void Clear();
- void EnterEditMode();
- void ExitEditMode(bool save);
- void VisibilityChanged(bool visible);
- void LockedChanged(bool locked);
- void ExpandClicked(bool checked);
- void Select();
- void Deselect();
- };
- class SourceTreeModel : public QAbstractListModel {
- Q_OBJECT
- friend class SourceTree;
- friend class SourceTreeItem;
- SourceTree *st;
- QVector<OBSSceneItem> items;
- bool hasGroups = false;
- static void OBSFrontendEvent(enum obs_frontend_event event, void *ptr);
- void Clear();
- void SceneChanged();
- void ReorderItems();
- void Add(obs_sceneitem_t *item);
- void Remove(obs_sceneitem_t *item);
- OBSSceneItem Get(int idx);
- QString GetNewGroupName();
- void AddGroup();
- void GroupSelectedItems(QModelIndexList &indices);
- void UngroupSelectedGroups(QModelIndexList &indices);
- void ExpandGroup(obs_sceneitem_t *item);
- void CollapseGroup(obs_sceneitem_t *item);
- void UpdateGroupState(bool update);
- public:
- explicit SourceTreeModel(SourceTree *st);
- virtual int rowCount(const QModelIndex &parent) const override;
- virtual QVariant data(const QModelIndex &index, int role) const override;
- virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
- virtual Qt::DropActions supportedDropActions() const override;
- };
- class SourceTree : public QListView {
- Q_OBJECT
- bool ignoreReorder = false;
- friend class SourceTreeModel;
- friend class SourceTreeItem;
- bool textPrepared = false;
- QStaticText textNoSources;
- QSvgRenderer iconNoSources;
- OBSData undoSceneData;
- bool iconsVisible = true;
- void UpdateNoSourcesMessage();
- void ResetWidgets();
- void UpdateWidget(const QModelIndex &idx, obs_sceneitem_t *item);
- void UpdateWidgets(bool force = false);
- inline SourceTreeModel *GetStm() const { return reinterpret_cast<SourceTreeModel *>(model()); }
- public:
- inline SourceTreeItem *GetItemWidget(int idx)
- {
- QWidget *widget = indexWidget(GetStm()->createIndex(idx, 0));
- return reinterpret_cast<SourceTreeItem *>(widget);
- }
- explicit SourceTree(QWidget *parent = nullptr);
- inline bool IgnoreReorder() const { return ignoreReorder; }
- inline void Clear() { GetStm()->Clear(); }
- inline void Add(obs_sceneitem_t *item) { GetStm()->Add(item); }
- inline OBSSceneItem Get(int idx) { return GetStm()->Get(idx); }
- inline QString GetNewGroupName() { return GetStm()->GetNewGroupName(); }
- void SelectItem(obs_sceneitem_t *sceneitem, bool select);
- bool MultipleBaseSelected() const;
- bool GroupsSelected() const;
- bool GroupedItemsSelected() const;
- void UpdateIcons();
- void SetIconsVisible(bool visible);
- public slots:
- inline void ReorderItems() { GetStm()->ReorderItems(); }
- inline void RefreshItems() { GetStm()->SceneChanged(); }
- void Remove(OBSSceneItem item, OBSScene scene);
- void GroupSelectedItems();
- void UngroupSelectedGroups();
- void AddGroup();
- bool Edit(int idx);
- void NewGroupEdit(int idx);
- protected:
- virtual void mouseDoubleClickEvent(QMouseEvent *event) override;
- virtual void dropEvent(QDropEvent *event) override;
- virtual void paintEvent(QPaintEvent *event) override;
- virtual void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override;
- };
- class SourceTreeDelegate : public QStyledItemDelegate {
- Q_OBJECT
- public:
- SourceTreeDelegate(QObject *parent);
- virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
- };
|