Initial size handling

This commit is contained in:
IlyaShurupov 2024-10-10 11:17:03 +03:00 committed by Ilya Shurupov
parent 9f9dcd5882
commit 0b73f8037b
28 changed files with 543 additions and 135 deletions

View file

@ -13,6 +13,19 @@ namespace tp {
class Widget {
friend class RootWidget;
public:
enum class SizePolicy {
Passive,
Expand,
Contract,
};
enum class LayoutPolicy {
Passive,
Vertically,
Horizontally,
};
public:
Widget();
virtual ~Widget() = default;
@ -23,6 +36,7 @@ namespace tp {
}
void addChild(Widget* child);
void removeChild(Widget* child);
WidgetManagerInterface* getRoot();
@ -31,18 +45,33 @@ namespace tp {
void bringToFront();
void bringToBack();
void setSizePolicy(SizePolicy x, SizePolicy y);
void setLayoutPolicy(LayoutPolicy layoutPolicy);
const Vec2F& getMinSize();
void setMinSize(const Vec2F& size);
public:
virtual void process(const EventHandler& events) {}
virtual void draw(Canvas& canvas) { canvas.rect(mArea.getCurrentRect(), RGBA(1.f), 10); }
virtual void draw(Canvas& canvas) {}
virtual void drawOverlay(Canvas& canvas) {}
virtual void mouseEnter();
virtual void mouseLeave();
// size policies
virtual void adjustRect();
virtual void pickRect();
virtual void clampRect();
virtual void adjustChildrenRect();
// resizing
RangeF pickRange(const RangeF& current, const RangeF& children, const RangeF& parent, bool vertical);
RangeF clampRange(const RangeF& current, const RangeF& children, const RangeF& parent, bool vertical);
RectF getChildrenEnclosure();
RectF getParentEnclosure();
void adjustLayout(bool vertical);
halnf changeChildSize(Widget*, halnf diff, bool vertical);
[[nodiscard]] virtual bool processesEvents() const;
[[nodiscard]] virtual bool propagateEventsToChildren() const;
@ -53,7 +82,11 @@ namespace tp {
public:
[[nodiscard]] RectF getArea() const;
[[nodiscard]] RectF getAreaT() const;
[[nodiscard]] RectF getRelativeArea() const;
[[nodiscard]] RectF getRelativeAreaT() const;
void setArea(const RectF& area);
protected:
@ -65,6 +98,12 @@ namespace tp {
// relative to the parent
SpringRect mArea;
// resizing
LayoutPolicy mLayoutPolicy = LayoutPolicy::Passive;
Vec2<SizePolicy> mSizePolicy = { SizePolicy::Passive, SizePolicy::Passive };
Vec2F mMinSize = { 50, 50 };
Vec2F mMaxSize = { FLT_MAX / 2, FLT_MAX / 2 };
bool mInFocus = false;
// debug