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
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
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@lists.squeakfoundation.org