ui/app: introduce Insets for system decoration insets

Insets is like image.Rectangle, but with properly named fields
and ui.Value instead of raw ints to make use with the layout
package easier.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2019-07-11 14:30:09 +02:00
parent 9d8d5da106
commit 478d56102a
3 changed files with 21 additions and 11 deletions
+8 -4
View File
@@ -19,16 +19,20 @@ type Event interface {
type DrawEvent struct {
Config Config
Size image.Point
// Insets is the window space taken up by
// system decoration such as translucent
// system bars and software keyboards.
Insets image.Rectangle
Insets Insets
// Whether this draw is system generated
// and needs a complete frame before
// proceeding.
sync bool
}
// Insets is the space taken up by
// system decoration such as translucent
// system bars and software keyboards.
type Insets struct {
Top, Bottom, Left, Right ui.Value
}
type StageEvent struct {
Stage Stage
}
+7 -4
View File
@@ -24,6 +24,7 @@ import (
"time"
"unsafe"
"gioui.org/ui"
"gioui.org/ui/f32"
"gioui.org/ui/key"
"gioui.org/ui/pointer"
@@ -36,7 +37,7 @@ type window struct {
dpi int
fontScale float32
insets image.Rectangle
insets Insets
stage Stage
started bool
@@ -200,9 +201,11 @@ func onFocusChange(env *C.JNIEnv, class C.jclass, view C.jlong, focus C.jboolean
//export onWindowInsets
func onWindowInsets(env *C.JNIEnv, class C.jclass, view C.jlong, top, right, bottom, left C.jint) {
w := views[view]
w.insets = image.Rectangle{
Min: image.Point{X: int(left), Y: int(top)},
Max: image.Point{X: int(right), Y: int(bottom)},
w.insets = Insets{
Top: ui.Px(float32(top)),
Right: ui.Px(float32(right)),
Bottom: ui.Px(float32(bottom)),
Left: ui.Px(float32(left)),
}
if w.stage >= StageRunning {
w.draw(true)
+6 -3
View File
@@ -22,6 +22,7 @@ import (
"sync/atomic"
"time"
"gioui.org/ui"
"gioui.org/ui/f32"
"gioui.org/ui/key"
"gioui.org/ui/pointer"
@@ -82,9 +83,11 @@ func onDraw(view C.CFTypeRef, dpi, sdpi, width, height C.CGFloat, sync C.int, to
X: int(width + .5),
Y: int(height + .5),
},
Insets: image.Rectangle{
Min: image.Point{X: int(left + .5), Y: int(top + .5)},
Max: image.Point{X: int(right + .5), Y: int(bottom + .5)},
Insets: Insets{
Top: ui.Px(float32(top)),
Right: ui.Px(float32(right)),
Bottom: ui.Px(float32(bottom)),
Left: ui.Px(float32(left)),
},
Config: Config{
pxPerDp: float32(dpi) * inchPrDp,