1
0
mirror of git://projects.qi-hardware.com/eda-tools.git synced 2024-11-23 06:02:48 +02:00

eeshow/: make glabels hoverable (WIP)

This commit is contained in:
Werner Almesberger 2016-08-10 21:50:07 -03:00
parent 08de2f7b4b
commit 0fdce017fb
7 changed files with 107 additions and 13 deletions

View File

@ -25,6 +25,32 @@
#include "dwg.h" #include "dwg.h"
/* ----- Helper functions -------------------------------------------------- */
static void bbox_from_poly(struct dwg_bbox *bbox, unsigned n,
const int *vx, const int *vy)
{
unsigned i;
int xmax, ymax;
bbox->x = xmax = *vx;
bbox->y = ymax = *vy;
for (i = 1; i != n; i++) {
if (vx[i] < bbox->x)
bbox->x = vx[i];
if (vy[i] < bbox->y)
bbox->y = vy[i];
if (vx[i] > xmax)
xmax = vx[i];
if (vy[i] > ymax)
ymax = vy[i];
}
bbox->w = xmax - bbox->x + 1;
bbox->h = ymax - bbox->y + 1;
}
/* ----- Labels ------------------------------------------------------------ */ /* ----- Labels ------------------------------------------------------------ */
@ -54,7 +80,7 @@ static enum box_type flip_box(enum box_type box)
void dwg_label(int x, int y, const char *s, int dir, int dim, void dwg_label(int x, int y, const char *s, int dir, int dim,
enum dwg_shape shape) enum dwg_shape shape, struct dwg_bbox *bbox)
{ {
struct text txt = { struct text txt = {
.s = s, .s = s,
@ -99,7 +125,7 @@ void dwg_label(int x, int y, const char *s, int dir, int dim,
void dwg_glabel(int x, int y, const char *s, int dir, int dim, void dwg_glabel(int x, int y, const char *s, int dir, int dim,
enum dwg_shape shape) enum dwg_shape shape, struct dwg_bbox *bbox)
{ {
struct text txt = { struct text txt = {
.s = s, .s = s,
@ -235,6 +261,9 @@ void dwg_glabel(int x, int y, const char *s, int dir, int dim,
vy[0] = vy[n - 1]; vy[0] = vy[n - 1];
gfx_poly(n, vx, vy, COLOR_GLABEL, COLOR_NONE, LAYER_GLABEL); gfx_poly(n, vx, vy, COLOR_GLABEL, COLOR_NONE, LAYER_GLABEL);
if (bbox)
bbox_from_poly(bbox, n, vx, vy);
if (asprintf(&tag, "G:%s", s)) {} if (asprintf(&tag, "G:%s", s)) {}
gfx_tag(tag, n, vx, vy); gfx_tag(tag, n, vx, vy);
} }
@ -296,7 +325,7 @@ static int make_box(enum box_type box, int h, int *vx, int *vy)
void dwg_hlabel(int x, int y, const char *s, int dir, int dim, void dwg_hlabel(int x, int y, const char *s, int dir, int dim,
enum dwg_shape shape) enum dwg_shape shape, struct dwg_bbox *bbox)
{ {
struct text txt = { struct text txt = {
.s = s, .s = s,
@ -374,7 +403,7 @@ void dwg_hlabel(int x, int y, const char *s, int dir, int dim,
void dwg_text(int x, int y, const char *s, int dir, int dim, void dwg_text(int x, int y, const char *s, int dir, int dim,
enum dwg_shape shape) enum dwg_shape shape, struct dwg_bbox *bbox)
{ {
struct text txt = { struct text txt = {
.s = s, .s = s,

View File

@ -25,15 +25,20 @@ enum dwg_shape {
dwg_bidir, // Bidirectional dwg_bidir, // Bidirectional
}; };
struct dwg_bbox {
int x, y;
int w, h;
};
void dwg_label(int x, int y, const char *s, int dir, int dim, void dwg_label(int x, int y, const char *s, int dir, int dim,
enum dwg_shape shape); enum dwg_shape shape, struct dwg_bbox *bbox);
void dwg_hlabel(int x, int y, const char *s, int dir, int dim, void dwg_hlabel(int x, int y, const char *s, int dir, int dim,
enum dwg_shape shape); enum dwg_shape shape, struct dwg_bbox *bbox);
void dwg_glabel(int x, int y, const char *s, int dir, int dim, void dwg_glabel(int x, int y, const char *s, int dir, int dim,
enum dwg_shape shape); enum dwg_shape shape, struct dwg_bbox *bbox);
void dwg_text(int x, int y, const char *s, int dir, int dim, void dwg_text(int x, int y, const char *s, int dir, int dim,
enum dwg_shape shape); enum dwg_shape shape, struct dwg_bbox *bbox);
void dwg_junction(int x, int y); void dwg_junction(int x, int y);
void dwg_noconn(int x, int y); void dwg_noconn(int x, int y);

View File

@ -103,3 +103,12 @@ void aoi_remove(struct aoi **aois, const struct aoi *aoi)
*aois = aoi->next; *aois = aoi->next;
free((void *) aoi); free((void *) aoi);
} }
void aoi_dehover(void)
{
if (hovering)
hovering->hover(hovering->user, 0);
hovering = NULL;
}

View File

@ -33,5 +33,6 @@ void aoi_update(struct aoi *aoi, const struct aoi *cfg);
bool aoi_hover(const struct aoi *aois, int x, int y); bool aoi_hover(const struct aoi *aois, int x, int y);
bool aoi_click(const struct aoi *aois, int x, int y); bool aoi_click(const struct aoi *aois, int x, int y);
void aoi_remove(struct aoi **aois, const struct aoi *aoi); void aoi_remove(struct aoi **aois, const struct aoi *aoi);
void aoi_dehover(void);
#endif /* !GUI_AOI_H */ #endif /* !GUI_AOI_H */

View File

@ -35,6 +35,7 @@
#include "sch.h" #include "sch.h"
#include "delta.h" #include "delta.h"
#include "diff.h" #include "diff.h"
#include "dwg.h"
#include "gui-aoi.h" #include "gui-aoi.h"
#include "gui-style.h" #include "gui-style.h"
#include "gui-over.h" #include "gui-over.h"
@ -678,6 +679,7 @@ static void do_sheet_overlays(struct gui_ctx *ctx)
static void go_to_sheet(struct gui_ctx *ctx, struct gui_sheet *sheet) static void go_to_sheet(struct gui_ctx *ctx, struct gui_sheet *sheet)
{ {
aoi_dehover();
if (!sheet->rendered) { if (!sheet->rendered) {
render_sheet(sheet); render_sheet(sheet);
mark_aois(ctx, sheet); mark_aois(ctx, sheet);
@ -906,6 +908,30 @@ static void select_subsheet(void *user)
} }
struct glabel_aoi_ctx {
const struct gui_sheet *sheet;
const struct sch_obj *obj;
struct overlay *over;
};
static bool hover_glabel(void *user, bool on)
{
struct glabel_aoi_ctx *aoi_ctx = user;
struct gui_ctx *ctx = aoi_ctx->sheet->ctx;
if (on) {
aoi_ctx->over = overlay_add(&ctx->sheet_overlays, NULL,// aois
NULL, NULL, NULL);
overlay_text_raw(aoi_ctx->over, aoi_ctx->obj->u.text.s);
} else {
overlay_remove(&ctx->sheet_overlays, aoi_ctx->over);
}
redraw(ctx);
return 1;
}
/* ----- Initialization ---------------------------------------------------- */ /* ----- Initialization ---------------------------------------------------- */
@ -930,6 +956,26 @@ static void add_sheet_aoi(struct gui_ctx *ctx, struct gui_sheet *parent,
} }
static void add_glabel_aoi(struct gui_sheet *sheet, const struct sch_obj *obj)
{
const struct dwg_bbox *bbox = &obj->u.text.bbox;
struct glabel_aoi_ctx *aoi_ctx = alloc_type(struct glabel_aoi_ctx);
struct aoi cfg = {
.x = bbox->x,
.y = bbox->y,
.w = bbox->w,
.h = bbox->h,
.hover = hover_glabel,
.user = aoi_ctx,
};
aoi_ctx->sheet = sheet;
aoi_ctx->obj = obj;
aoi_add(&sheet->aois, &cfg);
}
static void mark_aois(struct gui_ctx *ctx, struct gui_sheet *sheet) static void mark_aois(struct gui_ctx *ctx, struct gui_sheet *sheet)
{ {
const struct sch_obj *obj; const struct sch_obj *obj;
@ -940,6 +986,8 @@ static void mark_aois(struct gui_ctx *ctx, struct gui_sheet *sheet)
case sch_obj_sheet: case sch_obj_sheet:
add_sheet_aoi(ctx, sheet, obj); add_sheet_aoi(ctx, sheet, obj);
break; break;
case sch_obj_glabel:
add_glabel_aoi(sheet, obj);
default: default:
break; break;
} }

View File

@ -124,14 +124,14 @@ static void render_sheet(const struct sch_obj *obj,
for (field = sheet->fields; field; field = field->next) for (field = sheet->fields; field; field = field->next)
dwg_hlabel(obj->x, obj->y, field->s, dwg_hlabel(obj->x, obj->y, field->s,
field->side, field->dim, field->side, field->dim,
field->shape); field->shape, NULL);
// free(field->s) // free(field->s)
} }
void sch_render(const struct sheet *sheet) void sch_render(const struct sheet *sheet)
{ {
const struct sch_obj *obj; struct sch_obj *obj;
for (obj = sheet->objs; obj; obj = obj->next) for (obj = sheet->objs; obj; obj = obj->next)
switch (obj->type) { switch (obj->type) {
@ -151,10 +151,10 @@ void sch_render(const struct sheet *sheet)
case sch_obj_glabel: case sch_obj_glabel:
case sch_obj_text: case sch_obj_text:
{ {
const struct sch_text *text = &obj->u.text; struct sch_text *text = &obj->u.text;
text->fn(obj->x, obj->y, text->s, text->dir, text->fn(obj->x, obj->y, text->s, text->dir,
text->dim, text->shape); text->dim, text->shape, &text->bbox);
} }
break; break;
case sch_obj_comp: case sch_obj_comp:

View File

@ -54,11 +54,13 @@ struct sch_obj {
} wire; } wire;
struct sch_text { struct sch_text {
void (*fn)(int x, int y, const char *s, void (*fn)(int x, int y, const char *s,
int dir, int dim, enum dwg_shape shape); int dir, int dim, enum dwg_shape shape,
struct dwg_bbox *bbox);
const char *s; const char *s;
int dir; /* orientation */ int dir; /* orientation */
int dim; /* dimension */ int dim; /* dimension */
enum dwg_shape shape; enum dwg_shape shape;
struct dwg_bbox bbox; /* set when rendering; glabel */
} text; } text;
struct sch_comp { struct sch_comp {
const struct comp *comp; /* current component */ const struct comp *comp; /* current component */