shithub: mycel

Download patch

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)
-}