Right Click to add / rename items.. drag to move them around
Most of this is quite simple so hopefully it being commentless is understandable lol. I put this here as an crude example only so people could make their own or just get a better understanding experimenting with it.
Code: Select all
Global window = OpenWindow(#PB_Any,0,0,800,800,"",#PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Global tree = TreeGadget(#PB_Any,5,5,600,400,#PB_Tree_AlwaysShowSelection )
;Global tree2 = TreeGadget(#PB_Any,5,405,600,400,#PB_Tree_AlwaysShowSelection )
Global Create_Node = ButtonGadget(#PB_Any,607,10,85,15,"New")
Global Create_Child = ButtonGadget(#PB_Any,607,35,85,15,"NewChild")
Global Dragdrop = 0
Global treepop = CreatePopupMenu(#PB_Any)
MenuItem(1, "Rename")
MenuBar()
;MenuItem(2, "Insert Node")
MenuItem(3, "Add Node")
MenuItem(4, "Add Child")
MenuBar()
MenuItem(5, "Delete")
EnableGadgetDrop(tree,#PB_Drop_Private,#PB_Drag_Copy | #PB_Drag_Move,0)
;EnableGadgetDrop(tree2,#PB_Drop_Private,#PB_Drag_Copy | #PB_Drag_Move,0)
Structure treeitem
text$
sublevel.i
state.i
EndStructure
Procedure copy(gadget,item,List copy_tree.treeitem())
temp = GetGadgetState(gadget)
toplevel = GetGadgetItemAttribute(gadget,item,#PB_Tree_SubLevel)
;Debug "toplevel:" + Str(toplevel)
AddElement(copy_tree())
copy_tree()\sublevel = 0: copy_tree()\text$ = GetGadgetItemText(gadget,item)
SetGadgetState(gadget,item)
copy_tree()\state = GetGadgetItemState(gadget,item)
item + 1:sublevel = GetGadgetItemAttribute(gadget,item ,#PB_Tree_SubLevel)
While sublevel - toplevel > 0
AddElement(copy_tree())
copy_tree()\sublevel = sublevel - toplevel: copy_tree()\text$ = GetGadgetItemText(gadget,item)
;SetGadgetState(gadget,item)
copy_tree()\state = GetGadgetItemState(gadget,item)
item + 1:sublevel = GetGadgetItemAttribute(gadget,item,#PB_Tree_SubLevel)
Wend
SetGadgetState(gadget,temp)
EndProcedure
Procedure paste(gadget,item,List copy_tree.treeitem())
firstitem = item
toplevel = GetGadgetItemAttribute(gadget,item,#PB_Tree_SubLevel)
item + 1
ForEach copy_tree()
AddGadgetItem(gadget,item,copy_tree()\text$,0,copy_tree()\sublevel + toplevel + 1)
SetGadgetItemState(gadget,item,copy_tree()\state)
item +1
Next
lastitem = item - 1
item = firstitem + 1
ForEach copy_tree()
SetGadgetItemState(gadget,item,copy_tree()\state)
item + 1
Next
SetGadgetState(gadget,firstitem + 1)
SetGadgetState(gadget,firstitem)
;SetGadgetItemState(gadget,firstitem,3)
EndProcedure
Procedure dropper()
;Debug "dropper"
Select EventGadget()
Case tree
selected = GetGadgetState(tree)
dragselect = Dragdrop
If Selected = dragselect:ProcedureReturn:EndIf
dragsublevel = GetGadgetItemAttribute(tree,dragselect,#PB_Tree_SubLevel)
NewList copy_tree.treeitem()
copy(tree,dragselect,copy_tree())
RemoveGadgetItem(tree,dragselect)
selected = GetGadgetState(tree)
paste(tree,selected,copy_tree())
;dragselect = Dragdrop
;dragsub = GetGadgetItemAttribute(tree,dragselect,#PB_Tree_SubLevel)
EndSelect
EndProcedure
Procedure tree()
selected = GetGadgetState(tree)
Select EventType()
Case #PB_EventType_RightClick
Dragdrop = selected
; DragPrivate(0)
DisplayPopupMenu(Treepop, WindowID(Window))
Case #PB_EventType_DragStart
;DragText(GetGadgetItemText(tree,selected))
Dragdrop = selected
DragPrivate(0)
Case #PB_EventType_LeftClick
;Debug GetGadgetItemState(tree,selected)
;Case #PB_EventType_RightButtonDown
EndSelect
EndProcedure
Procedure rename_node()
selected = GetGadgetState(tree)
If selected <> -1
newtext$ = InputRequester("Rename","Change the name",GetGadgetItemText(tree,selected))
If newtext$
SetGadgetItemText(tree,selected,newtext$)
EndIf
EndIf
EndProcedure
Procedure delete_node()
selected = GetGadgetState(tree)
If selected <> -1
;Debug selected
RemoveGadgetItem(tree,selected)
EndIf
EndProcedure
Procedure Create_Node()
Selected = GetGadgetState(tree)
SetActiveWindow(window)
SetActiveGadget(tree)
;Debug "Selected:"+Str(Selected)
If selected = -1 :
If CountGadgetItems(tree) = 0
;If name$ = ""
text$ = InputRequester("Name","Set a name for this node","")
;Else
; text$ = name$
;EndIf
If text$ <> ""
;Debug text$
AddGadgetItem(tree,-1,text$,0,0)
;SetActiveWindow(window)
;SetActiveGadget(tree)
SetGadgetState(tree,0)
EndIf
EndIf
Else
sublevel = GetGadgetItemAttribute(tree,Selected,#PB_Tree_SubLevel)
text$ = InputRequester("Name","Set a name for this node","")
If text$ <> ""
; Debug text$
selected + 1
While GetGadgetItemAttribute(tree,Selected,#PB_Tree_SubLevel) > sublevel
Selected + 1
Wend
;Debug "the chosen one Selected:"+Selected
AddGadgetItem(tree,Selected,text$,0,sublevel)
SetGadgetState(tree,Selected)
EndIf
EndIf
EndProcedure
Procedure Create_Child()
Selected = GetGadgetState(tree)
If selected = -1 :
Else
sublevel = GetGadgetItemAttribute(tree,Selected,#PB_Tree_SubLevel)
text$ = InputRequester("Name","Set a name for this node","")
If text$ <> ""
; Debug text$
SetActiveWindow(window)
SetActiveGadget(tree)
AddGadgetItem(tree,Selected+1,text$,0,sublevel+1)
SetGadgetState(tree,Selected + 1)
EndIf
EndIf
EndProcedure
Procedure Endprogram()
End
EndProcedure
BindMenuEvent(treepop, 1, @rename_node())
BindMenuEvent(treepop, 5, @delete_node())
BindMenuEvent(treepop, 3, @Create_Node())
BindMenuEvent(treepop, 4, @Create_child())
BindGadgetEvent(tree,@tree())
BindGadgetEvent(Create_child,@Create_child())
BindGadgetEvent(Create_Node,@Create_Node())
BindEvent(#PB_Event_CloseWindow,@Endprogram())
BindEvent(#PB_Event_GadgetDrop,@dropper())
For i = 0 To Random(100)+10
rand = Random(1)
If Rand = 1: x = 1000
Else
x = 0
:EndIf
AddGadgetItem(tree,-1,Str(i),0,x)
SetGadgetState(tree,i)
SetGadgetItemState(tree,i,3)
;Debug GetGadgetItemState(tree,i)
;SetGadgetItemState(tree,i,3)
;SetGadgetItemState(tree,-1,9)
Next
Repeat:event = WaitWindowEvent():ForEver