From 050b94dd3afd11885dfc85506c0beb9233dd6fdd Mon Sep 17 00:00:00 2001 From: Maarten Heremans Date: Mon, 17 Jun 2024 15:58:12 +0200 Subject: [PATCH] Add padding and margin layouts --- screen/canvas.go | 4 +++- screen/container.go | 4 +++- screen/element.go | 25 +++++++++++++++++++++++++ screen/layout.go | 4 +++- screen/margin.go | 25 +++++++++++++++++++++++++ screen/padding.go | 25 +++++++++++++++++++++++++ screen/widget.go | 4 +++- uilayout/margin.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ uilayout/padding.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 screen/margin.go create mode 100644 screen/padding.go create mode 100644 uilayout/margin.go create mode 100644 uilayout/padding.go diff --git a/screen/canvas.go b/screen/canvas.go index 4d8954d..c7189df 100644 --- a/screen/canvas.go +++ b/screen/canvas.go @@ -43,7 +43,9 @@ func (c Canvas) Build( return } - decorator = applyDecorators(e, cnv) + decorator = applyPadding(e, cnv) + decorator = applyDecorators(e, decorator) + decorator = applyMargins(e, decorator) if e.Hidden { decorator.Hide() diff --git a/screen/container.go b/screen/container.go index ec2fc7b..1b01520 100644 --- a/screen/container.go +++ b/screen/container.go @@ -67,7 +67,9 @@ func (cnt Container) Build( return } - decorator = applyDecorators(e, cont) + decorator = applyPadding(e, cont) + decorator = applyDecorators(e, decorator) + decorator = applyMargins(e, decorator) if e.Hidden { decorator.Hide() diff --git a/screen/element.go b/screen/element.go index a72c2f6..c0c8cdc 100644 --- a/screen/element.go +++ b/screen/element.go @@ -25,6 +25,28 @@ type Color struct { 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 type Element struct { ID string `yaml:"id"` @@ -34,6 +56,9 @@ type Element struct { Widget Widget `yaml:"widget"` Canvas Canvas `yaml:"canvas"` + Padding Padding `yaml:"padding"` + Margins Margins `yaml:"margins"` + // Border Layout Elements Top *Element `yaml:"top"` Bottom *Element `yaml:"bottom"` diff --git a/screen/layout.go b/screen/layout.go index a1deecd..7b483a8 100644 --- a/screen/layout.go +++ b/screen/layout.go @@ -112,7 +112,9 @@ func (l Layout) Build( return } - decorator = applyDecorators(e, lay) + decorator = applyPadding(e, lay) + decorator = applyDecorators(e, decorator) + decorator = applyMargins(e, decorator) if e.Hidden { decorator.Hide() diff --git a/screen/margin.go b/screen/margin.go new file mode 100644 index 0000000..eb22693 --- /dev/null +++ b/screen/margin.go @@ -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 +} diff --git a/screen/padding.go b/screen/padding.go new file mode 100644 index 0000000..03c469f --- /dev/null +++ b/screen/padding.go @@ -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 +} diff --git a/screen/widget.go b/screen/widget.go index a8006a7..6ab4bb7 100644 --- a/screen/widget.go +++ b/screen/widget.go @@ -255,7 +255,9 @@ func (w Widget) Build( return } - decorator = applyDecorators(e, widget) + decorator = applyPadding(e, widget) + decorator = applyDecorators(e, decorator) + decorator = applyMargins(e, decorator) if e.Hidden { decorator.Hide() diff --git a/uilayout/margin.go b/uilayout/margin.go new file mode 100644 index 0000000..f6720ae --- /dev/null +++ b/uilayout/margin.go @@ -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) + } +} diff --git a/uilayout/padding.go b/uilayout/padding.go new file mode 100644 index 0000000..8f605f8 --- /dev/null +++ b/uilayout/padding.go @@ -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) + } +}