From 97bdcb5bfff28f7fa6ad5023c464f8a6f2eadb30 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Thu, 25 Sep 2025 23:27:50 +0200 Subject: [PATCH] more code sharing. --- src/lib/aqdiagram/graph/w_axis.c | 94 +++++++++++++++++++++++++++++- src/lib/aqdiagram/graph/w_axis.h | 7 ++- src/lib/aqdiagram/graph/w_axis_p.h | 2 + src/lib/aqdiagram/graph/w_xaxis.c | 4 +- src/lib/aqdiagram/graph/w_yaxis.c | 43 ++++++++++---- 5 files changed, 134 insertions(+), 16 deletions(-) diff --git a/src/lib/aqdiagram/graph/w_axis.c b/src/lib/aqdiagram/graph/w_axis.c index 35c0503..b0c2ffe 100644 --- a/src/lib/aqdiagram/graph/w_axis.c +++ b/src/lib/aqdiagram/graph/w_axis.c @@ -18,6 +18,15 @@ +/* ------------------------------------------------------------------------------------------------ + * defines + * ------------------------------------------------------------------------------------------------ + */ + +#define AQDG_AXISWIDGET_SCALESIZE 10 + + + /* ------------------------------------------------------------------------------------------------ * forward declarations * ------------------------------------------------------------------------------------------------ @@ -27,7 +36,8 @@ static GWENHYWFAR_CB void _freeData(void *bp, void *p); static void _setupObjectTree(AQDG_OBJECT *o); static void _createTickLabelsForLevel(AQDG_OBJECT *o, AQDG_GRAPH *graph, const AQDG_GRAPH_TICK_LIST *tickList, int level); -static int _doesCollideWithChildren(const AQDG_OBJECT *object, const AQDG_OBJECT *newObject); +static int _hasLabelCollisions(const AQDG_OBJECT *o); +static int _hideEverySecondLabel(AQDG_OBJECT *o); @@ -53,6 +63,9 @@ AQDG_OBJECT *AQDG_AxisWidget_new(AQDG_OBJECT *parent, uint32_t options, AQDG_OBJ xo->graphObject=graphObject; xo->axisIndex=axisIndex; + /* set defaults */ + xo->scaleSize=AQDG_AXISWIDGET_SCALESIZE; + _setupObjectTree(o); return o; @@ -149,6 +162,46 @@ void AQDG_AxisWidget_SetMaxValue(AQDG_OBJECT *o, double v) +int AQDG_AxisWidget_GetScaleSize(const AQDG_OBJECT *o) +{ + if (o) { + AQDG_WIDGET_AXIS *xo; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_WIDGET_AXIS, o); + return xo?xo->scaleSize:0; + } + return 0; +} + + + +void AQDG_AxisWidget_SetScaleSize(AQDG_OBJECT *o, int i) +{ + if (o) { + AQDG_WIDGET_AXIS *xo; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_WIDGET_AXIS, o); + if (xo) + xo->scaleSize=i; + } +} + + + +void AQDG_AxisWidget_HideCollidingChildren(AQDG_OBJECT *o) +{ + int doRun=1; + + while(doRun) { + if (_hasLabelCollisions(o)) + doRun=(_hideEverySecondLabel(o)<0)?0:1; + else + doRun=0; + } +} + + + void _setupObjectTree(AQDG_OBJECT *o) @@ -228,7 +281,7 @@ void _createTickLabelsForLevel(AQDG_OBJECT *o, AQDG_GRAPH *graph, const AQDG_GRA -int AQDG_AxisWidget_DoesCollideWithOtherChildren(const AQDG_OBJECT *object, const AQDG_OBJECT *newObject) +int _doesCollideWithOtherChildren(const AQDG_OBJECT *object, const AQDG_OBJECT *newObject) { AQDG_OBJECT *child; int xLeft; @@ -274,6 +327,43 @@ int AQDG_AxisWidget_DoesCollideWithOtherChildren(const AQDG_OBJECT *object, cons +int _hasLabelCollisions(const AQDG_OBJECT *o) +{ + AQDG_OBJECT *child; + + /* align left */ + child=AQDG_Object_Tree2_GetFirstChild(o); + while(child) { + if (!(AQDG_Object_GetFlags(child) & AQDG_OBJECT_FLAGS_HIDDEN)) { + if (_doesCollideWithOtherChildren(o, child)) + return 1; + } + child=AQDG_Object_Tree2_GetNext(child); + } + return 0; +} + + + +int _hideEverySecondLabel(AQDG_OBJECT *o) +{ + AQDG_OBJECT *child; + int hadVisibleChildren=0; + + child=AQDG_DrawableWidget_GetFirstVisibleChild(o); + while(child) { + child=AQDG_DrawableWidget_GetNextVisibleWidget(child); /* skip current */ + if (child) { + hadVisibleChildren=1; + AQDG_Object_AddFlags(child, AQDG_OBJECT_FLAGS_HIDDEN); + } + child=AQDG_DrawableWidget_GetNextVisibleWidget(child); + } + return hadVisibleChildren?0:GWEN_ERROR_NOT_FOUND; +} + + + diff --git a/src/lib/aqdiagram/graph/w_axis.h b/src/lib/aqdiagram/graph/w_axis.h index 8ff6a8a..66a9790 100644 --- a/src/lib/aqdiagram/graph/w_axis.h +++ b/src/lib/aqdiagram/graph/w_axis.h @@ -24,7 +24,12 @@ AQDG_API void AQDG_AxisWidget_SetMinValue(AQDG_OBJECT *o, double v); AQDG_API double AQDG_AxisWidget_GetMaxValue(const AQDG_OBJECT *o); AQDG_API void AQDG_AxisWidget_SetMaxValue(AQDG_OBJECT *o, double v); -AQDG_API int AQDG_AxisWidget_DoesCollideWithOtherChildren(const AQDG_OBJECT *object, const AQDG_OBJECT *newObject); +AQDG_API int AQDG_AxisWidget_GetScaleSize(const AQDG_OBJECT *o); +AQDG_API void AQDG_AxisWidget_SetScaleSize(AQDG_OBJECT *o, int i); + + +AQDG_API void AQDG_AxisWidget_HideCollidingChildren(AQDG_OBJECT *o); +AQDG_API void AQDG_AxisWidget_UnhideAllChildren(AQDG_OBJECT *o); diff --git a/src/lib/aqdiagram/graph/w_axis_p.h b/src/lib/aqdiagram/graph/w_axis_p.h index b19011b..0c969c5 100644 --- a/src/lib/aqdiagram/graph/w_axis_p.h +++ b/src/lib/aqdiagram/graph/w_axis_p.h @@ -18,6 +18,8 @@ struct AQDG_WIDGET_AXIS { int axisIndex; double minValue; double maxValue; + + int scaleSize; }; diff --git a/src/lib/aqdiagram/graph/w_xaxis.c b/src/lib/aqdiagram/graph/w_xaxis.c index dbded79..bbe4f16 100644 --- a/src/lib/aqdiagram/graph/w_xaxis.c +++ b/src/lib/aqdiagram/graph/w_xaxis.c @@ -110,7 +110,7 @@ void _setChildrenRelY(AQDG_OBJECT *o) AQDG_OBJECT *child; int borderSize; - borderSize=AQDG_Object_GetBorderTop(o); + borderSize=AQDG_Object_GetBorderTop(o)+AQDG_AxisWidget_GetScaleSize(o); /* align left */ child=AQDG_Object_Tree2_GetFirstChild(o); while(child) { @@ -123,7 +123,7 @@ void _setChildrenRelY(AQDG_OBJECT *o) int borderSize; /* align right */ - borderSize=AQDG_Object_GetBorderBottom(o); + borderSize=AQDG_Object_GetBorderBottom(o)+AQDG_AxisWidget_GetScaleSize(o); child=AQDG_Object_Tree2_GetFirstChild(o); while(child) { int pos; diff --git a/src/lib/aqdiagram/graph/w_yaxis.c b/src/lib/aqdiagram/graph/w_yaxis.c index 878e217..31b2381 100644 --- a/src/lib/aqdiagram/graph/w_yaxis.c +++ b/src/lib/aqdiagram/graph/w_yaxis.c @@ -25,6 +25,8 @@ static int _calcContentDims(AQDG_OBJECT *object); static int _layout(AQDG_OBJECT *object); +static void _setChildrenRelX(AQDG_OBJECT *o); +static void _setChildrenRelYFromValue(AQDG_OBJECT *o); static int _calcVerticalPos(double value, int contentSize, int borderSize, double minValue, double maxValue); @@ -49,22 +51,41 @@ AQDG_OBJECT *AQDG_YAxisWidget_new(AQDG_OBJECT *parent, uint32_t options, AQDG_OB -int _calcContentDims(AQDG_OBJECT *object) +int _calcContentDims(AQDG_OBJECT *o) { - /* TODO - * - get axis - * - get ticks - * - calc max height of tick labels - * - add size of axis line + tick lines + spacing - */ + AQDG_OBJECT *child; + int w=0; + int h=1; + + /* get max label width */ + child=AQDG_Object_Tree2_GetFirstChild(o); + while(child) { + int i; + + i=AQDG_Object_GetWidth(child); + w=(i>w)?i:w; + child=AQDG_Object_Tree2_GetNext(child); + } + + /* add space for scale, left border and right border */ + w+=AQDG_AxisWidget_GetScaleSize(o); + w+=AQDG_Object_GetBorderLeft(o)+AQDG_Object_GetBorderRight(o); + + AQDG_Object_SetContentWidth(o, w); + AQDG_Object_SetContentHeight(o, h); + return 1; } -int _layout(AQDG_OBJECT *object) +int _layout(AQDG_OBJECT *o) { - /* TODO */ + _setChildrenRelX(o); + _setChildrenRelYFromValue(o); + AQDG_DrawableWidget_UnhideAllChildren(o); + AQDG_AxisWidget_HideCollidingChildren(o); + return 1; } @@ -80,7 +101,7 @@ void _setChildrenRelX(AQDG_OBJECT *o) AQDG_OBJECT *child; int borderSize; - borderSize=AQDG_Object_GetBorderLeft(o); + borderSize=AQDG_Object_GetBorderLeft(o)+AQDG_AxisWidget_GetScaleSize(o); /* align left */ child=AQDG_Object_Tree2_GetFirstChild(o); while(child) { @@ -93,7 +114,7 @@ void _setChildrenRelX(AQDG_OBJECT *o) int borderSize; /* align right */ - borderSize=AQDG_Object_GetBorderRight(o); + borderSize=AQDG_Object_GetBorderRight(o)+AQDG_AxisWidget_GetScaleSize(o); child=AQDG_Object_Tree2_GetFirstChild(o); while(child) { int pos;