|
|
@@ -6,14 +6,18 @@
|
|
|
|
|
|
namespace BansheeEngine
|
|
|
{
|
|
|
- enum class DockLocation
|
|
|
- {
|
|
|
- Left, Right, Top, Bottom, Center
|
|
|
- };
|
|
|
-
|
|
|
+ /**
|
|
|
+ * @brief GUI element that allows editor widgets to be docked in it using arbitrary
|
|
|
+ * layouts. Docked widgets can be resized, undocked, maximizes or closed as needed.
|
|
|
+ */
|
|
|
class DockManager : public GUIElementContainer
|
|
|
{
|
|
|
public:
|
|
|
+ /**
|
|
|
+ * @brief Contains information about a single dock area. Each container can be a parent to
|
|
|
+ * two other containers or may contain a widget, which results in a container hierarchy.
|
|
|
+ * Two children can be split vertically or horizontally at an user-defined point.
|
|
|
+ */
|
|
|
class DockContainer
|
|
|
{
|
|
|
public:
|
|
|
@@ -21,32 +25,116 @@ namespace BansheeEngine
|
|
|
DockContainer(DockManager* manager, DockContainer* parent);
|
|
|
~DockContainer();
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Determines the position and size of the container, relative to the parent dock manager.
|
|
|
+ */
|
|
|
void setArea(INT32 x, INT32 y, UINT32 width, UINT32 height);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Transforms the container from non-leaf (parent to other containers)
|
|
|
+ * to leaf (parent to widgets). This involves creating a widget container to
|
|
|
+ * which you can dock widgets to.
|
|
|
+ *
|
|
|
+ * @param widgetParent GUI widget of the parent dock manager.
|
|
|
+ * @param parentWindow Editor window of the parent dock manager.
|
|
|
+ */
|
|
|
void makeLeaf(GUIWidget* widgetParent, EditorWindowBase* parentWindow);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Transforms the container from non-leaf (parent to other containers)
|
|
|
+ * to leaf (parent to widgets). Unlike the other overload this one accepts
|
|
|
+ * a previously created widget container.
|
|
|
+ *
|
|
|
+ * @param existingContainer An existing widget container that may be used for docking widgets.
|
|
|
+ */
|
|
|
void makeLeaf(EditorWidgetContainer* existingContainer);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Splits a leaf container containing a widget container (or may be empty in the case of root with no elements)
|
|
|
+ * into a container parent to two other containers.
|
|
|
+ *
|
|
|
+ * @param horizontal Whether the split is horizontal (true) or vertical (false.
|
|
|
+ * @param newChildIsFirst Determines to which child should the widget container from this object be moved to.
|
|
|
+ * If the new child is first, then bottom or right (for horizontal and vertical respectively)
|
|
|
+ * will receive the current widget container, and opposite if it's not first.
|
|
|
+ * @param splitPosition Determines at what position(in percent) should this container be split. User can modify this later
|
|
|
+ * via a dock slider.
|
|
|
+ */
|
|
|
void splitContainer(bool horizontal, bool newChildIsFirst, float splitPosition = 0.5f);
|
|
|
- void makeSplit(GUIWidget* widgetParent, DockManager::DockContainer* first, DockManager::DockContainer* second, bool horizontal, float splitPosition);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Splits a leaf container containing a widget container (or may be empty in the case of root with no elements)
|
|
|
+ * into a container parent to two other containers. Unlike "splitContainer" new containers aren't created automatically
|
|
|
+ * but you must provide existing ones. If this container is non-leaf its widget container will be destroyed.
|
|
|
+ *
|
|
|
+ * @param first Container to insert into the first child slot (left if vertical split, top if horizontal split).
|
|
|
+ * @param second Container to insert into the second child slot (right if vertical split, bottom if horizontal split).
|
|
|
+ * @param horizontal Whether the split is horizontal (true) or vertical (false.
|
|
|
+ * @param splitPosition Determines at what position(in percent) should this container be split. User can modify this later
|
|
|
+ * via a dock slider.
|
|
|
+ */
|
|
|
+ void makeSplit(DockContainer* first, DockContainer* second, bool horizontal, float splitPosition);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Adds a new widget to the left side of the container. If the container is leaf it will
|
|
|
+ * be split into two containers vertically.
|
|
|
+ */
|
|
|
void addLeft(EditorWidgetBase* widget);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Adds a new widget to the right side of the container. If the container is leaf it will
|
|
|
+ * be split into two containers vertically.
|
|
|
+ */
|
|
|
void addRight(EditorWidgetBase* widget);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Adds a new widget to the top side of the container. If the container is leaf it will
|
|
|
+ * be split into two containers horizontally.
|
|
|
+ */
|
|
|
void addTop(EditorWidgetBase* widget);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Adds a new widget to the bottom side of the container. If the container is leaf it will
|
|
|
+ * be split into two containers horizontally.
|
|
|
+ */
|
|
|
void addBottom(EditorWidgetBase* widget);
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Adds an existing widget to this leaf container.
|
|
|
+ */
|
|
|
void addWidget(EditorWidgetBase* widget);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Attempts to find a widget with the specified name, opens it
|
|
|
+ * and adds it to this leaf container.
|
|
|
+ */
|
|
|
void addWidget(const String& name);
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Update to be called once per frame. Calls updates on all child widgets.
|
|
|
+ */
|
|
|
void update();
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Attempts to find an existing leaf dock container with the specified
|
|
|
+ * widget container. Returns null if one cannot be found.
|
|
|
+ */
|
|
|
DockContainer* find(EditorWidgetContainer* widgetContainer);
|
|
|
|
|
|
/**
|
|
|
- * @brief Searches for a DockContainer at the specified position.
|
|
|
+ * @brief Searches for a container at the specified position. Call this at this top-most
|
|
|
+ * container in order to search them all.
|
|
|
*
|
|
|
- * @param pos Position in the same space as DockContainer.
|
|
|
+ * @param pos Position is relative to the container area.
|
|
|
*
|
|
|
* @return null if it fails, else the found DockContainer at position.
|
|
|
*/
|
|
|
DockContainer* findAtPos(const Vector2I& pos);
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Returns the bounds of the container that are to be considered
|
|
|
+ * dockable and interactable.
|
|
|
+ */
|
|
|
Rect2I getContentBounds() const;
|
|
|
|
|
|
bool mIsLeaf;
|
|
|
@@ -63,12 +151,26 @@ namespace BansheeEngine
|
|
|
static const UINT32 MIN_CHILD_SIZE;
|
|
|
|
|
|
private:
|
|
|
+ /**
|
|
|
+ * @brief Updates sizes and positions of all child containers.
|
|
|
+ * Normally called when parent area changes.
|
|
|
+ */
|
|
|
void updateChildAreas();
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Triggered whenever the user drags the GUI slider belonging to this container.
|
|
|
+ */
|
|
|
void sliderDragged(const Vector2I& delta);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Triggered whenever the user closes or undocks a widget belonging to this container.
|
|
|
+ */
|
|
|
void widgetRemoved();
|
|
|
};
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Available dock locations for the dock manager.
|
|
|
+ */
|
|
|
enum class DockLocation
|
|
|
{
|
|
|
Top,
|
|
|
@@ -78,6 +180,9 @@ namespace BansheeEngine
|
|
|
None
|
|
|
};
|
|
|
public:
|
|
|
+ /**
|
|
|
+ * @brief Creates a new dock manager for the specified window.
|
|
|
+ */
|
|
|
static DockManager* create(EditorWindowBase* parentWindow);
|
|
|
|
|
|
/**
|
|
|
@@ -85,23 +190,42 @@ namespace BansheeEngine
|
|
|
*/
|
|
|
void update();
|
|
|
|
|
|
- void render(const Viewport* viewport, DrawList& renderQueue);
|
|
|
+ /**
|
|
|
+ * @brief Inserts a new widget at the specified location.
|
|
|
+ *
|
|
|
+ * @param relativeTo Container relative to which to insert the widget. Can be null in which case
|
|
|
+ * the widget is inserted at the root.
|
|
|
+ * @param widgetToInsert Widget we want to insert into the dock layout.
|
|
|
+ * @param location Location to insert the widget at, relative to "relativeTo" container.
|
|
|
+ * If "relativeTo" is null this is ignored.
|
|
|
+ */
|
|
|
void insert(EditorWidgetContainer* relativeTo, EditorWidgetBase* widgetToInsert, DockLocation location);
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Returns a saved layout of all the currently docked widgets and their positions
|
|
|
+ * and areas.
|
|
|
+ */
|
|
|
DockManagerLayoutPtr getLayout() const;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Sets a previously saved layout of docked widgets. This will close all currently active
|
|
|
+ * widgets and open and position new ones according to the layout.
|
|
|
+ */
|
|
|
void setLayout(const DockManagerLayoutPtr& layout);
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Changes the position and size of the dock manager.
|
|
|
+ */
|
|
|
void setArea(INT32 x, INT32 y, UINT32 width, UINT32 height);
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Closes all docked widgets.
|
|
|
+ */
|
|
|
void closeAll();
|
|
|
|
|
|
- protected:
|
|
|
- ~DockManager();
|
|
|
-
|
|
|
- void updateClippedBounds();
|
|
|
-
|
|
|
private:
|
|
|
DockManager(EditorWindowBase* parentWindow, const GUIDimensions& dimensions);
|
|
|
+ ~DockManager();
|
|
|
|
|
|
static const Color TINT_COLOR;
|
|
|
static const Color HIGHLIGHT_COLOR;
|
|
|
@@ -124,9 +248,37 @@ namespace BansheeEngine
|
|
|
|
|
|
HEvent mRenderCallback;
|
|
|
|
|
|
+ /**
|
|
|
+ * @brief Render callback that allows the dock manager to render its overlay when needed.
|
|
|
+ * Called once per frame by the renderer.
|
|
|
+ */
|
|
|
+ void render(const Viewport* viewport, DrawList& renderQueue);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @brief Updates the dock overlay mesh that is displayed when user is dragging a widget
|
|
|
+ * over a certain area.
|
|
|
+ */
|
|
|
void updateDropOverlay(INT32 x, INT32 y, UINT32 width, UINT32 height);
|
|
|
|
|
|
- bool _mouseEvent(const GUIMouseEvent& event);
|
|
|
+ /**
|
|
|
+ * @brief Checks is the provided point inside the provided polygon.
|
|
|
+ *
|
|
|
+ * @param polyPoints Points of the polygon to test against.
|
|
|
+ * @param numPoints Number of points in "polyPoints".
|
|
|
+ * @param point Point to check if it's in the polygon.
|
|
|
+ *
|
|
|
+ * @returns True if the point is in the polygon.
|
|
|
+ */
|
|
|
bool insidePolygon(Vector2* polyPoints, UINT32 numPoints, Vector2 point) const;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @copydoc GUIElementBase::updateClippedBounds
|
|
|
+ */
|
|
|
+ void updateClippedBounds() override;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @copydoc GUIElementBase::_mouseEvent
|
|
|
+ */
|
|
|
+ bool _mouseEvent(const GUIMouseEvent& event) override;
|
|
|
};
|
|
|
}
|