properties-view.hpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #pragma once
  2. #include "vertical-scroll-area.hpp"
  3. #include <obs.hpp>
  4. #include <vector>
  5. #include <memory>
  6. class QFormLayout;
  7. class OBSPropertiesView;
  8. class QLabel;
  9. typedef obs_properties_t *(*PropertiesReloadCallback)(void *obj);
  10. typedef void (*PropertiesUpdateCallback)(void *obj, obs_data_t *settings);
  11. /* ------------------------------------------------------------------------- */
  12. class WidgetInfo : public QObject {
  13. Q_OBJECT
  14. friend class OBSPropertiesView;
  15. private:
  16. OBSPropertiesView *view;
  17. obs_property_t *property;
  18. QWidget *widget;
  19. void BoolChanged(const char *setting);
  20. void IntChanged(const char *setting);
  21. void FloatChanged(const char *setting);
  22. void TextChanged(const char *setting);
  23. bool PathChanged(const char *setting);
  24. void ListChanged(const char *setting);
  25. bool ColorChangedInternal(const char *setting, bool supportAlpha);
  26. bool ColorChanged(const char *setting);
  27. bool ColorAlphaChanged(const char *setting);
  28. bool FontChanged(const char *setting);
  29. void GroupChanged(const char *setting);
  30. void EditableListChanged();
  31. void ButtonClicked();
  32. void TogglePasswordText(bool checked);
  33. public:
  34. inline WidgetInfo(OBSPropertiesView *view_, obs_property_t *prop,
  35. QWidget *widget_)
  36. : view(view_), property(prop), widget(widget_)
  37. {
  38. }
  39. public slots:
  40. void ControlChanged();
  41. /* editable list */
  42. void EditListAdd();
  43. void EditListAddText();
  44. void EditListAddFiles();
  45. void EditListAddDir();
  46. void EditListRemove();
  47. void EditListEdit();
  48. void EditListUp();
  49. void EditListDown();
  50. void EditListReordered(const QModelIndex &parent, int start, int end,
  51. const QModelIndex &destination, int row);
  52. };
  53. /* ------------------------------------------------------------------------- */
  54. class OBSPropertiesView : public VScrollArea {
  55. Q_OBJECT
  56. friend class WidgetInfo;
  57. using properties_delete_t = decltype(&obs_properties_destroy);
  58. using properties_t =
  59. std::unique_ptr<obs_properties_t, properties_delete_t>;
  60. private:
  61. QWidget *widget = nullptr;
  62. properties_t properties;
  63. OBSData settings;
  64. void *obj = nullptr;
  65. std::string type;
  66. PropertiesReloadCallback reloadCallback;
  67. PropertiesUpdateCallback callback = nullptr;
  68. int minSize;
  69. std::vector<std::unique_ptr<WidgetInfo>> children;
  70. std::string lastFocused;
  71. QWidget *lastWidget = nullptr;
  72. bool deferUpdate;
  73. QWidget *NewWidget(obs_property_t *prop, QWidget *widget,
  74. const char *signal);
  75. QWidget *AddCheckbox(obs_property_t *prop);
  76. QWidget *AddText(obs_property_t *prop, QFormLayout *layout,
  77. QLabel *&label);
  78. void AddPath(obs_property_t *prop, QFormLayout *layout, QLabel **label);
  79. void AddInt(obs_property_t *prop, QFormLayout *layout, QLabel **label);
  80. void AddFloat(obs_property_t *prop, QFormLayout *layout,
  81. QLabel **label);
  82. QWidget *AddList(obs_property_t *prop, bool &warning);
  83. void AddEditableList(obs_property_t *prop, QFormLayout *layout,
  84. QLabel *&label);
  85. QWidget *AddButton(obs_property_t *prop);
  86. void AddColorInternal(obs_property_t *prop, QFormLayout *layout,
  87. QLabel *&label, bool supportAlpha);
  88. void AddColor(obs_property_t *prop, QFormLayout *layout,
  89. QLabel *&label);
  90. void AddColorAlpha(obs_property_t *prop, QFormLayout *layout,
  91. QLabel *&label);
  92. void AddFont(obs_property_t *prop, QFormLayout *layout, QLabel *&label);
  93. void AddFrameRate(obs_property_t *prop, bool &warning,
  94. QFormLayout *layout, QLabel *&label);
  95. void AddGroup(obs_property_t *prop, QFormLayout *layout);
  96. void AddProperty(obs_property_t *property, QFormLayout *layout);
  97. void resizeEvent(QResizeEvent *event) override;
  98. void GetScrollPos(int &h, int &v);
  99. void SetScrollPos(int h, int v);
  100. public slots:
  101. void ReloadProperties();
  102. void RefreshProperties();
  103. void SignalChanged();
  104. signals:
  105. void PropertiesResized();
  106. void Changed();
  107. void PropertiesRefreshed();
  108. public:
  109. OBSPropertiesView(OBSData settings, void *obj,
  110. PropertiesReloadCallback reloadCallback,
  111. PropertiesUpdateCallback callback, int minSize = 0);
  112. OBSPropertiesView(OBSData settings, const char *type,
  113. PropertiesReloadCallback reloadCallback,
  114. int minSize = 0);
  115. inline obs_data_t *GetSettings() const { return settings; }
  116. inline void UpdateSettings() { callback(obj, settings); }
  117. inline bool DeferUpdate() const { return deferUpdate; }
  118. };