clay/src/debug.c
Gwendolyn d89ef83551 Reworked property system completely.
Properties can now have values of different types, and they are registered with their name, either to a layout class or globally.
Layout classes are also registered with their name.
2023-02-08 01:09:21 +01:00

105 lines
4.3 KiB
C

#include <inttypes.h>
#include "clay.h"
#include "layout.h"
static size_t stringify_prop_value(struct clay_prop_val_s val, clay_prop_definition propdef, char *out, size_t max_len);
static void stringify_prop_values(clay_prop_vals_const vals, clay_prop_definition propdef, char *out, size_t max_len);
#define DEBUG_MAX_PROP_STR_LEN 2047
void clay_print_layout_tree(clay doc) {
clay_prop_map props = clay_layout_get_properties(doc);
int depth = 0;
for (clay cur = doc->parent; cur != NULL; cur = cur->parent, depth++);
int indent = depth * 4;
printf("%*s<%s>:\n", indent, "", clay_ctx_get_layout_class_name(doc->ctx, doc->class));
char *prop_string = malloc(DEBUG_MAX_PROP_STR_LEN + 1);
CLAY_MAP_FOREACH(props, prop_name, prop_val_ptr) {
const clay_prop_definition *propdef = clay_ctx_get_property_definition(doc->ctx, doc->class,
prop_name);
stringify_prop_values(prop_val_ptr->values, *propdef, prop_string, DEBUG_MAX_PROP_STR_LEN);
if (prop_val_ptr->inheritance_level == 0) {
printf("%*s %s: %s\n", indent, "", prop_name, prop_string);
} else {
printf("%*s [%s]: %s\n", indent, "", prop_name, prop_string);
}
}
free(prop_string);
clay_layout_list_const children = clay_layout_get_children(doc);
if (children->length > 0) {
printf("%*s children:\n", indent, "");
CLAY_LIST_FOREACH(children, childptr, _) {
clay_print_layout_tree(*childptr);
}
}
}
static void stringify_prop_values(clay_prop_vals_const vals, clay_prop_definition propdef, char *out, size_t max_len) {
size_t pos = 0;
CLAY_LIST_FOREACH(vals, valptr, _) {
pos += stringify_prop_value(*valptr, propdef, out + pos, max_len - pos);
pos += snprintf(out + pos, max_len - pos, " ");
}
}
static size_t
stringify_prop_value(struct clay_prop_val_s val, clay_prop_definition propdef, char *out, size_t max_len) {
size_t len = 0;
switch (val.type) {
case CLAY_PROP_TYPE_KEYWORD: {
bool found = false;
CLAY_MAP_FOREACH(propdef.keywords, keyword_string, numptr) {
if (*numptr == val.keyword) {
len += snprintf(out, max_len - len, "%s", keyword_string);
found = true;
break;
}
}
if (!found) {
len += snprintf(out, max_len - len, "<unknown value>");
}
break;
}
case CLAY_PROP_TYPE_NUMBER: {
if (val.number.type == CLAY_PROP_NUMBER_INT) {
len += snprintf(out, max_len - len, "%" PRId64, val.number.value_int);
} else {
len += snprintf(out, max_len - len, "%f", val.number.value_double);
}
const char *unit_str;
switch (val.number.unit) {
case CLAY_PROP_UNIT_PX:
unit_str = "px";
break;
case CLAY_PROP_UNIT_PT:
unit_str = "pt";
break;
case CLAY_PROP_UNIT_CM:
unit_str = "cm";
break;
case CLAY_PROP_UNIT_MM:
unit_str = "mm";
break;
case CLAY_PROP_UNIT_PERCENT:
unit_str = "%";
break;
default:
unit_str = "";
}
len += snprintf(out + len, max_len - len, "%s", unit_str);
break;
}
case CLAY_PROP_TYPE_COLOR: {
len += snprintf(out, max_len - len, "rgba(%" PRId8 ", %" PRId8 ", %" PRId8 ", %" PRId8 ")",
val.color.red, val.color.green, val.color.blue, val.color.alpha);
break;
}
case CLAY_PROP_TYPE_STRING: {
len += snprintf(out, max_len - len, "'%s'", val.string);
break;
}
}
return len;
}