i forgor again
This commit is contained in:
		
							parent
							
								
									34ca98f865
								
							
						
					
					
						commit
						a3ea1f64a3
					
				
							
								
								
									
										23
									
								
								box.go
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								box.go
									
									
									
									
									
								
							@ -74,12 +74,19 @@ func (this *box) MinimumSize () image.Point {
 | 
			
		||||
	return this.minSize
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *box) innerClippingBounds () image.Rectangle {
 | 
			
		||||
	innerBounds := this.bounds
 | 
			
		||||
func (this *box) borderSum () tomo.Inset {
 | 
			
		||||
	sum := tomo.Inset { }
 | 
			
		||||
	for _, border := range this.border {
 | 
			
		||||
		innerBounds = border.Width.Apply(innerBounds)
 | 
			
		||||
		sum[0] += border.Width[0]
 | 
			
		||||
		sum[1] += border.Width[1]
 | 
			
		||||
		sum[2] += border.Width[2]
 | 
			
		||||
		sum[3] += border.Width[3]
 | 
			
		||||
	}
 | 
			
		||||
	return innerBounds
 | 
			
		||||
	return sum
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *box) innerClippingBounds () image.Rectangle {
 | 
			
		||||
	return this.borderSum().Apply(this.bounds)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *box) SetBounds (bounds image.Rectangle) {
 | 
			
		||||
@ -97,6 +104,7 @@ func (this *box) SetColor (c color.Color) {
 | 
			
		||||
func (this *box) SetBorder (border ...tomo.Border) {
 | 
			
		||||
	this.border = border
 | 
			
		||||
	this.invalidateLayout()
 | 
			
		||||
	this.recalculateMinimumSize()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *box) SetMinimumSize (size image.Point) {
 | 
			
		||||
@ -112,6 +120,7 @@ func (this *box) SetPadding (padding tomo.Inset) {
 | 
			
		||||
	if this.padding == padding { return }
 | 
			
		||||
	this.padding = padding
 | 
			
		||||
	this.invalidateLayout()
 | 
			
		||||
	this.recalculateMinimumSize()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *box) SetDNDData (dat data.Data) {
 | 
			
		||||
@ -263,3 +272,9 @@ func (this *box) invalidateDraw () {
 | 
			
		||||
	if this.parent == nil || this.parent.window() == nil { return }
 | 
			
		||||
	this.parent.window().invalidateDraw(this.outer)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *box) recalculateMinimumSize () {
 | 
			
		||||
	if this.outer != this {
 | 
			
		||||
		this.outer.recalculateMinimumSize()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,7 @@ type containerBox struct {
 | 
			
		||||
	*box
 | 
			
		||||
 | 
			
		||||
	hOverflow, vOverflow bool
 | 
			
		||||
	hAlign, vAlign       tomo.Align
 | 
			
		||||
	contentBounds image.Rectangle
 | 
			
		||||
	scroll        image.Point
 | 
			
		||||
	
 | 
			
		||||
@ -41,6 +42,13 @@ func (this *containerBox) SetOverflow (horizontal, vertical bool) {
 | 
			
		||||
	this.invalidateLayout()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *containerBox) SetAlign (x, y tomo.Align) {
 | 
			
		||||
	if this.hAlign == x && this.vAlign == y { return }
 | 
			
		||||
	this.hAlign = x
 | 
			
		||||
	this.vAlign = y
 | 
			
		||||
	this.invalidateLayout()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *containerBox) ContentBounds () image.Rectangle {
 | 
			
		||||
	return this.contentBounds
 | 
			
		||||
}
 | 
			
		||||
@ -176,6 +184,9 @@ func (this *containerBox) recalculateMinimumSize () {
 | 
			
		||||
	minimum := this.layout.MinimumSize(this.layoutHints(), this.children)
 | 
			
		||||
	minimum.X += this.padding.Horizontal()
 | 
			
		||||
	minimum.Y += this.padding.Vertical()
 | 
			
		||||
	borderSum := this.borderSum()
 | 
			
		||||
	minimum.X += borderSum.Horizontal()
 | 
			
		||||
	minimum.Y += borderSum.Vertical()
 | 
			
		||||
	this.SetMinimumSize(minimum)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							@ -4,7 +4,7 @@ go 1.20
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	git.tebibyte.media/tomo/ggfx v0.4.0
 | 
			
		||||
	git.tebibyte.media/tomo/tomo v0.12.0
 | 
			
		||||
	git.tebibyte.media/tomo/tomo v0.14.0
 | 
			
		||||
	git.tebibyte.media/tomo/typeset v0.3.0
 | 
			
		||||
	git.tebibyte.media/tomo/xgbkb v1.0.1
 | 
			
		||||
	github.com/jezek/xgb v1.1.0
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							@ -5,6 +5,10 @@ git.tebibyte.media/tomo/tomo v0.11.0 h1:Gh9c/6rDqvhxt/DaNQHYNUfdRmSQTuz9T3F+pb5W
 | 
			
		||||
git.tebibyte.media/tomo/tomo v0.11.0/go.mod h1:lTwjpiHbP4UN/kFw+6FwhG600B+PMKVtMOr7wpd5IUY=
 | 
			
		||||
git.tebibyte.media/tomo/tomo v0.12.0 h1:MwcudNzo7hSeiEWGSLt6lxJGK3itxTSgdggaZoHZLJo=
 | 
			
		||||
git.tebibyte.media/tomo/tomo v0.12.0/go.mod h1:lTwjpiHbP4UN/kFw+6FwhG600B+PMKVtMOr7wpd5IUY=
 | 
			
		||||
git.tebibyte.media/tomo/tomo v0.13.0 h1:xQvEia1vDUfq3QkpU3De72z53ON+y8I6HMP8TDtcS2k=
 | 
			
		||||
git.tebibyte.media/tomo/tomo v0.13.0/go.mod h1:lTwjpiHbP4UN/kFw+6FwhG600B+PMKVtMOr7wpd5IUY=
 | 
			
		||||
git.tebibyte.media/tomo/tomo v0.14.0 h1:cMCOLjBEH9OtF+CODn0XFWa9liE0keMnLWs3t66I+Zw=
 | 
			
		||||
git.tebibyte.media/tomo/tomo v0.14.0/go.mod h1:lTwjpiHbP4UN/kFw+6FwhG600B+PMKVtMOr7wpd5IUY=
 | 
			
		||||
git.tebibyte.media/tomo/typeset v0.1.0 h1:ZLwQzy51vUskjg1nB4Emjag8VXn3ki2jEkE19kwVQ4c=
 | 
			
		||||
git.tebibyte.media/tomo/typeset v0.1.0/go.mod h1:PwDpSdBF3l/EzoIsa2ME7QffVVajnTHZN6l3MHEGe1g=
 | 
			
		||||
git.tebibyte.media/tomo/typeset v0.2.0 h1:7DcnB0sW12eL+MxkEMv99eVG2IQxsZHDDK6pz6VE1O8=
 | 
			
		||||
 | 
			
		||||
@ -43,6 +43,7 @@ type anyBox interface {
 | 
			
		||||
	doLayout      ()
 | 
			
		||||
	setParent     (parent)
 | 
			
		||||
	recursiveRedo ()
 | 
			
		||||
	recalculateMinimumSize ()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func assertAnyBox (unknown tomo.Box) anyBox {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										52
									
								
								textbox.go
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								textbox.go
									
									
									
									
									
								
							@ -18,6 +18,7 @@ type textBox struct {
 | 
			
		||||
	text      string
 | 
			
		||||
	textColor color.Color
 | 
			
		||||
	face      font.Face
 | 
			
		||||
	wrap      bool
 | 
			
		||||
	hAlign    tomo.Align
 | 
			
		||||
	
 | 
			
		||||
	drawer typeset.Drawer
 | 
			
		||||
@ -31,8 +32,6 @@ func (backend *Backend) NewTextBox() tomo.TextBox {
 | 
			
		||||
	box := &textBox {
 | 
			
		||||
		box:       backend.NewBox().(*box),
 | 
			
		||||
		textColor: color.Black,
 | 
			
		||||
		hOverflow: false,
 | 
			
		||||
		vOverflow: false,
 | 
			
		||||
	}
 | 
			
		||||
	box.box.drawer = box
 | 
			
		||||
	box.outer  = box
 | 
			
		||||
@ -82,11 +81,18 @@ func (this *textBox) SetFace (face font.Face) {
 | 
			
		||||
	this.invalidateLayout()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *textBox) SetHAlign (align tomo.Align) {
 | 
			
		||||
	if this.hAlign == align { return }
 | 
			
		||||
	this.hAlign = align
 | 
			
		||||
func (this *textBox) SetWrap (wrap bool) {
 | 
			
		||||
	if this.wrap == wrap { return }
 | 
			
		||||
	this.wrap = wrap
 | 
			
		||||
	this.recalculateMinimumSize()
 | 
			
		||||
	this.invalidateLayout()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	switch align {
 | 
			
		||||
func (this *textBox) SetAlign (x, y tomo.Align) {
 | 
			
		||||
	if this.hAlign == x { return }
 | 
			
		||||
	this.hAlign = x
 | 
			
		||||
 | 
			
		||||
	switch x {
 | 
			
		||||
	case tomo.AlignStart:  this.drawer.SetAlign(typeset.AlignLeft)
 | 
			
		||||
	case tomo.AlignMiddle: this.drawer.SetAlign(typeset.AlignCenter)
 | 
			
		||||
	case tomo.AlignEnd:    this.drawer.SetAlign(typeset.AlignRight)
 | 
			
		||||
@ -96,10 +102,6 @@ func (this *textBox) SetHAlign (align tomo.Align) {
 | 
			
		||||
	this.invalidateDraw()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *textBox) SetVAlign (align tomo.Align) {
 | 
			
		||||
	// TODO
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *textBox) Draw (can canvas.Canvas) {
 | 
			
		||||
	if can == nil { return }
 | 
			
		||||
	this.drawBorders(can)
 | 
			
		||||
@ -114,8 +116,30 @@ func (this *textBox) Draw (can canvas.Canvas) {
 | 
			
		||||
	this.drawer.Draw(can, this.textColor, offset)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *textBox) normalizedLayoutBoundsSpace () image.Rectangle {
 | 
			
		||||
	bounds := this.drawer.LayoutBoundsSpace()
 | 
			
		||||
	return bounds.Sub(bounds.Min)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *textBox) recalculateMinimumSize () {
 | 
			
		||||
	// TODO calculate minimum size and use SetMinimumSize
 | 
			
		||||
	minimum := image.Pt (
 | 
			
		||||
		this.drawer.Em().Round(),
 | 
			
		||||
		this.drawer.LineHeight().Round())
 | 
			
		||||
 | 
			
		||||
	textSize := this.normalizedLayoutBoundsSpace()
 | 
			
		||||
	if !this.hOverflow && !this.wrap {
 | 
			
		||||
		minimum.X = textSize.Dx()
 | 
			
		||||
	}
 | 
			
		||||
	if !this.vOverflow {
 | 
			
		||||
		 minimum.Y = textSize.Dy()
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	minimum.X += this.padding.Horizontal()
 | 
			
		||||
	minimum.Y += this.padding.Vertical()
 | 
			
		||||
	borderSum := this.borderSum()
 | 
			
		||||
	minimum.X += borderSum.Horizontal()
 | 
			
		||||
	minimum.Y += borderSum.Vertical()
 | 
			
		||||
	this.SetMinimumSize(minimum)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (this *textBox) doLayout () {
 | 
			
		||||
@ -123,7 +147,7 @@ func (this *textBox) doLayout () {
 | 
			
		||||
	previousContentBounds := this.contentBounds
 | 
			
		||||
 | 
			
		||||
	innerBounds := this.InnerBounds()
 | 
			
		||||
	if this.hOverflow {
 | 
			
		||||
	if this.hOverflow && !this.wrap {
 | 
			
		||||
		this.drawer.SetMaxWidth(0)
 | 
			
		||||
	} else {
 | 
			
		||||
		this.drawer.SetMaxWidth(innerBounds.Dx())
 | 
			
		||||
@ -134,9 +158,7 @@ func (this *textBox) doLayout () {
 | 
			
		||||
		this.drawer.SetMaxHeight(innerBounds.Dy())
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	this.contentBounds = this.drawer.LayoutBoundsSpace()
 | 
			
		||||
	this.contentBounds = this.contentBounds.Sub(this.contentBounds.Min)
 | 
			
		||||
	this.contentBounds = this.contentBounds.Sub(this.scroll)
 | 
			
		||||
	this.contentBounds = this.normalizedLayoutBoundsSpace().Sub(this.scroll)
 | 
			
		||||
	
 | 
			
		||||
	if previousContentBounds != this.contentBounds {
 | 
			
		||||
		this.on.contentBoundsChange.Broadcast()
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user