Constrained Morph dragging

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Constrained Morph dragging

senTalker
Hello Morphic experts,

I am learning / experimenting with Morphic and have the following question:

"How do I constrain the movement of a dragged Morph?"

As illustrated here:

http://jqueryui.com/draggable/#constrain-movement

(e.g. constrain within axis/container)

So far the "hack" I came up with was to aggresively re-position the
dragged Morph in its "drawOn:", if it is attached to a HandMorph:

drawOn: aCanvas
        self owner isHandMorph "is there a better way to ask: am I being dragged?"
                ifTrue: [ self position: (self position x) @ 400 ].
        super drawOn: aCanvas.


I am sure this solution is pretty bad... I also get visual artifacts
when I move the mouse up/down.

Are there better ways/hooks for this?

Generally: is there a method that is called on submorphs whenever the
parent Morph was re-positioned/re-sized?

Thanks in advance!


Sebastian
_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Constrained Morph dragging

senTalker
I came up with this... does what I need and I have  no visual
artifacts anymore. Still, I'm not happy for having to override a
private method in order for this to work... :-/

Overridden existing method in my Morph subclass:

privateFullMoveBy: delta
        super privateFullMoveBy: delta.
        (self wantsToConstrainDragging & self isBeingDragged)
                ifTrue: [ self adjustPositionWhileDragging ]

New methods in my Morph subclass:

isBeingDragged
        ^ self owner isHandMorph
       
wantsToConstrainDragging
        ^ true

adjustPositionWhileDragging
        self position: (self constrainedDragPositionFrom: (self topLeft))
       
constrainedDragPositionFrom: aNonConstrainedPosition
        "Adjust the position to be constrained however you want. In this case
horizontally at y=450"
        ^ (aNonConstrainedPosition x) @ 450.

You would need to override only "wantsToConstrainDragging" and
"constrainedDragPositionFor:".

Any critique to the code and/or naming welcome! :-)

Cheers,

Sebastian
_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: Constrained Morph dragging

dcorking
Igor posted great answers (
http://forum.world.st/Constrained-Morph-dragging-td4655743.html )

Your sliding morph works very smoothly. Nice.

Two quick remarks on style.

(1) IMHO don't worry about overriding a private method. There are
already 6 overrides of privateFullMoveBy: in Morphic.

(2) It would be nice if your morph responded sensibly to openInWorld.
For me, when I tried openInWorld, the morph received
privateFullMoveBy: before it had an owner, so isBeingDragged failed.

For archaeology, you could try reverse engineering Slider and
ScrollBar. Please contribute code comments, test cases or refactorings
back to Pharo or Squeak :)

Have fun! David
_______________________________________________
Beginners mailing list
[hidden email]
http://lists.squeakfoundation.org/mailman/listinfo/beginners