mirror of
git://projects.qi-hardware.com/eda-tools.git
synced 2024-11-23 02:30:36 +02:00
eeshow/: make glabels hoverable (WIP)
This commit is contained in:
parent
08de2f7b4b
commit
0fdce017fb
37
eeshow/dwg.c
37
eeshow/dwg.c
@ -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,
|
||||||
|
13
eeshow/dwg.h
13
eeshow/dwg.h
@ -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);
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -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 */
|
||||||
|
48
eeshow/gui.c
48
eeshow/gui.c
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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:
|
||||||
|
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user