1
0
mirror of git://projects.qi-hardware.com/fped.git synced 2024-11-25 18:15:55 +02:00

- combined frame and variable view into a single table

- make_var now sets up all back pointers, so we don't crash when deselecting a
  variable (this bug was uncovered by cleanup in the previous commit)
- report_parse_error didn't print a newline at the end of the message
- introduced frame reference selection and the data structures needed for it
- bounding box calculation of arcs used x for y
- added frame reference selection example quad.fpd



git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5377 99fdad57-331a-0410-800a-d7fa5415bdb3
This commit is contained in:
werner 2009-08-03 21:10:49 +00:00
parent e1e758b54f
commit 6c2734f6ac
8 changed files with 147 additions and 57 deletions

View File

@ -51,7 +51,7 @@ void yyerror(const char *s)
void report_parse_error(const char *s) void report_parse_error(const char *s)
{ {
fprintf(stderr, "%d: %s near \"%s\" ", lineno, s, yytext); fprintf(stderr, "%d: %s near \"%s\"\n", lineno, s, yytext);
exit(1); exit(1);
} }

17
fpd.y
View File

@ -79,9 +79,11 @@ static void make_var(const char *id, struct expr *expr)
table->vars->name = id; table->vars->name = id;
table->vars->frame = curr_frame; table->vars->frame = curr_frame;
table->rows = zalloc_type(struct row); table->rows = zalloc_type(struct row);
table->rows->table = table;
table->rows->values = zalloc_type(struct value); table->rows->values = zalloc_type(struct value);
table->rows->values->expr = expr; table->rows->values->expr = expr;
table->rows->values->row = table->rows; table->rows->values->row = table->rows;
table->active_row = table->rows;
*next_table = table; *next_table = table;
next_table = &table->next; next_table = &table->next;
} }
@ -421,15 +423,22 @@ obj:
$$->u.meas.other = $3; $$->u.meas.other = $3;
$$->u.meas.offset = $4; $$->u.meas.offset = $4;
} }
| TOK_FRAME ID base | TOK_FRAME ID
{
$<num>$.n = lineno;
}
base
{ {
$$ = new_obj(ot_frame); $$ = new_obj(ot_frame);
$$->base = $3; $$->base = $4;
$$->u.frame = find_frame($2); $$->u.frame.ref = find_frame($2);
if (!$$->u.frame) { if (!$$->u.frame.ref) {
yyerrorf("unknown frame \"%s\"", $2); yyerrorf("unknown frame \"%s\"", $2);
YYABORT; YYABORT;
} }
if (!$$->u.frame.ref->active_ref)
$$->u.frame.ref->active_ref = $$;
$$->u.frame.lineno = $<num>3.n;
} }
; ;

147
gui.c
View File

@ -31,7 +31,6 @@
GtkWidget *root; GtkWidget *root;
static GtkWidget *frames_box; static GtkWidget *frames_box;
static GtkWidget *vars_box;
/* ----- menu bar ---------------------------------------------------------- */ /* ----- menu bar ---------------------------------------------------------- */
@ -385,12 +384,13 @@ static void build_loop(GtkWidget *vbox, struct frame *frame,
/* ----- the list of variables, tables, and loops -------------------------- */ /* ----- the list of variables, tables, and loops -------------------------- */
static void build_vars(GtkWidget *vbox, struct frame *frame) static GtkWidget *build_vars(struct frame *frame)
{ {
GtkWidget *vbox;
struct table *table; struct table *table;
struct loop *loop; struct loop *loop;
destroy_all_children(GTK_CONTAINER(vbox)); vbox= gtk_vbox_new(FALSE, 0);
for (table = frame->tables; table; table = table->next) { for (table = frame->tables; table; table = table->next) {
add_sep(vbox, 3); add_sep(vbox, 3);
build_assignment(vbox, frame, table); build_assignment(vbox, frame, table);
@ -400,11 +400,11 @@ static void build_vars(GtkWidget *vbox, struct frame *frame)
add_sep(vbox, 3); add_sep(vbox, 3);
build_loop(vbox, frame, loop); build_loop(vbox, frame, loop);
} }
gtk_widget_show_all(vbox); return vbox;
} }
/* ----- frame list -------------------------------------------------------- */ /* ----- frame labels ------------------------------------------------------ */
static int validate_frame_name(const char *s, void *ctx) static int validate_frame_name(const char *s, void *ctx)
@ -468,27 +468,97 @@ static gboolean frame_select_event(GtkWidget *widget, GdkEventButton *event,
} }
static void build_frames(GtkWidget *vbox) static GtkWidget *build_frame_label(struct frame *frame)
{ {
struct frame *f;
GtkWidget *label; GtkWidget *label;
label = label_in_box_new(frame->name ? frame->name : "(root)");
gtk_misc_set_padding(GTK_MISC(label), 2, 2);
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
label_in_box_bg(label, active_frame == frame ?
COLOR_FRAME_SELECTED : COLOR_FRAME_UNSELECTED);
g_signal_connect(G_OBJECT(box_of_label(label)),
"button_press_event", G_CALLBACK(frame_select_event), frame);
frame->label = label;
return box_of_label(label);
}
/* ----- frame references -------------------------------------------------- */
static gboolean frame_ref_select_event(GtkWidget *widget, GdkEventButton *event,
gpointer data)
{
struct obj *obj = data;
obj->u.frame.ref->active_ref = data;
change_world();
return TRUE;
}
static GtkWidget *build_frame_refs(const struct frame *frame)
{
GtkWidget *hbox, *label;
struct obj *obj;
char buf[100];
hbox = gtk_hbox_new(FALSE, 0);
for (obj = frame->objs; obj; obj = obj->next)
if (obj->type == ot_frame && obj->u.frame.ref == active_frame) {
sprintf(buf, "%d", obj->u.frame.lineno);
label = label_in_box_new(buf);
gtk_misc_set_padding(GTK_MISC(label), 2, 2);
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
label_in_box_bg(label,
obj == obj->u.frame.ref->active_ref ?
COLOR_REF_SELECTED : COLOR_REF_UNSELECTED);
gtk_box_pack_start(GTK_BOX(hbox), box_of_label(label),
FALSE, FALSE, 2);
g_signal_connect(G_OBJECT(box_of_label(label)),
"button_press_event",
G_CALLBACK(frame_ref_select_event), obj);
}
return hbox;
}
/* ----- frames ------------------------------------------------------------ */
static void build_frames(GtkWidget *vbox)
{
struct frame *frame;
GtkWidget *tab, *label, *refs, *vars;
int n;
destroy_all_children(GTK_CONTAINER(vbox)); destroy_all_children(GTK_CONTAINER(vbox));
for (f = root_frame; f; f = f->prev) { for (frame = frames; frame; frame = frame->next)
label = label_in_box_new(f->name ? f->name : "(root)"); n++;
gtk_box_pack_start(GTK_BOX(vbox), box_of_label(label),
FALSE, TRUE, 0);
gtk_misc_set_padding(GTK_MISC(label), 2, 2);
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
label_in_box_bg(label, active_frame == f ? tab = gtk_table_new(n*2, 2, FALSE);
COLOR_FRAME_SELECTED : COLOR_FRAME_UNSELECTED); gtk_table_set_row_spacings(GTK_TABLE(tab), 1);
gtk_table_set_col_spacings(GTK_TABLE(tab), 1);
gtk_box_pack_start(GTK_BOX(vbox), tab, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(box_of_label(label)), n = 0;
"button_press_event", G_CALLBACK(frame_select_event), f); for (frame = root_frame; frame; frame = frame->prev) {
f->label = label; label = build_frame_label(frame);
gtk_table_attach_defaults(GTK_TABLE(tab), label,
0, 1, n*2, n*2+1);
refs = build_frame_refs(frame);
gtk_table_attach_defaults(GTK_TABLE(tab), refs,
1, 2, n*2, n*2+1);
vars = build_vars(frame);
gtk_table_attach_defaults(GTK_TABLE(tab), vars,
1, 2, n*2+1, n*2+2);
n++;
} }
gtk_widget_show_all(vbox); gtk_widget_show_all(tab);
} }
@ -497,41 +567,28 @@ static void build_frames(GtkWidget *vbox)
static void make_center_area(GtkWidget *vbox) static void make_center_area(GtkWidget *vbox)
{ {
GtkWidget *hbox, *vars, *paned; GtkWidget *hbox, *frames_area, *paned;
GtkWidget *frame_list, *icons; GtkWidget *icons;
hbox = gtk_hbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
/* Frame list */
frame_list = gtk_scrolled_window_new(NULL, NULL);
gtk_box_pack_start(GTK_BOX(hbox), frame_list, FALSE, TRUE, 0);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(frame_list),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
frames_box = gtk_vbox_new(FALSE, 0);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(frame_list),
frames_box);
build_frames(frames_box);
add_sep(hbox, 2);
paned = gtk_hpaned_new(); paned = gtk_hpaned_new();
gtk_box_pack_start(GTK_BOX(hbox), paned, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), paned, TRUE, TRUE, 0);
/* Variables */ /* Frames */
vars = gtk_scrolled_window_new(NULL, NULL); frames_area = gtk_scrolled_window_new(NULL, NULL);
gtk_paned_add1(GTK_PANED(paned), vars); gtk_paned_add1(GTK_PANED(paned), frames_area);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vars), gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(frames_area),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_widget_set_size_request(vars, 150, 100); gtk_widget_set_size_request(frames_area, 250, 100);
vars_box = gtk_vbox_new(FALSE, 0);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(vars), frames_box = gtk_vbox_new(FALSE, 0);
vars_box); build_frames(frames_box);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(frames_area),
frames_box);
/* Canvas */ /* Canvas */
@ -553,7 +610,6 @@ void change_world(void)
instantiate(); instantiate();
label_in_box_bg(active_frame->label, COLOR_FRAME_SELECTED); label_in_box_bg(active_frame->label, COLOR_FRAME_SELECTED);
build_frames(frames_box); build_frames(frames_box);
build_vars(vars_box, active_frame);
redraw(); redraw();
} }
@ -592,7 +648,6 @@ int gui_main(int argc, char **argv)
G_CALLBACK(gtk_main_quit), NULL); G_CALLBACK(gtk_main_quit), NULL);
make_screen(root); make_screen(root);
build_vars(vars_box, root_frame);
gtk_widget_show_all(root); gtk_widget_show_all(root);

View File

@ -62,6 +62,9 @@
#define COLOR_FRAME_SELECTED "#fff0a0" #define COLOR_FRAME_SELECTED "#fff0a0"
#define COLOR_FRAME_EDITING COLOR_EDITING #define COLOR_FRAME_EDITING COLOR_EDITING
#define COLOR_REF_UNSELECTED COLOR_CHOICE_UNSELECTED
#define COLOR_REF_SELECTED COLOR_CHOICE_SELECTED
#define COLOR_VAR_PASSIVE COLOR_FRAME_UNSELECTED #define COLOR_VAR_PASSIVE COLOR_FRAME_UNSELECTED
#define COLOR_VAR_EDITING COLOR_EDITING #define COLOR_VAR_EDITING COLOR_EDITING
#define COLOR_EXPR_PASSIVE "#f0f0ff" #define COLOR_EXPR_PASSIVE "#f0f0ff"

6
inst.c
View File

@ -61,9 +61,9 @@ enum inst_prio {
for (inst = insts[prio]; inst; inst = inst->next) for (inst = insts[prio]; inst; inst = inst->next)
struct inst *curr_frame = NULL;
struct inst *selected_inst = NULL; struct inst *selected_inst = NULL;
static struct inst *curr_frame = NULL;
static struct inst *insts[ip_n], **next_inst[ip_n]; static struct inst *insts[ip_n], **next_inst[ip_n];
static struct inst *prev_insts[ip_n]; static struct inst *prev_insts[ip_n];
@ -480,8 +480,8 @@ int inst_arc(struct obj *obj, struct coord center, struct coord start,
inst->u.arc.width = width; inst->u.arc.width = width;
inst->bbox.min.x = center.x-r; inst->bbox.min.x = center.x-r;
inst->bbox.max.x = center.x+r; inst->bbox.max.x = center.x+r;
inst->bbox.min.y = center.x-r; inst->bbox.min.y = center.y-r;
inst->bbox.max.y = center.x+r; inst->bbox.max.y = center.y+r;
propagate_bbox(inst); propagate_bbox(inst);
return 1; return 1;
} }

5
obj.c
View File

@ -92,8 +92,9 @@ static int generate_objs(struct frame *frame, struct coord base, int active)
for (obj = frame->objs; obj; obj = obj->next) for (obj = frame->objs; obj; obj = obj->next)
switch (obj->type) { switch (obj->type) {
case ot_frame: case ot_frame:
if (!generate_frame(obj->u.frame, if (!generate_frame(obj->u.frame.ref,
obj->base ? obj->base->pos : base, frame, active)) obj->base ? obj->base->pos : base, frame,
active && obj->u.frame.ref->active_ref == obj))
return 0; return 0;
break; break;
case ot_line: case ot_line:

11
obj.h
View File

@ -108,6 +108,9 @@ struct frame {
/* used during generation */ /* used during generation */
const struct frame *curr_parent; const struct frame *curr_parent;
/* generating and editing */
struct obj *active_ref;
/* for the GUI */ /* for the GUI */
GtkWidget *label; GtkWidget *label;
}; };
@ -121,6 +124,11 @@ enum obj_type {
ot_meas, ot_meas,
}; };
struct frame_ref {
struct frame *ref;
int lineno;
};
struct rect { struct rect {
struct vec *other; /* NULL if frame origin */ struct vec *other; /* NULL if frame origin */
struct expr *width; struct expr *width;
@ -145,7 +153,7 @@ struct meas {
struct obj { struct obj {
enum obj_type type; enum obj_type type;
union { union {
struct frame *frame; struct frame_ref frame;
struct rect rect; struct rect rect;
struct rect line; struct rect line;
struct pad pad; struct pad pad;
@ -154,6 +162,7 @@ struct obj {
} u; } u;
struct vec *base; struct vec *base;
struct obj *next; struct obj *next;
int lineno;
}; };

13
quad.fpd Normal file
View File

@ -0,0 +1,13 @@
frame c {
vec @(1mm, 0mm)
circ . @
}
vec @(-1mm, 1mm)
frame c .
vec @(1mm, -1mm)
frame c .
vec @(-1mm, -1mm)
frame c .
vec @(1mm, 1mm)
frame c .