BsEditorWidget.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #pragma once
  2. #include "BsEditorPrerequisites.h"
  3. #include "BsEditorWidgetManager.h"
  4. #include "BsEvent.h"
  5. #include "BsRect2I.h"
  6. namespace BansheeEngine
  7. {
  8. class BS_ED_EXPORT EditorWidgetBase
  9. {
  10. public:
  11. const String& getName() const { return mName; }
  12. const HString& getDisplayName() const { return mDisplayName; }
  13. INT32 getX() const { return mX; }
  14. INT32 getY() const { return mY; }
  15. UINT32 getWidth() const { return mWidth; }
  16. UINT32 getHeight() const { return mHeight; }
  17. Rect2I getBounds() const { return Rect2I(mX, mY, mWidth, mHeight); }
  18. bool hasFocus() const { return mHasFocus; }
  19. EditorWindowBase* getParentWindow() const;
  20. void _setSize(UINT32 width, UINT32 height);
  21. void _setPosition(INT32 x, INT32 y);
  22. void _changeParent(EditorWidgetContainer* parent);
  23. void _setHasFocus(bool focus);
  24. EditorWidgetContainer* _getParent() const { return mParent; }
  25. Vector2I screenToWidgetPos(const Vector2I& screenPos) const;
  26. Vector2I widgetToScreenPos(const Vector2I& widgetPos) const;
  27. void _disable();
  28. void _enable();
  29. void close();
  30. virtual void update() { }
  31. Event<void(UINT32, UINT32)> onResized;
  32. Event<void(INT32, INT32)> onMoved;
  33. Event<void(EditorWidgetContainer*)> onParentChanged;
  34. Event<void(bool)> onFocusChanged;
  35. protected:
  36. friend class EditorWidgetManager;
  37. EditorWidgetBase(const HString& displayName, const String& name, EditorWidgetContainer& parentContainer);
  38. virtual ~EditorWidgetBase();
  39. virtual void doOnMoved(INT32 x, INT32 y);
  40. virtual void doOnResized(UINT32 width, UINT32 height);
  41. virtual void doOnParentChanged();
  42. String mName;
  43. HString mDisplayName;
  44. EditorWidgetContainer* mParent;
  45. INT32 mX, mY;
  46. UINT32 mWidth, mHeight;
  47. GUIPanel* mContent;
  48. bool mHasFocus;
  49. GUIWidget& getParentWidget() const;
  50. static void destroy(EditorWidgetBase* widget);
  51. };
  52. template<typename Type>
  53. struct RegisterWidgetOnStart
  54. {
  55. public:
  56. RegisterWidgetOnStart()
  57. {
  58. EditorWidgetManager::preRegisterWidget(Type::getTypeName(), &create);
  59. }
  60. static EditorWidgetBase* create(EditorWidgetContainer& parentContainer)
  61. {
  62. return bs_new<Type>(EditorWidget<Type>::ConstructPrivately(), parentContainer);
  63. }
  64. void makeSureIAmInstantiated() { }
  65. };
  66. template <class Type>
  67. class EditorWidget : public EditorWidgetBase
  68. {
  69. static RegisterWidgetOnStart<Type> RegisterOnStart;
  70. protected:
  71. friend struct RegisterWidgetOnStart<Type>;
  72. struct ConstructPrivately {};
  73. EditorWidget(const HString& displayName, EditorWidgetContainer& parentContainer)
  74. :EditorWidgetBase(displayName, Type::getTypeName(), parentContainer)
  75. {
  76. RegisterOnStart.makeSureIAmInstantiated();
  77. }
  78. public:
  79. virtual ~EditorWidget() { }
  80. };
  81. template <typename Type>
  82. RegisterWidgetOnStart<Type> EditorWidget<Type>::RegisterOnStart;
  83. }