forked from joejulian/gio
86b231ca28
Finding the maximum or adding Values are particularly for adjusting margins for the safe area insets returned in app.UpdateEvent. Signed-off-by: Elias Naur <mail@eliasnaur.com>
97 lines
1.7 KiB
Go
97 lines
1.7 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
package ui
|
|
|
|
import "fmt"
|
|
|
|
// Value is a value with a unit.
|
|
type Value struct {
|
|
V float32
|
|
U Unit
|
|
}
|
|
|
|
// Unit represents a unit for a Value.
|
|
type Unit uint8
|
|
|
|
const (
|
|
// UnitPx represent device pixels in the resolution of
|
|
// the underlying display.
|
|
UnitPx Unit = iota
|
|
// UnitDp represents device independent pixels. 1 dp will
|
|
// have the same apparent size across platforms and
|
|
// display resolutions.
|
|
UnitDp
|
|
// UnitSp is like UnitDp but for font sizes.
|
|
UnitSp
|
|
)
|
|
|
|
// Px returns the Value for v device pixels.
|
|
func Px(v float32) Value {
|
|
return Value{V: v, U: UnitPx}
|
|
}
|
|
|
|
// Px returns the Value for v device independent
|
|
// pixels.
|
|
func Dp(v float32) Value {
|
|
return Value{V: v, U: UnitDp}
|
|
}
|
|
|
|
// Sp returns the Value for v scaled dps.
|
|
func Sp(v float32) Value {
|
|
return Value{V: v, U: UnitSp}
|
|
}
|
|
|
|
func (v Value) String() string {
|
|
return fmt.Sprintf("%g%s", v.V, v.U)
|
|
}
|
|
|
|
func (u Unit) String() string {
|
|
switch u {
|
|
case UnitPx:
|
|
return "px"
|
|
case UnitDp:
|
|
return "dp"
|
|
case UnitSp:
|
|
return "sp"
|
|
default:
|
|
panic("unknown unit")
|
|
}
|
|
}
|
|
|
|
// Add a list of Values.
|
|
func Add(c Config, values ...Value) Value {
|
|
var sum Value
|
|
for _, v := range values {
|
|
sum, v = compatible(c, sum, v)
|
|
sum.V += v.V
|
|
}
|
|
return sum
|
|
}
|
|
|
|
// Max returns the maximum of a list of Values.
|
|
func Max(c Config, values ...Value) Value {
|
|
var max Value
|
|
for _, v := range values {
|
|
max, v = compatible(c, max, v)
|
|
if v.V > max.V {
|
|
max.V = v.V
|
|
}
|
|
}
|
|
return max
|
|
}
|
|
|
|
func compatible(c Config, v1, v2 Value) (Value, Value) {
|
|
if v1.U == v2.U {
|
|
return v1, v2
|
|
}
|
|
if v1.V == 0 {
|
|
v1.U = v2.U
|
|
return v1, v2
|
|
}
|
|
if v2.V == 0 {
|
|
v2.U = v1.U
|
|
return v1, v2
|
|
}
|
|
return Px(float32(c.Px(v1))), Px(float32(c.Px(v2)))
|
|
}
|