Index: propdlg.c =================================================================== --- propdlg.c (revision 22036) +++ propdlg.c (revision 22037) @@ -171,6 +171,7 @@ case PCB_PROPT_ANGLE: case PCB_PROPT_INT: case PCB_PROPT_BOOL: + case PCB_PROPT_COLOR: } */ memset(&hv, 0, sizeof(hv)); @@ -219,6 +220,10 @@ sctx.c_absolute = ctx->dlg[ctx->wabs[p->type]].default_val.int_value; sctx.c_valid = 1; break; + case PCB_PROPT_COLOR: + sctx.color = ctx->dlg[ctx->wedit[p->type]].default_val.clr_value; + sctx.clr_valid = 1; + break; } pcb_propsel_set(&ctx->pe, r->user_data, &sctx); @@ -361,7 +366,6 @@ PCB_DAD_LABEL(ctx->dlg, "Data type: boolean"); PCB_DAD_BOOL(ctx->dlg, ""); ctx->wedit[5] = PCB_DAD_CURRENT(ctx->dlg); - PCB_DAD_MINMAX(ctx->dlg, -(1<<30), 1<<30); PCB_DAD_BEGIN_HBOX(ctx->dlg); ctx->wabs[5] = 0; PCB_DAD_BEGIN_HBOX(ctx->dlg); @@ -372,6 +376,20 @@ PCB_DAD_END(ctx->dlg); PCB_DAD_END(ctx->dlg); + PCB_DAD_BEGIN_VBOX(ctx->dlg); + PCB_DAD_LABEL(ctx->dlg, "Data type: color"); + PCB_DAD_COLOR(ctx->dlg); + ctx->wedit[6] = PCB_DAD_CURRENT(ctx->dlg); + PCB_DAD_BEGIN_HBOX(ctx->dlg); + ctx->wabs[6] = 0; + PCB_DAD_BEGIN_HBOX(ctx->dlg); + PCB_DAD_COMPFLAG(ctx->dlg, PCB_HATF_EXPFILL); + PCB_DAD_END(ctx->dlg); + PCB_DAD_BUTTON(ctx->dlg, "apply"); + PCB_DAD_CHANGE_CB(ctx->dlg, prop_data_cb); + PCB_DAD_END(ctx->dlg); + PCB_DAD_END(ctx->dlg); + PCB_DAD_END(ctx->dlg); } Index: propedit.c =================================================================== --- propedit.c (revision 22036) +++ propedit.c (revision 22037) @@ -186,6 +186,7 @@ pcb_printf(" common='%d'\n", com.i); pcb_printf(" min/avg/max=%d/%d/%d\n", min.i, avg.i, max.i); break; + case PCB_PROPT_COLOR: printf(" common=#%02d%02d%02d\n", com.clr.r, com.clr.g, com.clr.b); break; } } free(sorted); Index: props.c =================================================================== --- props.c (revision 22036) +++ props.c (revision 22037) @@ -43,11 +43,12 @@ static unsigned int prophash_angle(pcb_propval_t key) { return longhash(key.angle); } static unsigned int prophash_int(pcb_propval_t key) { return longhash(key.i); } static unsigned int prophash_bool(pcb_propval_t key) { return longhash(key.i); } +static unsigned int prophash_color(pcb_propval_t key) { return longhash(key.clr.packed); } static unsigned int prophash_string(pcb_propval_t key) { return key.string == NULL ? 0 : strhash(key.string); } typedef unsigned int (*prophash_ft)(pcb_propval_t key); static prophash_ft prophash[PCB_PROPT_max] = { - NULL, prophash_string, prophash_coord, prophash_angle, prophash_int, prophash_bool + NULL, prophash_string, prophash_coord, prophash_angle, prophash_int, prophash_bool, prophash_color }; /* A keyeq function for each known type */ @@ -55,6 +56,7 @@ static int propkeyeq_angle(pcb_propval_t a, pcb_propval_t b) { return a.angle == b.angle; } static int propkeyeq_int(pcb_propval_t a, pcb_propval_t b) { return a.i == b.i; } static int propkeyeq_bool(pcb_propval_t a, pcb_propval_t b) { return a.i == b.i; } +static int propkeyeq_color(pcb_propval_t a, pcb_propval_t b) { return a.clr.packed == b.clr.packed; } static int propkeyeq_string(pcb_propval_t a, pcb_propval_t b) { if ((b.string == NULL) && (a.string == NULL)) @@ -67,7 +69,7 @@ typedef int (*propkeyeq_ft)(pcb_propval_t a, pcb_propval_t b); static propkeyeq_ft propkeyeq[PCB_PROPT_max] = { - NULL, propkeyeq_string, propkeyeq_coord, propkeyeq_angle, propkeyeq_int, propkeyeq_bool + NULL, propkeyeq_string, propkeyeq_coord, propkeyeq_angle, propkeyeq_int, propkeyeq_bool, propkeyeq_color }; @@ -193,6 +195,7 @@ case PCB_PROPT_ANGLE: minp.angle = 100000; maxp.angle = -minp.angle; break; case PCB_PROPT_INT: minp.i = INT_MAX; maxp.i = -minp.i; break; case PCB_PROPT_BOOL: minp.i = 1; maxp.i = 0; break; + case PCB_PROPT_COLOR: break; } /* walk through all known values */ @@ -210,6 +213,7 @@ case PCB_PROPT_ANGLE: STAT(e->key, angle, e->value); break; case PCB_PROPT_INT: STAT(e->key, i, e->value); break; case PCB_PROPT_BOOL: STAT(e->key, i, e->value); break; + case PCB_PROPT_COLOR: break; } } @@ -223,6 +227,7 @@ case PCB_PROPT_ANGLE: avgp.angle = avgp.angle/num_vals; break; case PCB_PROPT_INT: avgp.i = avgp.i/num_vals; break; case PCB_PROPT_BOOL: avgp.i = avgp.i * 100/num_vals; break; + case PCB_PROPT_COLOR: break; } if (avg != NULL) *avg = avgp; if (min != NULL) *min = minp; Index: props.h =================================================================== --- props.h (revision 22036) +++ props.h (revision 22037) @@ -40,6 +40,7 @@ #include #include "idpath.h" +#include "color.h" typedef enum { PCB_PROPT_invalid, @@ -48,6 +49,7 @@ PCB_PROPT_ANGLE, PCB_PROPT_INT, PCB_PROPT_BOOL, + PCB_PROPT_COLOR, PCB_PROPT_max } pcb_prop_type_t; @@ -56,6 +58,7 @@ pcb_coord_t coord; pcb_angle_t angle; int i; + pcb_color_t clr; } pcb_propval_t; typedef pcb_propval_t htprop_key_t; Index: propsel.c =================================================================== --- propsel.c (revision 22036) +++ propsel.c (revision 22037) @@ -46,6 +46,7 @@ #define type2field_pcb_angle_t angle #define type2field_int i #define type2field_bool i +#define type2field_color clr #define type2TYPE_String PCB_PROPT_STRING #define type2TYPE_pcb_coord_t PCB_PROPT_COORD @@ -52,6 +53,7 @@ #define type2TYPE_pcb_angle_t PCB_PROPT_ANGLE #define type2TYPE_int PCB_PROPT_INT #define type2TYPE_bool PCB_PROPT_BOOL +#define type2TYPE_color PCB_PROPT_COLOR #define map_add_prop(ctx, name, type, val) \ do { \ @@ -127,7 +129,7 @@ map_add_prop(ctx, "p/layer/comb/negative", int, !!(layer->comb & PCB_LYC_SUB)); map_add_prop(ctx, "p/layer/comb/auto", int, !!(layer->comb & PCB_LYC_AUTO)); if (!layer->is_bound) - map_add_prop(ctx, "p/layer/color", String, layer->meta.real.color.str); + map_add_prop(ctx, "p/layer/color", color, layer->meta.real.color); map_attr(ctx, &layer->Attributes); } @@ -344,7 +346,7 @@ (pcb_layer_rename_(layer, pcb_strdup(st->s)) == 0)) DONE0; if ((strcmp(pn, "color") == 0) && - (layer_recolor(layer, st->s) == 0)) DONE0; + (layer_recolor(layer, st->color.str) == 0)) DONE0; return 0; } @@ -692,6 +694,7 @@ case PCB_PROPT_ANGLE: return pcb_strdup_printf("%f", val->angle); case PCB_PROPT_INT: return pcb_strdup_printf("%d", val->i); case PCB_PROPT_BOOL: return pcb_strdup(val->i ? "true" : "false"); + case PCB_PROPT_COLOR: return pcb_strdup_printf("#%02x%02x%02x", val->clr.r, val->clr.g, val->clr.b); default: return pcb_strdup(""); } Index: propsel.h =================================================================== --- propsel.h (revision 22036) +++ propsel.h (revision 22037) @@ -31,7 +31,8 @@ const char *s; /* only for string */ pcb_coord_t c; /* also int */ double d; - pcb_bool c_absolute, d_absolute, c_valid, d_valid; + pcb_color_t color; + pcb_bool c_absolute, d_absolute, c_valid, d_valid, clr_valid; /* private */ unsigned is_trace:1;