Simple example Tree Gadget w/ rightclick menu & drag and drop

Share your advanced PureBasic knowledge/code with the community.
deathmx
User
User
Posts: 27
Joined: Mon Feb 26, 2018 3:14 am

Simple example Tree Gadget w/ rightclick menu & drag and drop

Post by deathmx »

Just put this up to give an easy example of manipulating tree gadgets with right click and drag and drop.
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
Marc56us
Addict
Addict
Posts: 1477
Joined: Sat Feb 08, 2014 3:26 pm

Re: Simple example Tree Gadget w/ rightclick menu & drag and drop

Post by Marc56us »

Thank you.
This example has unfortunately the same problem as most: when you want to move an element to the root level before the first element or after the last one: it always ends up at level +1 instead of level 0
You should add an option to manage this. (I don't know how to)
I never managed to do it correctly on my TreeNote. I'll have to go back into it... one day
:|

(Edit 3:00pm: corrected link: there was one dot too many)
deathmx
User
User
Posts: 27
Joined: Mon Feb 26, 2018 3:14 am

Re: Simple example Tree Gadget w/ rightclick menu & drag and drop

Post by deathmx »

Sorry for the mess ;) try this one for those extra options you are looking for it was just a quick sketch : use drag and drop to access the options. There maybe bugs I didn't put much effort into it and needs some serious cleaning lol.

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)
Global treedrop_answer


MenuItem(1, "Rename")
MenuBar()
;MenuItem(2, "Insert Node")
MenuItem(3, "Add Node")
MenuItem(4, "Add Child")
MenuBar()
MenuItem(5, "Delete")

Global treedrop = CreatePopupMenu(#PB_Any)
MenuBar()
;MenuItem(2, "Insert Node")
MenuItem(6, "Insert")
MenuItem(7, "Append")
MenuItem(8, "Child")
MenuBar()
MenuItem(9, "Cancel")
;MenuItem(2, "Insert Node")


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(),adjust=0)
  firstitem = item
  If adjust = -1 Or adjust = 0
    toplevel = GetGadgetItemAttribute(gadget,item+adjust*-1,#PB_Tree_SubLevel)
  toplevel + adjust  
  Else
    toplevel = GetGadgetItemAttribute(gadget,item,#PB_Tree_SubLevel)
    sub = -1  
  EndIf
  
  item + 1
  
  ForEach copy_tree()
    AddGadgetItem(gadget,item,copy_tree()\text$,0,copy_tree()\sublevel + toplevel + 1+sub)
    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
  
  If adjust = -1
  SetGadgetState(gadget,firstitem + adjust*-1)  
  Else
  SetGadgetState(gadget,firstitem + adjust*-1+1)  
  
  EndIf
  ;SetGadgetState(gadget,firstitem+1)
  ;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()
      DisplayPopupMenu(Treedrop, WindowID(Window))
      
      ;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

Procedure treedrop()
  NewList copy_tree.treeitem()
      selected = GetGadgetState(tree)
      dragselect = Dragdrop
      If Selected = dragselect:ProcedureReturn:EndIf
      dragsublevel = GetGadgetItemAttribute(tree,dragselect,#PB_Tree_SubLevel)
  Select EventMenu()
      Case 6
      copy(tree,dragselect,copy_tree())
      RemoveGadgetItem(tree,dragselect)
      selected = GetGadgetState(tree)
      paste(tree,selected-1,copy_tree(),-1)
    Case 7  
      sublevel = GetGadgetItemAttribute(tree,Selected,#PB_Tree_SubLevel)
      selected + 1
        While GetGadgetItemAttribute(tree,Selected,#PB_Tree_SubLevel) > sublevel
          Selected + 1
        Wend
      copy(tree,dragselect,copy_tree())
      RemoveGadgetItem(tree,dragselect)
      selected = GetGadgetState(tree)
      paste(tree,selected,copy_tree(),1)
    Case 8
      copy(tree,dragselect,copy_tree())
      RemoveGadgetItem(tree,dragselect)
      selected = GetGadgetState(tree)
      paste(tree,selected,copy_tree())
      ;Debug "working" 
      
  EndSelect
EndProcedure


;BindMenuEvent(treedrop,6,@treedrop())

BindMenuEvent(treedrop,6,@treedrop())
BindMenuEvent(treedrop,7,@treedrop())
BindMenuEvent(treedrop,8,@treedrop())
BindMenuEvent(treedrop,9,@treedrop())
;BindMenuEvent(treedrop,6,@treedrop())
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
User avatar
blueb
Addict
Addict
Posts: 1041
Joined: Sat Apr 26, 2003 2:15 pm
Location: Cuernavaca, Mexico

Re: Simple example Tree Gadget w/ rightclick menu & drag and drop

Post by blueb »

Marc56us wrote: Fri Jun 18, 2021 10:23 am
... when you want to move an element to the root level before the first element or after the last one: it always ends up at level +1 instead of level 0
Second version seems to work...
I created a new item and dragged it 'above' the first item 0.

I then was able to highlight the last item.. press 'New' to append a new item 'After' the last item.

Perhaps this isn't what Marc56us was referring to.

Thanks for this deathmx.
Nice work.. it's appreciated. :D
- It was too lonely at the top.

System : PB 6.10 Beta 9 (x64) and Win Pro 11 (x64)
Hardware: AMD Ryzen 9 5900X w/64 gigs Ram, AMD RX 6950 XT Graphics w/16gigs Mem
Marc56us
Addict
Addict
Posts: 1477
Joined: Sat Feb 08, 2014 3:26 pm

Re: Simple example Tree Gadget w/ rightclick menu & drag and drop

Post by Marc56us »

It is the mouse movement that causes the problem.
If I move a branch on the last element (select add) but if the last element has children, then the added branch is put at level 1 (child) of the last and not 0 (root)

Don't look for it, I gave up on my side months ago. I never found a system that works in all cases. :cry:
deathmx
User
User
Posts: 27
Joined: Mon Feb 26, 2018 3:14 am

Re: Simple example Tree Gadget w/ rightclick menu & drag and drop

Post by deathmx »

I separated the paste procedure into three different procedures to help clear things up and in doing so I seem to have fixed a bug similar to what you are describing. Care to try again? Feels just a tad bit cleaner as well.

Thanks for your support! :D

Was actually using this as a quick editing tool for myself lol. I basically wanted to get a quick understanding which is why the code is a bit messy.

Marc, your treenote program looks quite nice :D. I like your design style.

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)
Global treedrop_answer


MenuItem(1, "Rename")
MenuBar()
;MenuItem(2, "Insert Node")
MenuItem(3, "Add Node")
MenuItem(4, "Add Child")
MenuBar()
MenuItem(5, "Delete")

Global treedrop = CreatePopupMenu(#PB_Any)
MenuBar()
;MenuItem(2, "Insert Node")
MenuItem(6, "Insert")
MenuItem(7, "Append")
MenuItem(8, "Child")
MenuBar()
MenuItem(9, "Cancel")
;MenuItem(2, "Insert Node")


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_append(gadget,item,List copy_tree.treeitem())
  sublevel = GetGadgetItemAttribute(gadget,item,#PB_Tree_SubLevel) ;get item sublevel
  NextItem = item + 1;Next item with same level
  While GetGadgetItemAttribute(gadget,Nextitem,#PB_Tree_SubLevel) > sublevel
    NextItem + 1  
  Wend
  pasted_Item = NextItem
  
  ForEach copy_tree()
    ;Debug Str(pasted_item) + " : " + copy_tree()\text$ + ": subLevel :" + Str(copy_tree()\sublevel)
    AddGadgetItem(gadget,pasted_Item,copy_tree()\text$,0,copy_tree()\sublevel+sublevel)
    ;SetGadgetItemState(gadget,pasted_Item,copy_tree()\state)
    pasted_item + 1
  Next
  pasted_Item = NextItem
   ForEach copy_tree()
    SetGadgetItemState(gadget,pasted_Item,copy_tree()\state)
    pasted_Item + 1
  Next
  
  SetGadgetState(gadget,NextItem)
  SetActiveGadget(gadget)
EndProcedure

Procedure paste_insert(gadget,item,List copy_tree.treeitem())
 sublevel = GetGadgetItemAttribute(gadget,item,#PB_Tree_SubLevel) 
 
 pasted_Item = item
 ForEach copy_tree()
   ; Debug Str(pasted_item) + " : " + copy_tree()\text$ + ": subLevel :" + Str(copy_tree()\sublevel)
    AddGadgetItem(gadget,pasted_Item,copy_tree()\text$,0,copy_tree()\sublevel+sublevel)
    ;SetGadgetItemState(gadget,pasted_Item,copy_tree()\state)
    pasted_item + 1
  Next
  pasted_Item = item
   ForEach copy_tree()
    SetGadgetItemState(gadget,pasted_Item,copy_tree()\state)
    pasted_Item + 1
  Next
  
  SetGadgetState(gadget,item + 1)
  SetActiveGadget(gadget)
EndProcedure

Procedure paste_child(gadget,item,List copy_tree.treeitem())
  sublevel = GetGadgetItemAttribute(gadget,item,#PB_Tree_SubLevel) 
 
 pasted_Item = item + 1
 ForEach copy_tree()
   ; Debug Str(pasted_item) + " : " + copy_tree()\text$ + ": subLevel :" + Str(copy_tree()\sublevel)
    AddGadgetItem(gadget,pasted_Item,copy_tree()\text$,0,copy_tree()\sublevel+sublevel+1)
    ;SetGadgetItemState(gadget,pasted_Item,copy_tree()\state)
    pasted_item + 1
  Next
  pasted_Item = item +1
   ForEach copy_tree()
    SetGadgetItemState(gadget,pasted_Item,copy_tree()\state)
    pasted_Item + 1
  Next
  
  SetGadgetState(gadget,item + 1) 
  SetActiveGadget(gadget)
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()
      DisplayPopupMenu(Treedrop, WindowID(Window))
      
      ;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

Procedure treedrop()
  NewList copy_tree.treeitem()
      selected = GetGadgetState(tree)
      dragselect = Dragdrop
      If Selected = dragselect:ProcedureReturn:EndIf
      dragsublevel = GetGadgetItemAttribute(tree,dragselect,#PB_Tree_SubLevel)
  Select EventMenu()
      Case 6
      copy(tree,dragselect,copy_tree())
      RemoveGadgetItem(tree,dragselect)
      selected = GetGadgetState(tree)
      paste_insert(tree,selected,copy_tree())
      ;paste(tree,selected-1,copy_tree(),-1)
    Case 7  
      
      copy(tree,dragselect,copy_tree())
      RemoveGadgetItem(tree,dragselect)
      selected = GetGadgetState(tree)
      paste_append(tree,selected,copy_tree())
    Case 8
      copy(tree,dragselect,copy_tree())
      RemoveGadgetItem(tree,dragselect)
      selected = GetGadgetState(tree)
      paste_child(tree,selected,copy_tree())
      ;Debug "working" 
      
  EndSelect
EndProcedure


;BindMenuEvent(treedrop,6,@treedrop())

BindMenuEvent(treedrop,6,@treedrop())
BindMenuEvent(treedrop,7,@treedrop())
BindMenuEvent(treedrop,8,@treedrop())
BindMenuEvent(treedrop,9,@treedrop())
;BindMenuEvent(treedrop,6,@treedrop())
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
Post Reply