mirror of
git://projects.qi-hardware.com/fped.git
synced 2024-11-25 20:50:39 +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:
parent
e1e758b54f
commit
6c2734f6ac
2
error.c
2
error.c
@ -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
17
fpd.y
@ -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;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
141
gui.c
141
gui.c
@ -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;
|
||||||
|
|
||||||
destroy_all_children(GTK_CONTAINER(vbox));
|
label = label_in_box_new(frame->name ? frame->name : "(root)");
|
||||||
for (f = root_frame; f; f = f->prev) {
|
|
||||||
label = label_in_box_new(f->name ? f->name : "(root)");
|
|
||||||
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_padding(GTK_MISC(label), 2, 2);
|
||||||
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
|
||||||
|
|
||||||
label_in_box_bg(label, active_frame == f ?
|
label_in_box_bg(label, active_frame == frame ?
|
||||||
COLOR_FRAME_SELECTED : COLOR_FRAME_UNSELECTED);
|
COLOR_FRAME_SELECTED : COLOR_FRAME_UNSELECTED);
|
||||||
|
|
||||||
g_signal_connect(G_OBJECT(box_of_label(label)),
|
g_signal_connect(G_OBJECT(box_of_label(label)),
|
||||||
"button_press_event", G_CALLBACK(frame_select_event), f);
|
"button_press_event", G_CALLBACK(frame_select_event), frame);
|
||||||
f->label = label;
|
frame->label = label;
|
||||||
|
|
||||||
|
return box_of_label(label);
|
||||||
}
|
}
|
||||||
gtk_widget_show_all(vbox);
|
|
||||||
|
|
||||||
|
/* ----- 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));
|
||||||
|
for (frame = frames; frame; frame = frame->next)
|
||||||
|
n++;
|
||||||
|
|
||||||
|
tab = gtk_table_new(n*2, 2, FALSE);
|
||||||
|
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);
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
for (frame = root_frame; frame; frame = frame->prev) {
|
||||||
|
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(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);
|
||||||
|
|
||||||
|
@ -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
6
inst.c
@ -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
5
obj.c
@ -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
11
obj.h
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user