Files
ReJUI/include/JUI/Widgets/Anchor.hpp

95 lines
2.3 KiB
C++

#pragma once
#include <JUI/Base/Widget.hpp>
namespace JUI {
/// An invisible, point-like widget which is used to attach decorator-type widgets at a given point.
/// For example: The CurveSegment Widget uses two Anchors for it's endpoints.
class Anchor : public Widget {
public:
Anchor() : Widget() {
}
explicit Anchor(Widget* parent) : Anchor() {
Parent(parent);
};
explicit Anchor(Widget* parent, const UDim2& position) : Anchor(parent) {
Position(position);
Size({0_px, 0_px});
}
void Update(float elapsed) override {
}
void Draw() override {
Color4 debug_color = Colors::Red;
float debug_size = 1;
J2D::FillCircle(debug_color, GetAbsolutePosition(), debug_size, 5);
}
Vector2 Point() { return GetAbsolutePosition(); }
protected:
private:
};
class Decorator : public Widget {
public:
Decorator() : Widget(){
}
explicit Decorator(Widget* parent) : Decorator() {
Parent(parent);
}
};
class ArrowDecorator : public Decorator {
public:
explicit ArrowDecorator(Widget* parent, Anchor* a, Anchor* b) : Decorator() {
Parent(parent);
origin = a;
goal = b;
}
void Draw() override {
auto goal_point = goal->Point();
auto origin_point = origin->Point();
using namespace J3ML;
J2D::DrawLine(color, origin->Point(), goal->Point(), line_width);
Vector2 direction = ( origin->Point() - goal->Point()).Normalized();
Vector2 triangle_base_pt = goal->Point() + (direction*arrowhead_size);
//J2D::DrawPoint(Colors::Yellow, triangle_base_pt, 4);
Vector2 tri_left = triangle_base_pt + (direction.Rotated90CW() *arrowhead_size);
Vector2 tri_right = triangle_base_pt + (direction.Rotated90CCW()*arrowhead_size);
Vector2 tri_top = goal->Point();
J2D::DrawLine(color, tri_top, tri_left, arrowhead_size);
J2D::DrawLine(color, tri_top, tri_right, arrowhead_size);
}
protected:
float arrowhead_size;
float line_width;
Color4 color;
Anchor* origin;
Anchor* goal;
private:
};
}