ref: 7c284bdddd481c95525f88e1a989bd512088b4a2
parent: edf21cfe46bc7fa80fc02991cfcb821e2274c3c3
author: Philip Silva <philip.silva@protonmail.com>
date: Fri Jan 7 18:51:38 EST 2022
use duit.Place for absolute positioning draw caching through duitx.Scroll and no more freezes then
--- a/browser/browser.go
+++ b/browser/browser.go
@@ -903,7 +903,7 @@
n.Attr = append(n.Attr, newAttr)
}
-func placeFunc(name string, place *duitx.Place) func(self *duit.Kid, sizeAvail image.Point) {
+func placeFunc(name string, place *duit.Place) func(self *duit.Kid, sizeAvail image.Point) {
return func(self *duit.Kid, sizeAvail image.Point) {
for i, kid := range place.Kids {
el := kid.UI.(*Element)
@@ -959,7 +959,7 @@
for _, a := range absolutes {
uis = append(uis, a)
}
- pl := &duitx.Place{
+ pl := &duit.Place{
Kids: duit.NewKids(uis...),
Background: bg,
}
@@ -1437,7 +1437,7 @@
case *duit.Edit:
case *duit.Button:
case *duit.List:
- case *duitx.Place:
+ case *duit.Place:
for _, kid := range v.Kids {
traverseTree(r+1, kid.UI, f)
}
--- a/browser/duitx/place.go
+++ /dev/null
@@ -1,184 +1,0 @@
-package duitx
-
-// Original code from github.com/mjl-/duit
-//
-// Copyright 2018 Mechiel Lukkien mechiel@ueber.net
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this
-// software and associated documentation files (the "Software"), to deal in the Software
-// without restriction, including without limitation the rights to use, copy, modify, merge,
-// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
-// to whom the Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or
-// substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-import (
- "image"
-
- "9fans.net/go/draw"
- "github.com/mjl-/duit"
- "github.com/psilva261/opossum/logger"
-)
-
-// Place contains other UIs it can position absolute, possibly on top of each other.
-type Place struct {
- // Place is called during layout. It must configure Kids, and set self.R, based on sizeAvail.
- Place func(self *duit.Kid, sizeAvail image.Point) `json:"-"`
- Kids []*duit.Kid // Kids to draw, set by the Place function.
- Background *draw.Image `json:"-"` // For background color.
-
- kidsReversed []*duit.Kid
- size image.Point
- imgs []*draw.Image
- force bool
-}
-
-var _ duit.UI = &Place{}
-
-func (ui *Place) ensure() {
- if len(ui.kidsReversed) == len(ui.Kids) {
- return
- }
- ui.kidsReversed = make([]*duit.Kid, len(ui.Kids))
- for i, k := range ui.Kids {
- ui.kidsReversed[len(ui.Kids)-1-i] = k
- }
-}
-
-func (ui *Place) Layout(dui *duit.DUI, self *duit.Kid, sizeAvail image.Point, force bool) {
- ui.ensure()
- debugLayout(dui, self)
-
- ui.Place(self, sizeAvail)
-}
-
-func (ui *Place) Draw(dui *duit.DUI, self *duit.Kid, img *draw.Image, orig image.Point, m draw.Mouse, force bool) {
- if self.Draw == duit.Clean || ui == nil || len(ui.Kids) == 0 {
- return
- }
- self.Draw = duit.Clean
- if ui.imgs == nil || ui.Kids[0].R.Size() != ui.imgs[0].R.Size() {
- var err error
- if ui.imgs != nil {
- for _, i := range ui.imgs {
- i.Free()
- }
- ui.imgs = nil
- }
- if ui.Kids[0].R.Dx() == 0 || ui.Kids[0].R.Dy() == 0 {
- return
- }
- ui.imgs = make([]*draw.Image, len(ui.Kids))
- for i, k := range ui.Kids {
- ui.imgs[i], err = dui.Display.AllocImage(k.R, draw.ARGB32, false, 0x00000000)
- if err != nil {
- log.Errorf("allocimage: %v", err)
- return
- }
- k.Draw = duit.Dirty
- }
- self.Draw = duit.DirtyKid
- }
- if self.Draw == duit.DirtyKid || ui.force {
- kidsDraw(dui, self, ui.Kids, ui.size, ui.Background, ui.imgs, image.ZP, m, false)
- self.Draw = duit.Clean
- ui.force = false
- }
- for _, i := range ui.imgs {
- if i != nil {
- img.Draw(i.R.Add(orig), i, nil, image.ZP)
- }
- }
-}
-
-func kidsDraw(dui *duit.DUI, self *duit.Kid, kids []*duit.Kid, uiSize image.Point, bg *draw.Image, imgs []*draw.Image, orig image.Point, m draw.Mouse, force bool) {
- debugDraw(dui, self)
-
- force = force || self.Draw == duit.Dirty
- if force {
- self.Draw = duit.Dirty
- }
-
- if bg == nil {
- bg = dui.Background
- }
- if force {
- // TODO: consider resetting other backgrounds also
- imgs[0].Draw(rect(uiSize).Add(orig), bg, nil, image.ZP)
- }
- for i, k := range kids {
- if !force && k.Draw == duit.Clean {
- continue
- }
- if !force && k.Draw == duit.Dirty {
- imgs[i].Draw(k.R.Add(orig), bg, nil, image.ZP)
- }
-
- mm := m
- mm.Point = mm.Point.Sub(k.R.Min)
- if force {
- k.Draw = duit.Dirty
- }
- k.UI.Draw(dui, k, imgs[i], orig.Add(k.R.Min), mm, force)
- k.Draw = duit.Clean
- }
- self.Draw = duit.Clean
-}
-
-func (ui *Place) result(dui *duit.DUI, self *duit.Kid, r *duit.Result) {
- relayout := false
- redraw := false
-
- for _, k := range ui.Kids {
- if k.Layout != duit.Clean {
- relayout = true
- } else if k.Draw != duit.Clean {
- redraw = true
- }
- }
- if relayout {
- self.Layout = duit.DirtyKid
- self.Draw = duit.DirtyKid
- ui.force = ui.force || r.Consumed
- } else if redraw {
- self.Draw = duit.DirtyKid
- ui.force = ui.force || r.Consumed
- }
-}
-
-func (ui *Place) Mouse(dui *duit.DUI, self *duit.Kid, m draw.Mouse, origM draw.Mouse, orig image.Point) (r duit.Result) {
- r = duit.KidsMouse(dui, self, ui.kidsReversed, m, origM, orig)
- ui.result(dui, self, &r)
- return
-}
-
-func (ui *Place) Key(dui *duit.DUI, self *duit.Kid, k rune, m draw.Mouse, orig image.Point) (r duit.Result) {
- r = duit.KidsKey(dui, self, ui.kidsReversed, k, m, orig)
- ui.result(dui, self, &r)
- return
-}
-
-func (ui *Place) FirstFocus(dui *duit.DUI, self *duit.Kid) (warp *image.Point) {
- return duit.KidsFirstFocus(dui, self, ui.Kids)
-}
-
-func (ui *Place) Focus(dui *duit.DUI, self *duit.Kid, o duit.UI) (warp *image.Point) {
- return duit.KidsFocus(dui, self, ui.Kids, o)
-}
-
-func (ui *Place) Mark(self *duit.Kid, o duit.UI, forLayout bool) (marked bool) {
- return duit.KidsMark(self, ui.Kids, o, forLayout)
-}
-
-func (ui *Place) Print(self *duit.Kid, indent int) {
- duit.PrintUI("Place", self, indent)
- duit.KidsPrint(ui.Kids, indent+1)
-}