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