minewebgen - internal/js/generators.go
1 package main
2
3 import (
4 "fmt"
5
6 "vimagination.zapto.org/gopherjs/overlay"
7 "vimagination.zapto.org/gopherjs/tabs"
8 "vimagination.zapto.org/gopherjs/xdom"
9 "vimagination.zapto.org/gopherjs/xjs"
10 "vimagination.zapto.org/minewebgen/internal/data"
11 "honnef.co/go/js/dom"
12 )
13
14 func GeneratorsTab(c dom.Element) {
15 go func() {
16 xjs.RemoveChildren(c)
17 gs, err := RPC.Generators()
18 if err != nil {
19 xjs.Alert("Error getting generator list: %s", err)
20 return
21 }
22 ng := xdom.Button()
23 xjs.SetInnerText(ng, "New Generator")
24 ng.AddEventListener("click", false, func(dom.Event) {
25 d := xdom.Div()
26 o := overlay.New(d)
27 o.OnClose(func() {
28 GeneratorsTab(c)
29 })
30 d.AppendChild(transferFile("Map", "Upload/Download", 3, o))
31 xjs.Body().AppendChild(o)
32 })
33 table := xjs.AppendChildren(xdom.Table(), xjs.AppendChildren(xdom.Tr(), xjs.SetInnerText(xdom.Th(), "Generator")))
34 if len(gs) == 0 {
35 table.AppendChild(xjs.AppendChildren(xdom.Tr(), xjs.SetInnerText(xdom.Td(), "No Generators")))
36 } else {
37 for _, g := range gs {
38 td := xdom.Td()
39 td.AddEventListener("click", false, func(g data.Generator) func(dom.Event) {
40 return func(dom.Event) {
41 d := xdom.Div()
42 o := overlay.New(d)
43 o.OnClose(func() {
44 GeneratorsTab(c)
45 })
46 d.AppendChild(tabs.New([]tabs.Tab{
47 {"Profile", generatorProfile(g.ID)},
48 {"Misc", misc("generator", g.ID, o, RPC.RemoveGenerator)},
49 }))
50 xjs.Body().AppendChild(o)
51 }
52 }(g))
53 table.AppendChild(xjs.AppendChildren(xdom.Tr(), xjs.SetInnerText(td, g.Name)))
54 }
55 }
56 xjs.AppendChildren(c,
57 xjs.SetInnerText(xdom.H2(), "Generators"),
58 ng,
59 table,
60 )
61 }()
62 }
63
64 func generatorProfile(id int) func(dom.Element) {
65 var d dom.Node
66 return func(c dom.Element) {
67 if d == nil {
68 g, err := RPC.Generator(id)
69 if err != nil {
70 xjs.Alert("Error while getting generator settings: %s", err)
71 return
72 }
73 tTable := xjs.AppendChildren(xdom.Table(), xjs.AppendChildren(xdom.Thead(), xjs.AppendChildren(xdom.Tr(),
74 xjs.SetInnerText(xdom.Th(), "Colour"),
75 xjs.SetInnerText(xdom.Th(), "Colour Code"),
76 xjs.SetInnerText(xdom.Th(), "Name"),
77 )))
78 for _, t := range g.Terrain {
79 colour := xdom.Td()
80 cc := fmt.Sprintf("rgb(%d, %d, %d)", t.Colour.R, t.Colour.G, t.Colour.B)
81 colour.Style().SetProperty("background-color", cc, "")
82 colour.Style().SetProperty("border", "1px solid #000", "")
83 tTable.AppendChild(xjs.AppendChildren(xdom.Tr(),
84 colour,
85 xjs.SetInnerText(xdom.Td(), cc),
86 xjs.SetInnerText(xdom.Td(), t.Name),
87 ))
88 }
89 bTable := xjs.AppendChildren(xdom.Table(), xjs.AppendChildren(xdom.Thead(), xjs.AppendChildren(xdom.Tr(),
90 xjs.SetInnerText(xdom.Th(), "Colour"),
91 xjs.SetInnerText(xdom.Th(), "Colour Code"),
92 xjs.SetInnerText(xdom.Th(), "Name"),
93 )))
94 for _, b := range g.Biomes {
95 colour := xdom.Td()
96 cc := fmt.Sprintf("rgb(%d, %d, %d)", b.Colour.R, b.Colour.G, b.Colour.B)
97 colour.Style().SetProperty("background-color", cc, "")
98 colour.Style().SetProperty("border", "1px solid #000", "")
99 bTable.AppendChild(xjs.AppendChildren(xdom.Tr(),
100 colour,
101 xjs.SetInnerText(xdom.Td(), cc),
102 xjs.SetInnerText(xdom.Td(), b.Name),
103 ))
104 }
105 pTable := xjs.AppendChildren(xdom.Table(), xjs.AppendChildren(xdom.Thead(), xjs.AppendChildren(xdom.Tr(),
106 xjs.SetInnerText(xdom.Th(), "Colour"),
107 xjs.SetInnerText(xdom.Th(), "Colour Code"),
108 xjs.SetInnerText(xdom.Th(), "Name"),
109 )))
110 for _, p := range g.Plants {
111 colour := xdom.Td()
112 cc := fmt.Sprintf("rgb(%d, %d, %d)", p.Colour.R, p.Colour.G, p.Colour.B)
113 colour.Style().SetProperty("background-color", cc, "")
114 colour.Style().SetProperty("border", "1px solid #000", "")
115 pTable.AppendChild(xjs.AppendChildren(xdom.Tr(),
116 colour,
117 xjs.SetInnerText(xdom.Td(), cc),
118 xjs.SetInnerText(xdom.Td(), p.Name),
119 ))
120 }
121 d = xjs.AppendChildren(xdom.Div(),
122 xjs.SetInnerText(xdom.H2(), "Terrain"),
123 tTable,
124 xjs.SetInnerText(xdom.H2(), "Biomes"),
125 bTable,
126 xjs.SetInnerText(xdom.H2(), "Plants"),
127 pTable,
128 )
129 }
130 c.AppendChild(d)
131 }
132 }