diff --git a/src/lib/aqdiagram/draw/context_cairo.c b/src/lib/aqdiagram/draw/context_cairo.c index 5e9ed6e..4f82bdc 100644 --- a/src/lib/aqdiagram/draw/context_cairo.c +++ b/src/lib/aqdiagram/draw/context_cairo.c @@ -431,7 +431,7 @@ int _drawText(AQDG_DRAW_CONTEXT *g, int penId, int fontId, int direction, int x, AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_FONT *font; AQDG_DRAW_PEN *pen; - cairo_font_extents_t extents; + cairo_text_extents_t te; xg=_ensureFullCairoContext(g); if (xg==NULL) { @@ -456,10 +456,11 @@ int _drawText(AQDG_DRAW_CONTEXT *g, int penId, int fontId, int direction, int x, } _setFont(xg->cr, font); - cairo_font_extents(xg->cr, &extents); + cairo_text_extents(xg->cr, text, &te); /* TODO: translate pos and rotate according to given direction (use cairo_save and cairo_restore) */ - cairo_move_to(xg->cr, x, y+extents.ascent); + /*DBG_ERROR(NULL, "te.x_bearing=%f, te.y_bearing=%f", te.x_bearing, te.y_bearing);*/ + cairo_move_to(xg->cr, x, y-te.y_bearing); cairo_show_text(xg->cr, text); return 0; diff --git a/src/lib/aqdiagram/draw/w_drawable.c b/src/lib/aqdiagram/draw/w_drawable.c index 61a63ba..766b50b 100644 --- a/src/lib/aqdiagram/draw/w_drawable.c +++ b/src/lib/aqdiagram/draw/w_drawable.c @@ -269,7 +269,7 @@ int AQDG_DrawableWidget_DrawBackground(AQDG_OBJECT *object) xo=GWEN_INHERIT_GETDATA(AQDG_OBJECT, AQDG_OBJECT_DRAWABLE, object); if (xo) { - DBG_ERROR(NULL, "Drawing with pen %d to %d/%d %d/%d", + DBG_ERROR(NULL, "Drawing background with pen %d to %d/%d %d/%d", xo->backgroundPenId, AQDG_Object_GetAbsoluteX(object), AQDG_Object_GetAbsoluteY(object), diff --git a/src/lib/aqdiagram/draw/w_label.c b/src/lib/aqdiagram/draw/w_label.c index 9ab7585..8170946 100644 --- a/src/lib/aqdiagram/draw/w_label.c +++ b/src/lib/aqdiagram/draw/w_label.c @@ -37,7 +37,7 @@ static int _calcYPos(AQDG_OBJECT *object, uint32_t opts, int th); -AQDG_OBJECT *AQDG_LabelWidget_new(AQDG_OBJECT *parent, uint32_t options, AQDG_DRAW_CONTEXT *drawContext) +AQDG_OBJECT *AQDG_LabelWidget_new(AQDG_OBJECT *parent, uint32_t options, AQDG_DRAW_CONTEXT *drawContext, const char *text) { AQDG_OBJECT *object; @@ -45,6 +45,8 @@ AQDG_OBJECT *AQDG_LabelWidget_new(AQDG_OBJECT *parent, uint32_t options, AQDG_DR AQDG_Object_SetOptions(object, options); AQDG_Object_SetCalcContentDimsFn(object, _calcContentDims); AQDG_DrawableWidget_SetDrawFn(object, _draw); + if (text) + AQDG_DrawableWidget_SetText(object, text); return object; } @@ -123,29 +125,32 @@ int _calcYPos(AQDG_OBJECT *object, uint32_t opts, int th) { int y; int h; + int oh=AQDG_Object_GetHeight(object); + int borderBottom=AQDG_Object_GetBorderBottom(object); + int borderTop=AQDG_Object_GetBorderTop(object); - h=AQDG_Object_GetHeight(object)-AQDG_Object_GetBorderTop(object)-AQDG_Object_GetBorderBottom(object); + h=oh-(borderTop+borderBottom); if (h<0) { DBG_ERROR(NULL, "Height smaller than borders (%d)", h); - return AQDG_Object_GetBorderTop(object); + return borderTop; } if (opts & AQDG_DRAWABLE_OPTIONS_JUSTIFY_BOTTOM) { /* bottom */ - y=(h-th)+AQDG_Object_GetBorderTop(object); + y=borderTop+(h-th); } else if (opts & AQDG_DRAWABLE_OPTIONS_JUSTIFY_VCENTER) { /* vcenter */ - y=((h-th)/2)+AQDG_Object_GetBorderTop(object); + y=borderTop+((h-th)/2); } else { /* top */ - y=AQDG_Object_GetBorderTop(object); + y=borderTop; } - if (y -AQDG_API AQDG_OBJECT *AQDG_LabelWidget_new(AQDG_OBJECT *parent, uint32_t options, AQDG_DRAW_CONTEXT *drawContext); +AQDG_API AQDG_OBJECT *AQDG_LabelWidget_new(AQDG_OBJECT *parent, uint32_t options, AQDG_DRAW_CONTEXT *drawContext, const char *text); diff --git a/src/lib/aqdiagram/libtest.c b/src/lib/aqdiagram/libtest.c index cbf5160..3c48148 100644 --- a/src/lib/aqdiagram/libtest.c +++ b/src/lib/aqdiagram/libtest.c @@ -23,6 +23,16 @@ #include +#define COLOUR1 0x00000000 +#define COLOUR2 0xff000000 +#define COLOUR3 0x0000ff00 +#define COLOUR4 0x00ff0000 +#define COLOUR5 0xffec5b00 +#define COLOUR6 0xc0c0c000 +#define COLOUR7 0xffffff00 + + + int test1(int argc, char **argv) { AQDG_DRAW_CONTEXT *dc; @@ -32,9 +42,15 @@ int test1(int argc, char **argv) dc=AQDG_Draw_ContextCairo_Png_new("/tmp/test.png", 640, 480); rootObject=AQDG_HLayoutWidget_new(NULL, AQDG_OBJECT_OPTIONS_STRETCHX | AQDG_OBJECT_OPTIONS_STRETCHY, dc); + AQDG_Object_SetBorderLeft(rootObject, 5); + AQDG_Object_SetBorderRight(rootObject, 5); + AQDG_Object_SetBorderTop(rootObject, 5); + AQDG_Object_SetBorderBottom(rootObject, 5); + AQDG_Object_SetHSpacing(rootObject, 4); + AQDG_Object_SetVSpacing(rootObject, 4); AQDG_Object_SetWidth(rootObject, 640); AQDG_Object_SetHeight(rootObject, 480); - rv=AQDG_Draw_Context_PenCreate(dc, 0xffec5b00, 1, AQDG_Dash_None); + rv=AQDG_Draw_Context_PenCreate(dc, COLOUR2, 1, AQDG_Dash_None); if (rv<0) { DBG_ERROR(NULL, "Error creating pen (%d)", rv); return 2; @@ -42,7 +58,7 @@ int test1(int argc, char **argv) DBG_ERROR(NULL, "Background pen: %d", rv); AQDG_DrawableWidget_SetBackgroundPenId(rootObject, rv); - rv=AQDG_Draw_Context_PenCreate(dc, 0xff000000, 1, AQDG_Dash_None); + rv=AQDG_Draw_Context_PenCreate(dc, COLOUR1, 1, AQDG_Dash_None); if (rv<0) { DBG_ERROR(NULL, "Error creating pen (%d)", rv); return 2; @@ -59,9 +75,8 @@ int test1(int argc, char **argv) o=AQDG_LabelWidget_new(rootObject, AQDG_OBJECT_OPTIONS_VALIGNCENTER|AQDG_OBJECT_OPTIONS_STRETCHY | AQDG_DRAWABLE_OPTIONS_JUSTIFY_VCENTER, - dc); - AQDG_DrawableWidget_SetText(o, "First Label"); - rv=AQDG_Draw_Context_PenCreate(dc, 0x80ec5b00, 1, AQDG_Dash_None); + dc, "First Label"); + rv=AQDG_Draw_Context_PenCreate(dc, COLOUR3, 1, AQDG_Dash_None); if (rv<0) { DBG_ERROR(NULL, "Error creating pen (%d)", rv); return 2; @@ -69,8 +84,20 @@ int test1(int argc, char **argv) DBG_ERROR(NULL, "Background pen: %d", rv); AQDG_DrawableWidget_SetBackgroundPenId(o, rv); - o=AQDG_LabelWidget_new(rootObject, 0, dc); - AQDG_DrawableWidget_SetText(o, "Second Label"); + o=AQDG_LabelWidget_new(rootObject, 0, dc, "Second Label"); + rv=AQDG_Draw_Context_PenCreate(dc, COLOUR4, 1, AQDG_Dash_None); + if (rv<0) { + DBG_ERROR(NULL, "Error creating pen (%d)", rv); + return 2; + } + DBG_ERROR(NULL, "Background pen: %d", rv); + AQDG_DrawableWidget_SetBackgroundPenId(o, rv); + rv=AQDG_Draw_Context_FontCreate(dc, "", 24, AQDG_Slant_None, AQDG_Weight_None); + if (rv<0) { + DBG_ERROR(NULL, "Error creating font (%d)", rv); + return 2; + } + AQDG_DrawableWidget_SetFontId(o, rv); DBG_ERROR(NULL, "Layout"); rv=AQDG_Object_Layout(rootObject); @@ -81,6 +108,8 @@ int test1(int argc, char **argv) DBG_ERROR(NULL, "CalcAbs"); AQDG_Object_Tree2_CalculateAbsPositions(rootObject); + AQDG_Object_Dump(rootObject, 2); + DBG_ERROR(NULL, "Draw"); rv=AQDG_DrawableWidget_Draw(rootObject); if (rv<0) { diff --git a/src/lib/aqdiagram/placement/layout.c b/src/lib/aqdiagram/placement/layout.c index b265223..e51cc75 100644 --- a/src/lib/aqdiagram/placement/layout.c +++ b/src/lib/aqdiagram/placement/layout.c @@ -12,6 +12,8 @@ #include "./layout.h" +#include + static int _getSumOfElementWidths(const AQDG_PLACEMENT_LAYOUT_ELEMENT *ptrElements, int numElements); static int _getStretchableElements(const AQDG_PLACEMENT_LAYOUT_ELEMENT *ptrElements, int numElements); diff --git a/src/lib/aqdiagram/placement/object.xml b/src/lib/aqdiagram/placement/object.xml index 250fe67..e879673 100644 --- a/src/lib/aqdiagram/placement/object.xml +++ b/src/lib/aqdiagram/placement/object.xml @@ -136,8 +136,10 @@ $(struct_type) *child; \n \n parent=$(struct_prefix)_Tree2_GetParent(object); \n - if (parent) \n + if (parent){ \n object->absoluteX=parent->absoluteX + object->relativeX; \n + object->absoluteY=parent->absoluteY + object->relativeY; \n + } \n child=$(struct_prefix)_Tree2_GetFirstChild(object); \n while(child) { \n $(struct_prefix)_Tree2_CalculateAbsPositions(child); \n @@ -147,6 +149,57 @@ } \n + + + + + $(api) void $(struct_prefix)_Dump(const $(struct_type) *object, int indent); + + + + + + void $(struct_prefix)_Dump(const $(struct_type) *object, int indent) \n + { \n + if (object) { \n + $(struct_type) *child; \n + int i; \n + \n + for(i=0; i<indent; i++) \n + fprintf(stderr, " "); \n + fprintf(stderr, "- Object:\\n"); \n + for(i=0; i<indent+2; i++) \n + fprintf(stderr, " "); \n + fprintf(stderr, "absX=%d, absY=%d, relX=%d, relY=%d\\n", \n + object->absoluteX, object->absoluteY, \n + object->relativeX, object->relativeY); \n + for(i=0; i<indent+2; i++) \n + fprintf(stderr, " "); \n + fprintf(stderr, "width=%d, height=%d\\n", \n + object->width, object->height); \n + for(i=0; i<indent+2; i++) \n + fprintf(stderr, " "); \n + fprintf(stderr, "left=%d, right=%d, top=%d, bottom=%d\\n", \n + object->borderLeft, \n + object->borderRight, \n + object->borderTop, \n + object->borderBottom); \n + for(i=0; i<indent+2; i++) \n + fprintf(stderr, " "); \n + fprintf(stderr, \n + "hSpacing=%d, vSpacing=%d, contWidth=%d, contWidthHeight=%d\\n",\n + object->hSpacing, object->vSpacing, \n + object->contentWidth, object->contentHeight); \n + \n + child=$(struct_prefix)_Tree2_GetFirstChild(object); \n + while(child) { \n + $(struct_prefix)_Dump(child, indent+2); \n + child=$(struct_prefix)_Tree2_GetNext(child); \n + } \n + } \n + } \n + +