diff --git a/Makefile b/Makefile index 6a5a12c..b1d0672 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ OBJS = fped.o expr.o coord.o obj.o delete.o inst.o util.o error.o \ gui.o gui_util.o gui_style.o gui_inst.o gui_status.o gui_canvas.o \ gui_tools.o -XPMS = point.xpm vec.xpm frame.xpm \ +XPMS = point.xpm vec.xpm frame.xpm frame_locked.xpm frame_ready.xpm \ line.xpm rect.xpm pad.xpm circ.xpm meas.xpm CFLAGS_GTK = `pkg-config --cflags gtk+-2.0` diff --git a/expr.c b/expr.c index 3eec5ae..6b785d4 100644 --- a/expr.c +++ b/expr.c @@ -384,6 +384,19 @@ fail: } +/* ----- make a number -----------------------------------------------------*/ + + +struct expr *new_num(struct num num) +{ + struct expr *expr; + + expr = new_op(op_num); + expr->u.num = num; + return expr; +} + + /* ----- expression-only parser -------------------------------------------- */ diff --git a/expr.h b/expr.h index 5cb12ea..82a6fc8 100644 --- a/expr.h +++ b/expr.h @@ -81,6 +81,17 @@ static inline struct num make_num(double n) } +static inline struct num make_mm(double mm) +{ + struct num res; + + res.type = nt_mm; + res.exponent = 1; + res.n = mm; + return res; +} + + static inline struct num make_mil(double mil) { struct num res; @@ -114,6 +125,7 @@ struct num eval_num(const struct expr *expr, const struct frame *frame); /* if frame == NULL, we only check the syntax without expanding */ char *expand(const char *name, const struct frame *frame); +struct expr *new_num(struct num num); struct expr *parse_expr(const char *s); void free_expr(struct expr *expr); diff --git a/gui.c b/gui.c index 682e03a..d7480de 100644 --- a/gui.c +++ b/gui.c @@ -503,6 +503,7 @@ static void select_frame(struct frame *frame) if (active_frame) label_in_box_bg(active_frame->label, COLOR_FRAME_UNSELECTED); active_frame = frame; + tool_frame_update(); change_world(); } @@ -648,7 +649,6 @@ static void make_center_area(GtkWidget *vbox) void change_world(void) { - tool_reset(); inst_deselect(); status_begin_reporting(); instantiate(); diff --git a/gui_canvas.c b/gui_canvas.c index 07c5605..b73fd40 100644 --- a/gui_canvas.c +++ b/gui_canvas.c @@ -154,6 +154,7 @@ static gboolean button_press_event(GtkWidget *widget, GdkEventButton *event, { struct coord pos = canvas_to_coord(&ctx, event->x, event->y); const struct inst *prev; + int res; switch (event->button) { case 1: @@ -162,7 +163,15 @@ static gboolean button_press_event(GtkWidget *widget, GdkEventButton *event, tool_cancel_drag(&ctx); dragging = 0; } - if (tool_consider_drag(&ctx, pos)) { + res = tool_consider_drag(&ctx, pos); + /* tool doesn't do drag */ + if (res < 0) { + change_world(); + inst_deselect(); + break; + } + if (res) { + inst_deselect(); dragging = 1; drag_escaped = 0; drag_start = pos; @@ -292,8 +301,10 @@ static gboolean key_press_event(GtkWidget *widget, GdkEventKey *event, case GDK_BackSpace: case GDK_Delete: case GDK_KP_Delete: - if (selected_inst && inst_delete(selected_inst)) + if (selected_inst && inst_delete(selected_inst)) { + tool_frame_update(); change_world(); + } break; case 'u': if (undelete()) diff --git a/gui_tools.c b/gui_tools.c index 312afb4..44bd964 100644 --- a/gui_tools.c +++ b/gui_tools.c @@ -12,6 +12,7 @@ #include +#include #include #include @@ -21,11 +22,15 @@ #include "gui_util.h" #include "gui_style.h" #include "gui_inst.h" +#include "gui_status.h" +#include "gui.h" #include "gui_tools.h" #include "icons/circ.xpm" #include "icons/frame.xpm" +#include "icons/frame_locked.xpm" +#include "icons/frame_ready.xpm" #include "icons/line.xpm" #include "icons/meas.xpm" #include "icons/pad.xpm" @@ -38,19 +43,25 @@ struct tool_ops { + void (*tool_selected)(void); struct pix_buf *(*drag_new)(struct draw_ctx *ctx, struct inst *from, struct coord to); + int (*end_new_raw)(struct draw_ctx *ctx, struct inst *from, + struct coord to); int (*end_new)(struct draw_ctx *ctx, struct inst *from, struct inst *to); }; -static GtkWidget *ev_point; +static GtkWidget *ev_point, *ev_frame; static GtkWidget *active_tool; static struct tool_ops *active_ops = NULL; static struct inst *hover_inst = NULL; +static GtkWidget *frame_image, *frame_image_locked, *frame_image_ready; + static struct drag_state { + struct inst *inst; /* non-NULL if dragging an existing object */ struct inst *new; /* non-NULL if dragging a new object */ int anchors_n; /* number of anchors, 0 if no moving */ int anchor_i; /* current anchor */ @@ -62,10 +73,21 @@ static struct drag_state { static struct pix_buf *pix_buf; -static struct tool_ops vec_ops; -static struct tool_ops frame_ops; -static struct tool_ops pad_ops; -static struct tool_ops meas_ops; + +static struct vec *new_vec(struct inst *base) +{ + struct vec *vec, **walk; + + vec = alloc_type(struct vec); + vec->name = NULL; + vec->base = inst_get_ref(base); + vec->n_refs = 0; + vec->next = NULL; + vec->frame = active_frame; + for (walk = &active_frame->vecs; *walk; walk = &(*walk)->next); + *walk = vec; + return vec; +} static struct obj *new_obj(enum obj_type type, struct inst *base) @@ -74,6 +96,7 @@ static struct obj *new_obj(enum obj_type type, struct inst *base) obj = alloc_type(struct obj); obj->type = type; + obj->frame = active_frame; obj->base = inst_get_ref(base); obj->next = NULL; obj->lineno = 0; @@ -83,6 +106,120 @@ static struct obj *new_obj(enum obj_type type, struct inst *base) } +/* ----- shared functions -------------------------------------------------- */ + + +static struct pix_buf *draw_move_line_common(struct inst *inst, + struct coord end, struct draw_ctx *ctx, struct coord pos, int i) +{ + struct coord from, to; + struct pix_buf *buf; + + from = translate(ctx, inst->base); + to = translate(ctx, end); + pos = translate(ctx, pos); + switch (i) { + case 0: + from = pos; + break; + case 1: + to = pos; + break; + default: + abort(); + } + buf = save_pix_buf(DA, from.x, from.y, to.x, to.y, 1); + gdk_draw_line(DA, gc_drag, from.x, from.y, to.x, to.y); + return buf; +} + + +static struct pix_buf *draw_move_rect_common(struct inst *inst, + struct coord other, struct draw_ctx *ctx, struct coord pos, int i) +{ + struct coord min, max; + struct pix_buf *buf; + + min = translate(ctx, inst->base); + max = translate(ctx, other); + pos = translate(ctx, pos); + switch (i) { + case 0: + min = pos; + break; + case 1: + max = pos; + break; + default: + abort(); + } + sort_coord(&min, &max); + buf = save_pix_buf(DA, min.x, min.y, max.x, max.y, 1); + gdk_draw_rectangle(DA, gc_drag, FALSE, + min.x, min.y, max.x-min.x, max.y-min.y); + return buf; +} + + +/* ----- vec --------------------------------------------------------------- */ + + +static void gridify(struct coord base, struct coord *pos) +{ + pos->x -= fmod(pos->x-base.x, mm_to_units(0.1)); + pos->y -= fmod(pos->y-base.y, mm_to_units(0.1)); +} + + +static struct pix_buf *drag_new_vec(struct draw_ctx *ctx, + struct inst *from, struct coord to) +{ + struct coord pos; + struct pix_buf *buf; + + pos = inst_get_point(from); + gridify(pos, &to); + status_set_type_x("dX ="); + status_set_type_y("dX ="); + status_set_x("%lg mm", units_to_mm(to.x-pos.x)); + status_set_y("%lg mm", units_to_mm(to.y-pos.y)); + pos = translate(ctx, pos); + to = translate(ctx, to); + buf = save_pix_buf(DA, pos.x, pos.y, to.x, to.y, 1); + gdk_draw_line(DA, gc_drag, pos.x, pos.y, to.x, to.y); + return buf; +} + + +struct pix_buf *draw_move_vec(struct inst *inst, struct draw_ctx *ctx, + struct coord pos, int i) +{ + return draw_move_line_common(inst, + add_vec(sub_vec(inst->u.rect.end, inst->base), pos), ctx, pos, i); +} + + +static int end_new_raw_vec(struct draw_ctx *ctx, + struct inst *from, struct coord to) +{ + struct vec *vec; + struct coord pos; + + vec = new_vec(from); + pos = inst_get_point(from); + gridify(pos, &to); + vec->x = new_num(make_mm(units_to_mm(to.x-pos.x))); + vec->y = new_num(make_mm(units_to_mm(to.y-pos.y))); + return 1; +} + + +static struct tool_ops vec_ops = { + .drag_new = drag_new_vec, + .end_new_raw = end_new_raw_vec, +}; + + /* ----- line -------------------------------------------------------------- */ @@ -103,25 +240,7 @@ static struct pix_buf *drag_new_line(struct draw_ctx *ctx, struct pix_buf *draw_move_line(struct inst *inst, struct draw_ctx *ctx, struct coord pos, int i) { - struct coord from, to; - struct pix_buf *buf; - - from = translate(ctx, inst->base); - to = translate(ctx, inst->u.rect.end); - pos = translate(ctx, pos); - switch (i) { - case 0: - from = pos; - break; - case 1: - to = pos; - break; - default: - abort(); - } - buf = save_pix_buf(DA, from.x, from.y, to.x, to.y, 1); - gdk_draw_line(DA, gc_drag, from.x, from.y, to.x, to.y); - return buf; + return draw_move_line_common(inst, inst->u.rect.end, ctx, pos, i); } @@ -164,33 +283,6 @@ static struct pix_buf *drag_new_rect(struct draw_ctx *ctx, } -static struct pix_buf *draw_move_rect_common(struct inst *inst, - struct coord other, struct draw_ctx *ctx, struct coord pos, int i) -{ - struct coord min, max; - struct pix_buf *buf; - - min = translate(ctx, inst->base); - max = translate(ctx, other); - pos = translate(ctx, pos); - switch (i) { - case 0: - min = pos; - break; - case 1: - max = pos; - break; - default: - abort(); - } - sort_coord(&min, &max); - buf = save_pix_buf(DA, min.x, min.y, max.x, max.y, 1); - gdk_draw_rectangle(DA, gc_drag, FALSE, - min.x, min.y, max.x-min.x, max.y-min.y); - return buf; -} - - struct pix_buf *draw_move_rect(struct inst *inst, struct draw_ctx *ctx, struct coord pos, int i) { @@ -365,6 +457,138 @@ static struct tool_ops circ_ops = { }; +/* ----- meas -------------------------------------------------------------- */ + + +struct pix_buf *draw_move_meas(struct inst *inst, struct draw_ctx *ctx, + struct coord pos, int i) +{ + return draw_move_line_common(inst, inst->u.meas.end, ctx, pos, i); +} + + +static int end_new_meas(struct draw_ctx *ctx, + struct inst *from, struct inst *to) +{ + struct obj *obj; + + if (from == to) + return 0; + obj = new_obj(ot_meas, from); + obj->u.meas.other = inst_get_ref(to); + obj->u.meas.offset = parse_expr("0mm"); + return 1; +} + + +static struct tool_ops meas_ops = { + .drag_new = NULL, + .end_new = end_new_meas, +}; + + +/* ----- frame helper ------------------------------------------------------ */ + + +static int is_parent_of(const struct frame *p, const struct frame *c) +{ + const struct obj *obj; + + if (p == c) + return 1; + for (obj = p->objs; obj; obj = obj->next) + if (obj->type == ot_frame) + if (is_parent_of(obj->u.frame.ref, c)) + return 1; + return 0; +} + + +/* ----- frame cache ------------------------------------------------------- */ + + +static struct frame *locked_frame = NULL; + + +static void remove_child(GtkWidget *widget, gpointer data) +{ + gtk_container_remove(GTK_CONTAINER(data), widget); +} + + +static void set_frame_image(GtkWidget *image) +{ + gtk_container_foreach(GTK_CONTAINER(ev_frame), remove_child, ev_frame); + gtk_container_add(GTK_CONTAINER(ev_frame), image); + gtk_widget_show_all(ev_frame); +} + + +void tool_frame_update(void) +{ + set_frame_image(!locked_frame ? frame_image : + is_parent_of(locked_frame, active_frame) ? + frame_image_locked : frame_image_ready); +} + + +void tool_frame_deleted(const struct frame *frame) +{ + if (frame == locked_frame) { + locked_frame = NULL; + set_frame_image(frame_image); + } +} + + +static void tool_selected_frame(void) +{ + if (active_frame != root_frame) { + locked_frame = active_frame; + set_frame_image(frame_image_locked); + } +} + + +/* ----- frame ------------------------------------------------------------- */ + + +struct pix_buf *draw_move_frame(struct inst *inst, struct draw_ctx *ctx, + struct coord pos, int i) +{ + struct pix_buf *buf; + int r = FRAME_EYE_R2; + + pos = translate(ctx, pos); + buf = save_pix_buf(DA, pos.x-r, pos.y-r, pos.x+r, pos.y+r, 1); + draw_arc(DA, gc_drag, FALSE, pos.x, pos.y, r, 0, 360); + return buf; +} + + +static int end_new_frame(struct draw_ctx *ctx, + struct inst *from, struct inst *to) +{ + struct obj *obj; + + if (!locked_frame || is_parent_of(locked_frame, active_frame)) + return 0; + obj = new_obj(ot_frame, from); + obj->u.frame.ref = locked_frame; + obj->u.frame.lineno = 0; + locked_frame = NULL; + tool_frame_update(); + return 1; +} + + +static struct tool_ops frame_ops = { + .tool_selected = tool_selected_frame, + .drag_new = NULL, + .end_new = end_new_frame, +}; + + /* ----- moving references ------------------------------------------------- */ @@ -398,7 +622,7 @@ static int would_be_equal(const struct drag_state *state, static int may_move_to(const struct drag_state *state, struct inst *curr) { - assert(selected_inst); + assert(drag.inst); assert(state->anchors_n); switch (state->anchors_n) { case 3: @@ -478,10 +702,24 @@ int tool_consider_drag(struct draw_ctx *ctx, struct coord pos) return 0; pix_buf = NULL; if (active_ops) { - drag.new = curr; - return 1; + if (active_ops->drag_new) { + drag.inst = NULL; + drag.new = curr; + return 1; + } else { + /* object is created without dragging */ + if (active_ops->end_new(ctx, curr, NULL)) { + tool_cancel_drag(ctx); + return -1; + } + return 0; + } } - return may_move(curr); + if (!may_move(curr)) + return 0; + drag.inst = selected_inst; + drag.new = NULL; + return 1; } @@ -491,7 +729,7 @@ void tool_drag(struct draw_ctx *ctx, struct coord to) restore_pix_buf(pix_buf); tool_hover(ctx, to); pix_buf = drag.new ? active_ops->drag_new(ctx, drag.new, to) : - inst_draw_move(selected_inst, ctx, to, drag.anchor_i); + inst_draw_move(drag.inst, ctx, to, drag.anchor_i); } @@ -514,6 +752,8 @@ int tool_end_drag(struct draw_ctx *ctx, struct coord to) struct tool_ops *ops = active_ops; tool_cancel_drag(ctx); + if (state.new && ops->end_new_raw) + return ops->end_new_raw(ctx, state.new, to); end = inst_find_point(ctx, to); if (!end) return 0; @@ -521,7 +761,7 @@ int tool_end_drag(struct draw_ctx *ctx, struct coord to) return ops->end_new(ctx, state.new, end); if (!may_move_to(&state, end)) return 0; - if (!inst_do_move_to(selected_inst, inst_get_vec(end), state.anchor_i)) + if (!inst_do_move_to(drag.inst, inst_get_vec(end), state.anchor_i)) do_move_to(&state, end); return 1; } @@ -543,6 +783,8 @@ static void tool_select(GtkWidget *evbox, struct tool_ops *ops) gtk_widget_modify_bg(evbox, GTK_STATE_NORMAL, &col); active_tool = evbox; active_ops = ops; + if (ops && ops->tool_selected) + ops->tool_selected(); } @@ -560,10 +802,21 @@ static gboolean tool_button_press_event(GtkWidget *widget, } +static GtkWidget *make_image(GdkDrawable *drawable, char **xpm) +{ + GdkPixmap *pixmap; + GtkWidget *image; + + pixmap = gdk_pixmap_create_from_xpm_d(drawable, NULL, NULL, xpm); + image = gtk_image_new_from_pixmap(pixmap, NULL); + gtk_misc_set_padding(GTK_MISC(image), 1, 1); + return image; +} + + static GtkWidget *tool_button(GtkWidget *bar, GdkDrawable *drawable, char **xpm, GtkWidget *last_evbox, struct tool_ops *ops) { - GdkPixmap *pixmap; GtkWidget *image, *evbox; GtkToolItem *item; GtkToolItem *last = NULL; @@ -571,8 +824,6 @@ static GtkWidget *tool_button(GtkWidget *bar, GdkDrawable *drawable, if (last_evbox) last = GTK_TOOL_ITEM(gtk_widget_get_ancestor(last_evbox, GTK_TYPE_TOOL_ITEM)); - pixmap = gdk_pixmap_create_from_xpm_d(drawable, NULL, NULL, xpm); - image = gtk_image_new_from_pixmap(pixmap, NULL); /* * gtk_radio_tool_button_new_from_widget is *huge*. we try to do things in a @@ -587,8 +838,10 @@ static GtkWidget *tool_button(GtkWidget *bar, GdkDrawable *drawable, gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(item), image); #else evbox = gtk_event_box_new(); - gtk_misc_set_padding(GTK_MISC(image), 1, 1); - gtk_container_add(GTK_CONTAINER(evbox), image); + if (xpm) { + image = make_image(drawable, xpm); + gtk_container_add(GTK_CONTAINER(evbox), image); + } g_signal_connect(G_OBJECT(evbox), "button_press_event", G_CALLBACK(tool_button_press_event), ops); @@ -616,13 +869,21 @@ GtkWidget *gui_setup_tools(GdkDrawable *drawable) ev_point = tool_button(bar, drawable, xpm_point, NULL, NULL); last = tool_button(bar, drawable, xpm_vec, ev_point, &vec_ops); - last = tool_button(bar, drawable, xpm_frame, last, &frame_ops); + ev_frame = tool_button(bar, drawable, NULL, last, &frame_ops); + last = ev_frame; last = tool_button(bar, drawable, xpm_pad, last, &pad_ops); last = tool_button(bar, drawable, xpm_line, last, &line_ops); last = tool_button(bar, drawable, xpm_rect, last, &rect_ops); last = tool_button(bar, drawable, xpm_circ, last, &circ_ops); last = tool_button(bar, drawable, xpm_meas, last, &meas_ops); + frame_image = gtk_widget_ref(make_image(drawable, xpm_frame)); + frame_image_locked = + gtk_widget_ref(make_image(drawable, xpm_frame_locked)); + frame_image_ready = + gtk_widget_ref(make_image(drawable, xpm_frame_ready)); + set_frame_image(frame_image); + tool_reset(); return bar; diff --git a/gui_tools.h b/gui_tools.h index 946424f..836113c 100644 --- a/gui_tools.h +++ b/gui_tools.h @@ -19,6 +19,8 @@ #include "inst.h" +struct pix_buf *draw_move_vec(struct inst *inst, struct draw_ctx *ctx, + struct coord pos, int i); struct pix_buf *draw_move_line(struct inst *inst, struct draw_ctx *ctx, struct coord pos, int i); struct pix_buf *draw_move_rect(struct inst *inst, struct draw_ctx *ctx, @@ -27,6 +29,10 @@ struct pix_buf *draw_move_pad(struct inst *inst, struct draw_ctx *ctx, struct coord pos, int i); struct pix_buf *draw_move_arc(struct inst *inst, struct draw_ctx *ctx, struct coord pos, int i); +struct pix_buf *draw_move_meas(struct inst *inst, struct draw_ctx *ctx, + struct coord pos, int i); +struct pix_buf *draw_move_frame(struct inst *inst, struct draw_ctx *ctx, + struct coord pos, int i); void do_move_to_arc(struct inst *inst, struct vec *vec, int i); @@ -37,6 +43,13 @@ void tool_drag(struct draw_ctx *ctx, struct coord to); void tool_cancel_drag(struct draw_ctx *ctx); int tool_end_drag(struct draw_ctx *ctx, struct coord to); +/* + * Cache the frame and track it. + */ + +void tool_frame_update(void); +void tool_frame_deleted(const struct frame *frame); + void tool_reset(void); GtkWidget *gui_setup_tools(GdkDrawable *drawable); diff --git a/icons/frame.fig b/icons/frame.fig index d7e233c..117d3cb 100644 --- a/icons/frame.fig +++ b/icons/frame.fig @@ -7,8 +7,10 @@ A4 Single -2 1200 2 +6 3750 3225 5775 4200 +2 1 0 10 12 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 3900 4125 3900 3525 5700 3525 +4 0 12 50 -1 22 42 0.0000 4 135 450 3750 3375 FRAME\001 +-6 2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 3600 2400 6000 2400 6000 4800 3600 4800 3600 2400 -2 1 0 10 12 7 50 -1 -1 0.000 0 0 -1 0 0 3 - 3900 4275 3900 3675 5700 3675 -4 0 12 50 -1 22 42 0.0000 4 135 450 3750 3525 FRAME\001 diff --git a/icons/frame_locked.fig b/icons/frame_locked.fig new file mode 100644 index 0000000..ebab309 --- /dev/null +++ b/icons/frame_locked.fig @@ -0,0 +1,17 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +A4 +100.00 +Single +-2 +1200 2 +6 3750 3225 5775 4200 +2 1 0 10 12 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 3900 4125 3900 3525 5700 3525 +4 0 12 50 -1 22 42 0.0000 4 135 450 3750 3375 FRAME\001 +-6 +1 3 0 0 0 0 50 -1 20 0.000 1 0.0000 5400 4200 375 375 5400 4200 5775 4200 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3600 2400 6000 2400 6000 4800 3600 4800 3600 2400 diff --git a/icons/frame_ready.fig b/icons/frame_ready.fig new file mode 100644 index 0000000..5552cc0 --- /dev/null +++ b/icons/frame_ready.fig @@ -0,0 +1,15 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +A4 +100.00 +Single +-2 +1200 2 +1 3 0 0 0 12 50 -1 20 0.000 1 0.0000 5400 4200 375 375 5400 4200 5775 4200 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3600 2400 6000 2400 6000 4800 3600 4800 3600 2400 +2 1 0 10 12 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 3900 4125 3900 3525 5700 3525 +4 0 12 50 -1 22 42 0.0000 4 135 450 3750 3375 FRAME\001 diff --git a/inst.c b/inst.c index a62b196..007fcbb 100644 --- a/inst.c +++ b/inst.c @@ -185,7 +185,7 @@ struct inst *inst_find_point(const struct draw_ctx *ctx, struct coord pos) found = NULL; for (inst = insts[ip_frame]; inst; inst = inst->next) { - if (!inst->active) + if (!inst->u.frame.active) continue; dist = gui_dist_frame_eye(inst, pos, ctx->scale); if (dist >= 0 && (!found || best_dist > dist)) { @@ -385,6 +385,7 @@ static struct inst_ops vec_ops = { .distance = gui_dist_vec, .select = vec_op_select, .anchors = vec_op_anchors, + .draw_move = draw_move_vec, }; @@ -671,6 +672,7 @@ static struct inst_ops meas_ops = { .distance = gui_dist_meas, .select = meas_op_select, .anchors = meas_op_anchors, + .draw_move = draw_move_meas, }; @@ -726,7 +728,7 @@ static void frame_op_select(struct inst *self) static int frame_op_anchors(struct inst *inst, struct vec ***anchors) { - anchors[0] = &inst->vec->base; + anchors[0] = &inst->obj->base; return 1; } @@ -738,6 +740,7 @@ static struct inst_ops frame_ops = { .distance = gui_dist_frame, .select = frame_op_select, .anchors = frame_op_anchors, + .draw_move = draw_move_frame, };