I would like to implement a 'dynamic' drag and drop in a list. By 'dynamic' I mean that in the list in which the drag is happening, there's an empty space below the dragged element which 'follows it' as you drag through the list (to make it visually obvious where the dropped element will end up in the list). Like what you see in iOS/Android apps supporting D&D.
What I've tried is to use Component.dragEnter to insert an empty Component with the size of the dragged element below the dragged compoment. And as the drag moves through the list, remove the old Component and insert a new one in the new position (explanation of why I create a new Component in next paragraph). However, with the dynamic updates that CN1 does while dragging, and my own updates when moving the empty Component, I just cannot find a way to make it work so I get the right vusual behavior. One aspect making this more complex than you'd think at first is that CN1's built-in support for drag&drop makes the original dragged component invisible with setVisible(false) which means it leaves an empty space behind.
The reason I recreate a new empty Component is because the final drop() will happen on the empty Component, and my trick to make this work is to override drop() on the empty Component to call drop on the dropTarget that is (was) in the Component's position.
All in all, I've spend I don't know how many days trying to get this to work with no success so far. Let me know if anyone has a suggestion for a more straightforward approach?
Big thanks in advance!
The builtin support hides the original component but drags an image of it which you can customize by overriding getDragImage().
You can use custom code to highlight the drop location by using a drag over listener which you can accomplish by using addDragOverListener(ActionListener).
Related
I have the problem with Drag-and-Drop Operation for UI elements:
i have created a test object to drag: DragTestObject_BP and have override the functions:
OnMouseBottonDown Function and OnDragDetected.
Recepient will be HUD_BP with overridden is OnDrop function.
The problem is, that first drag-and-drop operation is functioning without problem only, if the anchor for drag object is set for upper left corner. Otherwise the drag object has some wired offset.
Position on start:
Drag object jumped by first mouse click on it
Might be a bit late, but youll want to put the widget you're clicking to drag ("DragTestObject_BP") inside of another widget.
It's probably a good idea to remove any canvas panel in "DragTestObject_BP" as well.
This will make the origin of "DragTestObject_BP" where it is located visually, instead of using the location of the canvas panel which is the issue you seem to have run into.
I have 3 dropdown that are stacked on top of each other; I use canvas group to make the non relevant ones invisible; although the click is intercepted only on the topmost control.
How do you work around this? Should I keep track of the position in the hierarchy and swap it when I need to have a specific dropdown control so I can use it? Feels like a lot of work...hopefully is there an easier way?
The image component of UI elements has a Raycast Target property that you can set to false. This will make them unclickable.
I want to make a complex GUI element consistent of buttons, text fields etc. I'd like to be able to move this group, but I can't find a way how.
I tried making a BeginArea, placing all the elements in it and moving the area. For that used a GUI.RepeatButton to check when the mouse button is pressed. It worked, but the update fires only twice and then stops. So I couldn't use this method for smooth dragging.
I've also tried Window to use it with GUI.DragWindow(), but it seems it doesn't work within classes that extend EditorWindow.
Is there a way to make a draggable group for a custom EditorWindow class?
For the most part, AX forms seem to follow the AOT layout and appear in order. However, in some cases, the form items appear in seemingly arbitrary order, and in others, the items in the AOT won't even reorder. No matter how you drag and drop items in the AOT, they are always in the same order. This problem happened on occasion in AX 2009, but seems to be worse in AX 2012. The only way I've found to get around it is to drop the non-reordering items and recreate them.
Has anyone else had similar experiences? Anyone have a fix?
Ok, I've found that dragging and dropping only works part of the time. However, if you use ALT+the arrow keys to move items up and down in the hierarchy, that seems to work just fine.
The way I read your question it seems you are referring to control layout within a form. If your question is about something else please clarify.
To change form control layout you need to use AOT \Forms[FormName]\Designs\Design node. You can drag and drop controls and control groups.
If you drag a control (let's call it "dragControl") and drop it on top of another control (say "dropControl"), then dragControl will be placed after dropControl. This means that if you want to change the first control of a control group, you need to drag the first control, as dropping any control on top of the first one will place them after the first control.
Also make sure your form does not have changes is some higher layer that would override the changes you are making in a lower layer.
Does this answer your question?
I would like to arrange UIControls in WPF in a similar way to the applications on the iPhone. They should be positioned on a grid, but a user should be able to drag them somewhere else, after releasing the mouse button (or the finger in case of an iPhone) the selected UIControl should snap back to the next position in the grid. The other UIElements should be rearranged automatically.
Further the user should also be connect two elements with a line or something.
I'm not experienced with WPF. The first question is if there is a container which is suitable for something (System.Windows.Controls.Grid ?) or if I have to extend canvas or somethig else for this.
I would like to know which elements from the WPF framework can be used and which elements I have to write myself.
For people who do not own an iPhone: http://www.youtube.com/watch?v=3omhu2AUWC8
Update
I've looked at AnimatedTilePanel in the BangOTricks examples (see below), this one explains how to create your own Panel and how to let it arrange things there.. However I still need an idea how to implement drag and drop correctly in this example..
Unfortunately, you'll have to write a lot of things yourself, as WPF doesn't automatically do what you're looking for.
For positioning the controls, you can use either UniformGrid or Grid. Assuming it's much like the iPhone video you showed, you can just use the UniformGrid with 4 columns and however many rows you need.
For the dragging animation, layout-wise, you could start by manipulating the RenderTransform property on whatever is being dragged, but you'll have to set a handler to check once you've met whatever threshold necessary to move into the another "cell" -- and at that point, you'll have to changed the order of the items in the tree.
Take a look at AnimatedTilePanel from Kevin's Bag-o-Tricks at:
http://j832.com/bagotricks/
It doesn't do everything you want but it will show you how to write a panel that animates its children when changing size or order.
New input to this old post in 09. Earlier this year (2012) someone has wrote a FluidWrapPanel and open sourced it. I tried it and it works like a charm - just like that on the iPhone menu.
You can also apply to other UI Elements or UserControl.