Compare commits

..

No commits in common. "1964b0202b4fb02728489c797bbe9a02ccb35220" and "f503732f3854c8245571c295478c956635529b20" have entirely different histories.

4 changed files with 31 additions and 165 deletions

View file

@ -1,35 +0,0 @@
package main
import (
"fmt"
"image/color"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
"git.martyn.berlin/martyn/fyne-widgets/pkg/layouts"
)
func main() {
a := app.New()
w := a.NewWindow("FloatingButtons")
background := canvas.NewRectangle(color.RGBA{255, 0, 0, 128})
layout := layouts.NewFloatingControlsLayout()
layout.FloatingControlsLocation = layouts.FloatingControlsCenter
button := widget.NewButton("X", func() {
fmt.Println("button clicked")
layout.FloatingControlsLocation = layout.FloatingControlsLocation + 1
if layout.FloatingControlsLocation > 4 {
layout.FloatingControlsLocation = 0
}
w.SetContent(w.Content())
})
w.SetContent(container.New(&layout, background, button))
w.Resize(fyne.NewSize(100, 100))
w.ShowAndRun()
}

View file

@ -24,10 +24,6 @@ func main() {
level.Set(data / 100) level.Set(data / 100)
} }
vLevelPB := vumeter.NewVUMeterWithData(level) w.SetContent(container.New(layout.NewVBoxLayout(), levelPB, progress, slider))
vLevelPB.VUMeterDirection = vumeter.VUMeterVertical
vLevelPB.TextFormatter = func() string { return " " }
contain := container.New(layout.NewVBoxLayout(), levelPB, progress, slider)
w.SetContent(container.New(layout.NewHBoxLayout(), contain, vLevelPB))
w.ShowAndRun() w.ShowAndRun()
} }

View file

@ -1,59 +0,0 @@
package layouts
import (
"fyne.io/fyne/v2"
)
type FloatingControlsLocationEnum uint32
const (
FloatingControlsTopLeft = iota
FloatingControlsTopRight
FloatingControlsBottomLeft
FloatingControlsBottomRight
FloatingControlsCenter
)
type floatingControlsLayout struct {
FloatingControlsLocation FloatingControlsLocationEnum
}
// NewFloatingControlsLayout creates a new floatingControlsLayout instance
// This layout contains exactly TWO items, one background item (first) and one
// floating container that floats according to FloatingControlsLocation
func NewFloatingControlsLayout() floatingControlsLayout {
return floatingControlsLayout{FloatingControlsTopRight}
}
func (d *floatingControlsLayout) MinSize(objects []fyne.CanvasObject) fyne.Size {
if len(objects) > 1 {
return objects[0].MinSize()
}
return fyne.NewSize(0, 0)
}
func (d *floatingControlsLayout) Layout(objects []fyne.CanvasObject, containerSize fyne.Size) {
if len(objects) == 2 {
o := objects[0]
size := containerSize
o.Resize(size)
o.Move(fyne.NewPos(0, 0))
o = objects[1]
size = o.MinSize()
o.Resize(size)
switch d.FloatingControlsLocation {
case FloatingControlsTopLeft:
o.Move(fyne.NewPos(0, 0))
case FloatingControlsTopRight:
o.Move(fyne.NewPos(containerSize.Width-size.Width, 0))
case FloatingControlsBottomLeft:
o.Move(fyne.NewPos(0, containerSize.Height-size.Height))
case FloatingControlsBottomRight:
o.Move(fyne.NewPos(containerSize.Width-size.Width, containerSize.Height-size.Height))
case FloatingControlsCenter:
o.Move(fyne.NewPos((containerSize.Width/2)-(size.Width/2), (containerSize.Height/2)-(size.Height/2)))
}
}
}

View file

@ -54,74 +54,47 @@ func (v *vuRenderer) updateBars() {
} }
size := v.meter.Size() size := v.meter.Size()
var ratioSize float64 greenWidth := 0.0
if v.meter.VUMeterDirection == VUMeterHorizontal { amberWidth := 0.0
ratioSize = float64(size.Width) redWidth := 0.0
} else {
ratioSize = float64(size.Height)
}
greenSize := 0.0
amberSize := 0.0
redSize := 0.0
if ratio > (v.meter.OptimumValueMin / 100) { if ratio > (v.meter.OptimumValueMin / 100) {
if ratio > (v.meter.OptimumValueMax / 100) { if ratio > (v.meter.OptimumValueMax / 100) {
greenSize = ratioSize * v.meter.OptimumValueMin / 100 greenWidth = float64(size.Width) * v.meter.OptimumValueMin / 100
amberSize = ratioSize * v.meter.OptimumValueMax / 100 amberWidth = float64(size.Width) * v.meter.OptimumValueMax / 100
redSize = ratioSize * ratio redWidth = float64(size.Width) * ratio
} else { } else {
greenSize = ratioSize * v.meter.OptimumValueMin / 100 greenWidth = float64(size.Width) * v.meter.OptimumValueMin / 100
amberSize = ratioSize * ratio amberWidth = float64(size.Width) * ratio
} }
} else { } else {
greenSize = ratioSize * ratio greenWidth = float64(size.Width) * ratio
} }
redSize = redSize - amberSize redWidth = redWidth - amberWidth
if redSize < 0 { if redWidth < 0 {
redSize = 0 redWidth = 0
} }
amberSize = amberSize - greenSize amberWidth = amberWidth - greenWidth
if amberSize < 0 { if amberWidth < 0 {
amberSize = 0 amberWidth = 0
} }
lowalphaGreenSize := ratioSize * v.meter.OptimumValueMin / 100 lowalphaGreenWidth := float64(size.Width) * v.meter.OptimumValueMin / 100
lowalphaAmberSize := ratioSize * v.meter.OptimumValueMax / 100 lowalphaAmberWidth := float64(size.Width) * v.meter.OptimumValueMax / 100
lowalphaRedSize := ratioSize lowalphaRedWidth := float64(size.Width)
lowalphaRedSize = lowalphaRedSize - lowalphaAmberSize lowalphaRedWidth = lowalphaRedWidth - lowalphaAmberWidth
lowalphaAmberSize = lowalphaAmberSize - lowalphaGreenSize lowalphaAmberWidth = lowalphaAmberWidth - lowalphaGreenWidth
if v.meter.VUMeterDirection == VUMeterHorizontal { v.lowalphaGreen.Resize(fyne.NewSize(float32(lowalphaGreenWidth), size.Height))
v.lowalphaGreen.Move(fyne.NewPos(0, 0)) v.lowalphaAmber.Resize(fyne.NewSize(float32(lowalphaAmberWidth), size.Height))
v.lowalphaGreen.Resize(fyne.NewSize(float32(lowalphaGreenSize), size.Height)) v.lowalphaAmber.Move(fyne.NewPos(float32(lowalphaGreenWidth), 0))
v.lowalphaAmber.Resize(fyne.NewSize(float32(lowalphaAmberSize), size.Height)) v.lowalphaRed.Resize(fyne.NewSize(float32(lowalphaRedWidth), size.Height))
v.lowalphaAmber.Move(fyne.NewPos(float32(lowalphaGreenSize), 0)) v.lowalphaRed.Move(fyne.NewPos(float32(lowalphaAmberWidth+lowalphaGreenWidth), 0))
v.lowalphaRed.Resize(fyne.NewSize(float32(lowalphaRedSize), size.Height))
v.lowalphaRed.Move(fyne.NewPos(float32(lowalphaAmberSize+lowalphaGreenSize), 0))
} else {
v.lowalphaGreen.Move(fyne.NewPos(0, size.Height-float32(lowalphaGreenSize)))
v.lowalphaGreen.Resize(fyne.NewSize(size.Width, float32(lowalphaGreenSize)))
v.lowalphaAmber.Resize(fyne.NewSize(size.Width, float32(lowalphaAmberSize)))
v.lowalphaAmber.Move(fyne.NewPos(0, size.Height-float32(lowalphaGreenSize+lowalphaAmberSize)))
v.lowalphaRed.Resize(fyne.NewSize(size.Width, float32(lowalphaRedSize)))
v.lowalphaRed.Move(fyne.NewPos(0, size.Height-float32(lowalphaGreenSize+lowalphaAmberSize+lowalphaRedSize)))
}
if v.meter.VUMeterDirection == VUMeterHorizontal { v.bar.Resize(fyne.NewSize(float32(greenWidth), size.Height))
v.bar.Move(fyne.NewPos(0, 0)) v.optimumBar.Resize(fyne.NewSize(float32(amberWidth), size.Height))
v.bar.Resize(fyne.NewSize(float32(greenSize), size.Height)) v.optimumBar.Move(fyne.NewPos(float32(greenWidth), 0))
v.optimumBar.Resize(fyne.NewSize(float32(amberSize), size.Height)) v.peakBar.Resize(fyne.NewSize(float32(redWidth), size.Height))
v.optimumBar.Move(fyne.NewPos(float32(greenSize), 0)) v.peakBar.Move(fyne.NewPos(float32(greenWidth+amberWidth), 0))
v.peakBar.Resize(fyne.NewSize(float32(redSize), size.Height))
v.peakBar.Move(fyne.NewPos(float32(greenSize+amberSize), 0))
} else {
v.bar.Resize(fyne.NewSize(size.Width, float32(greenSize)))
v.bar.Move(fyne.NewPos(0, size.Height-float32(greenSize)))
v.optimumBar.Resize(fyne.NewSize(size.Width, float32(amberSize)))
v.optimumBar.Move(fyne.NewPos(0, size.Height-float32(greenSize+amberSize)))
v.peakBar.Resize(fyne.NewSize(size.Width, float32(redSize)))
v.peakBar.Move(fyne.NewPos(0, size.Height-float32(greenSize+amberSize+redSize)))
}
} }
// Layout the components of the widget // Layout the components of the widget
@ -155,20 +128,12 @@ func (v *vuRenderer) Objects() []fyne.CanvasObject {
func (v *vuRenderer) Destroy() { func (v *vuRenderer) Destroy() {
} }
type VUMeterDirectionEnum uint32
const (
VUMeterVertical = iota
VUMeterHorizontal
)
// vuMeter widget is a kind of custom progressbar but has "zones" of different color for peaking. // vuMeter widget is a kind of custom progressbar but has "zones" of different color for peaking.
type vuMeter struct { type vuMeter struct {
widget.BaseWidget widget.BaseWidget
TextFormatter func() string TextFormatter func() string
Value, Min, Max, Value, Min, Max,
OptimumValueMin, OptimumValueMax float64 OptimumValueMin, OptimumValueMax float64
VUMeterDirection VUMeterDirectionEnum
binder basicBinder binder basicBinder
} }
@ -249,7 +214,6 @@ func NewVUMeter(value float64) *vuMeter {
meter.OptimumValueMin = 75 meter.OptimumValueMin = 75
meter.OptimumValueMax = 85 meter.OptimumValueMax = 85
meter.ExtendBaseWidget(meter) meter.ExtendBaseWidget(meter)
meter.VUMeterDirection = VUMeterHorizontal
return meter return meter
} }