Nach langer Abstinenz poste ich auch einmal wieder etwas.
Nachdem ich schon einmal eine kleine Tree-Gadget-Designstudie für mich gemacht habe und im Bereich "Code, Tipps und Tricks" gepostet habe, möchte ich meinen neuen Ansatz posten.
Den alten Code kann ich kaum mehr durchblicken, außerdem denke ich, dass ich das damals viel zu kompliziert gelöst habe.
Meine Bitte:
Guckt euch doch einmal, ob diese Sache funktioniert.
Ich habe mich persönlich mit Tree Gadgets immer furchtbar gequält.
Ist meine Lösung brauchbar, unkompliziert genug?
Kann man das besser oder anders machen?
Und vielleicht kann ja das Schnippsel jemand für sich brauchen.
Danke
Code: Alles auswählen
EnableExplicit
;######################################################################################################################
;#  Routines
;######################################################################################################################
Procedure UnselectedFirstItem(tree)
  
  ; --- if no item is selected the new item will always placed as first item ---
  Protected selected_item_no = GetGadgetState(tree)  
  If selected_item_no = -1
    Protected node_name.s = InputRequester("Name", "Name:","")
    AddGadgetItem(tree, 0, node_name)
    SetGadgetState(tree, 0)
    ProcedureReturn #True
  EndIf
  
EndProcedure
Procedure AddAsFirstChild(tree)
  
  ; --- if no item is selected the new item will always placed as first item ---
  If UnselectedFirstItem(tree): ProcedureReturn: EndIf
  
  ; --- get name, finally add item and select the new added item ---
  Protected selected_item_no = GetGadgetState(tree)  
  Protected node_name.s = InputRequester("Name", "Name:","")
  Protected selected_sublevel =  GetGadgetItemAttribute(tree, selected_item_no, #PB_Tree_SubLevel)
  
  AddGadgetItem(tree, selected_item_no+1, node_name, 0, selected_sublevel+1)
  SetGadgetState(tree, selected_item_no+1)
  
EndProcedure
Procedure AddAsLastChild(tree)
  
  ; --- if no item is selected the new item will always placed as first item ---
  If UnselectedFirstItem(tree): ProcedureReturn: EndIf
  
  ; --- search for adding position ---
  Protected selected_item_no  = GetGadgetState(tree)    
  Protected selected_sublevel = GetGadgetItemAttribute(tree, selected_item_no, #PB_Tree_SubLevel)
  Protected no_tree_items     = CountGadgetItems(tree)-1
  Protected adding_item_no
  
  Debug "----"
  For adding_item_no = selected_item_no+1 To no_tree_items
    Protected current_sublevel = GetGadgetItemAttribute(tree, adding_item_no, #PB_Tree_SubLevel)
    Debug "Pos: "+adding_item_no+" Text: "+GetGadgetItemText(tree, adding_item_no)+"; If current_sublevel("+current_sublevel+") <= selected_sublevel("+selected_sublevel+")"
    If current_sublevel <= selected_sublevel: Break: EndIf ; <--- compare with debug output
  Next
  
  ; --- get name, finally add item and select the new added item ---
  Protected node_name.s = InputRequester("Name", "Name:","")  
  AddGadgetItem(tree, adding_item_no, node_name, 0, selected_sublevel+1); (*) <--
  SetGadgetState(tree, adding_item_no)  
  
EndProcedure
Procedure AddParallel(tree)
  
  ; --- if no item is selected the new item will always placed as first item ---
  If UnselectedFirstItem(tree): ProcedureReturn: EndIf
  
  ; --- search for adding position ---
  Protected selected_item_no  = GetGadgetState(tree)    
  Protected selected_sublevel = GetGadgetItemAttribute(tree, selected_item_no, #PB_Tree_SubLevel)
  Protected no_tree_items     = CountGadgetItems(tree)-1
  Protected adding_item_no
  
  Debug "----"
  For adding_item_no = selected_item_no+1 To no_tree_items
    Protected current_sublevel = GetGadgetItemAttribute(tree, adding_item_no, #PB_Tree_SubLevel)
    Debug "Pos: "+adding_item_no+" Text: "+GetGadgetItemText(tree, adding_item_no)+"; If current_sublevel("+current_sublevel+") <= selected_sublevel("+selected_sublevel+")"
    If current_sublevel <= selected_sublevel: Break: EndIf ; <--- compare with debug output
  Next
  
  ; --- get name, finally add item and select the new added item ---
  Protected node_name.s = InputRequester("Name", "Name:","")  
  AddGadgetItem(tree, adding_item_no, node_name, 0, selected_sublevel); (*) <--
  SetGadgetState(tree, adding_item_no)  
  
  
EndProcedure
; Info:
; AddParallel(tree) and AddAsLastChild(tree) are similiar except for one
; line of code (here --> (*))
; One could put it into one routine maybe with an option procedure argument.
; One could also put AddAsFirstChild(tree) in it with another procedure argument.
; For better understanding I let it like it is for now.
;######################################################################################################################
;#  Test Program
;######################################################################################################################
Enumeration Gadgets
  #tree
  #btnAddAsFirstChild
  #btnAddAsLastChild
  #btnAddParallel  
EndEnumeration
Procedure TestProgram()
  If OpenWindow(0, 0, 0, 800, 600, "Tree Gadget Procedures", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
    
    TreeGadget(#tree, 0, 0, 600, 600, #PB_Tree_AlwaysShowSelection )
    ButtonGadget(#btnAddAsFirstChild, 620, 10, 160, 30, "Add as first child") 
    ButtonGadget(#btnAddAsLastChild, 620, 50, 160, 30, "Add as last child") 
    ButtonGadget(#btnAddParallel, 620, 100, 160, 30, "Add parallel") 
    
    Repeat
      Protected Event = WaitWindowEvent()
      Protected EventGadget = EventGadget()
      
      If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
        End
      ElseIf EventGadget = #btnAddAsFirstChild
        AddAsFirstChild(#tree)
      ElseIf EventGadget = #btnAddAsLastChild
        AddAsLastChild(#tree)
      ElseIf EventGadget = #btnAddParallel
        AddParallel(#tree)        
      EndIf
      
    ForEver
    
  EndIf
  
EndProcedure
TestProgram()