Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ void NodeWidget::composeComponent() {
rect->setLayout(layout);
rect->setVerticalPolicy(RectTransform::Preferred);
rect->setHorizontalPolicy(RectTransform::Fixed);
rect->setBorder(2.0f);

Actor *title = Engine::composeActor(gFrame, "Title", actor());
if(title) {
Expand Down
33 changes: 24 additions & 9 deletions modules/editor/grapheditor/editor/graph/statenode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,35 @@
#include "graphwidgets/nodewidget.h"

#include <recttransform.h>
#include <layout.h>

Widget *StateNode::widget() {
if(m_nodeWidget == nullptr) {
NodeWidget *result = static_cast<NodeWidget *>(GraphNode::widget());
Actor *nodeActor = Engine::composeActor("NodeWidget", qPrintable(objectName()));
if(nodeActor) {
NodeWidget *nodeWidget = nodeActor->getComponent<NodeWidget>();

Frame *title = result->title();
Vector4 corners(title->corners());
corners.z = corners.w = corners.x;
title->setCorners(corners);
RectTransform *rect = nodeWidget->rectTransform();
rect->setVerticalPolicy(RectTransform::Fixed);
rect->setHorizontalPolicy(RectTransform::Fixed);

RectTransform *titleRect = title->rectTransform();
titleRect->setSize(Vector2(0.0f));
titleRect->setMargin(Vector4(5.0f));
titleRect->setAnchors(Vector2(0.0f), Vector2(1.0f));
Frame *title = nodeWidget->title();
Vector4 corners(title->corners());
corners.z = corners.w = corners.x;
title->setCorners(corners);

RectTransform *titleRect = title->rectTransform();
titleRect->setMargin(Vector4(5.0f));
titleRect->setAnchors(Vector2(0.0f), Vector2(1.0f));

Layout *layout = rect->layout();
layout->invalidate();
layout->update();

nodeWidget->setGraphNode(this);

m_nodeWidget = nodeWidget;
}
}

return m_nodeWidget;
Expand Down
25 changes: 15 additions & 10 deletions modules/uikit/src/components/layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,11 +185,13 @@ void Layout::setDirection(int direction) {
*/
Vector2 Layout::sizeHint() {
Vector4 padding;
Vector4 border;
if(m_rectTransform) {
padding = m_rectTransform->padding();
border = m_rectTransform->border();
}

Vector2 result(padding.w, padding.x);
Vector2 result(padding.w + border.w, padding.x + border.x);
for(auto it : m_items) {
Vector2 size;

Expand All @@ -214,8 +216,8 @@ Vector2 Layout::sizeHint() {
}
}

result.x += padding.y;
result.y += padding.z;
result.x += padding.y + border.y;
result.y += padding.z + border.z;

return result;
}
Expand All @@ -237,33 +239,36 @@ void Layout::invalidate() {
void Layout::update() {
if(m_dirty) {
Vector4 padding;
Vector4 border;
if(m_rectTransform) {
padding = m_rectTransform->padding();
border = m_rectTransform->border();
}

// Top and left paddings
float offset = ((m_direction == Vertical) ? padding.x : padding.w);
float offset = ((m_direction == Vertical) ? padding.x + border.x : padding.w + border.w);

for(auto it : m_items) {
if(it->m_attachedTransform) {
RectTransform *r = it->m_attachedTransform;
if(r->actor()->isEnabled()) {
offset += (it != *m_items.begin()) ? m_spacing : 0.0f;

Vector2 size = r->size();
Vector2 pivot = r->pivot();
Vector2 size(r->size());
Vector2 pivot(r->pivot());
Vector4 margin(r->margin());

if(m_direction == Vertical) {
offset += size.y * (1.0f - pivot.y);
Vector3 newPos(m_position.x + padding.w + size.x * pivot.x,
offset += size.y * (1.0f - pivot.y) - margin.z;
Vector3 newPos(m_position.x + padding.w + border.w + size.x * pivot.x,
m_position.y - offset, 0.0f);

r->setPosition(newPos);
offset += size.y * pivot.y;
} else {
offset += size.x * pivot.x;
offset += size.x * pivot.x + margin.w;
Vector3 newPos(m_position.x + offset,
m_position.y - padding.x - size.y * pivot.y, 0.0f);
m_position.y - padding.x - border.x - size.y * pivot.y, 0.0f);

r->setPosition(newPos);
offset += size.x * (1.0f - pivot.x);
Expand Down
32 changes: 20 additions & 12 deletions modules/uikit/src/components/recttransform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,11 @@ void RectTransform::recalcChilds() const {
RectTransform *parentRect = dynamic_cast<RectTransform *>(m_parent);
if(parentRect) {
parentSize = parentRect->size();

Vector4 padding(parentRect->padding());
Vector4 border(parentRect->border());
parentSize -= Vector2(padding.y + padding.w, padding.x + padding.z);
parentSize -= Vector2(border.y + border.w, border.x + border.z);
}

if(abs(m_minAnchors.x - m_maxAnchors.x) > EPSILON) { // fit to parent
Expand All @@ -362,7 +367,8 @@ void RectTransform::recalcChilds() const {
}
}

if(m_layout) {
if(m_layout &&
(m_horizontalPolicy != RectTransform::Fixed || m_verticalPolicy != RectTransform::Fixed)) {
Vector2 hint(m_layout->sizeHint());

m_size.x = policyHelper(m_horizontalPolicy, m_size.x, hint.x);
Expand Down Expand Up @@ -392,26 +398,28 @@ Vector2 RectTransform::sizeHint() const {

void RectTransform::recalcParent() {
if(m_layout) {
Vector2 hint(m_layout->sizeHint());

Vector2 size(m_size);
Vector2 oldSize(m_size);

bool isBreak = true;
if(m_verticalPolicy == Preferred) {
m_size.y = hint.y;
isBreak = false;
}

if(m_horizontalPolicy == Preferred) {
m_size.x = hint.x;
isBreak = false;
if(m_verticalPolicy == Preferred || m_horizontalPolicy == Preferred) {
Vector2 hint(m_layout->sizeHint());
if(m_verticalPolicy == Preferred) {
m_size.y = hint.y;
isBreak = false;
}

if(m_horizontalPolicy == Preferred) {
m_size.x = hint.x;
isBreak = false;
}
}

if(isBreak) {
return;
}

if(size != m_size) {
if(oldSize != m_size) {
setDirty();

for(auto it : m_subscribers) {
Expand Down
5 changes: 2 additions & 3 deletions worldeditor/bin/engine/materials/Frame.shader
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,8 @@ void main(void) {
float outerSDF = -length(min(radSDF, 0.0));
float sdf = innerSDF + outerSDF + borderRad;

const float softness = 0.0;
const float margin = 0.0;
float surface = smoothstep(margin - softness, margin + softness, sdf);
const float softness = 0.001;
float surface = smoothstep(softness, softness, sdf);

// Border
float width = (borderWidth.x > 0.0) ? max(fwidth(_uv0.y), borderWidth.x) : 0.0;
Expand Down
Loading