Hi all,
I want to add #drag and #drop behaviour to Playground class, I want to move a Square (or Triangle) in a drag and drop session, but I can't. at the moment. Any help ? Thanks. Best Regards Bruno Brasesco. |
Bruno,
> I want to add #drag and #drop behaviour to Playground class, I want to move > a Square (or Triangle) in a drag and drop session, but I can't. at the > moment. In the case you describe, it might be best to use a MouseTracker, hit testing at the beginning and end, and somehow acting on the resulting objects when the drag is completed. Re Dolphin's formalized drag and drop, there is some info on the Wiki, and you can look at BugOff in the following: http://needle.anest.ufl.edu/anest4/bills/SchwabGoodiesDolphin4.01a.zip One warning about the enclosed version of BugOff - do NOT drag from development tools to a BugOffShell, well, you can, but, don't save your image after you do it. I have an updated version that fixes this problem, but, haven't had time to package it yet. Have a good one, Bill -- Wilhelm K. Schwab, Ph.D. [hidden email] |
In reply to this post by Bruno Brasesco
Bruno Brasesco wrote:
> > I want to add #drag and #drop behaviour to Playground class, I want to move > a Square (or Triangle) in a drag and drop session, but I can't. at the > moment. I wrote a longish post on drag&drop some time ago. It's in Ian's archive dated 4th Match 2000. I hope it helps. Drop me a line if you can't find it. -- chris |
> Drop me a line if you can't find it.
Chris I can't find that mail. And it is not in Deja news. Best Regards Bruno Brasesco |
Bruno,
> Chris I can't find that mail. And it is not in Deja news. (BTW. Ian Bartholomew's news-group archive at http://www.iandb.org.uk/ is an excellent resource for any Dolphin programmer, I strongly recommed you download it) I've mailed you a copy of my post to you directly, but there's some other stuff I want to add here. In that post, I talked about how to connect up the D&D operations in a Presenter, so I was assuming that the View was already doing it's part of the job -- which is true when you are using the standard View components. What I hadn't really noticed is that you are attempting to add D&D to the Playground app, which uses a custom View, so there is some more work to be done to get D&D working. I haven't done much messing around with custom Views -- in fact I wrote my first only last week -- but it doesn't *seem* to be too difficult. I used the MoenTreeView as a guide to put together the following. If anyone knows of anything I've missed or done wrong/poorly then please tell us! We'll have to add a couple of methods: Playground>>onLeftButtonPressed: and Playgound>>requestDragObjects:, and copy #dragDetect: from MoenTreeView. First, we need to start a drag-drop session when someone attempts to drag one of the objects out of the playgound. That is accomplished by adding a method like: ---------- onLeftButtonPressed: aMouseEvent | target | target := shapes at: 1 ifAbsent: [nil]. "just to demo, pick a shape at random" (self isDragSource and: [target notNil and: [self dragDetect: aMouseEvent]]) ifTrue: [self onBegin: aMouseEvent button drag: target]. ^ super onLeftButtonPressed: aMouseEvent. --------- Here, I just choose an object to drag at random. A (much!) better version would probably do something like picking the object under the mouse, or the "current selection" if Playgound had a concept of selection. I'm using #dragDetect: here to see if the user is begining a drag operation. I've just copied MoenTreeView>>dragDetect: into Playgound. (If anyone at OA is reading, would it be a good idea to move dragDetect: up into View ? It seems generally usefull) That object is used to start a drag-drop session. The session responds by asking the View (and in turn the Presenter) to fill in its details. It sends #requestDragObjects: to the View, so we need to add a second method like: --------- requestDragObjects: session | target | target := session suggestedSource. target isNil ifFalse: [session addDragObject: (InternalDragDropObject object: target)]. ^ super requestDragObjects: session. --------- This is expected to initialise the set of drag-objects in the session with the View's best guess at what's appropriate (the Presenter will get a chance to modify it more intelligently later, as I described in my earlier post). I'm having to do something rather odd in the above code, and I'm not sure if that's because I'm missing something, or there's a flaw in the design of this part of the D&D system. The View is expected to fill in the drag objects (remember that there may be more than one, in general), but #requestDragObjects: doesn't have enough information to be able to do that properly in this case. If Playgound had a concept of a "current-selection" (as ListViews, and MoenTreeView, etc, do) then it'd be natural to add any selected shapes to the sesssion. But since it doesn't have that concept, the proper thing to do would probably be to add the object under the mouse. Unfortunately, at this point we don't know where the mouse was when the user started the operation. What I have done is to use the #suggestedSource of the D&D session (which was set earlier when I did #self onBegin:drag:). It's more than a little hacky, but I don't know of a better approach. Perhaps the ideal would be to add a "current-selection" concept to Playgound. That's it! Of course you also have to do the other stuff I talked about in my previous post too. (And don't forget to turn on the #isDragSource aspect of the Playgound instance). Some things I don't know, but would like to: How to do right-mouse dragging. As far as I can tell from the comments in the image, OA themselves don't yet know how to detect right-drag from custom views. How to make the drag operation use an image derived from the dragged Shape rather than the its icon. It'd be nice if there was some way to make the Shape paint itself as required to implement this. > Bruno Brasesco -- chris |
Free forum by Nabble | Edit this page |