Fix upload and initialization

This commit is contained in:
Ivan Danyliuk 2018-09-19 12:45:54 +03:00
parent 8229e5ce45
commit 098a817008
No known key found for this signature in database
GPG Key ID: 97ED33CE024E1DBF
7 changed files with 113 additions and 195 deletions

View File

@ -11,5 +11,4 @@ func main() {
vecty.AddStylesheet("css/pure-min.css") vecty.AddStylesheet("css/pure-min.css")
vecty.AddStylesheet("css/controls.css") vecty.AddStylesheet("css/controls.css")
vecty.RenderBody(page) vecty.RenderBody(page)
page.UpdateNetworkGraph(inputJSON)
} }

View File

@ -40,6 +40,7 @@ func NewNetworkSelector(handler func(*Network)) *NetworkSelector {
handler: handler, handler: handler,
} }
ns.upload = widgets.NewUploadWidget(ns.onUpload) ns.upload = widgets.NewUploadWidget(ns.onUpload)
ns.setCurrentNetwork(current)
return ns return ns
} }
@ -61,8 +62,8 @@ func (n *NetworkSelector) Render() vecty.ComponentOrHTML {
), ),
), ),
n.descriptionBlock(), n.descriptionBlock(),
elem.HorizontalRule(),
vecty.If(n.isCustom, n.upload), vecty.If(n.isCustom, n.upload),
elem.HorizontalRule(),
) )
} }
@ -77,26 +78,6 @@ func (n *NetworkSelector) descriptionBlock() *vecty.HTML {
) )
} }
// onChange implements handler for select input changed value
func (n *NetworkSelector) onChange(e *vecty.Event) {
value := e.Target.Get("value").String()
if value == "upload" {
n.isCustom = true
vecty.Rerender(n)
return
}
n.isCustom = false
n.current = n.networks[value]
if n.handler != nil {
go n.handler(n.current)
}
vecty.Rerender(n)
}
// LoadNetworks imports preloaded neworks from the directory with JSON files. // LoadNetworks imports preloaded neworks from the directory with JSON files.
func LoadNetworks() (map[string]*Network, error) { func LoadNetworks() (map[string]*Network, error) {
files, err := AssetDir("data") files, err := AssetDir("data")
@ -118,11 +99,12 @@ func LoadNetworks() (map[string]*Network, error) {
func (n *NetworkSelector) networkOptions() vecty.List { func (n *NetworkSelector) networkOptions() vecty.List {
var options vecty.List var options vecty.List
for name, _ := range n.networks { for name := range n.networks {
fmt.Printf("'%s' == '%s'\n", n.current.Name, name)
options = append(options, elem.Option( options = append(options, elem.Option(
vecty.Markup( vecty.Markup(
vecty.Property("value", name), vecty.Property("value", name),
vecty.Property("selected", n.current.Name == name), vecty.Property("selected", n.current.Name == "data/"+name), // TODO(divan): get rid of "data"
), ),
vecty.Text(name), vecty.Text(name),
)) ))
@ -130,6 +112,24 @@ func (n *NetworkSelector) networkOptions() vecty.List {
return options return options
} }
// onChange implements handler for select input changed value
func (n *NetworkSelector) onChange(e *vecty.Event) {
value := e.Target.Get("value").String()
if value == "upload" {
n.isCustom = true
vecty.Rerender(n)
return
}
n.isCustom = false
net := n.networks[value]
n.setCurrentNetwork(net)
vecty.Rerender(n)
}
// onUpload implements callback for "Upload" button clicked event. // onUpload implements callback for "Upload" button clicked event.
func (n *NetworkSelector) onUpload(json []byte) { func (n *NetworkSelector) onUpload(json []byte) {
r := bytes.NewReader(json) r := bytes.NewReader(json)
@ -139,12 +139,18 @@ func (n *NetworkSelector) onUpload(json []byte) {
} }
net.Name = fmt.Sprintf("Uploaded (%d nodes)", net.NodesCount()) net.Name = fmt.Sprintf("Uploaded (%d nodes)", net.NodesCount())
n.networks[net.Name] = net n.networks[net.Name] = net
n.setCurrentNetwork(net)
vecty.Rerender(n)
}
// setCurrentNetwork changes current network and runs needed update handlers.
func (n *NetworkSelector) setCurrentNetwork(net *Network) {
n.current = net n.current = net
if n.handler != nil { if n.handler != nil {
go n.handler(n.current) go n.handler(n.current)
} }
vecty.Rerender(n)
} }

24
page.go
View File

@ -1,10 +1,8 @@
package main package main
import ( import (
"bytes"
"fmt" "fmt"
"github.com/divan/graphx/formats"
"github.com/divan/graphx/graph" "github.com/divan/graphx/graph"
"github.com/divan/graphx/layout" "github.com/divan/graphx/layout"
"github.com/gopherjs/vecty" "github.com/gopherjs/vecty"
@ -25,7 +23,6 @@ type Page struct {
loader *widgets.Loader loader *widgets.Loader
forceEditor *widgets.ForceEditor forceEditor *widgets.ForceEditor
upload *widgets.UploadWidget
network *NetworkSelector network *NetworkSelector
data *graph.Graph data *graph.Graph
@ -37,7 +34,6 @@ func NewPage() *Page {
loader: widgets.NewLoader(), loader: widgets.NewLoader(),
forceEditor: widgets.NewForceEditor(), forceEditor: widgets.NewForceEditor(),
} }
page.upload = widgets.NewUploadWidget(page.onUpload)
page.network = NewNetworkSelector(page.onNetworkChange) page.network = NewNetworkSelector(page.onNetworkChange)
page.webgl = NewWebGLScene() page.webgl = NewWebGLScene()
return page return page
@ -56,7 +52,6 @@ func (p *Page) Render() vecty.ComponentOrHTML {
elem.Heading1(vecty.Text("Whisper Message Propagation")), elem.Heading1(vecty.Text("Whisper Message Propagation")),
elem.Paragraph(vecty.Text("This visualization represents message propagation in the p2p network.")), elem.Paragraph(vecty.Text("This visualization represents message propagation in the p2p network.")),
p.network, p.network,
p.upload,
elem.Div( elem.Div(
vecty.Markup( vecty.Markup(
vecty.MarkupIf(!p.loaded, vecty.Style("visibility", "hidden")), vecty.MarkupIf(!p.loaded, vecty.Style("visibility", "hidden")),
@ -118,26 +113,9 @@ func (p *Page) onUpdateClick(e *vecty.Event) {
} }
func (p *Page) onNetworkChange(network *Network) { func (p *Page) onNetworkChange(network *Network) {
fmt.Println("Network changed:", network)
p.data = network.Data p.data = network.Data
if !p.loaded {
return
}
config := p.forceEditor.Config() config := p.forceEditor.Config()
p.layout = layout.NewFromConfig(p.data, config.Config) p.layout = layout.NewFromConfig(p.data, config.Config)
go p.StartSimulation() go p.StartSimulation()
} }
// UpdateNetworkGraph updates graph and scene with new data.
func (p *Page) UpdateNetworkGraph(json []byte) error {
buf := bytes.NewBuffer(json)
data, err := formats.FromD3JSONReader(buf)
if err != nil {
return fmt.Errorf("update graph: %v", err)
}
p.data = data
config := p.forceEditor.Config()
p.layout = layout.NewFromConfig(data, config.Config)
go p.StartSimulation()
return nil
}

View File

@ -1,14 +0,0 @@
package main
import (
"fmt"
)
// onUpload implements callback for "Upload" button clicked event.
func (p *Page) onUpload(json []byte) {
if err := p.UpdateNetworkGraph(json); err != nil {
fmt.Println("[ERROR] Failed to process network.json:", err)
return
}
fmt.Println("Uploaded new network graph")
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -30,7 +30,6 @@ func (l *ForceEditor) Render() vecty.ComponentOrHTML {
elem.Heading3( elem.Heading3(
vecty.Text("Layout forces:"), vecty.Text("Layout forces:"),
), ),
elem.HorizontalRule(),
elem.Form( elem.Form(
vecty.Markup( vecty.Markup(
vecty.Class("pure-form"), vecty.Class("pure-form"),
@ -43,7 +42,7 @@ func (l *ForceEditor) Render() vecty.ComponentOrHTML {
) )
} }
// NewForcesEditor creates a new ForceEditor widget. // NewForceEditor creates a new ForceEditor widget.
func NewForceEditor() *ForceEditor { func NewForceEditor() *ForceEditor {
config := DefaultForcesConfig config := DefaultForcesConfig
repelling := NewForceInput("Gravity force:", config.Repelling) repelling := NewForceInput("Gravity force:", config.Repelling)