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
2 changes: 1 addition & 1 deletion engine/includes/components/transform.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class ENGINE_EXPORT Transform : public Component {
void setScale(const Vector3 &scale);

Transform *parentTransform() const;
void setParentTransform(Transform *parent, bool force = false);
virtual void setParentTransform(Transform *parent, bool force = false);

const Matrix4 &localTransform() const;
const Matrix4 &worldTransform() const;
Expand Down
2 changes: 1 addition & 1 deletion modules/uikit/includes/components/layout.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ class UIKIT_EXPORT Layout {

void invalidate();

void solveItemsDimension(int availableSpace, bool horizontal);
void solveItemsDimension(float availableSpace, bool horizontal);
void solveItemsPosition(float height, const Vector2 &offset);

protected:
Expand Down
2 changes: 2 additions & 0 deletions modules/uikit/includes/components/recttransform.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ class UIKIT_EXPORT RectTransform : public Transform {

Vector4 scissorArea() const;

void setParentTransform(Transform *parent, bool force = false) override;

private:
friend class UikitSuite::RectTransformTest;
friend class Layout;
Expand Down
50 changes: 50 additions & 0 deletions modules/uikit/includes/components/splitter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#ifndef SPLITTER_H
#define SPLITTER_H

#include "frame.h"

class UIKIT_EXPORT Splitter : public Frame {
A_OBJECT(Splitter, Frame, Components/UI)

A_NOPROPERTIES()
A_NOMETHODS()
A_NOENUMS()

public:
Splitter();

int handleWidth();
void setHandleWidth(int width);

int orentation();
void setOrientation(int orientation);

void addWidget(Widget *widget);

int count();

int indexOf(Widget *widget);

void insertWidget(int index, Widget *widget);

Widget *replaceWidget(int index, Widget *widget);

Widget *widget(int index);

protected:
void update() override;

void resizeWidget(int index, int orientation, float delta);

void childAdded(RectTransform *rect) const override;

void composeComponent() override;

protected:
float m_savedPosition;

int m_index;

};

#endif // SPLITTER_H
11 changes: 7 additions & 4 deletions modules/uikit/includes/components/widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,19 @@ class UIKIT_EXPORT Widget : public NativeBehaviour {

void updateStyleProperty(const TString &name, const float *v, int32_t size);

private:
void addStyleRules(const std::map<TString, TString> &rules, uint32_t weight);

void setSystem(ObjectSystem *system) override;
protected:
virtual void childAdded(RectTransform *child) const;

protected:
std::map<TString, std::pair<uint32_t, TString>> m_styleRules;

std::list<Widget *> m_childWidgets;

private:
void addStyleRules(const std::map<TString, TString> &rules, uint32_t weight);

void setSystem(ObjectSystem *system) override;

private:
friend class GuiLayer;
friend class RectTransform;
Expand Down
2 changes: 0 additions & 2 deletions modules/uikit/includes/editor/widgetcontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,6 @@ class WidgetController : public CameraController {

UndoStack *undoRedo() const { return m_editor->undoRedo(); }

static TString findFreeObjectName(const TString &name, Object *parent);

signals:
void sceneUpdated();
void objectsSelected(Object::ObjectList objects);
Expand Down
70 changes: 40 additions & 30 deletions modules/uikit/src/components/layout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ void Layout::invalidate() {
/*!
\internal
*/
void Layout::solveItemsDimension(int availableSpace, bool horizontal) {
void Layout::solveItemsDimension(float availableSpace, bool horizontal) {
if(m_orientation == Widget::Vertical) {
if(horizontal) {
for(auto it : m_items) {
Expand All @@ -222,15 +222,17 @@ void Layout::solveItemsDimension(int availableSpace, bool horizontal) {
}
}

int totalPref = 0;
float totalPref = 0.0f;
int expandingCount = 0;
int preferredCount = 0;
int fixedCount = 0;

std::list<float> sizes;

for(auto it : m_items) {
if(it->isEnabled()) {
RectTransform::SizePolicy policy = horizontal ? it->horizontalPolicy() : it->verticalPolicy();
int pref = horizontal ? it->size().x : it->size().y;
float pref = horizontal ? it->size().x : it->size().y;
Vector4 margin(it->margin());
pref += horizontal ? (margin.w + margin.y) : (margin.x + margin.z);

Expand All @@ -239,7 +241,7 @@ void Layout::solveItemsDimension(int availableSpace, bool horizontal) {
switch(policy) {
case RectTransform::Fixed: fixedCount++; break;
case RectTransform::Preferred: preferredCount++; break;
case RectTransform::Expanding: expandingCount++; break;
case RectTransform::Expanding: expandingCount++; sizes.push_back(pref); break;
default: break;
}
}
Expand All @@ -249,17 +251,29 @@ void Layout::solveItemsDimension(int availableSpace, bool horizontal) {

totalPref += spacesCount * m_spacing;

auto size = sizes.begin();
std::list<float> weights;
for(auto it : m_items) {
if(it->isEnabled()) {
RectTransform::SizePolicy policy = horizontal ? it->horizontalPolicy() : it->verticalPolicy();
if(policy == RectTransform::Expanding) {
float weight = (*size) / totalPref;
weights.push_back(weight);
++size;
}
}
}

if(availableSpace <= totalPref) { // Need to reduce size of widgets
int remainingSpace = availableSpace;
float remainingSpace = availableSpace;

for(auto it : m_items) {
if(it->isEnabled()) {
RectTransform::SizePolicy policy = horizontal ? it->horizontalPolicy() : it->verticalPolicy();
if(policy == RectTransform::Fixed) {
int pref = horizontal ? it->size().x : it->size().y;
if(policy == RectTransform::Fixed || policy == RectTransform::Preferred) {
float pref = horizontal ? it->size().x : it->size().y;
Vector4 margin(it->margin());
pref += horizontal ? (margin.w + margin.y) : (margin.x + margin.z);

remainingSpace -= pref;
}
}
Expand All @@ -268,46 +282,42 @@ void Layout::solveItemsDimension(int availableSpace, bool horizontal) {
remainingSpace -= spacesCount * m_spacing;

if(expandingCount > 0 && remainingSpace > 0) {
int spacePerFlexible = remainingSpace / expandingCount;

auto weight = weights.begin();
for(auto it : m_items) {
if(it->isEnabled()) {
RectTransform::SizePolicy policy = horizontal ? it->horizontalPolicy() : it->verticalPolicy();
if(policy == RectTransform::Expanding) {
Vector4 margin(it->margin());
Vector2 size(it->size());
if(horizontal) {
size.x = spacePerFlexible - (margin.w + margin.y);
size.x = remainingSpace * (*weight) - (margin.w + margin.y);
} else {
size.y = spacePerFlexible - (margin.x + margin.z);
size.y = remainingSpace * (*weight) - (margin.x + margin.z);
}
it->setSize(size);
++weight;
}
}
}
}
} else { // Need to expand widgets
int extra = availableSpace - totalPref;

float extra = availableSpace - totalPref;
auto weight = weights.begin();
for(auto it : m_items) {
if(it->isEnabled()) {
RectTransform::SizePolicy policy = horizontal ? it->horizontalPolicy() : it->verticalPolicy();

float extraSize = 0;
if(expandingCount > 0) {
if(policy == RectTransform::Expanding) {
extraSize = extra / static_cast<float>(expandingCount);
}
}

if(extraSize != 0) {
Vector2 size(it->size());
if(horizontal) {
size.x += extraSize;
} else {
size.y += extraSize;
if(policy == RectTransform::Expanding) {
float extraSize = extra * (*weight);
if(extraSize != 0) {
Vector2 size(it->size());
if(horizontal) {
size.x += extraSize;
} else {
size.y += extraSize;
}
it->setSize(size);
}
it->setSize(size);
++weight;
}
}
}
Expand Down Expand Up @@ -335,7 +345,7 @@ void Layout::solveItemsPosition(float height, const Vector2 &offset) {
} else {
shift += size.x * pivot.x + margin.w;
it->m_position.x = shift;
it->m_position.y = offset.y - size.y * pivot.y - margin.z;
it->m_position.y = offset.y - size.y * (1.0f - pivot.y) - margin.z;
shift += size.x * (1.0f - pivot.x) + margin.y;
}
it->setDirty();
Expand Down
15 changes: 14 additions & 1 deletion modules/uikit/src/components/recttransform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ void RectTransform::setPadding(const Vector4 &padding) {
if(!isSignalsBlocked()) {
Widget *widget = RectTransform::widget();
if(widget) {
widget->updateStyleProperty(gCssPadding, m_border.v, 4);
widget->updateStyleProperty(gCssPadding, m_padding.v, 4);
}
}
#endif
Expand Down Expand Up @@ -638,6 +638,19 @@ Vector4 RectTransform::scissorArea() const {
/*!
\internal
*/
void RectTransform::setParentTransform(Transform *parent, bool force) {
Transform::setParentTransform(parent, force);

RectTransform *rect = dynamic_cast<RectTransform *>(parent);
if(rect) {
for(auto it : rect->m_subscribers) {
it->childAdded(this);
}
}
}
/*!
\internal
*/
void RectTransform::applyStyle() {
Widget *widget = RectTransform::widget();

Expand Down
Loading
Loading