half-working peakMeter, minsize settable
This commit is contained in:
parent
9209012be3
commit
90669b36f1
|
@ -1,6 +1,8 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
"fyne.io/fyne/v2/app"
|
"fyne.io/fyne/v2/app"
|
||||||
"fyne.io/fyne/v2/container"
|
"fyne.io/fyne/v2/container"
|
||||||
"fyne.io/fyne/v2/data/binding"
|
"fyne.io/fyne/v2/data/binding"
|
||||||
|
@ -16,6 +18,7 @@ func main() {
|
||||||
levelPB := numeter.NewVUMeterWithData(level)
|
levelPB := numeter.NewVUMeterWithData(level)
|
||||||
level.Set(0.95)
|
level.Set(0.95)
|
||||||
levelPB.TextFormatter = func() string { return " " }
|
levelPB.TextFormatter = func() string { return " " }
|
||||||
|
levelPB.Peakhold = 3 * time.Second
|
||||||
progress := widget.NewProgressBarWithData(level)
|
progress := widget.NewProgressBarWithData(level)
|
||||||
setLevel := binding.NewFloat()
|
setLevel := binding.NewFloat()
|
||||||
setLevel.Set(75.0)
|
setLevel.Set(75.0)
|
||||||
|
@ -26,6 +29,7 @@ func main() {
|
||||||
|
|
||||||
vLevelPB := numeter.NewVUMeterWithData(level)
|
vLevelPB := numeter.NewVUMeterWithData(level)
|
||||||
vLevelPB.VUMeterDirection = numeter.VUMeterVertical
|
vLevelPB.VUMeterDirection = numeter.VUMeterVertical
|
||||||
|
levelPB.Peakhold = 3 * time.Second
|
||||||
levelPB.TextFormatter = func() string { return " " }
|
levelPB.TextFormatter = func() string { return " " }
|
||||||
contain := container.New(layout.NewVBoxLayout(), levelPB, progress, slider)
|
contain := container.New(layout.NewVBoxLayout(), levelPB, progress, slider)
|
||||||
w.SetContent(container.New(layout.NewHBoxLayout(), contain, vLevelPB))
|
w.SetContent(container.New(layout.NewHBoxLayout(), contain, vLevelPB))
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
package numeter
|
package numeter
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
"math"
|
"math"
|
||||||
|
"time"
|
||||||
|
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/canvas"
|
"fyne.io/fyne/v2/canvas"
|
||||||
|
@ -14,6 +16,8 @@ import (
|
||||||
|
|
||||||
type vuRenderer struct {
|
type vuRenderer struct {
|
||||||
currentframe *canvas.Raster
|
currentframe *canvas.Raster
|
||||||
|
lastPeakTime time.Time
|
||||||
|
lastPeakVal float64
|
||||||
meter *vuMeter
|
meter *vuMeter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,6 +63,34 @@ func vuSet(i *image.RGBA, w int, h int, o VUMeterDirectionEnum, val float64, col
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func drawPeakBar(i *image.RGBA, w int, h int, o VUMeterDirectionEnum, val float64, colGrn color.Color, colAmber color.Color, colRed color.Color) {
|
||||||
|
valPixel := int(math.Round(float64(w) * val))
|
||||||
|
c := colGrn
|
||||||
|
if o == VUMeterVertical {
|
||||||
|
valPixel = int(math.Round(float64(h) * val))
|
||||||
|
if float64(valPixel)/float64(h) > 0.75 {
|
||||||
|
c = colAmber
|
||||||
|
}
|
||||||
|
if float64(valPixel)/float64(h) > 0.85 {
|
||||||
|
c = colRed
|
||||||
|
}
|
||||||
|
for x := 0; x < w; x++ {
|
||||||
|
i.Set(x, valPixel-h, c)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
valPixel = int(math.Round(float64(w) * val))
|
||||||
|
if float64(valPixel)/float64(w) > 0.75 {
|
||||||
|
c = colAmber
|
||||||
|
}
|
||||||
|
if float64(valPixel)/float64(w) > 0.85 {
|
||||||
|
c = colRed
|
||||||
|
}
|
||||||
|
for y := 0; y < h; y++ {
|
||||||
|
i.Set(valPixel, y, c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (v *vuRenderer) Render(w int, h int) image.Image {
|
func (v *vuRenderer) Render(w int, h int) image.Image {
|
||||||
i := image.NewRGBA(image.Rect(0, 0, w, h))
|
i := image.NewRGBA(image.Rect(0, 0, w, h))
|
||||||
g := color.RGBA{0, 0x1f, 0, 0xff}
|
g := color.RGBA{0, 0x1f, 0, 0xff}
|
||||||
|
@ -70,6 +102,20 @@ func (v *vuRenderer) Render(w int, h int) image.Image {
|
||||||
r = color.RGBA{0xff, 0, 0, 0xff}
|
r = color.RGBA{0xff, 0, 0, 0xff}
|
||||||
val := (v.meter.Value - v.meter.Min) / (v.meter.Max - v.meter.Min) * 100
|
val := (v.meter.Value - v.meter.Min) / (v.meter.Max - v.meter.Min) * 100
|
||||||
vuSet(i, w, h, v.meter.VUMeterDirection, val, g, a, r)
|
vuSet(i, w, h, v.meter.VUMeterDirection, val, g, a, r)
|
||||||
|
if v.meter.Value > v.lastPeakVal {
|
||||||
|
fmt.Printf("New peak: %f, expires at %s\n", v.meter.Value, time.Now().Add(v.meter.Peakhold))
|
||||||
|
v.lastPeakTime = time.Now()
|
||||||
|
v.lastPeakVal = v.meter.Value
|
||||||
|
}
|
||||||
|
if v.lastPeakTime.Add(v.meter.Peakhold).Before(time.Now()) {
|
||||||
|
fmt.Printf("Previous peak good, bar at %f\n", v.lastPeakVal)
|
||||||
|
drawPeakBar(i, w, h, v.meter.VUMeterDirection, v.lastPeakVal, g, a, r)
|
||||||
|
}
|
||||||
|
if v.lastPeakTime.Add(v.meter.Peakhold).After(time.Now()) {
|
||||||
|
fmt.Printf("Previous peak expired, holding at %f\n", v.meter.Value)
|
||||||
|
v.lastPeakVal = v.meter.Value
|
||||||
|
v.lastPeakTime = time.Now()
|
||||||
|
}
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,6 +159,7 @@ type vuMeter struct {
|
||||||
TextFormatter func() string
|
TextFormatter func() string
|
||||||
Value, Min, Max,
|
Value, Min, Max,
|
||||||
OptimumValueMin, OptimumValueMax float64
|
OptimumValueMin, OptimumValueMax float64
|
||||||
|
Peakhold time.Duration
|
||||||
VUMeterDirection VUMeterDirectionEnum
|
VUMeterDirection VUMeterDirectionEnum
|
||||||
|
|
||||||
binder basicBinder
|
binder basicBinder
|
||||||
|
@ -120,9 +167,11 @@ type vuMeter struct {
|
||||||
|
|
||||||
func NewVUMeterRenderer(m *vuMeter) *vuRenderer {
|
func NewVUMeterRenderer(m *vuMeter) *vuRenderer {
|
||||||
c := canvas.NewRaster(func(w int, h int) image.Image { return image.NewNRGBA(image.Rect(0, 0, 200, 200)) })
|
c := canvas.NewRaster(func(w int, h int) image.Image { return image.NewNRGBA(image.Rect(0, 0, 200, 200)) })
|
||||||
renderer := vuRenderer{c, m}
|
renderer := vuRenderer{c, time.Now(), 0, m}
|
||||||
c.Generator = renderer.Render
|
c.Generator = renderer.Render
|
||||||
renderer.currentframe = c
|
renderer.currentframe = c
|
||||||
|
renderer.lastPeakTime = time.Now()
|
||||||
|
renderer.lastPeakVal = 0
|
||||||
|
|
||||||
return &renderer
|
return &renderer
|
||||||
}
|
}
|
||||||
|
@ -182,6 +231,7 @@ func NewVUMeter(value float64) *vuMeter {
|
||||||
meter.Max = 100
|
meter.Max = 100
|
||||||
meter.ExtendBaseWidget(meter)
|
meter.ExtendBaseWidget(meter)
|
||||||
meter.VUMeterDirection = VUMeterHorizontal
|
meter.VUMeterDirection = VUMeterHorizontal
|
||||||
|
meter.Peakhold = 0
|
||||||
return meter
|
return meter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue