more work on drawable object.

This commit is contained in:
Martin Preuss
2024-05-24 18:34:55 +02:00
parent 08a4d24732
commit 2561bdcd7d
3 changed files with 136 additions and 12 deletions

View File

@@ -20,7 +20,9 @@
static GWENHYWFAR_CB void _freeData(void *bp, void *p); 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 *object;
AQDG_OBJECT_DRAWABLE *xo; 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); GWEN_INHERIT_SETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object, xo, _freeData);
AQDG_Object_SetOptions(object, options); AQDG_Object_SetOptions(object, options);
xo->drawContext=drawContext;
xo->drawFn=_drawFallback; xo->drawFn=_drawFallback;
AQDG_Object_SetGetDefaultWidthFn(object, _getDefaultWidth);
AQDG_Object_SetGetDefaultHeightFn(object, _getDefaultHeight);
if (parent && GWEN_INHERIT_ISOFTYPE(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, parent)) { if (parent && GWEN_INHERIT_ISOFTYPE(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, parent)) {
xo->fontId=AQDG_DrawableObject_GetFontId(parent); xo->fontId=AQDG_DrawableObject_GetFontId(parent);
xo->foregroundPenId=AQDG_DrawableObject_GetForegroundPenId(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) int AQDG_DrawableObject_GetFontId(const AQDG_OBJECT *object)
{ {
if (object) { if (object) {
@@ -88,8 +107,14 @@ void AQDG_DrawableObject_SetFontId(AQDG_OBJECT *object, int i)
AQDG_OBJECT_DRAWABLE *xo; AQDG_OBJECT_DRAWABLE *xo;
xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object);
if (xo) if (xo) {
if (xo->fontId!=i) {
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) { if (xo) {
free(xo->text); free(xo->text);
xo->text=s?strdup(s):NULL; 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) AQDG_OBJECT_DRAWABLE_DRAW_FN AQDG_DrawableObject_SetDrawFn(AQDG_OBJECT *object, AQDG_OBJECT_DRAWABLE_DRAW_FN fn)
{ {
if (object) { 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) { if (object) {
AQDG_OBJECT_DRAWABLE *xo; AQDG_OBJECT_DRAWABLE *xo;
xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object);
if (xo && xo->drawFn) if (xo && xo->drawFn)
return xo->drawFn(object, g); return xo->drawFn(object);
} }
AQDG_Object_SubFlags(object, AQDG_OBJECT_FLAGS_DRAW);
return 0; return 0;
} }
int _drawFallback(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g) int _drawFallback(AQDG_OBJECT *object)
{ {
AQDG_OBJECT_DRAWABLE *xo; AQDG_OBJECT_DRAWABLE *xo;
@@ -217,7 +303,7 @@ int _drawFallback(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g)
if (xo) { if (xo) {
AQDG_OBJECT *child; AQDG_OBJECT *child;
AQDG_Draw_Context_DrawFilledRect(g, AQDG_Draw_Context_DrawFilledRect(xo->drawContext,
xo->backgroundPenId, xo->backgroundPenId,
AQDG_Object_GetAbsoluteX(object), AQDG_Object_GetAbsoluteX(object),
AQDG_Object_GetAbsoluteY(object), AQDG_Object_GetAbsoluteY(object),
@@ -225,9 +311,10 @@ int _drawFallback(AQDG_OBJECT *object, AQDG_DRAW_CONTEXT *g)
AQDG_Object_GetHeight(object)); AQDG_Object_GetHeight(object));
child=AQDG_Object_Tree2_GetFirstChild(object); child=AQDG_Object_Tree2_GetFirstChild(object);
while(child) { while(child) {
AQDG_DrawableObject_Draw(child, g); AQDG_DrawableObject_Draw(child);
child=AQDG_Object_Tree2_GetNext(child); child=AQDG_Object_Tree2_GetNext(child);
} }
AQDG_Object_SubFlags(object, AQDG_OBJECT_FLAGS_DRAW);
return 1; return 1;
} }
return 0; 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;
}

View File

@@ -15,11 +15,13 @@
#include <aqdiagram/draw/context.h> #include <aqdiagram/draw/context.h>
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 int AQDG_DrawableObject_GetFontId(const AQDG_OBJECT *object);
AQDG_API void AQDG_DrawableObject_SetFontId(AQDG_OBJECT *object, int i); 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 const char *AQDG_DrawableObject_GetText(const AQDG_OBJECT *object);
AQDG_API void AQDG_DrawableObject_SetText(AQDG_OBJECT *object, const char *s); 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 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 #endif

View File

@@ -14,11 +14,14 @@
typedef struct AQDG_OBJECT_DRAWABLE AQDG_OBJECT_DRAWABLE; typedef struct AQDG_OBJECT_DRAWABLE AQDG_OBJECT_DRAWABLE;
struct AQDG_OBJECT_DRAWABLE { struct AQDG_OBJECT_DRAWABLE {
AQDG_DRAW_CONTEXT *drawContext;
int fontId; int fontId;
int foregroundPenId; int foregroundPenId;
int backgroundPenId; int backgroundPenId;
char *text; char *text;
int contentWidth;
int contentHeight;
AQDG_OBJECT_DRAWABLE_DRAW_FN drawFn; AQDG_OBJECT_DRAWABLE_DRAW_FN drawFn;
}; };