From 2561bdcd7db6abaa40f9b719fcf6f58939f16483 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Fri, 24 May 2024 18:34:55 +0200 Subject: [PATCH] more work on drawable object. --- src/lib/aqdiagram/draw/o_drawable.c | 131 ++++++++++++++++++++++++-- src/lib/aqdiagram/draw/o_drawable.h | 14 ++- src/lib/aqdiagram/draw/o_drawable_p.h | 3 + 3 files changed, 136 insertions(+), 12 deletions(-) diff --git a/src/lib/aqdiagram/draw/o_drawable.c b/src/lib/aqdiagram/draw/o_drawable.c index d05f2c8..4d1c125 100644 --- a/src/lib/aqdiagram/draw/o_drawable.c +++ b/src/lib/aqdiagram/draw/o_drawable.c @@ -20,7 +20,9 @@ static GWENHYWFAR_CB void _freeData(void *bp, void *p); -static int _drawFallback(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g); +static int _drawFallback(AQDG_OBJECT *object); +static int _getDefaultWidth(AQDG_OBJECT *object); +static int _getDefaultHeight(AQDG_OBJECT *object); @@ -33,7 +35,7 @@ GWEN_INHERIT(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE); -AQDG_OBJECT *AQDG_DrawableObject_new(AQDG_OBJECT *parent, uint32_t options) +AQDG_OBJECT *AQDG_DrawableObject_new(AQDG_OBJECT *parent, uint32_t options, AQDG_DRAW_CONTEXT *drawContext) { AQDG_OBJECT *object; AQDG_OBJECT_DRAWABLE *xo; @@ -43,8 +45,12 @@ AQDG_OBJECT *AQDG_DrawableObject_new(AQDG_OBJECT *parent, uint32_t options) GWEN_INHERIT_SETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object, xo, _freeData); AQDG_Object_SetOptions(object, options); + xo->drawContext=drawContext; xo->drawFn=_drawFallback; + AQDG_Object_SetGetDefaultWidthFn(object, _getDefaultWidth); + AQDG_Object_SetGetDefaultHeightFn(object, _getDefaultHeight); + if (parent && GWEN_INHERIT_ISOFTYPE(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, parent)) { xo->fontId=AQDG_DrawableObject_GetFontId(parent); xo->foregroundPenId=AQDG_DrawableObject_GetForegroundPenId(parent); @@ -69,6 +75,19 @@ GWENHYWFAR_CB void _freeData(void *bp, void *p) +AQDG_DRAW_CONTEXT *AQDG_DrawableObject_GetDrawContext(const AQDG_OBJECT *object) +{ + if (object) { + AQDG_OBJECT_DRAWABLE *xo; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); + return xo?xo->drawContext:NULL; + } + return NULL; +} + + + int AQDG_DrawableObject_GetFontId(const AQDG_OBJECT *object) { if (object) { @@ -88,8 +107,14 @@ void AQDG_DrawableObject_SetFontId(AQDG_OBJECT *object, int i) AQDG_OBJECT_DRAWABLE *xo; xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); - if (xo) - xo->fontId=i; + if (xo) { + if (xo->fontId!=i) { + xo->fontId=i; + AQDG_Object_ModifyBranchFlagsUp(object, + AQDG_OBJECT_FLAGS_LAYOUT | AQDG_OBJECT_FLAGS_DRAW, + AQDG_OBJECT_FLAGS_LAYOUT | AQDG_OBJECT_FLAGS_DRAW); + } + } } } @@ -169,12 +194,72 @@ void AQDG_DrawableObject_SetText(AQDG_OBJECT *object, const char *s) if (xo) { free(xo->text); xo->text=s?strdup(s):NULL; + AQDG_Object_ModifyBranchFlagsUp(object, + AQDG_OBJECT_FLAGS_LAYOUT | AQDG_OBJECT_FLAGS_DRAW, + AQDG_OBJECT_FLAGS_LAYOUT | AQDG_OBJECT_FLAGS_DRAW); } } } +int AQDG_DrawableObject_GetContentWidth(const AQDG_OBJECT *object) +{ + if (object) { + AQDG_OBJECT_DRAWABLE *xo; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); + return xo?xo->contentWidth:0; + } + return 0; +} + + + +void AQDG_DrawableObject_SetContentWidth(AQDG_OBJECT *object, int i) +{ + if (object) { + AQDG_OBJECT_DRAWABLE *xo; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); + if (xo) { + xo->contentWidth=i; + AQDG_Object_ModifyBranchFlagsUp(object, AQDG_OBJECT_FLAGS_LAYOUT, AQDG_OBJECT_FLAGS_LAYOUT); + } + } +} + + + +int AQDG_DrawableObject_GetContentHeight(const AQDG_OBJECT *object) +{ + if (object) { + AQDG_OBJECT_DRAWABLE *xo; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); + return xo?xo->contentHeight:0; + } + return 0; +} + + + +void AQDG_DrawableObject_SetContentHeight(AQDG_OBJECT *object, int i) +{ + if (object) { + AQDG_OBJECT_DRAWABLE *xo; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); + if (xo) { + xo->contentHeight=i; + AQDG_Object_ModifyBranchFlagsUp(object, AQDG_OBJECT_FLAGS_LAYOUT, AQDG_OBJECT_FLAGS_LAYOUT); + } + } +} + + + + AQDG_OBJECT_DRAWABLE_DRAW_FN AQDG_DrawableObject_SetDrawFn(AQDG_OBJECT *object, AQDG_OBJECT_DRAWABLE_DRAW_FN fn) { if (object) { @@ -195,21 +280,22 @@ AQDG_OBJECT_DRAWABLE_DRAW_FN AQDG_DrawableObject_SetDrawFn(AQDG_OBJECT *object, -int AQDG_DrawableObject_Draw(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g) +int AQDG_DrawableObject_Draw(AQDG_OBJECT *object) { if (object) { AQDG_OBJECT_DRAWABLE *xo; xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); if (xo && xo->drawFn) - return xo->drawFn(object, g); + return xo->drawFn(object); } + AQDG_Object_SubFlags(object, AQDG_OBJECT_FLAGS_DRAW); return 0; } -int _drawFallback(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g) +int _drawFallback(AQDG_OBJECT *object) { AQDG_OBJECT_DRAWABLE *xo; @@ -217,7 +303,7 @@ int _drawFallback(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g) if (xo) { AQDG_OBJECT *child; - AQDG_Draw_Context_DrawFilledRect(g, + AQDG_Draw_Context_DrawFilledRect(xo->drawContext, xo->backgroundPenId, AQDG_Object_GetAbsoluteX(object), AQDG_Object_GetAbsoluteY(object), @@ -225,9 +311,10 @@ int _drawFallback(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g) AQDG_Object_GetHeight(object)); child=AQDG_Object_Tree2_GetFirstChild(object); while(child) { - AQDG_DrawableObject_Draw(child, g); + AQDG_DrawableObject_Draw(child); child=AQDG_Object_Tree2_GetNext(child); } + AQDG_Object_SubFlags(object, AQDG_OBJECT_FLAGS_DRAW); return 1; } return 0; @@ -235,6 +322,32 @@ int _drawFallback(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g) +int _getDefaultWidth(AQDG_OBJECT *object) +{ + AQDG_OBJECT_DRAWABLE *xo; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); + if (xo) { + return xo->contentWidth; + } + return 1; +} + + + +int _getDefaultHeight(AQDG_OBJECT *object) +{ + AQDG_OBJECT_DRAWABLE *xo; + + xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); + if (xo) { + return xo->contentHeight; + } + return 1; +} + + + diff --git a/src/lib/aqdiagram/draw/o_drawable.h b/src/lib/aqdiagram/draw/o_drawable.h index 0754111..8da0353 100644 --- a/src/lib/aqdiagram/draw/o_drawable.h +++ b/src/lib/aqdiagram/draw/o_drawable.h @@ -15,11 +15,13 @@ #include -typedef int (*AQDG_OBJECT_DRAWABLE_DRAW_FN)(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g); +typedef int (*AQDG_OBJECT_DRAWABLE_DRAW_FN)(AQDG_OBJECT *object); -AQDG_API AQDG_OBJECT *AQDG_DrawableObject_new(AQDG_OBJECT *parent, uint32_t options); +AQDG_API AQDG_OBJECT *AQDG_DrawableObject_new(AQDG_OBJECT *parent, uint32_t options, AQDG_DRAW_CONTEXT *drawContext); + +AQDG_API AQDG_DRAW_CONTEXT *AQDG_DrawableObject_GetDrawContext(const AQDG_OBJECT *object); AQDG_API int AQDG_DrawableObject_GetFontId(const AQDG_OBJECT *object); AQDG_API void AQDG_DrawableObject_SetFontId(AQDG_OBJECT *object, int i); @@ -33,10 +35,16 @@ AQDG_API void AQDG_DrawableObject_SetBackgroundPenId(AQDG_OBJECT *object, int i) AQDG_API const char *AQDG_DrawableObject_GetText(const AQDG_OBJECT *object); AQDG_API void AQDG_DrawableObject_SetText(AQDG_OBJECT *object, const char *s); +AQDG_API int AQDG_DrawableObject_GetContentWidth(const AQDG_OBJECT *object); +AQDG_API void AQDG_DrawableObject_SetContentWidth(AQDG_OBJECT *object, int i); + +AQDG_API int AQDG_DrawableObject_GetContentHeight(const AQDG_OBJECT *object); +AQDG_API void AQDG_DrawableObject_SetContentHeight(AQDG_OBJECT *object, int i); + AQDG_API AQDG_OBJECT_DRAWABLE_DRAW_FN AQDG_DrawableObject_SetDrawFn(AQDG_OBJECT *object, AQDG_OBJECT_DRAWABLE_DRAW_FN fn); -AQDG_API int AQDG_DrawableObject_Draw(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g); +AQDG_API int AQDG_DrawableObject_Draw(AQDG_OBJECT *object); #endif diff --git a/src/lib/aqdiagram/draw/o_drawable_p.h b/src/lib/aqdiagram/draw/o_drawable_p.h index 677ceb6..e79c126 100644 --- a/src/lib/aqdiagram/draw/o_drawable_p.h +++ b/src/lib/aqdiagram/draw/o_drawable_p.h @@ -14,11 +14,14 @@ typedef struct AQDG_OBJECT_DRAWABLE AQDG_OBJECT_DRAWABLE; struct AQDG_OBJECT_DRAWABLE { + AQDG_DRAW_CONTEXT *drawContext; int fontId; int foregroundPenId; int backgroundPenId; char *text; + int contentWidth; + int contentHeight; AQDG_OBJECT_DRAWABLE_DRAW_FN drawFn; };