Replace Old Widgets

This commit is contained in:
IlyaShurupov 2024-10-18 10:56:42 +03:00 committed by Ilya Shurupov
parent 03da5e41d6
commit c41dc20132
81 changed files with 388 additions and 278 deletions

View file

@ -0,0 +1,30 @@
#pragma once
#include "Layout.hpp"
namespace tp {
class BasicLayout : public WidgetLayout {
friend class DebugManager;
public:
explicit BasicLayout(Widget* widget) : WidgetLayout(widget) {}
void updateLayout(bool vertical) override;
void pickRect(bool vertical) override;
void clampRect() override;
[[nodiscard]] RectF getAvailableChildArea() const override;
void setLayoutPolicy(LayoutPolicy layout) { mLayoutPolicy = layout; }
private:
void adjustLayout(bool vertical);
static halnf changeChildSize(Widget*, halnf diff, bool vertical);
private:
LayoutPolicy mLayoutPolicy = LayoutPolicy::Vertical;
halnf mLayoutGap = 5;
halnf mLayoutMargin = 9;
};
}

View file

@ -0,0 +1,109 @@
#include "Widget.hpp"
namespace tp {
class DockLayout : public WidgetLayout {
public:
enum Side { LEFT, TOP, RIGHT, BOTTOM, NONE };
private:
struct ResizeHandle {
RectF area{ 0, 0, 0, 0 };
halnf start{ 0 };
halnf end{ 0 };
bool active = false;
bool hover = false;
};
struct SideWidgetData {
Widget* widget = nullptr;
bool hidden = false;
halnf absoluteSize = 300;
alni order = -1;
Side side = { TOP };
RectF area = {};
RectF headerArea = {};
RectF previewHandleArea = {};
ResizeHandle resizeHandle;
RectF areaBeforeDocking = {};
};
public:
explicit DockLayout(Widget* widget);
void updateResizeHover(const Vec2F& pointer);
bool startResize(const Vec2F& pointer);
void updateResize(const Vec2F& pointerDelta);
void endResize();
void updatePreviewSide(const Vec2F& pointer);
public:
void pickRect(bool vertical) override {}
void clampRect() override {};
void updateLayout(bool vertical) override;
void adjustChildrenRect();
public:
bool setCenterWidget(Widget* widget);
bool dockWidget(Widget* widget, Side side);
bool undockWidget(Side side);
void toggleWidgetVisibility(Side side);
public:
[[nodiscard]] bool isSideVisible(Side side) const;
[[nodiscard]] bool sideExists(Side side) const;
[[nodiscard]] bool isResizing() const { return mResizing; }
[[nodiscard]] bool isResizing(Side side) const { return mSideWidgets[side].resizeHandle.active; }
[[nodiscard]] bool isResizeHandleHover(Side side) const { return mSideWidgets[side].resizeHandle.hover; }
Side getSideFromWidget(Widget*);
Side getPreviewSide();
[[nodiscard]] RectF getRectBeforeDocked(Side side) const { return mSideWidgets[side].areaBeforeDocking; }
[[nodiscard]] RectF getResizeHandleArea(Side side) const { return mSideWidgets[side].resizeHandle.area; }
[[nodiscard]] RectF getHeaderArea(Side side) const { return mSideWidgets[side].headerArea; }
[[nodiscard]] RectF getPreviewHandleArea(Side side) const { return mSideWidgets[side].previewHandleArea; }
[[nodiscard]] RectF getPreviewArea() const { return mPreviewArea; }
Widget* getSideWidget(Side side) { return mSideWidgets[side].widget; }
const std::vector<Widget*>& getDockedWidgets();
private:
ualni getVisibleSidesSize() const;
void calculateSideAreas();
void calculateResizeHandles();
void updateChildSideWidgets();
void calculateHeaderAreas();
private:
RectF mPreviewArea = {};
Side mPreviewSide = NONE;
int resizeType[2] = { 0, 0 };
SideWidgetData mSideWidgets[4];
std::vector<Widget*> mDockedWidgets;
private:
bool mResizing = false;
Widget* mCenterWidget = nullptr;
RectF mCenterArea {};
// Parameters
const halnf mHandleSplitFactor = 0.3;
const halnf mHandleFactor = 0.1;
halnf mSideSizePadding = 150.f;
halnf mPadding = 4;
halnf mHeaderSize = 27;
};
}

View file

@ -0,0 +1,34 @@
#pragma once
#include "BasicLayout.hpp"
namespace tp {
class FloatingLayout : public BasicLayout {
public:
explicit FloatingLayout(Widget* widget) :
BasicLayout(widget) {}
public:
void startAction(const Vec2F& pointer);
void updateAction(const Vec2F& pointer);
void endAction();
bool isFloating() const { return mIsFloating; }
RectF resizeHandleRect();
public:
void pickRect(bool vertical) override;
private:
bool mIsFloating = false;
bool mIsResizing = false;
Vec2F mPointerStart;
Vec2F mPointerCurrent;
// TODO : remove?
halnf mHandleSize = 10;
halnf mHandlePadding = 2;
};
}

View file

@ -0,0 +1,18 @@
#pragma once
#include "Layout.hpp"
namespace tp {
class OverlayLayout : public WidgetLayout {
friend class DebugManager;
public:
explicit OverlayLayout(Widget* widget) : WidgetLayout(widget) {}
void updateLayout(bool vertical) override;
void pickRect(bool vertical) override {}
void clampRect() override {}
};
}

View file

@ -0,0 +1,24 @@
#pragma once
#include "Layout.hpp"
namespace tp {
class ScrollableBarWidget;
class ScrollableLayout : public WidgetLayout {
public:
explicit ScrollableLayout(Widget* widget) :
WidgetLayout(widget) {
setSizePolicy(SizePolicy::Expanding, SizePolicy::Expanding);
}
void updateLayout(bool vertical) override;
[[nodiscard]] RectF getAvailableChildArea() const override;
private:
void updateWidgetRects(const RectF& area, Widget* content, ScrollableBarWidget* scroller) const;
private:
halnf mScrollerSize = 15;
};
}