mirror of
https://github.com/status-im/whispervis.git
synced 2025-02-08 11:23:53 +00:00
Fix upload and initialization
This commit is contained in:
parent
8229e5ce45
commit
098a817008
1
main.go
1
main.go
@ -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)
|
|
||||||
}
|
}
|
||||||
|
@ -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
24
page.go
@ -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
|
|
||||||
}
|
|
||||||
|
14
upload.go
14
upload.go
@ -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")
|
|
||||||
}
|
|
208
whispervis.js
208
whispervis.js
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user