Skip to content

Commit

Permalink
simple canvas object wrapper
Browse files Browse the repository at this point in the history
Making this public would address fyne-io#709.
  • Loading branch information
toaster committed Mar 2, 2021
1 parent 3ff23b9 commit 0c7f3b9
Show file tree
Hide file tree
Showing 2 changed files with 232 additions and 0 deletions.
93 changes: 93 additions & 0 deletions internal/canvas_object_wrapper.go
@@ -0,0 +1,93 @@
package internal

import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
)

var _ fyne.CanvasObject = (*SimpleCanvasObjectWrapper)(nil)
var _ CanvasObjectWrapper = (*SimpleCanvasObjectWrapper)(nil)

// CanvasObjectWrapper defines an interface for objects wrapping a fyne.CanvasObject.
type CanvasObjectWrapper interface {
WrappedObject() fyne.CanvasObject
}

// SimpleCanvasObjectWrapper is a simple CanvasObjectWrapper which can be easily extended.
type SimpleCanvasObjectWrapper struct {
O fyne.CanvasObject

pos fyne.Position
}

// Hide hides the wrapped object.
//
// Implements: fyne.CanvasObject
func (w *SimpleCanvasObjectWrapper) Hide() {
w.O.Hide()
}

// MinSize returns the min size of the wrapped object.
//
// Implements: fyne.CanvasObject
func (w *SimpleCanvasObjectWrapper) MinSize() fyne.Size {
return w.O.MinSize()
}

// Move moves the wrapped object.
//
// Implements: fyne.CanvasObject
func (w *SimpleCanvasObjectWrapper) Move(position fyne.Position) {
w.pos = position
w.Refresh()
}

// Position returns the position of the wrapped object.
//
// Implements: fyne.CanvasObject
func (w *SimpleCanvasObjectWrapper) Position() fyne.Position {
return w.pos
}

// Refresh refreshes the wrapped object.
//
// Implements: fyne.CanvasObject
func (w *SimpleCanvasObjectWrapper) Refresh() {
w.O.Refresh()
canvas.Refresh(w)
}

// Resize resizes the wrapped object.
//
// Implements: fyne.CanvasObject
func (w *SimpleCanvasObjectWrapper) Resize(size fyne.Size) {
w.O.Resize(size)
}

// Show shows the wrapped object.
//
// Implements: fyne.CanvasObject
func (w *SimpleCanvasObjectWrapper) Show() {
w.O.Show()
}

// Size returns the size of the wrapped object.
//
// Implements: fyne.CanvasObject
func (w *SimpleCanvasObjectWrapper) Size() fyne.Size {
return w.O.Size()
}

// Visible returns whether the wrapped object is visible or not.
//
// Implements: fyne.CanvasObject
func (w *SimpleCanvasObjectWrapper) Visible() bool {
return w.O.Visible()
}

// WrappedObject returns the wrapped object.
//
// Implements: CanvasObjectWrapper
func (w *SimpleCanvasObjectWrapper) WrappedObject() fyne.CanvasObject {
return w.O
}
139 changes: 139 additions & 0 deletions internal/canvas_object_wrapper_test.go
@@ -0,0 +1,139 @@
package internal_test

import (
"testing"

"github.com/stretchr/testify/assert"

"fyne.io/fyne/v2"
"fyne.io/fyne/v2/internal"
)

var _ fyne.CanvasObject = (*simpleCanvasObject)(nil)

func TestSimpleCanvasObjectWrapper_Hide(t *testing.T) {
o := &simpleCanvasObject{}
w := &internal.SimpleCanvasObjectWrapper{O: o}

assert.True(t, o.Visible())
w.Hide()
assert.False(t, o.Visible())
}

func TestSimpleCanvasObjectWrapper_MinSize(t *testing.T) {
o := &simpleCanvasObject{minSize: fyne.NewSize(12, 34)}
w := &internal.SimpleCanvasObjectWrapper{O: o}
assert.Equal(t, fyne.NewSize(12, 34), w.MinSize())
o = &simpleCanvasObject{minSize: fyne.NewSize(13, 42)}
w = &internal.SimpleCanvasObjectWrapper{O: o}
assert.Equal(t, fyne.NewSize(13, 42), w.MinSize())
}

func TestSimpleCanvasObjectWrapper_MoveAndPosition(t *testing.T) {
o := &simpleCanvasObject{}
w := &internal.SimpleCanvasObjectWrapper{O: o}

assert.Equal(t, fyne.NewPos(0, 0), w.Position())
assert.Equal(t, fyne.NewPos(0, 0), o.Position())
w.Move(fyne.NewPos(17, 389))
assert.Equal(t, fyne.NewPos(17, 389), w.Position())
assert.Equal(t, fyne.NewPos(0, 0), o.Position())
}

func TestSimpleCanvasObjectWrapper_Refresh(t *testing.T) {
o := &simpleCanvasObject{}
w := &internal.SimpleCanvasObjectWrapper{O: o}

assert.Equal(t, 0, o.refreshCount)
w.Refresh()
assert.Equal(t, 1, o.refreshCount)
w.Refresh()
w.Refresh()
assert.Equal(t, 3, o.refreshCount)
}

func TestSimpleCanvasObjectWrapper_Resize(t *testing.T) {
o := &simpleCanvasObject{}
w := &internal.SimpleCanvasObjectWrapper{O: o}

assert.Equal(t, fyne.NewSize(0, 0), o.Size())
w.Resize(fyne.NewSize(17, 389))
assert.Equal(t, fyne.NewSize(17, 389), o.Size())
}

func TestSimpleCanvasObjectWrapper_Show(t *testing.T) {
o := &simpleCanvasObject{hidden: true}
w := &internal.SimpleCanvasObjectWrapper{O: o}

assert.False(t, o.Visible())
w.Show()
assert.True(t, o.Visible())
}

func TestSimpleCanvasObjectWrapper_Size(t *testing.T) {
o := &simpleCanvasObject{size: fyne.NewSize(12, 34)}
w := &internal.SimpleCanvasObjectWrapper{O: o}
assert.Equal(t, fyne.NewSize(12, 34), w.Size())
o = &simpleCanvasObject{size: fyne.NewSize(13, 42)}
w = &internal.SimpleCanvasObjectWrapper{O: o}
assert.Equal(t, fyne.NewSize(13, 42), w.Size())
}

func TestSimpleCanvasObjectWrapper_Visible(t *testing.T) {
o := &simpleCanvasObject{hidden: true}
w := &internal.SimpleCanvasObjectWrapper{O: o}
assert.False(t, w.Visible())
o = &simpleCanvasObject{hidden: false}
w = &internal.SimpleCanvasObjectWrapper{O: o}
assert.True(t, w.Visible())
}

func TestSimpleCanvasObjectWrapper_WrappedObject(t *testing.T) {
o := &simpleCanvasObject{}
w := &internal.SimpleCanvasObjectWrapper{O: o}
assert.Same(t, o, w.WrappedObject())
}

type simpleCanvasObject struct {
hidden bool
minSize fyne.Size
pos fyne.Position
refreshCount int
size fyne.Size
}

func (o *simpleCanvasObject) MinSize() fyne.Size {
return o.minSize
}

func (o *simpleCanvasObject) Move(position fyne.Position) {
o.pos = position
}

func (o *simpleCanvasObject) Position() fyne.Position {
return o.pos
}

func (o *simpleCanvasObject) Resize(size fyne.Size) {
o.size = size
}

func (o *simpleCanvasObject) Size() fyne.Size {
return o.size
}

func (o *simpleCanvasObject) Hide() {
o.hidden = true
}

func (o *simpleCanvasObject) Visible() bool {
return !o.hidden
}

func (o *simpleCanvasObject) Show() {
o.hidden = false
}

func (o *simpleCanvasObject) Refresh() {
o.refreshCount++
}

0 comments on commit 0c7f3b9

Please sign in to comment.