aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app.go6
-rw-r--r--color.go7
-rw-r--r--go.mod20
-rw-r--r--go.sum98
-rw-r--r--main.go140
-rw-r--r--volume/volume.go4
-rw-r--r--widget.go116
7 files changed, 382 insertions, 9 deletions
diff --git a/app.go b/app.go
index f0f5068..8e9d8bb 100644
--- a/app.go
+++ b/app.go
@@ -35,13 +35,13 @@ type App struct {
FlowUnit mass.FlowRate
Comp compressor.Compressor
- CompImg image.Image
+ CompImg *image.NRGBA
}
func NewApp() (App, error) {
a := App{
Displacement: 2 * volume.Litre,
- VolumeUnit: volume.Litre,
+ VolumeUnit: volume.CubicCentimetre,
Rpm: []int{2000},
@@ -91,7 +91,7 @@ func (a *App) SetCompressor(c compressor.Compressor) error {
}
b := j.Bounds()
- m := image.NewRGBA(image.Rect(0, 0, b.Dx(), b.Dy()))
+ m := image.NewNRGBA(image.Rect(0, 0, b.Dx(), b.Dy()))
draw.Draw(m, m.Bounds(), j, b.Min, draw.Src)
a.Comp = c
diff --git a/color.go b/color.go
new file mode 100644
index 0000000..3db4759
--- /dev/null
+++ b/color.go
@@ -0,0 +1,7 @@
+package main
+
+import "image/color"
+
+var (
+ black = color.NRGBA{R: 0, G: 0, B: 0, A: 255}
+)
diff --git a/go.mod b/go.mod
index f4c91a4..d977b6a 100644
--- a/go.mod
+++ b/go.mod
@@ -1,5 +1,21 @@
module github.com/sam-anthony/volute
-go 1.17
+go 1.18
-require github.com/BurntSushi/toml v1.1.0
+require (
+ gioui.org v0.0.0-20220607102828-5cf916c0753c
+ github.com/BurntSushi/toml v1.1.0
+ golang.org/x/exp v0.0.0-20220609121020-a51bd0440498
+)
+
+require (
+ gioui.org/cpu v0.0.0-20210817075930-8d6a761490d2 // indirect
+ gioui.org/shader v1.0.6 // indirect
+ github.com/benoitkugler/textlayout v0.1.1 // indirect
+ github.com/gioui/uax v0.2.1-0.20220325163150-e3d987515a12 // indirect
+ github.com/go-text/typesetting v0.0.0-20220411150340-35994bc27a7b // indirect
+ golang.org/x/exp/shiny v0.0.0-20220609121020-a51bd0440498 // indirect
+ golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d // indirect
+ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect
+ golang.org/x/text v0.3.7 // indirect
+)
diff --git a/go.sum b/go.sum
index ec0c385..a0c5c9c 100644
--- a/go.sum
+++ b/go.sum
@@ -1,2 +1,100 @@
+eliasnaur.com/font v0.0.0-20220124212145-832bb8fc08c3 h1:djFprmHZgrSepsHAIRMp5UJn3PzsoTg9drI+BDmif5Q=
+gioui.org v0.0.0-20220607102828-5cf916c0753c h1:NnSe6ebWNvFkRu13Ouo1ENvZRsZBqY1rETAPrRJGRCU=
+gioui.org v0.0.0-20220607102828-5cf916c0753c/go.mod h1:WHoHbUjH91BJS2xkfps2AhKxji+9o3xwfsphGsCBfnM=
+gioui.org/cpu v0.0.0-20210808092351-bfe733dd3334/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ=
+gioui.org/cpu v0.0.0-20210817075930-8d6a761490d2 h1:AGDDxsJE1RpcXTAxPG2B4jrwVUJGFDjINIPi1jtO6pc=
+gioui.org/cpu v0.0.0-20210817075930-8d6a761490d2/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ=
+gioui.org/shader v1.0.6 h1:cvZmU+eODFR2545X+/8XucgZdTtEjR3QWW6W65b0q5Y=
+gioui.org/shader v1.0.6/go.mod h1:mWdiME581d/kV7/iEhLmUgUK5iZ09XR5XpduXzbePVM=
github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I=
github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/benoitkugler/pstokenizer v1.0.0/go.mod h1:l1G2Voirz0q/jj0TQfabNxVsa8HZXh/VMxFSRALWTiE=
+github.com/benoitkugler/textlayout v0.0.5/go.mod h1:puH4v13Uz7uIhIH0XMk5jgc8U3MXcn5r3VlV9K8n0D8=
+github.com/benoitkugler/textlayout v0.1.1 h1:hizE/085xAeY8q7gwV00uHR2Q27KYB2g1HW+UacXl68=
+github.com/benoitkugler/textlayout v0.1.1/go.mod h1:o+1hFV+JSHBC9qNLIuwVoLedERU7sBPgEFcuSgfvi/w=
+github.com/benoitkugler/textlayout-testdata v0.1.1 h1:AvFxBxpfrQd8v55qH59mZOJOQjtD6K2SFe9/HvnIbJk=
+github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21/go.mod h1:po7NpZ/QiTKzBKyrsEAxwnTamCoh8uDk/egRpQ7siIc=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/gioui/uax v0.2.1-0.20220325163150-e3d987515a12 h1:1bjaB/5IIicfKpP4k0s30T2WEw//Kh00zULa8DQ0cxA=
+github.com/gioui/uax v0.2.1-0.20220325163150-e3d987515a12/go.mod h1:kDhBRTA/i3H46PVdhqcw26TdGSIj42TOKNWKY+Kipnw=
+github.com/go-text/typesetting v0.0.0-20220411150340-35994bc27a7b h1:WINlj3ANt+CVrO2B4NGDHRlPvEWZPxjhb7z+JKypwXI=
+github.com/go-text/typesetting v0.0.0-20220411150340-35994bc27a7b/go.mod h1:ZNYu5saGoMOqtkVH5T8onTwhzenDUVszI+5WFHJRaxQ=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20220609121020-a51bd0440498 h1:TF0FvLUGEq/8wOt/9AV1nj6D4ViZGUIGCMQfCv7VRXY=
+golang.org/x/exp v0.0.0-20220609121020-a51bd0440498/go.mod h1:yh0Ynu2b5ZUe3MQfp2nM0ecK7wsgouWTDN0FNeJuIys=
+golang.org/x/exp/shiny v0.0.0-20220609121020-a51bd0440498 h1:mJjyic/dxHcz1W6IUE8zf6+RltuO8+9mS45tTtb4F6k=
+golang.org/x/exp/shiny v0.0.0-20220609121020-a51bd0440498/go.mod h1:VjAR7z0ngyATZTELrBSkxOOHhhlnVUxDye4mcjx5h/8=
+golang.org/x/image v0.0.0-20210504121937-7319ad40d33e/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs=
+golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/main.go b/main.go
index be07b1b..d29fbc4 100644
--- a/main.go
+++ b/main.go
@@ -1,8 +1,18 @@
package main
import (
- "fmt"
+ "golang.org/x/exp/slices"
+ "log"
"os"
+
+ "gioui.org/app"
+ "gioui.org/font/gofont"
+ "gioui.org/io/system"
+ "gioui.org/layout"
+ "gioui.org/op"
+ "gioui.org/unit"
+ "gioui.org/widget"
+ "gioui.org/widget/material"
)
const (
@@ -11,9 +21,131 @@ const (
)
func main() {
- _, err := NewApp()
+ state, err := NewApp()
if err != nil {
- fmt.Println(err)
- os.Exit(1)
+ log.Fatal(err)
+ }
+
+ go func() {
+ w := app.NewWindow(
+ app.Title("Volute"),
+ )
+ if err := run(state, w); err != nil {
+ log.Fatal(err)
+ }
+ os.Exit(0)
+ }()
+ app.Main()
+}
+
+func run(s App, w *app.Window) error {
+ var ops op.Ops
+
+ th := material.NewTheme(gofont.Collection())
+ inset := layout.UniformInset(unit.Dp(2))
+
+ displacement := NewFloat(th)
+ displacement.Set(2000.0)
+
+ var rpm []Int
+ rpm = append(rpm, NewInt(th))
+ rpm[0].Set(2000)
+ var rpmList = layout.List{Axis: layout.Horizontal}
+
+ var duplicateButton []widget.Clickable
+ duplicateButton = append(duplicateButton, widget.Clickable{})
+ var duplicateButtonList = layout.List{Axis: layout.Horizontal}
+
+ var deleteButton []widget.Clickable
+ deleteButton = append(deleteButton, widget.Clickable{})
+ var deleteButtonList = layout.List{Axis: layout.Horizontal}
+
+ for {
+ e := <-w.Events()
+ switch e := e.(type) {
+ case system.DestroyEvent:
+ return e.Err
+ case system.FrameEvent:
+ gtx := layout.NewContext(&ops, e)
+
+ for i := range rpm {
+ if duplicateButton[i].Clicked() {
+ rpm = slices.Insert(rpm, i, rpm[i])
+ duplicateButton = slices.Insert(
+ duplicateButton,
+ i,
+ duplicateButton[i],
+ )
+ deleteButton = slices.Insert(
+ deleteButton,
+ i,
+ deleteButton[i],
+ )
+ break
+ }
+ if deleteButton[i].Clicked() && len(rpm) > 1 {
+ rpm = slices.Delete(rpm, i, i+1)
+ duplicateButton = slices.Delete(duplicateButton, i, i+1)
+ deleteButton = slices.Delete(deleteButton, i, i+1)
+ break
+ }
+ }
+
+ layout.Flex{
+ Axis: layout.Vertical,
+ }.Layout(gtx,
+ // Displacement
+ layout.Rigid(
+ func(gtx layout.Context) layout.Dimensions {
+ return inset.Layout(gtx,
+ func(gtx layout.Context) layout.Dimensions {
+ return displacement.Layout(gtx)
+ },
+ )
+ },
+ ),
+ // Rpm
+ layout.Rigid(
+ func(gtx layout.Context) layout.Dimensions {
+ return rpmList.Layout(gtx,
+ len(rpm),
+ func(gtx layout.Context, index int) layout.Dimensions {
+ return inset.Layout(gtx,
+ func(gtx layout.Context) layout.Dimensions {
+ return rpm[index].Layout(gtx)
+ },
+ )
+ },
+ )
+ },
+ ),
+ // Duplicate
+ layout.Rigid(
+ func(gtx layout.Context) layout.Dimensions {
+ return duplicateButtonList.Layout(gtx,
+ len(duplicateButton),
+ func(gtx layout.Context, i int) layout.Dimensions {
+ return material.Button(th, &duplicateButton[i], "Duplicate").
+ Layout(gtx)
+ },
+ )
+ },
+ ),
+ // Delete
+ layout.Rigid(
+ func(gtx layout.Context) layout.Dimensions {
+ return deleteButtonList.Layout(gtx,
+ len(deleteButton),
+ func(gtx layout.Context, i int) layout.Dimensions {
+ return material.Button(th, &deleteButton[i], "Delete").
+ Layout(gtx)
+ },
+ )
+ },
+ ),
+ )
+
+ e.Frame(gtx.Ops)
+ }
}
}
diff --git a/volume/volume.go b/volume/volume.go
index e634b5d..4eb22fe 100644
--- a/volume/volume.go
+++ b/volume/volume.go
@@ -9,6 +9,10 @@ const (
CubicInch Volume = 16.38706
)
+func New(i float32, u Volume) Volume {
+ return Volume(i) * u
+}
+
func (v Volume) As(unit Volume) float32 {
return float32(v / unit)
}
diff --git a/widget.go b/widget.go
new file mode 100644
index 0000000..d38f448
--- /dev/null
+++ b/widget.go
@@ -0,0 +1,116 @@
+package main
+
+import (
+ "fmt"
+ "math/bits"
+ "strconv"
+ "strings"
+
+ "gioui.org/layout"
+ "gioui.org/text"
+ "gioui.org/unit"
+ "gioui.org/widget"
+ "gioui.org/widget/material"
+)
+
+type Float struct {
+ val float32
+ editor widget.Editor
+ th *material.Theme
+}
+
+func NewFloat(th *material.Theme) Float {
+ f := Float{th: th}
+ f.editor.SetText(fmt.Sprintf("%.2f", f.val))
+ f.editor.SingleLine = true
+ f.editor.Alignment = text.Middle
+ return f
+}
+
+func (f *Float) Set(v float32) {
+ f.val = v
+ f.editor.SetText(fmt.Sprintf("%.2f", f.val))
+}
+
+func (f *Float) Layout(gtx layout.Context) layout.Dimensions {
+ inputString := f.editor.Text()
+ inputString = strings.TrimSpace(inputString)
+ inputFloat, err := strconv.ParseFloat(inputString, 32)
+ if err != nil {
+ f.editor.SetText("")
+ } else {
+ f.val = float32(inputFloat)
+ }
+
+ ed := material.Editor(f.th, &f.editor, "")
+
+ border := widget.Border{
+ Color: black,
+ CornerRadius: unit.Dp(3),
+ Width: unit.Dp(2),
+ }
+
+ inset := layout.Inset{
+ Top: unit.Dp(1),
+ Bottom: unit.Dp(1),
+ Left: unit.Dp(3),
+ Right: unit.Dp(3),
+ }
+
+ return border.Layout(gtx,
+ func(gtx layout.Context) layout.Dimensions {
+ return inset.Layout(gtx, ed.Layout)
+ },
+ )
+}
+
+type Int struct {
+ val int
+ editor widget.Editor
+ th *material.Theme
+}
+
+func NewInt(th *material.Theme) Int {
+ i := Int{th: th}
+ i.editor.SetText(fmt.Sprintf("%d", i.val))
+ i.editor.SingleLine = true
+ i.editor.Alignment = text.Middle
+ return i
+}
+
+func (i *Int) Set(v int) {
+ i.val = v
+ i.editor.SetText(fmt.Sprintf("%d", i.val))
+}
+
+func (i *Int) Layout(gtx layout.Context) layout.Dimensions {
+ inputString := i.editor.Text()
+ inputString = strings.TrimSpace(inputString)
+ inputInt, err := strconv.ParseInt(inputString, 10, bits.UintSize)
+ if err != nil {
+ i.editor.SetText("")
+ } else {
+ i.val = int(inputInt)
+ }
+
+ ed := material.Editor(i.th, &i.editor, "")
+
+ border := widget.Border{
+ Color: black,
+ CornerRadius: unit.Dp(3),
+ Width: unit.Dp(2),
+ }
+
+ inset := layout.Inset{
+ Top: unit.Dp(1),
+ Bottom: unit.Dp(1),
+ Left: unit.Dp(3),
+ Right: unit.Dp(3),
+ }
+
+ return border.Layout(gtx,
+ func(gtx layout.Context) layout.Dimensions {
+ return inset.Layout(gtx, ed.Layout)
+ },
+ )
+}