Use generic layout algorithms.

This commit is contained in:
Martin Preuss
2023-11-18 18:55:23 +01:00
parent 0638a58e16
commit 9624dda3f5
5 changed files with 71 additions and 106 deletions

View File

@@ -76,6 +76,16 @@ void AQDG_Placement_LayoutSecondaryAxis(AQDG_PLACEMENT_LAYOUT_ELEMENT *ptrElemen
AQDG_PLACEMENT_LAYOUT_ELEMENT *ptr;
rawLength=destLength-borderBegin-borderEnd;
/* stretch on request */
ptr=ptrElements;
for (i=0; i<numElements; i++) {
if (ptr->opts & AQDG_PLACEMENT_LAYOUT_ELEMENT_OPTS_STRETCH)
ptr->length=rawLength;
ptr++;
}
/* place children */
ptr=ptrElements;
for (i=0; i<numElements; i++) {
int pos;
@@ -89,7 +99,7 @@ void AQDG_Placement_LayoutSecondaryAxis(AQDG_PLACEMENT_LAYOUT_ELEMENT *ptrElemen
else
pos=borderBegin;
ptr->pos=(pos>borderBegin)?pos:borderBegin;
ptr->pos=(pos<borderBegin)?borderBegin:pos;
ptr++;
}
}

View File

@@ -123,8 +123,8 @@ int test1(GWEN_UNUSED GWEN_TEST_MODULE *mod)
DBG_ERROR(AQDG_LOGDOMAIN, "WIDTH of box 2 is not 70 (%d)", w);
errors++;
}
if (y!=16) {
DBG_ERROR(AQDG_LOGDOMAIN, "Y of box 2 is not 16 (%d)", y);
if (y!=19) {
DBG_ERROR(AQDG_LOGDOMAIN, "Y of box 2 is not 19 (%d)", y);
errors++;
}
if (h!=10) {

View File

@@ -11,6 +11,7 @@
#endif
#include "o_hlayout.h"
#include "o_layout.h"
/* ------------------------------------------------------------------------------------------------
@@ -19,8 +20,6 @@
*/
static int _layout(AQDG_OBJECT *object);
static void _vAlignChild(AQDG_OBJECT *child, uint32_t childOpts, int parentHeight, int borderTop, int borderBottom);
static void _hStretchBelow(AQDG_OBJECT *object, int selfWidth, int minWidth, int hSpacing, int stretchables);
@@ -47,114 +46,39 @@ AQDG_OBJECT *AQDG_HLayoutObject_new(AQDG_OBJECT *parent, uint32_t options)
int _layout(AQDG_OBJECT *object)
{
AQDG_OBJECT *child;
int stretchables=0;
int minWidth;
int selfWidth;
int selfHeight;
int hSpacing;
int borderTop;
int borderBottom;
int num;
selfWidth=AQDG_Object_GetWidth(object);
selfHeight=AQDG_Object_GetHeight(object);
borderTop=AQDG_Object_GetBorderTop(object);
borderBottom=AQDG_Object_GetBorderBottom(object);
hSpacing=AQDG_Object_GetHSpacing(object);
num=AQDG_LayoutObject_CountDirectChildren(object);
if (num) {
AQDG_PLACEMENT_LAYOUT_ELEMENT *elements;
minWidth=AQDG_Object_GetBorderLeft(object);
child=AQDG_Object_Tree2_GetFirstChild(object);
while(child) {
int childWidth;
uint32_t childOpts;
childOpts=AQDG_Object_GetOptions(child);
AQDG_Object_SetRelativeX(child, minWidth);
if (childOpts & AQDG_OBJECT_OPTIONS_FIXEDWIDTH)
childWidth=AQDG_Object_GetWidth(child);
else {
childWidth=AQDG_Object_GetDefaultWidth(child);
AQDG_Object_SetWidth(child, childWidth);
AQDG_LayoutObject_SetChildrenWidths(object);
elements=AQDG_LayoutObject_Children2ElementsX(object, num);
if (elements) {
AQDG_Placement_LayoutAndStretch(elements, num,
AQDG_Object_GetWidth(object),
AQDG_Object_GetBorderLeft(object),
AQDG_Object_GetBorderRight(object),
AQDG_Object_GetHSpacing(object));
AQDG_LayoutObject_ChildrenFromElementsX(object, elements, num);
free(elements);
}
minWidth+=childWidth;
_vAlignChild(child, childOpts, selfHeight, borderTop, borderBottom);
AQDG_LayoutObject_SetChildrenHeights(object);
elements=AQDG_LayoutObject_Children2ElementsY(object, num);
if (elements) {
AQDG_Placement_LayoutSecondaryAxis(elements, num,
AQDG_Object_GetHeight(object),
AQDG_Object_GetBorderTop(object),
AQDG_Object_GetBorderBottom(object));
AQDG_LayoutObject_ChildrenFromElementsY(object, elements, num);
free(elements);
}
if (childOpts & AQDG_OBJECT_OPTIONS_STRETCHX)
stretchables++;
child=AQDG_Object_Tree2_GetNext(child);
if (child)
minWidth+=hSpacing;
}
minWidth+=AQDG_Object_GetBorderRight(object);
if (stretchables && (selfWidth>minWidth))
_hStretchBelow(object, selfWidth, minWidth, hSpacing, stretchables);
return 0;
}
void _vAlignChild(AQDG_OBJECT *child, uint32_t childOpts, int parentHeight, int borderTop, int borderBottom)
{
int childHeight;
int y;
int rawParentHeight;
rawParentHeight=parentHeight-borderTop-borderBottom;
if (childOpts & AQDG_OBJECT_OPTIONS_FIXEDHEIGHT)
childHeight=AQDG_Object_GetHeight(child);
else {
if (childOpts & AQDG_OBJECT_OPTIONS_STRETCHY)
childHeight=rawParentHeight;
else
childHeight=AQDG_Object_GetDefaultHeight(child);
AQDG_Object_SetHeight(child, childHeight);
}
if (childOpts & AQDG_OBJECT_OPTIONS_VALIGNBOTTOM)
y=parentHeight-borderBottom-childHeight;
else if (childOpts & AQDG_OBJECT_OPTIONS_VALIGNCENTER)
y=(rawParentHeight-childHeight)/2;
else
y=borderTop;
AQDG_Object_SetRelativeY(child, y);
}
void _hStretchBelow(AQDG_OBJECT *object, int selfWidth, int minWidth, int hSpacing, int stretchables)
{
AQDG_OBJECT *child;
int diffWidth;
int toAdd;
int pos;
diffWidth=selfWidth-minWidth;
toAdd=diffWidth/stretchables;
pos=AQDG_Object_GetBorderLeft(object);
child=AQDG_Object_Tree2_GetFirstChild(object);
while(child) {
int w;
AQDG_Object_SetRelativeX(child, pos);
w=AQDG_Object_GetWidth(child);
if (AQDG_Object_GetOptions(child) & AQDG_OBJECT_OPTIONS_STRETCHX) {
w+=toAdd;
AQDG_Object_SetWidth(child, w);
}
pos+=w;
child=AQDG_Object_Tree2_GetNext(child);
if (child)
pos+=hSpacing;
} /* while */
}

View File

@@ -61,7 +61,7 @@ AQDG_PLACEMENT_LAYOUT_ELEMENT *AQDG_LayoutObject_Children2ElementsX(const AQDG_O
eptr=elements;
child=AQDG_Object_Tree2_GetFirstChild(object);
while(child && num) {
_setElementFromObjectX(eptr, object);
_setElementFromObjectX(eptr, child);
child=AQDG_Object_Tree2_GetNext(child);
eptr++;
num--;
@@ -88,7 +88,7 @@ AQDG_PLACEMENT_LAYOUT_ELEMENT *AQDG_LayoutObject_Children2ElementsY(const AQDG_O
eptr=elements;
child=AQDG_Object_Tree2_GetFirstChild(object);
while(child && num) {
_setElementFromObjectY(eptr, object);
_setElementFromObjectY(eptr, child);
child=AQDG_Object_Tree2_GetNext(child);
eptr++;
num--;
@@ -140,6 +140,34 @@ void AQDG_LayoutObject_ChildrenFromElementsY(AQDG_OBJECT *object, const AQDG_PLA
void AQDG_LayoutObject_SetChildrenWidths(AQDG_OBJECT *object)
{
AQDG_OBJECT *child;
child=AQDG_Object_Tree2_GetFirstChild(object);
while(child) {
if (!(AQDG_Object_GetOptions(child) & AQDG_OBJECT_OPTIONS_FIXEDWIDTH))
AQDG_Object_SetWidth(child, AQDG_Object_GetDefaultWidth(child));
child=AQDG_Object_Tree2_GetNext(child);
}
}
void AQDG_LayoutObject_SetChildrenHeights(AQDG_OBJECT *object)
{
AQDG_OBJECT *child;
child=AQDG_Object_Tree2_GetFirstChild(object);
while(child) {
if (!(AQDG_Object_GetOptions(child) & AQDG_OBJECT_OPTIONS_FIXEDHEIGHT))
AQDG_Object_SetHeight(child, AQDG_Object_GetDefaultHeight(child));
child=AQDG_Object_Tree2_GetNext(child);
}
}
void _setElementFromObjectX(AQDG_PLACEMENT_LAYOUT_ELEMENT *eptr, const AQDG_OBJECT *object)
{
uint32_t opts;

View File

@@ -23,6 +23,9 @@ AQDG_API AQDG_PLACEMENT_LAYOUT_ELEMENT *AQDG_LayoutObject_Children2ElementsY(con
AQDG_API void AQDG_LayoutObject_ChildrenFromElementsX(AQDG_OBJECT *object, const AQDG_PLACEMENT_LAYOUT_ELEMENT *elements, int num);
AQDG_API void AQDG_LayoutObject_ChildrenFromElementsY(AQDG_OBJECT *object, const AQDG_PLACEMENT_LAYOUT_ELEMENT *elements, int num);
AQDG_API void AQDG_LayoutObject_SetChildrenWidths(AQDG_OBJECT *object);
AQDG_API void AQDG_LayoutObject_SetChildrenHeights(AQDG_OBJECT *object);