Hi Andrew,
This is one I bumped heads with a while back.
I tried things along the line you suggested and tied myself in knots.
So I started with what I knew worked. Handles on polygons and looked at what they used.
The #on:send: message is the best way I have found to add behavior to morphs.
define a method in your inheritance chain (e.g.)
Morph>>initializeMyMove
self on: #mouseMove send: #moveThisWay to: self ; on: #mouseUp send: #stopThat to: self .
Then make methods #moveThisWay and #stopThat in your specific subclass to do what you want.
Then make a sample of your morph and send it the initializeMyMove message.
where circle understands what you mean by #moveThisWay and #stopThat.
I found by experimenting that circle would not listen to mouse move unless it was also listening to #mouseUp or #mouseDown.
I also found I absolutely didn't need to write my own low level stuff for the morphs.
----- To stop the rectangle from moving you need to make it "resist being picked up" from the red halo or tell it to #beSticky programatically.
I also agree that if you can get away with using a pasteup morph instead of the rectange thats a win. A tip of the hat to Andreas who said it first.
-----
There are also tricks for making the gui feel smoother. For my application I update my morphs position from the delta of the mouse move
desiredPosition := oldPosition + mouseMoveEnd - mouseMoveStart + tug.
Where tug was a vector based on the signs of the coordinates of (mousePosition - oldPosition).
finally you apply constraints to desiredPosition (e.g. constrain to be within the owners bounds and what results is the newPosition to which you move your morph.
On mouse up I wanted to insure my morph wound up on a grid intersection. So the final behavior was essentially snap to grid.
Again for ideas look at the behavior of handles.
HTH,
Yours in service, --Jerome Peace
__________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com
squeak-dev@lists.squeakfoundation.org