Thanks, but unfortunately that doesn���t work.

 

The object stored in the image variable is an ImagePresenter, not a Morph, so it doesn���t understand globalPointToLocal:. However, the ImagePresenter contains an adapter (an SpMorphicBoxAdapter) which has a variable called widget containing an AlphaImageMorph which must represent the image. But if I send the #globalPointToLocal: message to the AlphaImageMorph instance it just returns the same point that it was given as argument. This must be because Morph>>globalPointToLocal: is implemented as:

 

Morph>>globalPointToLocal: aPoint

���������������������������������������������������� ^self point: aPoint from: nil

 

and:

Morph>>point: aPoint from: aReferenceMorph

���������������������������������������������������� owner ifNil: [^ aPoint].

���������������������������������������������������� ^ (owner transformFrom: aReferenceMorph) globalPointToLocal: aPoint

 

Since these definitions are the only one in any of the Morph subclasses, aReferenceMorph will always be nil for all Morphs and Morph>>point: aPoint from: aReferenceMorph (and Morph>>globalPointToLocal:) will always return the same point that it was given as argument. This seems a bit strange.

 

After some more research, I found a similar question from 2012 where the #globalPointToLocal: method was apparently working:

http://forum.world.st/Mouse-handler-on-a-morph-td4603302.html

 

So at the moment I am not sure if #globalPointToLocal: is the intended way of transforming coordinates, perhaps with a bug, or if there is new way of transforming coordinates and this is just old code that has not been removed from the image. At first, I would have guessed that coordinate transformation should have been handled by the different Layouts used, but this doesn���t seem to be the case.

 

Any further suggestions are very welcome!

 

Kind regards,

Mikael

 

 

Fr��n: sducasseatwork--- via Pharo-users [mailto:pharo-users@lists.pharo.org]
Skickat: den 4 mars 2025 12:37
Till: Any question about pharo is welcome
Kopia: sducasseatwork@mailo.com
��mne: [Pharo-users] Re: Converting global coordinates from a mouse event

 

I did a little search and I found 

 

Morph >> globalPointToLocal: aPoint

������������������������������������������ ^self point: aPoint from: nil

 

may be 

 

   image eventHandler whenMouseDownDo: [ :event |

                                                                                  self handleMouseDown: event

�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������� image globa���..



].



On 2 Mar 2025, at 22:00, Mikael Svane <mikael.svane@fridhem.org> wrote:

 

I have a presenter that is a subclass of SpPresenterWithModel and it contains, among other things, an ImagePresenter with an autoscaling image (a Form). I want to capture mouse clicks on the image and get the coordinate of the click relative to the upper left corner of the Form.

 

My #initializePresenter method looks like this:

initializePresenter 

                           image := self newImage

                                                       image: self emptyImage;

                                                       autoScale: true.

                           image eventHandler whenMouseDownDo: [ :event |

                                                                                  self handleMouseDown: event].

 

This works, and the #handleMouseDown: method is run whenever the mouse is pressed on the ImagePresenter, but the MouseButtonEvent reports global coordinates and I can���t find out how to convert these to coordinates relative to the Form that the ImagePresenter holds. I have googled and found answers to similar old questions, but nothing that seems to apply to Spec2. 

 

There must be a very simple solution to this, it���s just that I can���t seem to find it.

 

Kind regards,

Mikael