r5366 - developers/werner/fped
werner at docs.openmoko.org
werner at docs.openmoko.org
Sun Aug 2 07:36:21 CEST 2009
Author: werner
Date: 2009-08-02 07:36:21 +0200 (Sun, 02 Aug 2009)
New Revision: 5366
Modified:
developers/werner/fped/TODO
developers/werner/fped/gui_inst.c
developers/werner/fped/gui_inst.h
developers/werner/fped/inst.c
Log:
- the stem of a vector can now also be selected, but at low priority
- active elements are drawn above inactive ones
- the selected element is always drawn on top
Modified: developers/werner/fped/TODO
===================================================================
--- developers/werner/fped/TODO 2009-08-02 05:17:39 UTC (rev 5365)
+++ developers/werner/fped/TODO 2009-08-02 05:36:21 UTC (rev 5366)
@@ -17,8 +17,6 @@
- eliminate duplicate instances
Style:
-- stack elements (2a): all inactive below all active
-- stack elements (2b): unselected below selected
- make column of entry field greedily consume all unallocated space
Code cleanup:
Modified: developers/werner/fped/gui_inst.c
===================================================================
--- developers/werner/fped/gui_inst.c 2009-08-02 05:17:39 UTC (rev 5365)
+++ developers/werner/fped/gui_inst.c 2009-08-02 05:36:21 UTC (rev 5366)
@@ -143,6 +143,22 @@
}
+/*
+ * The circles at a vector's tip enjoy the highest selection priority. However,
+ * users will probably also expected a click on a nicely exposed stem to work.
+ * So we give it second look after having exhausted all other options.
+ */
+
+unit_type gui_dist_vec_fallback(struct inst *self, struct coord pos,
+ unit_type scale)
+{
+ unit_type d;
+
+ d = dist_line(pos, self->base, self->u.end)/scale;
+ return d > SELECT_R ? -1 : d;
+}
+
+
void gui_draw_vec(struct inst *self, struct draw_ctx *ctx)
{
struct coord from = translate(ctx, self->base);
Modified: developers/werner/fped/gui_inst.h
===================================================================
--- developers/werner/fped/gui_inst.h 2009-08-02 05:17:39 UTC (rev 5365)
+++ developers/werner/fped/gui_inst.h 2009-08-02 05:36:21 UTC (rev 5366)
@@ -31,6 +31,8 @@
struct coord canvas_to_coord(const struct draw_ctx *ctx, int x, int y);
unit_type gui_dist_vec(struct inst *self, struct coord pos, unit_type scale);
+unit_type gui_dist_vec_fallback(struct inst *self, struct coord pos,
+ unit_type scale);
unit_type gui_dist_line(struct inst *self, struct coord pos, unit_type scale);
unit_type gui_dist_rect(struct inst *self, struct coord pos, unit_type scale);
unit_type gui_dist_pad(struct inst *self, struct coord pos, unit_type scale);
Modified: developers/werner/fped/inst.c
===================================================================
--- developers/werner/fped/inst.c 2009-08-02 05:17:39 UTC (rev 5365)
+++ developers/werner/fped/inst.c 2009-08-02 05:36:21 UTC (rev 5366)
@@ -129,8 +129,8 @@
deselect_outside();
edit_nothing();
+ selected_inst = NULL;
FOR_INST_PRIOS_DOWN(prio) {
- selected_inst = NULL;
for (inst = insts[prio]; inst; inst = inst->next) {
if (!inst->active || !inst->ops->distance)
continue;
@@ -140,14 +140,30 @@
best_dist = dist;
}
}
- if (selected_inst) {
- set_path(1);
- if (selected_inst->ops->select)
- selected_inst->ops->select(selected_inst);
- return 1;
+ if (selected_inst)
+ goto selected;
+ }
+
+ /* give vectors a second chance */
+
+ for (inst = insts[ip_vec]; inst; inst = inst->next) {
+ if (!inst->active)
+ continue;
+ dist = gui_dist_vec_fallback(inst, pos, ctx->scale);
+ if (dist >= 0 && (!selected_inst || best_dist > dist)) {
+ selected_inst = inst;
+ best_dist = dist;
}
}
- return 0;
+
+ if (!selected_inst)
+ return 0;
+
+selected:
+ set_path(1);
+ if (selected_inst->ops->select)
+ selected_inst->ops->select(selected_inst);
+ return 1;
}
@@ -615,8 +631,13 @@
struct inst *inst;
FOR_INSTS_UP(prio, inst)
- if (inst->ops->draw)
+ if (!inst->active && inst->ops->draw)
inst->ops->draw(inst, ctx);
+ FOR_INSTS_UP(prio, inst)
+ if (inst->active && inst != selected_inst && inst->ops->draw)
+ inst->ops->draw(inst, ctx);
+ if (selected_inst && selected_inst->ops->draw)
+ selected_inst->ops->draw(selected_inst, ctx);
}
More information about the commitlog
mailing list