mirror of
git://projects.qi-hardware.com/fped.git
synced 2024-11-22 12:24:03 +02:00
When editing a variable or value, the actual value is now shown. The choice
of active frame reference, row, and loop instance affects this value, as it should. - obj.c (run_loops): reset loop->curr_value to UNDEF when instantiation is done - obj.c (generate_frame): reset frame->curr_parent to NULL when instantiation is done - expr.c (eval_var, eval_string_var): distinguish beteen instantiation and editing mode, and use "active" values in the latter - gui_frame.c (edit_var, edit_value, edit_value_list): display the value of the variable or the active expression in the "X" field - gui_frame.c (assignment_value_select_event, table_value_select_event, loop_from_select_event, loop_to_select_event): pass the frame to edit_value and edit_value_list - expr.c (str_unit): since we may now accidently expose a wider range of exponents, removed -2 ... 2 exponent range limitation git-svn-id: http://svn.openmoko.org/trunk/eda/fped@5788 99fdad57-331a-0410-800a-d7fa5415bdb3
This commit is contained in:
parent
393c178a5f
commit
e84727ce95
78
expr.c
78
expr.c
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* expr.c - Expressions and values
|
* expr.c - Expressions and values
|
||||||
*
|
*
|
||||||
* Written 2009 by Werner Almesberger
|
* Written 2009, 2010 by Werner Almesberger
|
||||||
* Copyright 2009 by Werner Almesberger
|
* Copyright 2009, 2010 by Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -41,39 +41,35 @@ void fail_expr(const struct expr *expr)
|
|||||||
/* ----- unit conversion --------------------------------------------------- */
|
/* ----- unit conversion --------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If an expression contains a typo, we may get large exponents. Thus, we just
|
||||||
|
* "sprintf" in order to be able to handle any integer. Since the number of
|
||||||
|
* different exponents in a session will still be small, we use "unique" to
|
||||||
|
* give us a constant string, so that we don't have to worry about memory
|
||||||
|
* allocation.
|
||||||
|
*/
|
||||||
|
|
||||||
const char *str_unit(struct num n)
|
const char *str_unit(struct num n)
|
||||||
{
|
{
|
||||||
|
const char *unit;
|
||||||
|
char buf[20]; /* @@@ plenty */
|
||||||
|
|
||||||
if (n.exponent == 0)
|
if (n.exponent == 0)
|
||||||
return "";
|
return stralloc("");
|
||||||
if (n.type == nt_mm) {
|
switch (n.type) {
|
||||||
switch (n.exponent) {
|
case nt_mm:
|
||||||
case -2:
|
unit = "mm";
|
||||||
return "mm^-2";
|
break;
|
||||||
case -1:
|
case nt_mil:
|
||||||
return "mm^-1";
|
unit = "mil";
|
||||||
case 1:
|
break;
|
||||||
return "mm";
|
default:
|
||||||
case 2:
|
abort();
|
||||||
return "mm^2";
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (n.type == nt_mil) {
|
if (n.exponent == 1)
|
||||||
switch (n.exponent) {
|
return unit;
|
||||||
case -2:
|
sprintf(buf, "%s^%d", unit, n.exponent);
|
||||||
return "mil^(-2)";
|
return unique(buf);
|
||||||
case -1:
|
|
||||||
return "mil^(-1)";
|
|
||||||
case 1:
|
|
||||||
return "mil";
|
|
||||||
case 2:
|
|
||||||
return "mil^2";
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
abort();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -115,6 +111,14 @@ struct num op_num(const struct expr *self, const struct frame *frame)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We have two modes of operation: during instantiation and editing, after
|
||||||
|
* instantiation. During instantiation, we follow curr_row and curr_parent.
|
||||||
|
* These pointers are NULL when instantiation finishes, and we use this as a
|
||||||
|
* signal that we're now in editing mode. In editing mode, the "active" values
|
||||||
|
* are used instead of the "current" ones.
|
||||||
|
*/
|
||||||
|
|
||||||
struct num eval_var(const struct frame *frame, const char *name)
|
struct num eval_var(const struct frame *frame, const char *name)
|
||||||
{
|
{
|
||||||
const struct table *table;
|
const struct table *table;
|
||||||
@ -124,7 +128,8 @@ struct num eval_var(const struct frame *frame, const char *name)
|
|||||||
struct num res;
|
struct num res;
|
||||||
|
|
||||||
for (table = frame->tables; table; table = table->next) {
|
for (table = frame->tables; table; table = table->next) {
|
||||||
value = table->curr_row->values;
|
value = table->curr_row ? table->curr_row->values :
|
||||||
|
table->active_row->values;
|
||||||
for (var = table->vars; var; var = var->next) {
|
for (var = table->vars; var; var = var->next) {
|
||||||
if (var->name == name) {
|
if (var->name == name) {
|
||||||
if (var->visited) {
|
if (var->visited) {
|
||||||
@ -143,6 +148,8 @@ struct num eval_var(const struct frame *frame, const char *name)
|
|||||||
}
|
}
|
||||||
for (loop = frame->loops; loop; loop = loop->next)
|
for (loop = frame->loops; loop; loop = loop->next)
|
||||||
if (loop->var.name == name) {
|
if (loop->var.name == name) {
|
||||||
|
if (loop->curr_value == UNDEF)
|
||||||
|
return make_num(loop->n+loop->active);
|
||||||
if (!loop->initialized) {
|
if (!loop->initialized) {
|
||||||
fail("uninitialized loop \"%s\"", name);
|
fail("uninitialized loop \"%s\"", name);
|
||||||
return undef;
|
return undef;
|
||||||
@ -151,6 +158,8 @@ struct num eval_var(const struct frame *frame, const char *name)
|
|||||||
}
|
}
|
||||||
if (frame->curr_parent)
|
if (frame->curr_parent)
|
||||||
return eval_var(frame->curr_parent, name);
|
return eval_var(frame->curr_parent, name);
|
||||||
|
if (frame->active_ref)
|
||||||
|
return eval_var(frame->active_ref->frame, name);
|
||||||
return undef;
|
return undef;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,7 +173,8 @@ static const char *eval_string_var(const struct frame *frame, const char *name)
|
|||||||
const char *res;
|
const char *res;
|
||||||
|
|
||||||
for (table = frame->tables; table; table = table->next) {
|
for (table = frame->tables; table; table = table->next) {
|
||||||
value = table->curr_row->values;
|
value = table->curr_row ? table->curr_row->values :
|
||||||
|
table->active_row->values;
|
||||||
for (var = table->vars; var; var = var->next) {
|
for (var = table->vars; var; var = var->next) {
|
||||||
if (var->name == name) {
|
if (var->name == name) {
|
||||||
if (var->visited)
|
if (var->visited)
|
||||||
@ -183,6 +193,8 @@ static const char *eval_string_var(const struct frame *frame, const char *name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
if (frame->curr_parent)
|
if (frame->curr_parent)
|
||||||
return eval_string_var(frame->curr_parent, name);
|
return eval_string_var(frame->curr_parent, name);
|
||||||
|
if (frame->active_ref)
|
||||||
|
return eval_string_var(frame->active_ref->frame, name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
49
gui_frame.c
49
gui_frame.c
@ -535,6 +535,39 @@ static void unselect_var(void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void show_value(const struct expr *expr, const struct frame *frame)
|
||||||
|
{
|
||||||
|
const char *value_string;
|
||||||
|
struct num value;
|
||||||
|
|
||||||
|
status_set_type_x(NULL, "value =");
|
||||||
|
value_string = eval_str(expr, frame);
|
||||||
|
if (value_string)
|
||||||
|
status_set_x(NULL, "\"%s\"", value_string);
|
||||||
|
else {
|
||||||
|
value = eval_num(expr, frame);
|
||||||
|
if (is_undef(value))
|
||||||
|
status_set_x(NULL, "undefined");
|
||||||
|
else
|
||||||
|
status_set_x(NULL, "%lg%s", value.n, str_unit(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void show_var_value(const struct var *var, const struct frame *frame)
|
||||||
|
{
|
||||||
|
const struct var *walk;
|
||||||
|
const struct value *value;
|
||||||
|
|
||||||
|
if (!var->table)
|
||||||
|
return;
|
||||||
|
value = var->table->active_row->values;
|
||||||
|
for (walk = var->table->vars; walk != var; walk = walk->next)
|
||||||
|
value = value->next;
|
||||||
|
show_value(value->expr, frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void edit_var(struct var *var,
|
static void edit_var(struct var *var,
|
||||||
void (*set_values)(void *user, const struct value *values, int n_values),
|
void (*set_values)(void *user, const struct value *values, int n_values),
|
||||||
void *user, int max_values)
|
void *user, int max_values)
|
||||||
@ -543,6 +576,7 @@ static void edit_var(struct var *var,
|
|||||||
label_in_box_bg(var->widget, COLOR_VAR_EDITING);
|
label_in_box_bg(var->widget, COLOR_VAR_EDITING);
|
||||||
status_set_type_entry(NULL, "name =");
|
status_set_type_entry(NULL, "name =");
|
||||||
status_set_name("Variable name", "%s", var->name);
|
status_set_name("Variable name", "%s", var->name);
|
||||||
|
show_var_value(var, var->frame);
|
||||||
edit_nothing();
|
edit_nothing();
|
||||||
edit_unique_with_values(&var->name, validate_var_name, var,
|
edit_unique_with_values(&var->name, validate_var_name, var,
|
||||||
set_values, user, max_values,
|
set_values, user, max_values,
|
||||||
@ -575,21 +609,23 @@ static void unselect_value(void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void edit_value(struct value *value)
|
static void edit_value(struct value *value, const struct frame *frame)
|
||||||
{
|
{
|
||||||
inst_select_outside(value, unselect_value);
|
inst_select_outside(value, unselect_value);
|
||||||
label_in_box_bg(value->widget, COLOR_EXPR_EDITING);
|
label_in_box_bg(value->widget, COLOR_EXPR_EDITING);
|
||||||
|
show_value(value->expr, frame);
|
||||||
edit_nothing();
|
edit_nothing();
|
||||||
edit_expr(&value->expr, "Value");
|
edit_expr(&value->expr, "Value");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void edit_value_list(struct value *value,
|
static void edit_value_list(struct value *value, const struct frame *frame,
|
||||||
void (*set_values)(void *user, const struct value *values, int n_values),
|
void (*set_values)(void *user, const struct value *values, int n_values),
|
||||||
void *user)
|
void *user)
|
||||||
{
|
{
|
||||||
inst_select_outside(value, unselect_value);
|
inst_select_outside(value, unselect_value);
|
||||||
label_in_box_bg(value->widget, COLOR_VAR_EDITING);
|
label_in_box_bg(value->widget, COLOR_VAR_EDITING);
|
||||||
|
show_value(value->expr, frame);
|
||||||
edit_nothing();
|
edit_nothing();
|
||||||
edit_expr_list(value->expr, set_values, user, "Value(s)");
|
edit_expr_list(value->expr, set_values, user, "Value(s)");
|
||||||
}
|
}
|
||||||
@ -674,7 +710,7 @@ static gboolean assignment_value_select_event(GtkWidget *widget,
|
|||||||
switch (event->button) {
|
switch (event->button) {
|
||||||
case 1:
|
case 1:
|
||||||
edit_nothing();
|
edit_nothing();
|
||||||
edit_value(value);
|
edit_value(value, value->row->table->vars->frame);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -797,7 +833,8 @@ static gboolean table_value_select_event(GtkWidget *widget,
|
|||||||
if (!value->row ||
|
if (!value->row ||
|
||||||
value->row->table->active_row == value->row) {
|
value->row->table->active_row == value->row) {
|
||||||
edit_nothing();
|
edit_nothing();
|
||||||
edit_value_list(value, set_row_values, value);
|
edit_value_list(value, value->row->table->vars->frame,
|
||||||
|
set_row_values, value);
|
||||||
} else {
|
} else {
|
||||||
select_row(value->row);
|
select_row(value->row);
|
||||||
change_world();
|
change_world();
|
||||||
@ -969,7 +1006,7 @@ static gboolean loop_from_select_event(GtkWidget *widget,
|
|||||||
switch (event->button) {
|
switch (event->button) {
|
||||||
case 1:
|
case 1:
|
||||||
edit_nothing();
|
edit_nothing();
|
||||||
edit_value(&loop->from);
|
edit_value(&loop->from, loop->var.frame);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -984,7 +1021,7 @@ static gboolean loop_to_select_event(GtkWidget *widget,
|
|||||||
switch (event->button) {
|
switch (event->button) {
|
||||||
case 1:
|
case 1:
|
||||||
edit_nothing();
|
edit_nothing();
|
||||||
edit_value(&loop->to);
|
edit_value(&loop->to, loop->var.frame);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
6
obj.c
6
obj.c
@ -1,8 +1,8 @@
|
|||||||
/*
|
/*
|
||||||
* obj.c - Object definition model
|
* obj.c - Object definition model
|
||||||
*
|
*
|
||||||
* Written 2009 by Werner Almesberger
|
* Written 2009, 2010 by Werner Almesberger
|
||||||
* Copyright 2009 by Werner Almesberger
|
* Copyright 2009, 2010 by Werner Almesberger
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -239,6 +239,7 @@ static int run_loops(struct frame *frame, struct loop *loop,
|
|||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
loop->initialized = 0;
|
loop->initialized = 0;
|
||||||
|
loop->curr_value = UNDEF;
|
||||||
if (active) {
|
if (active) {
|
||||||
loop->n = from.n;
|
loop->n = from.n;
|
||||||
loop->iterations = n;
|
loop->iterations = n;
|
||||||
@ -279,6 +280,7 @@ static int generate_frame(struct frame *frame, struct coord base,
|
|||||||
frame->curr_parent = parent;
|
frame->curr_parent = parent;
|
||||||
ok = iterate_tables(frame, frame->tables, base, active);
|
ok = iterate_tables(frame, frame->tables, base, active);
|
||||||
inst_end_frame(frame);
|
inst_end_frame(frame);
|
||||||
|
frame->curr_parent = NULL;
|
||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user