r5847 - trunk/eda/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Fri Feb 19 11:27:47 CET 2010


Author: werner
Date: 2010-02-19 11:27:46 +0100 (Fri, 19 Feb 2010)
New Revision: 5847

Modified:
   trunk/eda/fped/gui.c
   trunk/eda/fped/gui_frame.c
   trunk/eda/fped/gui_frame.h
   trunk/eda/fped/gui_style.h
   trunk/eda/fped/gui_util.c
   trunk/eda/fped/gui_util.h
Log:
Wrap wide tables. 

- gui_frame.c (build_table): restructured code to build tables column by column
  instead of row by row
- gui_frame.c (build_table): wrap tables wider than the screen area available
  for variables and tables
- gui_util.h, gui_util.c (get_widget_width): new helper function that returns a
  widget's requested width
- gui.c, gui_style.h: replace hard-coded initial pane size with constants
  DEFAULT_FRAME_AREA_WIDTH and DEFAULT_FRAME_AREA_HEIGHT
- gui.c (change_world): pass the width of the left pane as a wrapping hint to 
  build_frames
- gui_frame.c (build_frames): subtract width of longest package template or 
  frame name from available width
- gui.c (change_world): moved call to build_frames to separate function
  do_build_frames
- gui.c (gui_main): used g_signal_connect_swapped instead of g_signal_connect
  for no good reason



Modified: trunk/eda/fped/gui.c
===================================================================
--- trunk/eda/fped/gui.c	2010-02-18 14:18:30 UTC (rev 5846)
+++ trunk/eda/fped/gui.c	2010-02-19 10:27:46 UTC (rev 5847)
@@ -41,12 +41,15 @@
 int show_bright = 0;
 
 
+static GtkWidget *paned;
 static GtkWidget *frames_box;
 static GtkWidget *ev_stuff, *ev_meas, *ev_all, *ev_bright;
 static GtkWidget *stuff_image[2], *meas_image[2], *all_image[2];
 static GtkWidget *bright_image[2];
 
+static void do_build_frames(void);
 
+
 /* ----- view callbacks ---------------------------------------------------- */
 
 
@@ -220,9 +223,21 @@
 /* ----- central screen area ----------------------------------------------- */
 
 
+static void resize_frames_area(GtkWidget *widget, GtkAllocation *allocation,
+    gpointer user_data)
+{
+	static int width = 0;
+
+	if (allocation->width == width)
+		return;
+	width = allocation->width;
+	do_build_frames();
+}
+
+
 static void make_center_area(GtkWidget *vbox)
 {
-	GtkWidget *hbox, *frames_area, *paned;
+	GtkWidget *hbox, *frames_area;//, *paned;
 	GtkWidget *tools;
 
 	hbox = gtk_hbox_new(FALSE, 0);
@@ -237,14 +252,18 @@
 	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(frames_area, 250, 100);
+	gtk_widget_set_size_request(frames_area,
+	    DEFAULT_FRAME_AREA_WIDTH, DEFAULT_FRAME_AREA_HEIGHT);
 
 	frames_box = gtk_vbox_new(FALSE, 0);
-	build_frames(frames_box);
+	build_frames(frames_box, DEFAULT_FRAME_AREA_WIDTH);
 
 	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(frames_area),
 	    frames_box);
 
+	g_signal_connect(G_OBJECT(frames_area), "size-allocate",
+	    G_CALLBACK(resize_frames_area), NULL);
+
 	/* Canvas */
 
 	gtk_paned_add2(GTK_PANED(paned), make_canvas());
@@ -259,6 +278,15 @@
 /* ----- GUI construction -------------------------------------------------- */
 
 
+static void do_build_frames(void)
+{
+	int width;
+
+	width = gtk_paned_get_position(GTK_PANED(paned));
+	build_frames(frames_box, width > 0 ? width : DEFAULT_FRAME_AREA_WIDTH);
+}
+
+
 void change_world(void)
 {
 	struct bbox before, after;
@@ -269,7 +297,7 @@
 	instantiate();
 	after = inst_get_bbox();
 	label_in_box_bg(active_frame->label, COLOR_FRAME_SELECTED);
-	build_frames(frames_box);
+	do_build_frames();
 	if (after.min.x < before.min.x || after.min.y < before.min.y || 
 	    after.max.x > before.max.x || after.max.y > before.max.y)
 		zoom_to_extents();
@@ -323,7 +351,7 @@
 	/* get root->window */
 	gtk_widget_show_all(root);
 
-	g_signal_connect_swapped(G_OBJECT(root), "destroy",
+	g_signal_connect(G_OBJECT(root), "destroy",
 	    G_CALLBACK(gtk_main_quit), NULL);
 
 	make_screen(root);

Modified: trunk/eda/fped/gui_frame.c
===================================================================
--- trunk/eda/fped/gui_frame.c	2010-02-18 14:18:30 UTC (rev 5846)
+++ trunk/eda/fped/gui_frame.c	2010-02-19 10:27:46 UTC (rev 5847)
@@ -955,8 +955,10 @@
 }
 
 
+/* @@@ this function is too long */
+
 static void build_table(GtkWidget *vbox, struct frame *frame,
-    struct table *table)
+    struct table *table, int wrap_width)
 {
 	GtkWidget *tab, *field;
 	GtkWidget *evbox, *align;
@@ -964,8 +966,9 @@
 	struct row *row;
 	struct value *value;
 	int n_vars = 0, n_rows = 0;
+	int n_var, n_row, pos, col;
 	char *expr;
-	GdkColor col;
+	GdkColor color;
 
 	for (var = table->vars; var; var = var->next)
 		n_vars++;
@@ -975,26 +978,40 @@
 	if (n_vars == 1 && n_rows == 1)
 		return;
 
-	evbox = gtk_event_box_new();
-	align = gtk_alignment_new(0, 0, 0, 0);
-	gtk_container_add(GTK_CONTAINER(align), evbox);
-	gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0);
+	var = table->vars;
+	n_var = 0;
+	n_vars = 0;
+	while (var) {
+		col = n_vars+(n_var != n_vars);;
+		if (!n_vars) {
+			evbox = gtk_event_box_new();
+			align = gtk_alignment_new(0, 0, 0, 0);
+			gtk_container_add(GTK_CONTAINER(align), evbox);
+			gtk_box_pack_start(GTK_BOX(vbox), align,
+			    FALSE, FALSE, 0);
 
-	tab = gtk_table_new(n_rows+1, n_vars, FALSE);
-	gtk_container_add(GTK_CONTAINER(evbox), tab);
-	col = get_color(COLOR_VAR_TABLE_SEP);
-	gtk_widget_modify_bg(GTK_WIDGET(evbox),
-	    GTK_STATE_NORMAL, &col);
+			tab = gtk_table_new(n_rows+1, col, FALSE);
+			gtk_container_add(GTK_CONTAINER(evbox), tab);
+			color = get_color(COLOR_VAR_TABLE_SEP);
+			gtk_widget_modify_bg(GTK_WIDGET(evbox),
+			    GTK_STATE_NORMAL, &color);
 
-	gtk_table_set_row_spacings(GTK_TABLE(tab), 1);
-	gtk_table_set_col_spacings(GTK_TABLE(tab), 1);
+			gtk_table_set_row_spacings(GTK_TABLE(tab), 1);
+			gtk_table_set_col_spacings(GTK_TABLE(tab), 1);
 
-	n_vars = 0;
-	for (var = table->vars; var; var = var->next) {
+			/* @@@
+			 * for now, we just add an empty first column to
+			 * wrapped tables, which yields a thin black line.
+			 * Might want to put something more visible later.
+			 */
+
+		}
+		gtk_table_resize(GTK_TABLE(tab), n_rows, col+1);
+	
 		field = label_in_box_new(var->name,
 		    "Variable (column) name. Click to edit.");
 		gtk_table_attach_defaults(GTK_TABLE(tab), box_of_label(field),
-		    n_vars, n_vars+1, 0, 1);
+		    col, col+1, 0, 1);
 		label_in_box_bg(field, COLOR_VAR_PASSIVE);
 		g_signal_connect(G_OBJECT(box_of_label(field)),
 		    "button_press_event",
@@ -1003,20 +1020,20 @@
 		    "scroll_event",
 		    G_CALLBACK(table_scroll_event), table);
 		var->widget = field;
-		n_vars++;
-	}
-	n_rows = 0;
-	for (row = table->rows; row; row = row->next) {
-		n_vars = 0;
-		for (value = row->values; value; value = value->next) {
+
+		n_row = 0;
+		for (row = table->rows; row; row = row->next) {
+			value = row->values;
+			for (pos = 0; pos != n_var; pos++)
+				value = value->next;
 			expr = unparse(value->expr);
 			field = label_in_box_new(expr,
 			    "Variable value. Click to select row or to edit.");
 			free(expr);
 			gtk_table_attach_defaults(GTK_TABLE(tab),
 			    box_of_label(field),
-			    n_vars, n_vars+1,
-			    n_rows+1, n_rows+2);
+			    col, col+1,
+			    n_row+1, n_row+2);
 			label_in_box_bg(field, table->active_row == row ?
 			    COLOR_ROW_SELECTED : COLOR_ROW_UNSELECTED);
 			g_signal_connect(G_OBJECT(box_of_label(field)),
@@ -1026,10 +1043,39 @@
 			    "scroll_event",
 			    G_CALLBACK(table_scroll_event), table);
 			value->widget = field;
-			n_vars++;
+			n_row++;
 		}
-		n_rows++;
+
+		/*
+		 * Wrap tables wider than the screen area available for
+		 * variables and tables. Don't wrap before having output at
+		 * least one column.
+		 */
+		if (n_vars && get_widget_width(tab) > wrap_width) {
+			/*
+			 * Resizing alone doesn't hide extra columns. We have
+			 * to explicitly remove their content as well.
+			 */
+			gtk_container_remove(GTK_CONTAINER(tab),
+			    box_of_label(var->widget));
+			for (row = table->rows; row; row = row->next) {
+				value = row->values;
+				for (pos = 0; pos != n_var; pos++)
+					value = value->next;
+				gtk_container_remove(GTK_CONTAINER(tab),
+				    box_of_label(value->widget));
+			}
+			gtk_table_resize(GTK_TABLE(tab), n_rows, col);
+
+			n_vars = 0;
+			continue;
+		}
+
+		var = var->next;
+		n_var++;
+		n_vars++;
 	}
+	
 }
 
 
@@ -1220,7 +1266,7 @@
 /* ----- the list of variables, tables, and loops -------------------------- */
 
 
-static GtkWidget *build_vars(struct frame *frame)
+static GtkWidget *build_vars(struct frame *frame, int wrap_width)
 {
 	GtkWidget *vbox;
 	struct table *table;
@@ -1230,7 +1276,7 @@
 	for (table = frame->tables; table; table = table->next) {
 		add_sep(vbox, 3);
 		build_assignment(vbox, frame, table);
-		build_table(vbox, frame, table);
+		build_table(vbox, frame, table, wrap_width);
 	}
 	for (loop = frame->loops; loop; loop = loop->next) {
 		add_sep(vbox, 3);
@@ -1696,11 +1742,12 @@
 /* ----- frames ------------------------------------------------------------ */
 
 
-void build_frames(GtkWidget *vbox)
+void build_frames(GtkWidget *vbox, int wrap_width)
 {
 	struct frame *frame;
 	GtkWidget *hbox, *tab, *label, *packages, *refs, *vars, *items, *meas;
 	int n = 0;
+	int max_name_width, name_width;
 
 	destroy_all_children(GTK_CONTAINER(vbox));
 	for (frame = frames; frame; frame = frame->next)
@@ -1717,6 +1764,7 @@
 
 	label = build_pkg_name();
 	gtk_table_attach_defaults(GTK_TABLE(tab), label, 0, 1, 0, 1);
+	max_name_width = get_widget_width(label);
 
 	packages = build_pkg_names();
 	gtk_table_attach_defaults(GTK_TABLE(tab), packages, 1, 2, 0, 1);
@@ -1726,13 +1774,21 @@
 		label = build_frame_label(frame);
 		gtk_table_attach_defaults(GTK_TABLE(tab), label,
 		    0, 1, n*2+1, n*2+2);
+		n++;
+		name_width = get_widget_width(label);
+		if (name_width > max_name_width)
+			max_name_width = name_width;
+	}
 
+	wrap_width -= max_name_width+FRAME_AREA_MISC_WIDTH;
+	n = 0;
+	for (frame = root_frame; frame; frame = frame->prev) {
 		refs = build_frame_refs(frame);
 		gtk_table_attach_defaults(GTK_TABLE(tab), refs,
 		    1, 2, n*2+1, n*2+2);
 
 		if (show_vars) {
-			vars = build_vars(frame);
+			vars = build_vars(frame, wrap_width);
 			gtk_table_attach_defaults(GTK_TABLE(tab), vars,
 			    1, 2, n*2+2, n*2+3);
 			dont_build_items(frame);

Modified: trunk/eda/fped/gui_frame.h
===================================================================
--- trunk/eda/fped/gui_frame.h	2010-02-18 14:18:30 UTC (rev 5846)
+++ trunk/eda/fped/gui_frame.h	2010-02-19 10:27:46 UTC (rev 5847)
@@ -1,8 +1,8 @@
 /*
  * gui_frame.h - GUI, frame window
  *
- * Written 2009 by Werner Almesberger
- * Copyright 2009 by Werner Almesberger
+ * Written 2009, 2010 by Werner Almesberger
+ * Copyright 2009, 2010 by Werner Almesberger
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,6 +27,6 @@
 void gui_frame_select_inst(struct inst *inst);
 void gui_frame_deselect_inst(struct inst *inst);
 
-void build_frames(GtkWidget *vbox);
+void build_frames(GtkWidget *vbox, int warp_width);
 
 #endif /* !GUI_FRAME_H */

Modified: trunk/eda/fped/gui_style.h
===================================================================
--- trunk/eda/fped/gui_style.h	2010-02-18 14:18:30 UTC (rev 5846)
+++ trunk/eda/fped/gui_style.h	2010-02-19 10:27:46 UTC (rev 5847)
@@ -1,8 +1,8 @@
 /*
  * gui_style.h - GUI, style definitions
  *
- * Written 2009 by Werner Almesberger
- * Copyright 2009 by Werner Almesberger
+ * Written 2009, 2010 by Werner Almesberger
+ * Copyright 2009, 2010 by Werner Almesberger
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -61,7 +61,11 @@
 #define	MM_FORMAT_SHORT		"%.4g"
 #define	MIL_FORMAT_SHORT	"%.4g"
 
+#define	DEFAULT_FRAME_AREA_WIDTH 250
+#define	DEFAULT_FRAME_AREA_HEIGHT 100
+#define	FRAME_AREA_MISC_WIDTH	26	/* pane, scroll bar, slack */
 
+
 /* ----- assorted colors --------------------------------------------------- */
 
 

Modified: trunk/eda/fped/gui_util.c
===================================================================
--- trunk/eda/fped/gui_util.c	2010-02-18 14:18:30 UTC (rev 5846)
+++ trunk/eda/fped/gui_util.c	2010-02-19 10:27:46 UTC (rev 5847)
@@ -387,3 +387,16 @@
 {
 	gtk_container_foreach(container, destroy_callback, NULL);
 }
+
+
+/* ----- get a widget's desired width -------------------------------------- */
+
+
+int get_widget_width(GtkWidget *widget)
+{
+	GtkRequisition req;
+
+	gtk_widget_show_all(widget);
+	gtk_widget_size_request(widget, &req);
+	return req.width;
+}

Modified: trunk/eda/fped/gui_util.h
===================================================================
--- trunk/eda/fped/gui_util.h	2010-02-18 14:18:30 UTC (rev 5846)
+++ trunk/eda/fped/gui_util.h	2010-02-19 10:27:46 UTC (rev 5847)
@@ -79,4 +79,6 @@
 
 void destroy_all_children(GtkContainer *container);
 
+int get_widget_width(GtkWidget *widget);
+
 #endif /* !GUI_UTIL_H */




More information about the commitlog mailing list