Initial code for forces editor

This commit is contained in:
Ivan Danyliuk 2018-09-06 16:54:35 +03:00
parent c897c6d72e
commit 82cff28a55
No known key found for this signature in database
GPG Key ID: 97ED33CE024E1DBF
3 changed files with 127 additions and 2 deletions

View File

@ -17,12 +17,14 @@ func main() {
panic(err)
}
l := layout.NewAuto(data)
forceEditor := widgets.NewForceEditor()
config := forceEditor.Config()
l := layout.NewFromConfig(data, config)
steps := 50
page := &Page{
layout: l,
loader: widgets.NewLoader(steps),
forceEditor: widgets.NewForceEditor(),
forceEditor: forceEditor,
}
vecty.SetTitle("Whisper Simulation")

46
widgets/force_editor.go Normal file
View File

@ -0,0 +1,46 @@
package widgets
import (
"github.com/divan/graphx/layout"
"github.com/gopherjs/vecty"
"github.com/gopherjs/vecty/elem"
)
type ForceEditor struct {
vecty.Core
inputs vecty.List
config layout.Config
}
func (l *ForceEditor) Render() vecty.ComponentOrHTML {
return elem.Div(
elem.Heading3(
vecty.Text("Layout forces:"),
),
elem.HorizontalRule(),
elem.Form(
vecty.Markup(
vecty.Class("pure-form"),
),
vecty.List(l.inputs),
),
)
}
func NewForceEditor() *ForceEditor {
config := layout.DefaultConfig
inputs := vecty.List{
NewForceInput("Gravity force:", config.Repelling),
NewForceInput("Spring force:", config.SpringStiffness),
NewForceInput("Drag force:", config.DragCoeff),
}
return &ForceEditor{
inputs: inputs,
config: config,
}
}
func (l *ForceEditor) Config() layout.Config {
return l.config
}

77
widgets/force_input.go Normal file
View File

@ -0,0 +1,77 @@
package widgets
import (
"fmt"
"strconv"
"github.com/gopherjs/vecty"
"github.com/gopherjs/vecty/elem"
"github.com/gopherjs/vecty/event"
"github.com/gopherjs/vecty/prop"
)
type ForceInput struct {
vecty.Core
changed bool
title string
value float64
}
func NewForceInput(title string, value float64) *ForceInput {
return &ForceInput{
title: title,
value: value,
}
}
func (f *ForceInput) Render() vecty.ComponentOrHTML {
value := fmt.Sprintf("%.2f", f.value)
return elem.Div(
vecty.Markup(
vecty.Class("pure-markup-group", "pure-u-1"),
),
elem.Label(
vecty.Markup(
vecty.Class("pure-u-1-2"),
),
vecty.Text(f.title),
),
elem.Input(
vecty.Markup(
prop.Value(value),
event.Input(f.onEditInput),
vecty.Class("pure-input-1-3"),
vecty.Style("float", "right"),
vecty.Style("margin-right", "10px"),
vecty.Style("text-align", "right"),
),
),
)
}
func (f *ForceInput) onEditInput(event *vecty.Event) {
value := event.Target.Get("value").String()
fvalue, err := strconv.ParseFloat(value, 0)
if err != nil {
return
}
f.changed = true
f.value = fvalue
}
// Value returns the current value.
func (f *ForceInput) Value() float64 {
return f.value
}
// Changed returns if input value has been changed, and resets it's value to false.
func (f *ForceInput) Changed() bool {
if f.changed {
f.changed = false
return true
}
return false
}