TreeGadget to JSON back to TreeGadget... that's a fun one
This saves a TreeGadget to JSON text
Code: Select all
OpenWindow(0, 0, 0, 300, 500, "TreeGadget", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
TreeGadget(0, 10, 10, 280, 480)
AddGadgetItem(0, -1, "Item 1", 0, 0)
AddGadgetItem(0, -1, "Folder A", 0, 0)
AddGadgetItem(0, -1, "Item 2", 0, 1)
AddGadgetItem(0, -1, "Folder B", 0, 1)
AddGadgetItem(0, 5, "Item 3", 0, 2)
AddGadgetItem(0, -1, "Item 4", 0, 0)
AddGadgetItem(0, -1, "Folder C", 0, 0)
AddGadgetItem(0, -1, "Item 5", 0, 1)
AddGadgetItem(0, -1, "Folder D", 0, 1)
AddGadgetItem(0, -1, "Item 6", 0, 2)
AddGadgetItem(0, -1, "Item 7", 0, 0)
For i = 0 To CountGadgetItems(0) - 1
SetGadgetItemState(0, i, #PB_Tree_Expanded)
Next
Procedure.i CreateJSONFromTreeGadget(JSON.i, Gadget.i)
Protected Result.i = CreateJSON(JSON)
If (Result)
If (JSON = #PB_Any)
JSON = Result
EndIf
*Array = SetJSONArray(JSONValue(JSON))
NewList PrevArray.i()
Level.i = 0
n.i = CountGadgetItems(Gadget)
i.i = 0
While (i < n)
NewLevel.i = GetGadgetItemAttribute(Gadget, i, #PB_Tree_SubLevel)
While (NewLevel > Level) ; We're on a deeper sublevel, so insert a new array
AddElement(PrevArray()) : PrevArray() = *Array
*Array = AddJSONElement(*Array)
SetJSONArray(*Array)
Level + 1
Wend
While (NewLevel < Level) ; We're back to the parent sublevel, so return to that array
*Array = PrevArray()
DeleteElement(PrevArray())
Level - 1
Wend
SetJSONString(AddJSONElement(*Array), GetGadgetItemText(Gadget, i)) ; Add new item
i + 1
Wend
EndIf
ProcedureReturn (Result)
EndProcedure
If CreateJSONFromTreeGadget(0, 0)
Output.s = ComposeJSON(0, #PB_JSON_PrettyPrint)
Debug Output
If CreateFile(1, GetTemporaryDirectory() + "tree.json")
WriteString(1, Output)
CloseFile(1)
EndIf
EndIf
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
and this loads JSON text into a TreeGadget:
Code: Select all
OpenWindow(0, 0, 0, 300, 500, "TreeGadget", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
TreeGadget(0, 10, 10, 280, 480)
Procedure FillTreeGadgetFromJSON(JSON.i, Gadget.i)
ClearGadgetItems(Gadget)
*Array = JSONValue(JSON)
NewList PrevArray.i()
NewList PrevIndex.i()
i.i = 0
Level.i = 0
If JSONType(*Array) = #PB_JSON_Array
n.i = JSONArraySize(*Array)
While (i < n)
Select (JSONType(GetJSONElement(*Array, i)))
Case #PB_JSON_String
AddGadgetItem(Gadget, -1, GetJSONString(GetJSONElement(*Array, i)), #Null, Level)
i + 1
Case #PB_JSON_Array
AddElement(PrevArray()) : PrevArray() = *Array
AddElement(PrevIndex()) : PrevIndex() = i
*Array = GetJSONElement(*Array, i)
n.i = JSONArraySize(*Array)
i = 0
Level + 1
Default
i + 1
EndSelect
While (i = n) ; Close
If (ListSize(PrevArray())) ; Go back to previous level
*Array = PrevArray()
DeleteElement(PrevArray())
n.i = JSONArraySize(*Array)
i = PrevIndex() + 1
DeleteElement(PrevIndex())
Level - 1
Else ; No more levels to go back to
Break
EndIf
Wend
Wend
EndIf
n = CountGadgetItems(Gadget)
For i = 0 To n - 1
SetGadgetItemState(Gadget, i, #PB_Tree_Expanded)
Next
EndProcedure
If ReadFile(1, GetTemporaryDirectory() + "tree.json")
Input.s = ReadString(1, #PB_File_IgnoreEOL)
If ParseJSON(0, Input)
FillTreeGadgetFromJSON(0, 0)
EndIf
CloseFile(1)
EndIf
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow