|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"github.com/lxn/walk"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
func FormatBool(b bool) string {
|
|
|
|
if b {
|
|
|
|
return "true"
|
|
|
|
}
|
|
|
|
return "false"
|
|
|
|
}
|
|
|
|
|
|
|
|
type Node struct {
|
|
|
|
name string
|
|
|
|
value interface{}
|
|
|
|
parent *Node
|
|
|
|
children []*Node
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewNode(name string,value interface{},parent *Node) *Node {
|
|
|
|
return &Node{name: name,value:value,parent: parent}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Node) Text() string {
|
|
|
|
txt := d.name
|
|
|
|
dim := " : "
|
|
|
|
switch d.value.(type) {
|
|
|
|
case int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64:
|
|
|
|
txt += dim + fmt.Sprintf("%d",d.value)
|
|
|
|
case float32,float64:
|
|
|
|
v := fmt.Sprintf("%f",d.value)
|
|
|
|
s := strings.Split(v,".")
|
|
|
|
i,_ := strconv.Atoi(s[1])
|
|
|
|
if i == 0 {
|
|
|
|
txt += dim + fmt.Sprintf("%d",int(d.value.(float64)))
|
|
|
|
}else{
|
|
|
|
txt += dim + v
|
|
|
|
}
|
|
|
|
case string:
|
|
|
|
txt += dim + "\"" + d.value.(string) + "\""
|
|
|
|
case bool:
|
|
|
|
txt += dim + FormatBool(d.value.(bool))
|
|
|
|
case map[string]interface{}:
|
|
|
|
txt += "(Object)"
|
|
|
|
case []interface{}:
|
|
|
|
txt += "(Array)"
|
|
|
|
}
|
|
|
|
return txt
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Node) Parent() walk.TreeItem {
|
|
|
|
if d.parent == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return d.parent
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Node) ChildCount() int {
|
|
|
|
if d.children == nil {
|
|
|
|
d.ResetChildren();
|
|
|
|
}
|
|
|
|
return len(d.children)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Node) ChildAt(index int) walk.TreeItem {
|
|
|
|
return d.children[index]
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Node) Image() interface{} {
|
|
|
|
icon,err := walk.NewIconFromResourceId(5)
|
|
|
|
if err != nil {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
return icon
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Node) ResetChildren() {
|
|
|
|
d.children = nil
|
|
|
|
switch d.value.(type) {
|
|
|
|
case map[string]interface{}:
|
|
|
|
m := d.value.(map[string]interface{})
|
|
|
|
for k,v := range m {
|
|
|
|
d.children = append(d.children, NewNode(k, v,d))
|
|
|
|
}
|
|
|
|
case []interface{}:
|
|
|
|
v := d.value.([]interface{})
|
|
|
|
for i,_ := range v {
|
|
|
|
d.children = append(d.children, NewNode(fmt.Sprintf("%d",i), v[i],d))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type JSONModel struct {
|
|
|
|
walk.TreeModelBase
|
|
|
|
roots []*Node
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewJSONModel(m map[string]interface{}) *JSONModel {
|
|
|
|
model := new(JSONModel)
|
|
|
|
for k,v := range m {
|
|
|
|
model.roots = append(model.roots, NewNode(k, v,nil))
|
|
|
|
}
|
|
|
|
return model
|
|
|
|
}
|
|
|
|
|
|
|
|
func (*JSONModel) LazyPopulation() bool {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *JSONModel) RootCount() int {
|
|
|
|
return len(m.roots)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *JSONModel) RootAt(index int) walk.TreeItem {
|
|
|
|
return m.roots[index]
|
|
|
|
}
|