r5377 - trunk/eda/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Mon Aug 3 23:10:49 CEST 2009


Author: werner
Date: 2009-08-03 23:10:49 +0200 (Mon, 03 Aug 2009)
New Revision: 5377

Added:
   trunk/eda/fped/quad.fpd
Modified:
   trunk/eda/fped/error.c
   trunk/eda/fped/fpd.y
   trunk/eda/fped/gui.c
   trunk/eda/fped/gui_style.h
   trunk/eda/fped/inst.c
   trunk/eda/fped/obj.c
   trunk/eda/fped/obj.h
Log:
- 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



Modified: trunk/eda/fped/error.c
===================================================================
--- trunk/eda/fped/error.c	2009-08-03 20:46:17 UTC (rev 5376)
+++ trunk/eda/fped/error.c	2009-08-03 21:10:49 UTC (rev 5377)
@@ -51,7 +51,7 @@
 
 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);
 }
 

Modified: trunk/eda/fped/fpd.y
===================================================================
--- trunk/eda/fped/fpd.y	2009-08-03 20:46:17 UTC (rev 5376)
+++ trunk/eda/fped/fpd.y	2009-08-03 21:10:49 UTC (rev 5377)
@@ -79,9 +79,11 @@
 	table->vars->name = id;
 	table->vars->frame = curr_frame;
 	table->rows = zalloc_type(struct row);
+	table->rows->table = table;
 	table->rows->values = zalloc_type(struct value);
 	table->rows->values->expr = expr;
 	table->rows->values->row = table->rows;
+	table->active_row = table->rows;
 	*next_table = table;
 	next_table = &table->next;
 }
@@ -421,15 +423,22 @@
 			$$->u.meas.other = $3;
 			$$->u.meas.offset = $4;
 		}
-	| TOK_FRAME ID base
+	| TOK_FRAME ID 
+		{ 
+		    $<num>$.n = lineno;
+		}
+		    base
 		{
 			$$ = new_obj(ot_frame);
-			$$->base = $3;
-			$$->u.frame = find_frame($2);
-			if (!$$->u.frame) {
+			$$->base = $4;
+			$$->u.frame.ref = find_frame($2);
+			if (!$$->u.frame.ref) {
 				yyerrorf("unknown frame \"%s\"", $2);
 				YYABORT;
 			}
+			if (!$$->u.frame.ref->active_ref)
+				$$->u.frame.ref->active_ref = $$;
+			$$->u.frame.lineno = $<num>3.n;
 		}
 	;
 

Modified: trunk/eda/fped/gui.c
===================================================================
--- trunk/eda/fped/gui.c	2009-08-03 20:46:17 UTC (rev 5376)
+++ trunk/eda/fped/gui.c	2009-08-03 21:10:49 UTC (rev 5377)
@@ -31,7 +31,6 @@
 GtkWidget *root;
 
 static GtkWidget *frames_box;
-static GtkWidget *vars_box;
 
 
 /* ----- menu bar ---------------------------------------------------------- */
@@ -385,12 +384,13 @@
 /* ----- 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 loop *loop;
 
-	destroy_all_children(GTK_CONTAINER(vbox));
+	vbox= gtk_vbox_new(FALSE, 0);
 	for (table = frame->tables; table; table = table->next) {
 		add_sep(vbox, 3);
 		build_assignment(vbox, frame, table);
@@ -400,11 +400,11 @@
 		add_sep(vbox, 3);
 		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)
@@ -468,27 +468,97 @@
 }
 
 
-static void build_frames(GtkWidget *vbox)
+static GtkWidget *build_frame_label(struct frame *frame)
 {
-	struct frame *f;
 	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));
-	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_alignment(GTK_MISC(label), 0, 0);
+	for (frame = frames; frame; frame = frame->next)
+		n++;
 
-		label_in_box_bg(label, active_frame == f ?
-		    COLOR_FRAME_SELECTED : COLOR_FRAME_UNSELECTED);
+	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);
 
-		g_signal_connect(G_OBJECT(box_of_label(label)),
-		    "button_press_event", G_CALLBACK(frame_select_event), f);
-		f->label = label;
+	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(vbox);
+	gtk_widget_show_all(tab);
 }
 
 
@@ -497,42 +567,29 @@
 
 static void make_center_area(GtkWidget *vbox)
 {
-	GtkWidget *hbox, *vars, *paned;
-	GtkWidget *frame_list, *icons;
+	GtkWidget *hbox, *frames_area, *paned;
+	GtkWidget *icons;
 
 	hbox = gtk_hbox_new(FALSE, 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();
 	gtk_box_pack_start(GTK_BOX(hbox), paned, TRUE, TRUE, 0);
 	
-	/* Variables */
+	/* Frames */
 
-	vars = gtk_scrolled_window_new(NULL, NULL);
-	gtk_paned_add1(GTK_PANED(paned), vars);
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vars),
+	frames_area = gtk_scrolled_window_new(NULL, NULL);
+	gtk_paned_add1(GTK_PANED(paned), frames_area);
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(frames_area),
 	    GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-	gtk_widget_set_size_request(vars, 150, 100);
-	vars_box = gtk_vbox_new(FALSE, 0);
+	gtk_widget_set_size_request(frames_area, 250, 100);
 
-	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(vars),
-	    vars_box);
+	frames_box = gtk_vbox_new(FALSE, 0);
+	build_frames(frames_box);
 
+	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(frames_area),
+	    frames_box);
+
 	/* Canvas */
 
 	gtk_paned_add2(GTK_PANED(paned), make_canvas());
@@ -553,7 +610,6 @@
 	instantiate();
 	label_in_box_bg(active_frame->label, COLOR_FRAME_SELECTED);
 	build_frames(frames_box);
-	build_vars(vars_box, active_frame);
 	redraw();
 }
 
@@ -592,7 +648,6 @@
 	    G_CALLBACK(gtk_main_quit), NULL);
 
 	make_screen(root);
-	build_vars(vars_box, root_frame);
 
 	gtk_widget_show_all(root);
 

Modified: trunk/eda/fped/gui_style.h
===================================================================
--- trunk/eda/fped/gui_style.h	2009-08-03 20:46:17 UTC (rev 5376)
+++ trunk/eda/fped/gui_style.h	2009-08-03 21:10:49 UTC (rev 5377)
@@ -62,6 +62,9 @@
 #define COLOR_FRAME_SELECTED	"#fff0a0"
 #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_EDITING	COLOR_EDITING
 #define	COLOR_EXPR_PASSIVE	"#f0f0ff"

Modified: trunk/eda/fped/inst.c
===================================================================
--- trunk/eda/fped/inst.c	2009-08-03 20:46:17 UTC (rev 5376)
+++ trunk/eda/fped/inst.c	2009-08-03 21:10:49 UTC (rev 5377)
@@ -61,9 +61,9 @@
 		for (inst = insts[prio]; inst; inst = inst->next)
 
 
-struct inst *curr_frame = 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 *prev_insts[ip_n];
 
@@ -480,8 +480,8 @@
 	inst->u.arc.width = width;
 	inst->bbox.min.x = center.x-r;
 	inst->bbox.max.x = center.x+r;
-	inst->bbox.min.y = center.x-r;
-	inst->bbox.max.y = center.x+r;
+	inst->bbox.min.y = center.y-r;
+	inst->bbox.max.y = center.y+r;
 	propagate_bbox(inst);
 	return 1;
 }

Modified: trunk/eda/fped/obj.c
===================================================================
--- trunk/eda/fped/obj.c	2009-08-03 20:46:17 UTC (rev 5376)
+++ trunk/eda/fped/obj.c	2009-08-03 21:10:49 UTC (rev 5377)
@@ -92,8 +92,9 @@
 	for (obj = frame->objs; obj; obj = obj->next)
 		switch (obj->type) {
 		case ot_frame:
-			if (!generate_frame(obj->u.frame,
-			    obj->base ? obj->base->pos : base, frame, active))
+			if (!generate_frame(obj->u.frame.ref,
+			    obj->base ? obj->base->pos : base, frame,
+			    active && obj->u.frame.ref->active_ref == obj))
 				return 0;
 			break;
 		case ot_line:

Modified: trunk/eda/fped/obj.h
===================================================================
--- trunk/eda/fped/obj.h	2009-08-03 20:46:17 UTC (rev 5376)
+++ trunk/eda/fped/obj.h	2009-08-03 21:10:49 UTC (rev 5377)
@@ -108,6 +108,9 @@
 	/* used during generation */
 	const struct frame *curr_parent;
 
+	/* generating and editing */
+	struct obj *active_ref;
+
 	/* for the GUI */
 	GtkWidget *label;
 };
@@ -121,6 +124,11 @@
 	ot_meas,
 };
 
+struct frame_ref {
+	struct frame *ref;
+	int lineno;
+};
+
 struct rect {
 	struct vec *other; /* NULL if frame origin */
 	struct expr *width;
@@ -145,7 +153,7 @@
 struct obj {
 	enum obj_type type;
 	union {
-		struct frame *frame;
+		struct frame_ref frame;
 		struct rect rect;
 		struct rect line;
 		struct pad pad;
@@ -154,6 +162,7 @@
 	} u;
 	struct vec *base;
 	struct obj *next;
+	int lineno;
 };
 
 

Added: trunk/eda/fped/quad.fpd
===================================================================
--- trunk/eda/fped/quad.fpd	                        (rev 0)
+++ trunk/eda/fped/quad.fpd	2009-08-03 21:10:49 UTC (rev 5377)
@@ -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 .




More information about the commitlog mailing list