Add padding and margin layouts
This commit is contained in:
		| @@ -43,7 +43,9 @@ func (c Canvas) Build( | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	decorator = applyDecorators(e, cnv) | 	decorator = applyPadding(e, cnv) | ||||||
|  | 	decorator = applyDecorators(e, decorator) | ||||||
|  | 	decorator = applyMargins(e, decorator) | ||||||
|  |  | ||||||
| 	if e.Hidden { | 	if e.Hidden { | ||||||
| 		decorator.Hide() | 		decorator.Hide() | ||||||
|   | |||||||
| @@ -67,7 +67,9 @@ func (cnt Container) Build( | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	decorator = applyDecorators(e, cont) | 	decorator = applyPadding(e, cont) | ||||||
|  | 	decorator = applyDecorators(e, decorator) | ||||||
|  | 	decorator = applyMargins(e, decorator) | ||||||
|  |  | ||||||
| 	if e.Hidden { | 	if e.Hidden { | ||||||
| 		decorator.Hide() | 		decorator.Hide() | ||||||
|   | |||||||
| @@ -25,6 +25,28 @@ type Color struct { | |||||||
| 	Alpha uint8 `yaml:"alpha"` | 	Alpha uint8 `yaml:"alpha"` | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type Margins struct { | ||||||
|  | 	Top    float32 `yaml:"top"` | ||||||
|  | 	Bottom float32 `yaml:"bottom"` | ||||||
|  | 	Left   float32 `yaml:"left"` | ||||||
|  | 	Right  float32 `yaml:"right"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *Margins) HasMargins() bool { | ||||||
|  | 	return m.Top > 0 || m.Bottom > 0 || m.Left > 0 || m.Right > 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type Padding struct { | ||||||
|  | 	Top    float32 `yaml:"top"` | ||||||
|  | 	Bottom float32 `yaml:"bottom"` | ||||||
|  | 	Left   float32 `yaml:"left"` | ||||||
|  | 	Right  float32 `yaml:"right"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (p *Padding) HasPadding() bool { | ||||||
|  | 	return p.Top > 0 || p.Bottom > 0 || p.Left > 0 || p.Right > 0 | ||||||
|  | } | ||||||
|  |  | ||||||
| // Element represents the yaml description of a ui element | // Element represents the yaml description of a ui element | ||||||
| type Element struct { | type Element struct { | ||||||
| 	ID string `yaml:"id"` | 	ID string `yaml:"id"` | ||||||
| @@ -34,6 +56,9 @@ type Element struct { | |||||||
| 	Widget    Widget    `yaml:"widget"` | 	Widget    Widget    `yaml:"widget"` | ||||||
| 	Canvas    Canvas    `yaml:"canvas"` | 	Canvas    Canvas    `yaml:"canvas"` | ||||||
|  |  | ||||||
|  | 	Padding Padding `yaml:"padding"` | ||||||
|  | 	Margins Margins `yaml:"margins"` | ||||||
|  |  | ||||||
| 	// Border Layout Elements | 	// Border Layout Elements | ||||||
| 	Top    *Element   `yaml:"top"` | 	Top    *Element   `yaml:"top"` | ||||||
| 	Bottom *Element   `yaml:"bottom"` | 	Bottom *Element   `yaml:"bottom"` | ||||||
|   | |||||||
| @@ -112,7 +112,9 @@ func (l Layout) Build( | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	decorator = applyDecorators(e, lay) | 	decorator = applyPadding(e, lay) | ||||||
|  | 	decorator = applyDecorators(e, decorator) | ||||||
|  | 	decorator = applyMargins(e, decorator) | ||||||
|  |  | ||||||
| 	if e.Hidden { | 	if e.Hidden { | ||||||
| 		decorator.Hide() | 		decorator.Hide() | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								screen/margin.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								screen/margin.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | package screen | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bitbucket.org/hevanto/ui/uilayout" | ||||||
|  | 	"fyne.io/fyne/v2" | ||||||
|  | 	"fyne.io/fyne/v2/container" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func applyMargins( | ||||||
|  | 	e *Element, | ||||||
|  | 	obj fyne.CanvasObject, | ||||||
|  | ) ( | ||||||
|  | 	margin fyne.CanvasObject, | ||||||
|  | ) { | ||||||
|  | 	margin = obj | ||||||
|  | 	if e.Margins.HasMargins() { | ||||||
|  | 		margin = container.New(uilayout.NewMargin( | ||||||
|  | 			e.Margins.Top, | ||||||
|  | 			e.Margins.Bottom, | ||||||
|  | 			e.Margins.Left, | ||||||
|  | 			e.Margins.Right, | ||||||
|  | 		), obj) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								screen/padding.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								screen/padding.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | package screen | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bitbucket.org/hevanto/ui/uilayout" | ||||||
|  | 	"fyne.io/fyne/v2" | ||||||
|  | 	"fyne.io/fyne/v2/container" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func applyPadding( | ||||||
|  | 	e *Element, | ||||||
|  | 	obj fyne.CanvasObject, | ||||||
|  | ) ( | ||||||
|  | 	padding fyne.CanvasObject, | ||||||
|  | ) { | ||||||
|  | 	padding = obj | ||||||
|  | 	if e.Padding.HasPadding() { | ||||||
|  | 		padding = container.New(uilayout.NewPadding( | ||||||
|  | 			e.Padding.Top, | ||||||
|  | 			e.Padding.Bottom, | ||||||
|  | 			e.Padding.Left, | ||||||
|  | 			e.Padding.Right, | ||||||
|  | 		), obj) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
| @@ -255,7 +255,9 @@ func (w Widget) Build( | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	decorator = applyDecorators(e, widget) | 	decorator = applyPadding(e, widget) | ||||||
|  | 	decorator = applyDecorators(e, decorator) | ||||||
|  | 	decorator = applyMargins(e, decorator) | ||||||
|  |  | ||||||
| 	if e.Hidden { | 	if e.Hidden { | ||||||
| 		decorator.Hide() | 		decorator.Hide() | ||||||
|   | |||||||
							
								
								
									
										45
									
								
								uilayout/margin.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								uilayout/margin.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | package uilayout | ||||||
|  |  | ||||||
|  | import "fyne.io/fyne/v2" | ||||||
|  |  | ||||||
|  | type Margin struct { | ||||||
|  | 	top    float32 | ||||||
|  | 	bottom float32 | ||||||
|  | 	left   float32 | ||||||
|  | 	right  float32 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func NewMargin( | ||||||
|  | 	top, bottom, left, right float32, | ||||||
|  | ) *Margin { | ||||||
|  | 	return &Margin{ | ||||||
|  | 		top:    top, | ||||||
|  | 		bottom: bottom, | ||||||
|  | 		left:   left, | ||||||
|  | 		right:  right, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *Margin) MinSize(objects []fyne.CanvasObject) fyne.Size { | ||||||
|  | 	w := m.left + m.right | ||||||
|  | 	h := m.top + m.bottom | ||||||
|  | 	if len(objects) > 0 { | ||||||
|  | 		w += objects[0].MinSize().Width | ||||||
|  | 		h += objects[0].MinSize().Height | ||||||
|  | 	} | ||||||
|  | 	return fyne.NewSize(w, h) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (m *Margin) Layout( | ||||||
|  | 	objects []fyne.CanvasObject, | ||||||
|  | 	containerSize fyne.Size, | ||||||
|  | ) { | ||||||
|  | 	pos := fyne.NewPos(m.left, m.top) | ||||||
|  | 	if len(objects) > 0 { | ||||||
|  | 		o := objects[0] | ||||||
|  | 		size := containerSize.Subtract( | ||||||
|  | 			fyne.NewSize(m.left+m.right, m.top+m.bottom)) | ||||||
|  | 		o.Resize(size) | ||||||
|  | 		o.Move(pos) | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										45
									
								
								uilayout/padding.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								uilayout/padding.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | package uilayout | ||||||
|  |  | ||||||
|  | import "fyne.io/fyne/v2" | ||||||
|  |  | ||||||
|  | type Padding struct { | ||||||
|  | 	top    float32 | ||||||
|  | 	bottom float32 | ||||||
|  | 	left   float32 | ||||||
|  | 	right  float32 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func NewPadding( | ||||||
|  | 	top, bottom, left, right float32, | ||||||
|  | ) *Padding { | ||||||
|  | 	return &Padding{ | ||||||
|  | 		top:    top, | ||||||
|  | 		bottom: bottom, | ||||||
|  | 		left:   left, | ||||||
|  | 		right:  right, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (p *Padding) MinSize(objects []fyne.CanvasObject) fyne.Size { | ||||||
|  | 	w := p.left + p.right | ||||||
|  | 	h := p.top + p.bottom | ||||||
|  | 	if len(objects) > 0 { | ||||||
|  | 		w += objects[0].MinSize().Width | ||||||
|  | 		h += objects[0].MinSize().Height | ||||||
|  | 	} | ||||||
|  | 	return fyne.NewSize(w, h) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (p *Padding) Layout( | ||||||
|  | 	objects []fyne.CanvasObject, | ||||||
|  | 	containerSize fyne.Size, | ||||||
|  | ) { | ||||||
|  | 	pos := fyne.NewPos(p.left, p.top) | ||||||
|  | 	if len(objects) > 0 { | ||||||
|  | 		o := objects[0] | ||||||
|  | 		size := containerSize.Subtract( | ||||||
|  | 			fyne.NewSize(p.left+p.right, p.top+p.bottom)) | ||||||
|  | 		o.Resize(size) | ||||||
|  | 		o.Move(pos) | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Maarten Heremans
					Maarten Heremans