I'm an arborist and I'm all right...
BlitzMax Forums/Brucey's Modules/I'm an arborist and I'm all right...
| ||
Interesting things you can do with trees :SuperStrict Framework wx.wxApp Import wx.wxFrame Import wx.wxTreeCtrl Import wx.wxTextDropTarget Import wx.wxTextDataObject Import wx.wxDropSource New MyApp.Run() Type MyApp Extends wxApp Method OnInit:Int() Local sz:MyFrame = MyFrame(New MyFrame.Create(Null, wxID_ANY, "Drag Drop Example", -1, -1, 250, 280)) sz.Show(True) Return True End Method End Type Type MyFrame Extends wxFrame Field treectrl:wxTreeCtrl Field dragItem:wxTreeItemId Method OnInit() treectrl = New wxTreeCtrl.Create(Self, -1) Local root:wxTreeItemId = treeCtrl.AddRoot("Root") For Local i:Int = 1 To 10 treectrl.AppendItem(root, "Node Number " + i) Next treeCtrl.ExpandAll() Centre() Local target:MyTextDropTarget = New MyTextDropTarget.CreateTarget(Self) treeCtrl.SetDropTarget(target) treeCtrl.ConnectAny(wxEVT_COMMAND_TREE_BEGIN_DRAG, _OnDrag, Null, Self) End Method Function _OnDrag(event:wxEvent) MyFrame(event.sink).OnDrag(wxTreeEvent(event)) End Function Method OnDrag(event:wxTreeEvent) dragItem = event.GetItem() If Not dragItem.Equals(treectrl.GetRootItem()) Then Local tdo:wxTextDataObject = New wxTextDataObject.Create(treectrl.getItemText(dragItem)) Local tds:wxDropSource = New wxDropSource.Create(tdo, treectrl) tds.DoDragDrop(wxDrag_AllowMove) End If End Method End Type Type MyTextDropTarget Extends wxTextDropTarget Field s:MyFrame Field ctrl:wxTreeCtrl Method CreateTarget:MyTextDropTarget(owner:MyFrame) s = owner ctrl = s.treectrl Super.Create() Return Self End Method Method OnDropText:Int(x:Int, y:Int, data:String) Local flags:Int ' find the item we drop onto Local item:wxTreeItemId = ctrl.HitTest(x, y, flags) ' everything is okay to do the drop? ' - source is okay ' - target is okay ' - target <> source ' - target <> root If s.dragItem And s.dragItem.isOk() And item.isOk() And Not item.Equals(s.dragItem) And Not item.Equals(ctrl.GetRootItem()) Then ' create a new item Local newItem:wxTreeItemId = Ctrl.InsertItem(ctrl.GetItemParent(item), item, data) ' copy its user data, if any ctrl.SetItemData(newItem, ctrl.GetItemData(s.dragItem)) ' remove the original item ctrl.DeleteItem(s.dragItem) ' select the 'moved' item ctrl.SelectItem(newItem) End If Return False End Method End Type So much interestingness, so little code :-p |
| ||
Weird.. it works on Windows but not Linux. |
| ||
Works on Mac too... :-) |
| ||
Is it possible to drag an item from one tree to another? Is it possible to drag an item from a tree to a property in a property grid control? |
| ||
I improved your code a bit by selecting the dragged node when dragging. Is it possible to display a line where the node will be dropped? It isn't very obvious right now:SuperStrict Framework wx.wxApp Import wx.wxFrame Import wx.wxTreeCtrl Import wx.wxTextDropTarget Import wx.wxTextDataObject Import wx.wxDropSource Import brl.standardio Import brl.random New MyApp.Run() Type MyApp Extends wxApp Method OnInit:Int() Local sz:MyFrame = MyFrame(New MyFrame.Create(Null, wxID_ANY, "Drag Drop Example", -1, -1, 250, 280)) sz.Show(True) Return True End Method End Type Type MyFrame Extends wxFrame Field treectrl:wxTreeCtrl Field dragItem:wxTreeItemId Method OnInit() treectrl = New wxTreeCtrl.Create(Self, -1,0,0,wxTR_HAS_BUTTONS) Local root:wxTreeItemId = treeCtrl.AddRoot("Root") For Local i:Int = 1 To 10 treectrl.AppendItem(root, "Node Number " + i) Next treeCtrl.ExpandAll() Centre() Local target:MyTextDropTarget = New MyTextDropTarget.CreateTarget(Self) treeCtrl.SetDropTarget(target) treeCtrl.ConnectAny(wxEVT_COMMAND_TREE_BEGIN_DRAG, _OnDrag, Null, Self) End Method Function _OnDrag(event:wxEvent) MyFrame(event.sink).OnDrag(wxTreeEvent(event)) End Function Method OnDrag(event:wxTreeEvent) dragItem = event.GetItem() treectrl.SelectItem(dragitem) If Not dragItem.Equals(treectrl.GetRootItem()) Then Local tdo:wxTextDataObject = New wxTextDataObject.Create(treectrl.getItemText(dragItem)) Local tds:wxDropSource = New wxDropSource.Create(tdo, treectrl) tds.DoDragDrop(wxDrag_AllowMove) End If End Method End Type Type MyTextDropTarget Extends wxTextDropTarget Field s:MyFrame Field ctrl:wxTreeCtrl Method CreateTarget:MyTextDropTarget(owner:MyFrame) s = owner ctrl = s.treectrl Super.Create() Return Self End Method Method OnDropText:Int(x:Int, y:Int, data:String) Local flags:Int ' find the item we drop onto Local item:wxTreeItemId = ctrl.HitTest(x, y, flags) ' everything is okay to do the drop? ' - source is okay ' - target is okay ' - target <> source ' - target <> root If s.dragItem And s.dragItem.isOk() And item.isOk() And Not item.Equals(s.dragItem) And Not item.Equals(ctrl.GetRootItem()) Then ' create a new item Local newItem:wxTreeItemId = Ctrl.InsertItem(ctrl.GetItemParent(item), item, data) ' copy its user data, if any ctrl.SetItemData(newItem, ctrl.GetItemData(s.dragItem)) ' remove the original item ctrl.DeleteItem(s.dragItem) ' select the 'moved' item ctrl.SelectItem(newItem) End If Return False End Method End Type |
| ||
Is SetItemDropHighlight of any use to you? |
| ||
Works on Mac too... :-) I don't know what it is, but trying to compile anything as a multi-threaded app no longer works since the BMX 1.40 update: Undefined symbols: "_threads_GetThreadData", referenced from: _444 in appstub.debug.mt.macos.x86.a(debugger_mt.stdio.bmx.debug.mt.macos.x86.o) "_threads_SetThreadData", referenced from: _444 in appstub.debug.mt.macos.x86.a(debugger_mt.stdio.bmx.debug.mt.macos.x86.o) "_threads_AllocThreadData", referenced from: _442 in appstub.debug.mt.macos.x86.a(debugger_mt.stdio.bmx.debug.mt.macos.x86.o) ld: symbol(s) not found collect2: ld returned 1 exit status Single-threaded compilation works fine. |
| ||
try rebuilding all your modules, single and multi-threaded. I dunno why but I get similar glitches some times and I have to rebuild both to get MT building working again... I blame gremlins personally. |
| ||
Is SetItemDropHighlight of any use to you? Looking at the docs, I don't think so, unless you can tell me why. Is there any way to give better visualization of the tree drag and drop operation? You can only drag a node onto another node, and there is no visual feedback for where it will be inserted. |
| ||
try rebuilding all your modules, single and multi-threaded. That's what I usually do after an upgrade. But 1.40 really seems to have some gremlins aboard, at least for multi-threaded builds. The funny thing is that in most cases it helps to build first a single-threaded version and then it's also possible to create a multi-threaded build. |