Send commitlog mailing list submissions to
        commitlog@lists.openmoko.org

To subscribe or unsubscribe via the World Wide Web, visit
        http://lists.openmoko.org/mailman/listinfo/commitlog
or, via email, send a message with subject or body 'help' to
        commitlog-requ...@lists.openmoko.org

You can reach the person managing the list at
        commitlog-ow...@lists.openmoko.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of commitlog digest..."
Today's Topics:

   1. r5354 - developers/werner/fped (wer...@docs.openmoko.org)
   2. r5355 - developers/werner/fped (wer...@docs.openmoko.org)
--- Begin Message ---
Author: werner
Date: 2009-08-01 00:11:03 +0200 (Sat, 01 Aug 2009)
New Revision: 5354

Modified:
   developers/werner/fped/README
   developers/werner/fped/TODO
   developers/werner/fped/expr.c
   developers/werner/fped/fpd.y
   developers/werner/fped/gui.c
   developers/werner/fped/gui_status.c
   developers/werner/fped/gui_status.h
   developers/werner/fped/gui_style.h
   developers/werner/fped/inst.c
   developers/werner/fped/inst.h
   developers/werner/fped/obj.c
   developers/werner/fped/obj.h
   developers/werner/fped/util.c
   developers/werner/fped/util.h
Log:
- some more language documentation details and cleanup
- added more details to color scheme for selecting non-canvas items
- moved is_id from expr.c to util.c
- loops now keep their variable name in "struct var", to allow better code 
  sharing with other variable-related functions
- variable names can now be edited
- frame names can now be edited



Modified: developers/werner/fped/README
===================================================================
--- developers/werner/fped/README       2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/README       2009-07-31 22:11:03 UTC (rev 5354)
@@ -10,6 +10,25 @@
 that can be performed through the GUI.
 
 
+Footprint definition file format
+================================
+
+Footprint definitions are stored in text files. The program "fped" reads
+and (soon) writes such files, visualizes their content, and provides a
+graphical editor for them.
+
+The syntax is unique and draws from elements of a variety of languages
+commonly found on unix systems. One specialty is that there are no
+reserved words - the language keywords appear only at the beginning of
+a line and can thus be recognized as such without restricting their use
+for identifiers. This reduces the risk of creating incompatibilities
+with existing designs when introduction future language features.
+
+fped uses the C preprocessor for comments, conditional compilation,
+and - to a limited extent - also macros. Long lines can be split by
+ending them with a backslash.
+
+
 Geometry model
 ==============
 
@@ -186,7 +205,7 @@
 Simple variables
 ----------------
 
-A variable with a single value is defined with the usual C-like
+A variable with a single value is defined with the following
 assignment syntax:
 
 set <identifier> = <expression>

Modified: developers/werner/fped/TODO
===================================================================
--- developers/werner/fped/TODO 2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/TODO 2009-07-31 22:11:03 UTC (rev 5354)
@@ -21,10 +21,13 @@
 - add postscript output
 - add option to include/omit helper vecs and frames (display and postscript)
 - Q: how do we handle stacks of objects ?
-- consider using cairo instead of gdk
+- future: consider using cairo instead of gdk
 - Q: add frame arguments ? (e.g., .frame pad(pin_num_offset) ...)
 - Q: should we make it a requirement to generate objects only once ?
 - advanced: non-standard solder mask
 - advanced: solder paste exceptions (subtractive, additive)
 - advanced: silk line width
 - make column of entry field greedily consume all unallocated space
+- when selecting an arc only consider the part drawn, not the whole circle
+- merge edit_unique with edit_name
+- merge find_var_in_frame with similar mechanisms in expr.c and fpd.y

Modified: developers/werner/fped/expr.c
===================================================================
--- developers/werner/fped/expr.c       2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/expr.c       2009-07-31 22:11:03 UTC (rev 5354)
@@ -123,7 +123,7 @@
                }
        }
        for (loop = frame->loops; loop; loop = loop->next)
-               if (loop->var == name)
+               if (loop->var.name == name)
                        return make_num(loop->curr_value);
        if (frame->curr_parent)
                return eval_var(frame->curr_parent, name);
@@ -297,18 +297,6 @@
 /* ----- string expansion -------------------------------------------------- */
 
 
-static int is_id(char c, int first)
-{
-       if ((c >= 'A' && c <= 'Z') ||
-           (c >= 'a' && c <= 'z') ||
-           c == '_')
-               return 1;
-       if (first)
-               return 0;
-       return c >= '0' && c <= '9';
-}
-
-
 char *expand(const char *name, const struct frame *frame)
 {
        int len = strlen(name);

Modified: developers/werner/fped/fpd.y
===================================================================
--- developers/werner/fped/fpd.y        2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/fpd.y        2009-07-31 22:11:03 UTC (rev 5354)
@@ -21,13 +21,18 @@
 
 
 static struct frame *curr_frame;
+static struct table *curr_table;
+static struct row *curr_row;
+
 static struct frame *last_frame = NULL;
+static struct vec *last_vec = NULL;
+
 static struct table **next_table;
 static struct loop **next_loop;
 static struct vec **next_vec;
 static struct obj **next_obj;
+
 static int n_vars, n_values;
-static struct vec *last_vec = NULL;
 
 
 static struct frame *find_frame(const char *name)
@@ -70,9 +75,11 @@
        table = zalloc_type(struct table);
        table->vars = zalloc_type(struct var);
        table->vars->name = id;
+       table->vars->frame = curr_frame;
        table->rows = zalloc_type(struct row);
        table->rows->values = zalloc_type(struct value);
        table->rows->values->expr = expr;
+       table->rows->values->row = table->rows;
        *next_table = table;
        next_table = &table->next;
 }
@@ -83,7 +90,9 @@
        struct loop *loop;
 
        loop = alloc_type(struct loop);
-       loop->var = id;
+       loop->var.name = id;
+       loop->var.next = NULL;
+       loop->var.frame = curr_frame;
        loop->from = from;
        loop->to = to;
        loop->next = NULL;
@@ -172,7 +181,6 @@
                        else
                                frames = curr_frame;
                        last_frame = curr_frame;
-
                }
            frame_items '}'
                {
@@ -213,6 +221,7 @@
                {
                        $<table>$ = zalloc_type(struct table);
                        *next_table = $<table>$;
+                       curr_table = $<table>$;
                        n_vars = 0;
                }
            '{' vars '}' rows
@@ -245,6 +254,7 @@
                {
                        $$ = alloc_type(struct var);
                        $$->name = $1;
+                       $$->frame = curr_frame;
                        $$->next = NULL;
                        n_vars++;
                }
@@ -257,6 +267,9 @@
                }
        | '{'
                {
+                       $<row>$ = alloc_type(struct row);
+                       $<row>$->table = curr_table;
+                       curr_row = $<row>$;;
                        n_values = 0;
                }
            row '}'
@@ -264,12 +277,11 @@
                        if (n_vars != n_values)
                                yyerrorf("table has %d variables but row has "
                                    "%d values", n_vars, n_values);
-                       $<row>$ = alloc_type(struct row);
-                       $<row>$->values = $3;
+                       $<row>2->values = $3;
                }
            rows
                {
-                       $$ = $<row>5;
+                       $$ = $<row>2;
                        $$->next = $6;
                }
        ;
@@ -294,6 +306,7 @@
                {
                        $$ = alloc_type(struct value);
                        $$->expr = $1;
+                       $$->row = curr_row;
                        $$->next = NULL;
                        n_values++;
                }

Modified: developers/werner/fped/gui.c
===================================================================
--- developers/werner/fped/gui.c        2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/gui.c        2009-07-31 22:11:03 UTC (rev 5354)
@@ -12,9 +12,11 @@
 
 
 #include <stdlib.h>
+#include <string.h>
 #include <math.h>
 #include <gtk/gtk.h>
 
+#include "util.h"
 #include "inst.h"
 #include "obj.h"
 #include "unparse.h"
@@ -27,6 +29,7 @@
 
 GtkWidget *root;
 
+static GtkWidget *frames_box;
 static GtkWidget *vars_box;
 
 
@@ -69,13 +72,88 @@
 }
 
 
-/* ----- GUI construction -------------------------------------------------- */
+/* ----- variable name editor ---------------------------------------------- */
 
 
+static int find_var_in_frame(const struct frame *frame, const char *name)
+{
+       const struct table *table;
+       const struct loop *loop;
+       const struct var *var;
+
+       for (table = frame->tables; table; table = table->next)
+               for (var = table->vars; var; var = var->next)
+                       if (!strcmp(var->name, name))
+                               return 1;
+       for (loop = frame->loops; loop; loop = loop->next)
+               if (!strcmp(loop->var.name, name))
+                       return 1;
+        return 0;
+}
+
+
+static int validate_id(const char *s)
+{
+       const char *p;
+
+       if (!*s)
+               return 0;
+       for (p = s; *p; p++)
+               if (!is_id(*p, s == p))
+                       return 0;
+       return 1;
+}
+
+
+static int validate_var_name(const char *s, void *ctx)
+{
+       struct var *var = ctx;
+
+       if (!validate_id(s))
+               return 0;
+       return !find_var_in_frame(var->frame, s);
+}
+
+
+static void unselect_var(void *data)
+{
+       struct var *var = data;
+
+        label_in_box_bg(var->widget, COLOR_VAR_PASSIVE);
+}
+
+
+static void edit_var(struct var *var)
+{
+       inst_select_outside(var, unselect_var);
+        label_in_box_bg(var->widget, COLOR_VAR_EDITING);
+       status_set_name(var->name);
+       edit_unique(&var->name, validate_var_name, var);
+}
+
+
+/* ----- assignments ------------------------------------------------------- */
+
+
+static gboolean assignment_var_select_event(GtkWidget *widget,
+     GdkEventButton *event, gpointer data)
+{
+       edit_var(data);
+       return TRUE;
+}
+
+
+static gboolean assignment_value_select_event(GtkWidget *widget,
+     GdkEventButton *event, gpointer data)
+{
+       return TRUE;
+}
+
+
 static void build_assignment(GtkWidget *vbox, struct frame *frame,
      struct table *table)
 {
-       GtkWidget *hbox;
+       GtkWidget *hbox, *field;
        char *expr;
 
        if (!table->vars || table->vars->next)
@@ -85,17 +163,48 @@
 
        hbox = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(table->vars->name),
-           FALSE, FALSE, 0);
+
+       field = label_in_box_new(table->vars->name);
+       gtk_box_pack_start(GTK_BOX(hbox), box_of_label(field), FALSE, FALSE, 0);
+       label_in_box_bg(field, COLOR_VAR_PASSIVE);
+       table->vars->widget = field;
+       g_signal_connect(G_OBJECT(box_of_label(field)),
+           "button_press_event",
+           G_CALLBACK(assignment_var_select_event), table->vars);
+
        gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(" = "),
            FALSE, FALSE, 0);
+
        expr = unparse(table->rows->values->expr);
-       gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(expr),
-           FALSE, FALSE, 0);
+       field = label_in_box_new(expr);
        free(expr);
+       gtk_box_pack_start(GTK_BOX(hbox), box_of_label(field), FALSE, FALSE, 0);
+       label_in_box_bg(field, COLOR_EXPR_PASSIVE);
+       table->rows->values->widget = field;
+       g_signal_connect(G_OBJECT(box_of_label(field)),
+           "button_press_event",
+           G_CALLBACK(assignment_value_select_event), table->rows->values);
 }
 
 
+/* ----- tables ------------------------------------------------------------ */
+
+
+static gboolean table_var_select_event(GtkWidget *widget,
+     GdkEventButton *event, gpointer data)
+{
+       edit_var(data);
+       return TRUE;
+}
+
+
+static gboolean table_value_select_event(GtkWidget *widget,
+     GdkEventButton *event, gpointer data)
+{
+       return TRUE;
+}
+
+
 static void build_table(GtkWidget *vbox, struct frame *frame,
      struct table *table)
 {
@@ -123,9 +232,13 @@
        n_vars = 0;
        for (var = table->vars; var; var = var->next) {
                field = label_in_box_new(var->name);
-               label_in_box_bg(field, "pink");
                gtk_table_attach_defaults(GTK_TABLE(tab), box_of_label(field),
                    n_vars, n_vars+1, 0, 1);
+               label_in_box_bg(field, COLOR_VAR_PASSIVE);
+               g_signal_connect(G_OBJECT(box_of_label(field)),
+                   "button_press_event",
+                   G_CALLBACK(table_var_select_event), var);
+               var->widget = field;
                n_vars++;
        }
        n_rows = 0;
@@ -139,6 +252,12 @@
                            box_of_label(field),
                            n_vars, n_vars+1,
                            n_rows+1, n_rows+2);
+                       label_in_box_bg(field, table->active == n_rows ?
+                           COLOR_ROW_SELECTED : COLOR_ROW_UNSELECTED);
+                       g_signal_connect(G_OBJECT(box_of_label(field)),
+                           "button_press_event",
+                           G_CALLBACK(table_value_select_event), value);
+                       value->widget = field;
                        n_vars++;
                }
                n_rows++;
@@ -146,31 +265,77 @@
 }
 
 
+/* ----- loops ------------------------------------------------------------- */
+
+
+static gboolean loop_var_select_event(GtkWidget *widget,
+     GdkEventButton *event, gpointer data)
+{
+       edit_var(data);
+       return TRUE;
+}
+
+
+static gboolean loop_from_select_event(GtkWidget *widget,
+     GdkEventButton *event, gpointer data)
+{
+       return TRUE;
+}
+
+
+static gboolean loop_to_select_event(GtkWidget *widget,
+     GdkEventButton *event, gpointer data)
+{
+       return TRUE;
+}
+
+
 static void build_loop(GtkWidget *vbox, struct frame *frame,
      struct loop *loop)
 {
-       GtkWidget *hbox;
+       GtkWidget *hbox, *field;
        char *expr;
 
        hbox = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(loop->var),
-           FALSE, FALSE, 0);
+
+       field = label_in_box_new(loop->var.name);
+       gtk_box_pack_start(GTK_BOX(hbox), box_of_label(field), FALSE, FALSE, 0);
+       label_in_box_bg(field, COLOR_VAR_PASSIVE);
+       g_signal_connect(G_OBJECT(box_of_label(field)),
+           "button_press_event",
+           G_CALLBACK(loop_var_select_event), loop);
+       loop->var.widget = field;
+
        gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(" = "),
            FALSE, FALSE, 0);
+
        expr = unparse(loop->from);
-       gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(expr),
-           FALSE, FALSE, 0);
+       field = label_in_box_new(expr);
        free(expr);
+       gtk_box_pack_start(GTK_BOX(hbox), box_of_label(field), FALSE, FALSE, 0);
+       label_in_box_bg(field, COLOR_EXPR_PASSIVE);
+       g_signal_connect(G_OBJECT(box_of_label(field)),
+           "button_press_event",
+           G_CALLBACK(loop_from_select_event), loop);
+
        gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(" ... "),
            FALSE, FALSE, 0);
+
        expr = unparse(loop->to);
-       gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(expr),
-           FALSE, FALSE, 0);
+       field = label_in_box_new(expr);
        free(expr);
+       gtk_box_pack_start(GTK_BOX(hbox), box_of_label(field), FALSE, FALSE, 0);
+       label_in_box_bg(field, COLOR_EXPR_PASSIVE);
+       g_signal_connect(G_OBJECT(box_of_label(field)),
+           "button_press_event",
+           G_CALLBACK(loop_to_select_event), loop);
 }
 
 
+/* ----- the list of variables, tables, and loops -------------------------- */
+
+
 static void build_vars(GtkWidget *vbox, struct frame *frame)
 {
        struct table *table;
@@ -193,19 +358,32 @@
 /* ----- frame list -------------------------------------------------------- */
 
 
-void change_world(void)
+static int validate_frame_name(const char *s, void *ctx)
 {
-       instantiate();
-       label_in_box_bg(active_frame->label, "pink");
-       build_vars(vars_box, active_frame);
-       redraw();
+       struct frame *f;
+
+       if (!validate_id(s))
+               return 0;
+       for (f = frames; f; f = f->next)
+               if (f->name && !strcmp(f->name, s))
+                       return 0;
+       return 1;
 }
 
 
+static void edit_frame(struct frame *frame)
+{
+       inst_select_outside(frame, NULL);
+       label_in_box_bg(frame->label, COLOR_FRAME_EDITING);
+       status_set_name(frame->name);
+       edit_unique(&frame->name, validate_frame_name, frame);
+}
+
+
 static void select_frame(struct frame *frame)
 {
        if (active_frame) {
-               label_in_box_bg(active_frame->label, "grey");
+               label_in_box_bg(active_frame->label, COLOR_FRAME_UNSELECTED);
                inst_deselect();
        }
        active_frame = frame;
@@ -216,16 +394,22 @@
 static gboolean frame_select_event(GtkWidget *widget, GdkEventButton *event,
      gpointer data)
 {
-       select_frame(data);
+       if (active_frame != data)
+               select_frame(data);
+       else {
+               if (active_frame->name)
+                       edit_frame(data);
+       }
        return TRUE;
 }
 
 
-static void show_frames(GtkWidget *vbox)
+static void build_frames(GtkWidget *vbox)
 {
        struct frame *f;
        GtkWidget *label;
 
+       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),
@@ -233,12 +417,14 @@
                gtk_misc_set_padding(GTK_MISC(label), 2, 2);
                gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
 
-               label_in_box_bg(label, "grey");
+               label_in_box_bg(label, active_frame == f ?
+                   COLOR_FRAME_SELECTED : COLOR_FRAME_UNSELECTED);
 
                g_signal_connect(G_OBJECT(box_of_label(label)),
                    "button_press_event", G_CALLBACK(frame_select_event), f);
                f->label = label;
        }
+       gtk_widget_show_all(vbox);
 }
 
 
@@ -249,7 +435,6 @@
 {
        GtkWidget *hbox, *vars, *paned;
        GtkWidget *frame_list;
-       GtkWidget *v2box;
 
        hbox = gtk_hbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
@@ -261,11 +446,11 @@
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(frame_list),
            GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
 
-       v2box = gtk_vbox_new(FALSE, 0);
+       frames_box = gtk_vbox_new(FALSE, 0);
        gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(frame_list),
-           v2box);
+           frames_box);
 
-       show_frames(v2box);
+       build_frames(frames_box);
 
        add_sep(hbox, 2);
 
@@ -293,6 +478,16 @@
 /* ----- GUI construction -------------------------------------------------- */
 
 
+void change_world(void)
+{
+       instantiate();
+       label_in_box_bg(active_frame->label, COLOR_FRAME_SELECTED);
+       build_frames(frames_box);
+       build_vars(vars_box, active_frame);
+       redraw();
+}
+
+
 static void make_screen(GtkWidget *window)
 {
        GtkWidget *vbox;

Modified: developers/werner/fped/gui_status.c
===================================================================
--- developers/werner/fped/gui_status.c 2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/gui_status.c 2009-07-31 22:11:03 UTC (rev 5354)
@@ -95,6 +95,65 @@
 }
 
 
+/* ----- identifier fields ------------------------------------------------- */
+
+
+struct edit_unique_ctx {
+       const char **s;
+       int (*validate)(const char *s, void *ctx);
+       void *ctx;
+};
+
+
+static int unique_changed(GtkWidget *widget, const char *s, void *ctx)
+{
+       const struct edit_unique_ctx *unique_ctx = ctx;
+       int ok;
+
+       if (!strcmp(s, *unique_ctx->s)) {
+               entry_color(COLOR_EDIT_ASIS);
+               return 1;
+       }
+       ok = !unique_ctx->validate || unique_ctx->validate(s, unique_ctx->ctx);
+       entry_color(ok ? COLOR_EDIT_GOOD : COLOR_EDIT_BAD);
+       return ok;
+}
+
+
+static int unique_activate(GtkWidget *widget, const char *s, void *ctx)
+{
+       const struct edit_unique_ctx *unique_ctx = ctx;
+
+       if (unique_ctx->validate && !unique_ctx->validate(s, unique_ctx->ctx))
+               return 0;
+       *unique_ctx->s = unique(s);
+       entry_color(COLOR_EDIT_ASIS);
+       return 1;
+}
+
+
+static struct edit_ops edit_ops_unique = {
+       .changed        = unique_changed,
+       .activate       = unique_activate,
+};
+
+
+void edit_unique(const char **s, int (*validate)(const char *s, void *ctx), 
+    void *ctx)
+{
+       static struct edit_unique_ctx unique_ctx;
+
+       unique_ctx.s = s;
+       unique_ctx.validate = validate;
+       unique_ctx.ctx = ctx;
+       edit_ops = &edit_ops_unique;
+       edit_ctx = &unique_ctx;
+       gtk_entry_set_text(GTK_ENTRY(status_entry), *s);
+       entry_color(COLOR_EDIT_ASIS);
+       gtk_widget_show(status_entry);
+}
+
+
 /* ----- string fields ----------------------------------------------------- */
 
 

Modified: developers/werner/fped/gui_status.h
===================================================================
--- developers/werner/fped/gui_status.h 2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/gui_status.h 2009-07-31 22:11:03 UTC (rev 5354)
@@ -20,6 +20,8 @@
 #include "expr.h"
 
 
+void edit_unique(const char **s, int (*validate)(const char *s, void *ctx),
+    void *ctx);
 void edit_name(char **s, int (*validate)(const char *s, void *ctx), void *ctx);
 void edit_expression(struct expr **expr);
 void edit_nothing(void);

Modified: developers/werner/fped/gui_style.h
===================================================================
--- developers/werner/fped/gui_style.h  2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/gui_style.h  2009-07-31 22:11:03 UTC (rev 5354)
@@ -42,7 +42,22 @@
 #define COLOR_EDIT_GOOD        "#a0ffa0"
 #define COLOR_EDIT_BAD "#ffa0a0"
 
+#define        COLOR_EDITING   "#ff00ff"
 
+#define        COLOR_FRAME_UNSELECTED  "#c0c0c0"
+#define COLOR_FRAME_SELECTED   "#fff0a0"
+#define COLOR_FRAME_EDITING    COLOR_EDITING
+
+#define        COLOR_VAR_PASSIVE       COLOR_FRAME_UNSELECTED
+#define        COLOR_VAR_EDITING       COLOR_EDITING
+#define        COLOR_EXPR_PASSIVE      "#f0f0ff"
+#define        COLOR_EXPR_EDITING      COLOR_EDITING
+#define        COLOR_CHOICE_UNSELECTED COLOR_EXPR_PASSIVE
+#define        COLOR_CHOICE_SELECTED   "#9090ff"
+#define        COLOR_ROW_UNSELECTED    COLOR_CHOICE_UNSELECTED
+#define        COLOR_ROW_SELECTED      COLOR_CHOICE_SELECTED
+
+
 /* ----- canvas drawing styles --------------------------------------------- */
 
 

Modified: developers/werner/fped/inst.c
===================================================================
--- developers/werner/fped/inst.c       2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/inst.c       2009-07-31 22:11:03 UTC (rev 5354)
@@ -36,6 +36,32 @@
 #define        IS_ACTIVE       ((active_set & 1))
 
 
+/* ----- selection of items not on the canvas ------------------------------ */
+
+
+static void *selected_outside = NULL;
+static void (*outside_deselect)(void *item);
+
+
+static void deselect_outside(void)
+{
+       if (selected_outside && outside_deselect)
+               outside_deselect(selected_outside);
+       selected_outside = NULL;
+}
+
+
+void inst_select_outside(void *item, void (*deselect)(void *item))
+{
+       if (item == selected_outside)
+               return;
+       deselect_outside();
+       inst_deselect();
+       selected_outside = item;
+       outside_deselect = deselect;
+}
+
+
 /* ----- selection --------------------------------------------------------- */
 
 
@@ -63,6 +89,7 @@
        struct inst *inst;
        int best_dist, dist;
 
+       deselect_outside();
        selected_inst = NULL;
        edit_nothing();
        for (inst = insts; inst; inst = inst->next) {
@@ -87,6 +114,7 @@
 {
        if (selected_inst)
                set_path(0);
+       deselect_outside();
        status_set_name("");
        status_set_x("");
        status_set_y("");

Modified: developers/werner/fped/inst.h
===================================================================
--- developers/werner/fped/inst.h       2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/inst.h       2009-07-31 22:11:03 UTC (rev 5354)
@@ -74,6 +74,7 @@
 extern struct inst *selected_inst;
 
 
+void inst_select_outside(void *item, void (*deselect)(void *item));
 int inst_select(const struct draw_ctx *ctx, struct coord pos);
 void inst_deselect(void);
 

Modified: developers/werner/fped/obj.c
===================================================================
--- developers/werner/fped/obj.c        2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/obj.c        2009-07-31 22:11:03 UTC (rev 5354)
@@ -151,7 +151,7 @@
        for (loop->curr_value = from.n; loop->curr_value <= to.n;
            loop->curr_value += 1) {
                if (n >= MAX_ITERATIONS) {
-                       fail("%s: too many iterations (%d)", loop->var,
+                       fail("%s: too many iterations (%d)", loop->var.name,
                            MAX_ITERATIONS);
                        return 0;
                }

Modified: developers/werner/fped/obj.h
===================================================================
--- developers/werner/fped/obj.h        2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/obj.h        2009-07-31 22:11:03 UTC (rev 5354)
@@ -23,16 +23,31 @@
 struct var {
        const char *name;
        struct var *next;
+
+       /* back reference */
+       struct frame *frame;
+
+       /* for the GUI */
+       GtkWidget *widget;
 };
 
 struct value {
        struct expr *expr;
        struct value *next;
+
+       /* back reference */
+       struct row *row;
+
+       /* for the GUI */
+       GtkWidget *widget;
 };
 
 struct row {
        struct value *values;
        struct row *next;
+
+       /* back reference */
+       struct table *table;
 };
 
 struct table {
@@ -48,7 +63,7 @@
 };
 
 struct loop {
-       const char *var;
+       struct var var;
        struct expr *from;
        struct expr *to;
        struct loop *next;

Modified: developers/werner/fped/util.c
===================================================================
--- developers/werner/fped/util.c       2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/util.c       2009-07-31 22:11:03 UTC (rev 5354)
@@ -16,6 +16,20 @@
 #include "util.h"
 
 
+
+int is_id(char c, int first) 
+{
+       if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_')
+               return 1;
+       if (first)
+               return 0;
+       return c >= '0' && c <= '9';
+}
+
+
+/* ----- unique identifiers ------------------------------------------------ */
+
+
 static struct unique {
        const char *s;
        struct unique *next;

Modified: developers/werner/fped/util.h
===================================================================
--- developers/werner/fped/util.h       2009-07-31 16:57:46 UTC (rev 5353)
+++ developers/werner/fped/util.h       2009-07-31 22:11:03 UTC (rev 5354)
@@ -45,6 +45,9 @@
        strnalloc_tmp[n] = 0;                           \
        strnalloc_tmp; })
 
+
+int is_id(char c, int first);
+
 const char *unique(const char *s);
 
 #endif /* !UTIL_H */




--- End Message ---
--- Begin Message ---
Author: werner
Date: 2009-08-01 00:16:10 +0200 (Sat, 01 Aug 2009)
New Revision: 5355

Modified:
   developers/werner/fped/TODO
Log:
Reorganized TODO.



Modified: developers/werner/fped/TODO
===================================================================
--- developers/werner/fped/TODO 2009-07-31 22:11:03 UTC (rev 5354)
+++ developers/werner/fped/TODO 2009-07-31 22:16:10 UTC (rev 5355)
@@ -1,33 +1,45 @@
-- make frame selection work
-- Q: should loop be (start, last) or (start, iterations) ?
+Missing features:
 - add row selection
-- change vector circle color ? (also, highlight on hover ?)
-- stack elements (1): frames, pads, silk, vecs
-- stack elements (2): all unselected below all selected
-- stack elements (3): circle on top of vec
-- detect recursive evaluation (through variables)
-- eliminate duplicate instances
 - populate input area (still needed: mm/mil, rezoom)
 - add vec editor
 - add obj editor
-- decide on table presentation
 - add table/var/loop editor
 - add incremental expression parser (for editor)
 - add default unit (combine with grid unit selection ?)
 - consider adding auto/mm/mil selection for each dimension
 - add measurements
-- Q: allow reassignment of vector names ? (no: would cause confusion in GUI)
 - add KiCad output
 - add postscript output
 - add option to include/omit helper vecs and frames (display and postscript)
+
+Error detection:
+- detect recursive evaluation (through variables)
+- eliminate duplicate instances
+
+Bugs:
+- when selecting an arc only consider the part drawn, not the whole circle
+
+Style:
+- stack elements (1): frames, pads, silk, vecs
+- stack elements (2): all unselected below all selected
+- stack elements (3): circle on top of vec
+- make column of entry field greedily consume all unallocated space
+
+Code cleanup:
+- merge edit_unique with edit_name
+- merge find_var_in_frame with similar mechanisms in expr.c and fpd.y
+
+Open decisions:
+- decide on table presentation (merge frame and vars into single entity ?)
+- Q: should loop be (start, last) or (start, iterations) ?
+- change vector circle color ? (also, highlight on hover ?)
+- Q: allow reassignment of vector names ? (no: would cause confusion in GUI)
 - Q: how do we handle stacks of objects ?
-- future: consider using cairo instead of gdk
 - Q: add frame arguments ? (e.g., .frame pad(pin_num_offset) ...)
 - Q: should we make it a requirement to generate objects only once ?
+
+Future directions:
+- future: consider using cairo instead of gdk
 - advanced: non-standard solder mask
 - advanced: solder paste exceptions (subtractive, additive)
 - advanced: silk line width
-- make column of entry field greedily consume all unallocated space
-- when selecting an arc only consider the part drawn, not the whole circle
-- merge edit_unique with edit_name
-- merge find_var_in_frame with similar mechanisms in expr.c and fpd.y




--- End Message ---
_______________________________________________
commitlog mailing list
commitlog@lists.openmoko.org
http://lists.openmoko.org/mailman/listinfo/commitlog

Reply via email to