BsEditorWidgetManager.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #pragma once
  2. #include "BsEditorPrerequisites.h"
  3. #include "BsModule.h"
  4. namespace BansheeEngine
  5. {
  6. /**
  7. * @brief Handles opening and closing of EditorWidgets. Its primary purpose
  8. * is to keep track of all types of widgets so they can be saved and restored
  9. * upon program shutdown/startup, as well as being able to change widget layout on
  10. * the fly.
  11. */
  12. class BS_ED_EXPORT EditorWidgetManager : public Module<EditorWidgetManager>
  13. {
  14. public:
  15. EditorWidgetManager();
  16. ~EditorWidgetManager();
  17. /**
  18. * @brief Called every frame.
  19. */
  20. void update();
  21. /**
  22. * @brief Registers a widget that can then be opened by calling "open". When loading
  23. * a widget layout this name and callback will be used to attempt creating the widget.
  24. *
  25. * @param name Unique name for the widget.
  26. * @param createCallback Callback that returns a new instance of the widget.
  27. */
  28. void registerWidget(const String& name, std::function<EditorWidgetBase*(EditorWidgetContainer&)> createCallback);
  29. /**
  30. * @brief Unregisters a widget so it may no longer be opened using this manager.
  31. */
  32. void unregisterWidget(const String& name);
  33. /**
  34. * @brief Creates a widget with the given name. If widget is already created it returns the existing instance.
  35. * Widget is opened in a new window.
  36. *
  37. * @param name The name of the widget.
  38. *
  39. * @return Always returns the created widget, and throws an exception if it fails.
  40. */
  41. EditorWidgetBase* open(const String& name);
  42. /**
  43. * @brief Creates a new widget an inserts it into the specified container.
  44. */
  45. EditorWidgetBase* create(const String& name, EditorWidgetContainer& parentContainer);
  46. /**
  47. * @brief Checks if the provided name represents a widget that can be created.
  48. */
  49. bool isValidWidget(const String& name) const;
  50. /**
  51. * @brief Closes the given widget.
  52. */
  53. void close(EditorWidgetBase* widget);
  54. /**
  55. * @brief Closes all open editor widgets.
  56. */
  57. void closeAll();
  58. /**
  59. * @brief Retrieves the layout of all currently active widgets. You may later
  60. * use this layout to restore exact position of the widgets.
  61. */
  62. EditorWidgetLayoutPtr getLayout() const;
  63. /**
  64. * @brief Positions all widgets according to the provided layout. It will open
  65. * new widgets or close current ones if needed.
  66. */
  67. void setLayout(const EditorWidgetLayoutPtr& layout);
  68. /**
  69. * @brief Allows you to queue up widgets that will be registered as soon as an instance of EditorWidgetManager is
  70. * created.
  71. *
  72. * @note Useful primarily when widgets are being registered from static methods, because then there is no
  73. * EditorWidgetManager instance yet.
  74. */
  75. static void preRegisterWidget(const String& name, std::function<EditorWidgetBase*(EditorWidgetContainer&)> createCallback);
  76. private:
  77. /**
  78. * @brief Triggered whenever a window gains focus.
  79. */
  80. void onFocusGained(const RenderWindow& window);
  81. /**
  82. * @brief Triggered whenever a window loses focus.
  83. */
  84. void onFocusLost(const RenderWindow& window);
  85. Map<String, EditorWidgetBase*> mActiveWidgets;
  86. Map<String, std::function<EditorWidgetBase*(EditorWidgetContainer&)>> mCreateCallbacks;
  87. HEvent mOnFocusLostConn;
  88. HEvent mOnFocusGainedConn;
  89. static Stack<std::pair<String, std::function<EditorWidgetBase*(EditorWidgetContainer&)>>> QueuedCreateCallbacks;
  90. };
  91. }