properties-view.hpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #pragma once
  2. #include <QScrollArea>
  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,
  11. obs_data_t *settings);
  12. /* ------------------------------------------------------------------------- */
  13. class WidgetInfo : public QObject {
  14. Q_OBJECT
  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 ColorChanged(const char *setting);
  26. bool FontChanged(const char *setting);
  27. void ButtonClicked();
  28. public:
  29. inline WidgetInfo(OBSPropertiesView *view_, obs_property_t *prop,
  30. QWidget *widget_)
  31. : view(view_), property(prop), widget(widget_)
  32. {}
  33. public slots:
  34. void ControlChanged();
  35. };
  36. /* ------------------------------------------------------------------------- */
  37. class OBSPropertiesView : public QScrollArea {
  38. Q_OBJECT
  39. friend class WidgetInfo;
  40. using properties_delete_t = decltype(&obs_properties_destroy);
  41. using properties_t =
  42. std::unique_ptr<obs_properties_t, properties_delete_t>;
  43. private:
  44. QWidget *widget;
  45. properties_t properties;
  46. OBSData settings;
  47. void *obj;
  48. PropertiesReloadCallback reloadCallback;
  49. PropertiesUpdateCallback callback;
  50. int minSize;
  51. std::vector<std::unique_ptr<WidgetInfo>> children;
  52. std::string lastFocused;
  53. QWidget *lastWidget;
  54. QWidget *NewWidget(obs_property_t *prop, QWidget *widget,
  55. const char *signal);
  56. QWidget *AddCheckbox(obs_property_t *prop);
  57. QWidget *AddText(obs_property_t *prop);
  58. void AddPath(obs_property_t *prop, QFormLayout *layout, QLabel **label);
  59. QWidget *AddInt(obs_property_t *prop);
  60. QWidget *AddFloat(obs_property_t *prop);
  61. QWidget *AddList(obs_property_t *prop, bool &warning);
  62. QWidget *AddButton(obs_property_t *prop);
  63. void AddColor(obs_property_t *prop, QFormLayout *layout, QLabel *&label);
  64. void AddFont(obs_property_t *prop, QFormLayout *layout, QLabel *&label);
  65. void AddProperty(obs_property_t *property, QFormLayout *layout);
  66. void resizeEvent(QResizeEvent *event) override;
  67. public slots:
  68. void ReloadProperties();
  69. void RefreshProperties();
  70. signals:
  71. void PropertiesResized();
  72. public:
  73. OBSPropertiesView(OBSData settings, void *obj,
  74. PropertiesReloadCallback reloadCallback,
  75. PropertiesUpdateCallback callback,
  76. int minSize = 0);
  77. };