Prompting A User For a Canvas Click

cage cage-dev at twistfold.it
Thu Dec 10 11:08:30 UTC 2020


On Wed, Dec 09, 2020 at 03:38:03PM -0700, Ryan Burnside wrote:
> Hello cage,

Hi!

> Thanks for the reply.

You're welcome!  I am always  happy to discuss programming  with other
lispers! :)

> Your code did demonstrate the general idea if I was collecting from a field.
> But as this is a CAD program (think drafting) it's important that the user
> be able to pick points of interest from a main canvas.
> As important that the canvas cursor can "snap" to points of interest such as
> endpoints intersections etc. (I'll handle that myself).

I wrote  a (unfortunately  never released)  software -many  years ago-
that vaguely remember me what you  want to accomplish.  I had a canvas
and a set of buttons next to  the former. Each button allowed the user
to draw a  shape (nothing too complicated: box, circle  a bezier arrow
and a  few more). If an  user would wants  to draw a bezier  they just
have to press  the corresponding button (to enter in  "bezier mode" so
to  say) and  press four  times the  mouse button  on the  canvas; the
program collected the points calculated the  bezier and drawn a set of
segments and an arrow head on the last ends.

I am not sure that this workflow  fits into your program but all i did
was forget about  a main loop and  just let the user  events drive the
process. I waited for <1> (i  mean, mouse click) event (event bound to
the  canvas) checked  the drawing  mode (box,  bezier etc.)   and acts
following the mode (collect two point [one more events] for a box -the
diagonal- or for a segment and so on). Once got all the data needed to
draw the program updated the canvas with actual drawing.

I  even draw  a little  placeholder for  each collected  point in  the
canvas for each of this events.

There was also  interactions that allowed to move control  points of a
shape (in this case i waited for <Button1-Motion> event).

You can even  tag canvas items (the shapes) and  bind different custom
events to each one, see:

https://www.autistici.org/interzona/lisp.html#orge51c1f0

If  this is  -with  good approximation-  what  you want  to  do i  can
guarantee is doable with ltk. :)

>
> Here is a diagram if it helps...
> https://i.imgur.com/5uxY7Tq.png

Looking  to the  diagram  i started  to  think that  if  you call  the
procedure 'draw-foo' inside  the function bound to a  canvas event you
get more or less  what i described above, but i  could easily be wrong,
as usual! :)

Inside the event function you can  even run another toplevel (modal if
needed and hijack completely the input system)  as i did in the code i
wrote before.

> Hopefully this is possible!

I also hope it was! :)

Bye!!!
C.



More information about the ltk-user mailing list