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/controls.css")
vecty.RenderBody(page)
page.UpdateNetworkGraph(inputJSON)
}

View File

@ -40,6 +40,7 @@ func NewNetworkSelector(handler func(*Network)) *NetworkSelector {
handler: handler,
}
ns.upload = widgets.NewUploadWidget(ns.onUpload)
ns.setCurrentNetwork(current)
return ns
}
@ -61,8 +62,8 @@ func (n *NetworkSelector) Render() vecty.ComponentOrHTML {
),
),
n.descriptionBlock(),
elem.HorizontalRule(),
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.
func LoadNetworks() (map[string]*Network, error) {
files, err := AssetDir("data")
@ -118,11 +99,12 @@ func LoadNetworks() (map[string]*Network, error) {
func (n *NetworkSelector) networkOptions() 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(
vecty.Markup(
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),
))
@ -130,6 +112,24 @@ func (n *NetworkSelector) networkOptions() vecty.List {
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.
func (n *NetworkSelector) onUpload(json []byte) {
r := bytes.NewReader(json)
@ -139,12 +139,18 @@ func (n *NetworkSelector) onUpload(json []byte) {
}
net.Name = fmt.Sprintf("Uploaded (%d nodes)", net.NodesCount())
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
if n.handler != nil {
go n.handler(n.current)
}
vecty.Rerender(n)
}

24
page.go
View File

@ -1,10 +1,8 @@
package main
import (
"bytes"
"fmt"
"github.com/divan/graphx/formats"
"github.com/divan/graphx/graph"
"github.com/divan/graphx/layout"
"github.com/gopherjs/vecty"
@ -25,7 +23,6 @@ type Page struct {
loader *widgets.Loader
forceEditor *widgets.ForceEditor
upload *widgets.UploadWidget
network *NetworkSelector
data *graph.Graph
@ -37,7 +34,6 @@ func NewPage() *Page {
loader: widgets.NewLoader(),
forceEditor: widgets.NewForceEditor(),
}
page.upload = widgets.NewUploadWidget(page.onUpload)
page.network = NewNetworkSelector(page.onNetworkChange)
page.webgl = NewWebGLScene()
return page
@ -56,7 +52,6 @@ func (p *Page) Render() vecty.ComponentOrHTML {
elem.Heading1(vecty.Text("Whisper Message Propagation")),
elem.Paragraph(vecty.Text("This visualization represents message propagation in the p2p network.")),
p.network,
p.upload,
elem.Div(
vecty.Markup(
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) {
fmt.Println("Network changed:", network)
p.data = network.Data
if !p.loaded {
return
}
config := p.forceEditor.Config()
p.layout = layout.NewFromConfig(p.data, config.Config)
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(
vecty.Text("Layout forces:"),
),
elem.HorizontalRule(),
elem.Form(
vecty.Markup(
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 {
config := DefaultForcesConfig
repelling := NewForceInput("Gravity force:", config.Repelling)