On May 20, 2007, at 3:01 PM, David H. Shanabrook wrote:

I am experimenting with geometry tutors, such as pentominos. when trying to fit shapes precisely together the shadow is very disturbing, it is hard to know what is the shadow and what is the shape, especially for kids.

When I want to remove the drag-shadow from Morphs, I often use something like the following methods (implemented on my Morph subclass):

        fullDrawOn: aCanvas

                aCanvas isShadowDrawing ifTrue: [^ self].
        
                super fullDrawOn: aCanvas.
        
#fullDrawOn: is sent to a Morph to ask it to draw itself, its border, and its submorphs. The Hand uses it to draw a shadow copy of the Morph. This method says, if that's what's going on, don't draw anything (therefore preventing any shadow from being shown).

        wantsToBeCachedByHand

                ^ false

This message is also sent during shadow drawing. It seems to be necessary to prevent shadows from being drawn, but I'm afraid I have forgotten why! and I'm not sure I have a chance to track it down right now. (I almost held off from posting this because of that, but I thought it would be better to offer the advice and leave an exercise for the reader. :)

Note that the shadow does serve at least one important purpose. In the default mouse handling, clicking on a Morph picks it up, and one must click the mouse again to drop the Morph. It can be confusing to have a Morph "stuck" to the hand without any visual indication.

I often make a simple mouse override to fix this too, if I am not doing any more specialized mouse handling on my own. Here is what I do:

        handlesMouseDown: evt

                ^ true

This tells Morphic that a particular Morph wants to receive mouse events.

        mouseDown: evt

                evt hand
                        waitForClicksOrDrag: self
                        event: evt
                        selectors: #( #click: #doubleClick: 
#doubleClickTimeout: #startDrag:)
                        threshold: 0

This message is sent on mouse down. The method here tells the Hand to parse upcoming mouse events, and decide whether a click, double click, or drag might be happening. The threshold of "0" says to interpret any mouse movement at all as a drag. (There is a simpler variant of #waitForClicksOrDrag... that defaults that to 10, which I find to be too unresponsive.)

        startDrag: evt

                evt hand grabMorph: self.

This is called when the Hand detects a drag, after the "wait" message from above. The method just tells the hand to pick up this Morph.

Of course I'm sure there must be some flag that does the same thing! ;) If I am writing a system with many Morphs like this, I of course put all of this code in a superclass to avoid clutter.

Hope this helps,
Benjamin Schroeder

_______________________________________________
Beginners mailing list
[email protected]
http://lists.squeakfoundation.org/mailman/listinfo/beginners

Reply via email to