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()
