mirror of
git://projects.qi-hardware.com/fped.git
synced 2024-11-18 12:00:37 +02:00
make variable type changes also commit the value (name) being edited
This streamlines the workflow.
This commit is contained in:
parent
f2d3986600
commit
5d76af2d7c
@ -572,7 +572,7 @@ static void add_sep(GtkWidget *box, int size)
|
|||||||
/* ----- variable name editor ---------------------------------------------- */
|
/* ----- variable name editor ---------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
int find_var_in_frame(const struct frame *frame, const char *name,
|
static int find_var_in_frame(const struct frame *frame, const char *name,
|
||||||
const struct var *self)
|
const struct var *self)
|
||||||
{
|
{
|
||||||
const struct table *table;
|
const struct table *table;
|
||||||
@ -668,7 +668,6 @@ static void set_col_values(void *user, const struct value *values,
|
|||||||
|
|
||||||
void reselect_var(struct var *var)
|
void reselect_var(struct var *var)
|
||||||
{
|
{
|
||||||
|
|
||||||
edit_var(var, set_col_values, var, -1);
|
edit_var(var, set_col_values, var, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,8 +22,6 @@
|
|||||||
extern int show_vars;
|
extern int show_vars;
|
||||||
|
|
||||||
|
|
||||||
int find_var_in_frame(const struct frame *frame, const char *name,
|
|
||||||
const struct var *self);
|
|
||||||
void reselect_var(struct var *var);
|
void reselect_var(struct var *var);
|
||||||
|
|
||||||
void make_popups(void);
|
void make_popups(void);
|
||||||
|
156
gui_status.c
156
gui_status.c
@ -174,7 +174,6 @@ void status_set_angle_xy(const char *tooltip, struct coord v)
|
|||||||
status_set_angle(tooltip, "a = 0 deg");
|
status_set_angle(tooltip, "a = 0 deg");
|
||||||
else
|
else
|
||||||
status_set_angle(tooltip, "a = %3.1f deg", theta_vec(v));
|
status_set_angle(tooltip, "a = %3.1f deg", theta_vec(v));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -187,59 +186,6 @@ static void entry_color(GtkWidget *widget, const char *color)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ----- variable type display and change ---------------------------------- */
|
|
||||||
|
|
||||||
|
|
||||||
static struct var *curr_var;
|
|
||||||
static GtkWidget *var_type;
|
|
||||||
|
|
||||||
|
|
||||||
static void show_var_type(void)
|
|
||||||
{
|
|
||||||
gtk_label_set_text(GTK_LABEL(var_type),
|
|
||||||
curr_var->key ? "key" : "assign");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static gboolean var_type_button_press_event(GtkWidget *widget,
|
|
||||||
GdkEventButton *event, gpointer data)
|
|
||||||
{
|
|
||||||
switch (event->button) {
|
|
||||||
case 1:
|
|
||||||
if (curr_var->key &&
|
|
||||||
find_var_in_frame(curr_var->frame, curr_var->name,
|
|
||||||
curr_var))
|
|
||||||
return TRUE;
|
|
||||||
curr_var->key = !curr_var->key;
|
|
||||||
show_var_type();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* We can't just redraw() here, because changing the variable type may
|
|
||||||
* also affect lots of other things. So we change the world and hope
|
|
||||||
* we end up selecting the same variable afterwards.
|
|
||||||
*/
|
|
||||||
change_world();
|
|
||||||
reselect_var(curr_var);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void edit_var_type(struct var *var)
|
|
||||||
{
|
|
||||||
vacate_widget(status_box_x);
|
|
||||||
curr_var = var;
|
|
||||||
var_type = label_in_box_new(NULL, "Variable type. Click to cycle.");
|
|
||||||
gtk_container_add(GTK_CONTAINER(status_box_x), box_of_label(var_type));
|
|
||||||
label_in_box_bg(var_type, COLOR_SELECTOR);
|
|
||||||
g_signal_connect(G_OBJECT(box_of_label(var_type)),
|
|
||||||
"button_press_event", G_CALLBACK(var_type_button_press_event),
|
|
||||||
NULL);
|
|
||||||
show_var_type();
|
|
||||||
gtk_widget_show_all(status_box_x);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ----- pad type display and change --------------------------------------- */
|
/* ----- pad type display and change --------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
@ -503,22 +449,30 @@ struct edit_unique_with_values_ctx {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static enum edit_status unique_with_values_status(const char *s, void *ctx)
|
static int unique_with_values_check(const char *s,
|
||||||
|
const struct edit_unique_with_values_ctx *unique_ctx)
|
||||||
{
|
{
|
||||||
const struct edit_unique_with_values_ctx *unique_ctx = ctx;
|
|
||||||
const char *id;
|
const char *id;
|
||||||
struct value *values;
|
struct value *values;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
if (!strcmp(s, *unique_ctx->s))
|
|
||||||
return es_unchanged;
|
|
||||||
status_begin_reporting();
|
status_begin_reporting();
|
||||||
n = parse_var(s, &id, &values, unique_ctx->max_values);
|
n = parse_var(s, &id, &values, unique_ctx->max_values);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return es_bad;
|
return 0;
|
||||||
free_values(values, 0);
|
free_values(values, 0);
|
||||||
return !unique_ctx->validate ||
|
return unique_ctx->validate ?
|
||||||
unique_ctx->validate(id, unique_ctx->ctx) ? es_good : es_bad;
|
unique_ctx->validate(id, unique_ctx->ctx) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static enum edit_status unique_with_values_status(const char *s, void *ctx)
|
||||||
|
{
|
||||||
|
const struct edit_unique_with_values_ctx *unique_ctx = ctx;
|
||||||
|
|
||||||
|
if (!strcmp(s, *unique_ctx->s))
|
||||||
|
return es_unchanged;
|
||||||
|
return unique_with_values_check(s, unique_ctx) ? es_good : es_bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -565,6 +519,76 @@ void edit_unique_with_values(const char **s,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----- variable type display and change ---------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
static struct var *curr_var;
|
||||||
|
static GtkWidget *var_type;
|
||||||
|
|
||||||
|
|
||||||
|
static void show_var_type(void)
|
||||||
|
{
|
||||||
|
gtk_label_set_text(GTK_LABEL(var_type),
|
||||||
|
curr_var->key ? "key" : "assign");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a bit of a layering violation. Note that we can't just try to
|
||||||
|
* activate the edit and see what happens, because unique_with_values_status
|
||||||
|
* would unconditionally accept the previous value, even if it is no longer
|
||||||
|
* acceptable after the type change.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int attempt_var_type_change(struct var *var)
|
||||||
|
{
|
||||||
|
const struct edit_unique_with_values_ctx *ctx;
|
||||||
|
const char *s;
|
||||||
|
|
||||||
|
ctx = gtk_object_get_data(GTK_OBJECT(status_entry), "edit-ctx");
|
||||||
|
s = gtk_entry_get_text(GTK_ENTRY(status_entry));
|
||||||
|
var->key = !var->key;
|
||||||
|
if (unique_with_values_check(s, ctx))
|
||||||
|
return 1;
|
||||||
|
var->key = !var->key;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean do_activate(void);
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean var_type_button_press_event(GtkWidget *widget,
|
||||||
|
GdkEventButton *event, gpointer data)
|
||||||
|
{
|
||||||
|
switch (event->button) {
|
||||||
|
case 1:
|
||||||
|
if (!attempt_var_type_change(curr_var))
|
||||||
|
return TRUE;
|
||||||
|
/* commit edit and change_world() */
|
||||||
|
do_activate();
|
||||||
|
reselect_var(curr_var);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void edit_var_type(struct var *var)
|
||||||
|
{
|
||||||
|
vacate_widget(status_box_x);
|
||||||
|
curr_var = var;
|
||||||
|
var_type = label_in_box_new(NULL, "Variable type. Click to cycle.");
|
||||||
|
gtk_container_add(GTK_CONTAINER(status_box_x), box_of_label(var_type));
|
||||||
|
label_in_box_bg(var_type, COLOR_SELECTOR);
|
||||||
|
g_signal_connect(G_OBJECT(box_of_label(var_type)),
|
||||||
|
"button_press_event", G_CALLBACK(var_type_button_press_event),
|
||||||
|
NULL);
|
||||||
|
show_var_type();
|
||||||
|
gtk_widget_show_all(status_box_x);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ----- string fields ----------------------------------------------------- */
|
/* ----- string fields ----------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
@ -849,8 +873,7 @@ static gboolean changed(GtkWidget *widget, GdkEventMotion *event,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static gboolean activate(GtkWidget *widget, GdkEventMotion *event,
|
static gboolean do_activate(void)
|
||||||
gpointer data)
|
|
||||||
{
|
{
|
||||||
GtkWidget *edit;
|
GtkWidget *edit;
|
||||||
enum edit_status status;
|
enum edit_status status;
|
||||||
@ -880,6 +903,13 @@ static gboolean activate(GtkWidget *widget, GdkEventMotion *event,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean activate(GtkWidget *widget, GdkEventMotion *event,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
return do_activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void edit_nothing(void)
|
void edit_nothing(void)
|
||||||
{
|
{
|
||||||
gtk_widget_hide(status_entry);
|
gtk_widget_hide(status_entry);
|
||||||
|
Loading…
Reference in New Issue
Block a user