Fixed transparent boxes not redrawing sometimes
This commit is contained in:
		
							parent
							
								
									0c0b8ae475
								
							
						
					
					
						commit
						db2ed06daf
					
				| @ -1,6 +1,7 @@ | ||||
| package x | ||||
| 
 | ||||
| import "image" | ||||
| import "image/color" | ||||
| import "git.tebibyte.media/tomo/tomo" | ||||
| import "git.tebibyte.media/tomo/tomo/event" | ||||
| import "git.tebibyte.media/tomo/tomo/canvas" | ||||
| @ -12,7 +13,7 @@ type containerBox struct { | ||||
| 	hAlign, vAlign       tomo.Align | ||||
| 	contentBounds image.Rectangle | ||||
| 	scroll        image.Point | ||||
| 	 | ||||
| 
 | ||||
| 	gap             image.Point | ||||
| 	children        []tomo.Box | ||||
| 	layout          tomo.Layout | ||||
| @ -29,6 +30,16 @@ func (backend *Backend) NewContainerBox() tomo.ContainerBox { | ||||
| 	return this | ||||
| } | ||||
| 
 | ||||
| func (this *containerBox) SetColor (c color.Color) { | ||||
| 	this.box.SetColor(c) | ||||
| 	this.invalidateTransparentChildren() | ||||
| } | ||||
| 
 | ||||
| func (this *containerBox) SetTexture (texture canvas.Texture) { | ||||
| 	this.box.SetTexture(texture) | ||||
| 	this.invalidateTransparentChildren() | ||||
| } | ||||
| 
 | ||||
| func (this *containerBox) SetOverflow (horizontal, vertical bool) { | ||||
| 	if this.hOverflow == horizontal && this.vOverflow == vertical { return } | ||||
| 	this.hOverflow = horizontal | ||||
| @ -71,7 +82,7 @@ func (this *containerBox) SetGap (gap image.Point) { | ||||
| func (this *containerBox) Add (child tomo.Object) { | ||||
| 	box := assertAnyBox(child.GetBox()) | ||||
| 	if indexOf(this.children, tomo.Box(box)) > -1 { return } | ||||
| 	 | ||||
| 
 | ||||
| 	box.setParent(this) | ||||
| 	box.flushActionQueue() | ||||
| 	this.children = append(this.children, box) | ||||
| @ -83,7 +94,7 @@ func (this *containerBox) Delete (child tomo.Object) { | ||||
| 	box := assertAnyBox(child.GetBox()) | ||||
| 	index := indexOf(this.children, tomo.Box(box)) | ||||
| 	if index < 0 { return } | ||||
| 	 | ||||
| 
 | ||||
| 	box.setParent(nil) | ||||
| 	this.children = remove(this.children, index) | ||||
| 	this.invalidateLayout() | ||||
| @ -97,7 +108,7 @@ func (this *containerBox) Insert (child, before tomo.Object) { | ||||
| 	beforeBox := assertAnyBox(before.GetBox()) | ||||
| 	index     := indexOf(this.children, tomo.Box(beforeBox)) | ||||
| 	if index < 0 { return } | ||||
| 	 | ||||
| 
 | ||||
| 	box.setParent(this) | ||||
| 	this.children = insert(this.children, index, tomo.Box(box)) | ||||
| 	this.invalidateLayout() | ||||
| @ -155,13 +166,24 @@ func (this *containerBox) drawBackgroundPart (can canvas.Canvas) { | ||||
| 	pen := can.Pen() | ||||
| 	pen.Fill(this.color) | ||||
| 	pen.Texture(this.texture) | ||||
| 	 | ||||
| 
 | ||||
| 	if this.transparent() && this.parent != nil { | ||||
| 		this.parent.drawBackgroundPart(can) | ||||
| 	} | ||||
| 	pen.Rectangle(this.innerClippingBounds) | ||||
| } | ||||
| 
 | ||||
| func (this *containerBox) invalidateTransparentChildren () { | ||||
| 	window := this.window() | ||||
| 	if this.window == nil { return } | ||||
| 	for _, box := range this.children { | ||||
| 		box := assertAnyBox(box) | ||||
| 		if box.transparent() { | ||||
| 			window.invalidateDraw(box) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (this *containerBox) flushActionQueue () { | ||||
| 	for _, box := range this.children { | ||||
| 		box.(anyBox).flushActionQueue() | ||||
| @ -251,11 +273,11 @@ func (this *containerBox) propagate (callback func (anyBox) bool) bool { | ||||
| 
 | ||||
| func (this *containerBox) propagateAlt (callback func (anyBox) bool) bool { | ||||
| 	if !callback(this) { return false} | ||||
| 	 | ||||
| 
 | ||||
| 	for _, box := range this.children { | ||||
| 		box := box.(anyBox) | ||||
| 		if !box.propagateAlt(callback) { return false } | ||||
| 	} | ||||
| 	 | ||||
| 
 | ||||
| 	return true | ||||
| } | ||||
|  | ||||
							
								
								
									
										13
									
								
								system.go
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								system.go
									
									
									
									
									
								
							| @ -42,7 +42,7 @@ type parent interface { | ||||
| type anyBox interface { | ||||
| 	tomo.Box | ||||
| 	canvas.Drawer | ||||
| 	 | ||||
| 
 | ||||
| 	doDraw           () | ||||
| 	doLayout         () | ||||
| 	doMinimumSize    () | ||||
| @ -52,6 +52,7 @@ type anyBox interface { | ||||
| 	recursiveRedo    () | ||||
| 	canBeFocused     () bool | ||||
| 	boxUnder         (image.Point) anyBox | ||||
| 	transparent      () bool | ||||
| 
 | ||||
| 	propagate    (func (anyBox) bool) bool | ||||
| 	propagateAlt (func (anyBox) bool) bool | ||||
| @ -122,10 +123,10 @@ func (window *window) invalidateLayout (box anyBox) { | ||||
| 
 | ||||
| func (window *window) focus (box anyBox) { | ||||
| 	if window.focused == box { return } | ||||
| 	 | ||||
| 
 | ||||
| 	previous := window.focused | ||||
| 	window.focused = box | ||||
| 	 | ||||
| 
 | ||||
| 	if previous != nil { | ||||
| 		previous.handleFocusLeave() | ||||
| 	} | ||||
| @ -136,10 +137,10 @@ func (window *window) focus (box anyBox) { | ||||
| 
 | ||||
| func (window *window) hover (box anyBox) { | ||||
| 	if window.hovered == box { return } | ||||
| 	 | ||||
| 
 | ||||
| 	previous := window.hovered | ||||
| 	window.hovered = box | ||||
| 	 | ||||
| 
 | ||||
| 	if previous != nil { | ||||
| 		previous.handleMouseLeave() | ||||
| 	} | ||||
| @ -213,7 +214,7 @@ func (window *window) afterEvent () { | ||||
| 		childBounds = childBounds.Sub(childBounds.Min) | ||||
| 		window.root.SetBounds(childBounds) | ||||
| 
 | ||||
| 		// full relayout/redraw		 | ||||
| 		// full relayout/redraw | ||||
| 		if window.root != nil { | ||||
| 			window.root.recursiveRedo() | ||||
| 		} | ||||
|  | ||||
		Reference in New Issue
	
	Block a user