diff --git a/CHANGELOG.md b/CHANGELOG.md index cad0ae5035..74b69a2c93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,17 +10,34 @@ More detailed release notes can be found on the [releases page](https://github.c These changes likely break some apps, please read the [upgrading doc](https://developer.fyne.io/api/v2.0/upgrading) for more info +* Coordinate system to float32 + * Size and Position units were changed from int to float32 + * `Text.TextSize` moved to float32 and `fyne.MeasureText` now takes a float32 size parameter + * Removed `Size.Union` + * Added fyne.Delta for difference based X, Y representation + * DraggedEvent.DraggedX and DraggedX (int, int) to DraggedEvent.Dragged (Delta) + * ScrollEvent.DeltaX and DeltaY (int, int) moved to ScrollEvent.Scrolled (Delta) + +* Theme API update + * `fyne.Theme` moved to `fyne.LegacyTheme` and can be load to a new theme using `theme.FromLegacy` + * A new, more flexible, Theme interface has been created that we encourage developers to use + * The second parameter of `theme.NewThemedResource` was removed, it was previously ignored -* `fyne.Theme` moved to `fyne.LegacyTheme` and can be load to a new theme using `theme.FromLegacy` -* A new, more flexible, Theme interface has been created that we encourage developers to use * The desktop.Cursor definition was renamed desktop.StandardCursor to make way for custom cursors +* Dialogs no longer show when created, unless using the ShowXxx convenience methods +* Removed deprecated types including dialog.FileIcon (now widget.FileIcon) + ### Added * Add MouseButtonTertiary for middle mouse button events on desktop +* Add fyne.Vector for simple x/y coordinates ### Changed +* Coordinate system is now float32 - see breaking changes above +* ScrollEvent and DragEvent moved to Delta from (int, int) + * Change bundled resources to use more efficient string storage * Desktop left and right mouse buttons renamed to MouseButtonPrimary and MouseButtonSecondary * Many optimisations and widget performance enhancements diff --git a/canvas/animation.go b/canvas/animation.go index a528459b89..61e81f89fb 100644 --- a/canvas/animation.go +++ b/canvas/animation.go @@ -49,7 +49,7 @@ func NewPositionAnimation(start, stop fyne.Position, d time.Duration, fn func(fy return &fyne.Animation{ Duration: d, Tick: func(done float32) { - fn(fyne.NewPos(scaleInt(start.X, xDelta, done), scaleInt(start.Y, yDelta, done))) + fn(fyne.NewPos(scaleVal(start.X, xDelta, done), scaleVal(start.Y, yDelta, done))) }} } @@ -63,7 +63,7 @@ func NewSizeAnimation(start, stop fyne.Size, d time.Duration, fn func(fyne.Size) return &fyne.Animation{ Duration: d, Tick: func(done float32) { - fn(fyne.NewSize(scaleInt(start.Width, widthDelta, done), scaleInt(start.Height, heightDelta, done))) + fn(fyne.NewSize(scaleVal(start.Width, widthDelta, done), scaleVal(start.Height, heightDelta, done))) }} } @@ -71,6 +71,6 @@ func scaleChannel(start int, diff, done float32) uint8 { return uint8(start + int(diff*done)) } -func scaleInt(start int, delta, done float32) int { - return start + int(delta*done) +func scaleVal(start float32, delta, done float32) float32 { + return start + delta*done } diff --git a/canvas/base_internal_test.go b/canvas/base_internal_test.go index 034c136832..c863d18144 100644 --- a/canvas/base_internal_test.go +++ b/canvas/base_internal_test.go @@ -21,8 +21,8 @@ func TestBase_Move(t *testing.T) { base.Move(fyne.NewPos(10, 10)) pos := base.Position() - assert.Equal(t, 10, pos.X) - assert.Equal(t, 10, pos.Y) + assert.Equal(t, float32(10), pos.X) + assert.Equal(t, float32(10), pos.Y) } func TestBase_Resize(t *testing.T) { @@ -30,8 +30,8 @@ func TestBase_Resize(t *testing.T) { base.Resize(fyne.NewSize(10, 10)) size := base.Size() - assert.Equal(t, 10, size.Width) - assert.Equal(t, 10, size.Height) + assert.Equal(t, float32(10), size.Width) + assert.Equal(t, float32(10), size.Height) } func TestBase_HideShow(t *testing.T) { diff --git a/canvas/circle_test.go b/canvas/circle_test.go index b33a6966aa..2f2776c7bd 100644 --- a/canvas/circle_test.go +++ b/canvas/circle_test.go @@ -26,8 +26,8 @@ func TestCircle_FillColor(t *testing.T) { } func TestCircle_Resize(t *testing.T) { - targetWidth := 50 - targetHeight := 50 + targetWidth := float32(50) + targetHeight := float32(50) circle := canvas.NewCircle(color.White) start := circle.Size() assert.True(t, start.Height == 0) diff --git a/canvas/line.go b/canvas/line.go index 98eceec826..a3b8a58d54 100644 --- a/canvas/line.go +++ b/canvas/line.go @@ -24,8 +24,8 @@ type Line struct { // Size returns the current size of bounding box for this line object func (l *Line) Size() fyne.Size { - return fyne.NewSize(int(math.Abs(float64(l.Position2.X)-float64(l.Position1.X))), - int(math.Abs(float64(l.Position2.Y)-float64(l.Position1.Y)))) + return fyne.NewSize(float32(math.Abs(float64(l.Position2.X)-float64(l.Position1.X))), + float32(math.Abs(float64(l.Position2.Y)-float64(l.Position1.Y)))) } // Resize sets a new bottom-right position for the line object and it will then be refreshed. diff --git a/canvas/line_test.go b/canvas/line_test.go index 8989fa468d..7d53edb068 100644 --- a/canvas/line_test.go +++ b/canvas/line_test.go @@ -24,8 +24,8 @@ func TestLine_Resize(t *testing.T) { line.Resize(fyne.NewSize(10, 0)) size := line.Size() - assert.Equal(t, size.Width, 10) - assert.Equal(t, size.Height, 0) + assert.Equal(t, float32(10), size.Width) + assert.Equal(t, float32(0), size.Height) } func TestLine_StrokeColor(t *testing.T) { diff --git a/canvas/testdata/text/layout_long_center_large.png b/canvas/testdata/text/layout_long_center_large.png index 1078dc6aef..d53a853aaf 100644 Binary files a/canvas/testdata/text/layout_long_center_large.png and b/canvas/testdata/text/layout_long_center_large.png differ diff --git a/canvas/testdata/text/layout_long_leading_large.png b/canvas/testdata/text/layout_long_leading_large.png index f5fb3cb5e7..17b442499f 100644 Binary files a/canvas/testdata/text/layout_long_leading_large.png and b/canvas/testdata/text/layout_long_leading_large.png differ diff --git a/canvas/testdata/text/layout_long_trailing_large.png b/canvas/testdata/text/layout_long_trailing_large.png index 8b5783e1df..1bd1a8940e 100644 Binary files a/canvas/testdata/text/layout_long_trailing_large.png and b/canvas/testdata/text/layout_long_trailing_large.png differ diff --git a/canvas/testdata/text/layout_short_center_large.png b/canvas/testdata/text/layout_short_center_large.png index 241e6203cc..bf9b6185fc 100644 Binary files a/canvas/testdata/text/layout_short_center_large.png and b/canvas/testdata/text/layout_short_center_large.png differ diff --git a/canvas/testdata/text/layout_short_leading_large.png b/canvas/testdata/text/layout_short_leading_large.png index 14741a7332..287b7cad48 100644 Binary files a/canvas/testdata/text/layout_short_leading_large.png and b/canvas/testdata/text/layout_short_leading_large.png differ diff --git a/canvas/testdata/text/layout_short_trailing_large.png b/canvas/testdata/text/layout_short_trailing_large.png index 932b0cb9c6..1dc917f5b9 100644 Binary files a/canvas/testdata/text/layout_short_trailing_large.png and b/canvas/testdata/text/layout_short_trailing_large.png differ diff --git a/canvas/text.go b/canvas/text.go index 582b4a1086..e37636f2d0 100644 --- a/canvas/text.go +++ b/canvas/text.go @@ -18,7 +18,7 @@ type Text struct { Color color.Color // The main text draw color Text string // The string content of this Text - TextSize int // Size of the text - if the Canvas scale is 1.0 this will be equivalent to point size + TextSize float32 // Size of the text - if the Canvas scale is 1.0 this will be equivalent to point size TextStyle fyne.TextStyle // The style of the text content } diff --git a/canvas/text_test.go b/canvas/text_test.go index a0d52aeea2..d841b862b7 100644 --- a/canvas/text_test.go +++ b/canvas/text_test.go @@ -51,7 +51,7 @@ func TestText_Layout(t *testing.T) { "short_leading_large": { text: "abc", align: fyne.TextAlignLeading, - size: fyne.NewSize(500, 100), + size: fyne.NewSize(500, 101), }, "long_leading_small": { text: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", @@ -61,7 +61,7 @@ func TestText_Layout(t *testing.T) { "long_leading_large": { text: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", align: fyne.TextAlignLeading, - size: fyne.NewSize(500, 100), + size: fyne.NewSize(500, 101), }, "short_center_small": { text: "abc", @@ -71,7 +71,7 @@ func TestText_Layout(t *testing.T) { "short_center_large": { text: "abc", align: fyne.TextAlignCenter, - size: fyne.NewSize(500, 100), + size: fyne.NewSize(500, 101), }, "long_center_small": { text: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", @@ -81,7 +81,7 @@ func TestText_Layout(t *testing.T) { "long_center_large": { text: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", align: fyne.TextAlignCenter, - size: fyne.NewSize(500, 100), + size: fyne.NewSize(500, 101), }, "short_trailing_small": { text: "abc", @@ -91,7 +91,7 @@ func TestText_Layout(t *testing.T) { "short_trailing_large": { text: "abc", align: fyne.TextAlignTrailing, - size: fyne.NewSize(500, 100), + size: fyne.NewSize(500, 101), }, "long_trailing_small": { text: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", @@ -101,7 +101,7 @@ func TestText_Layout(t *testing.T) { "long_trailing_large": { text: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", align: fyne.TextAlignTrailing, - size: fyne.NewSize(500, 100), + size: fyne.NewSize(500, 101), }, } { t.Run(name, func(t *testing.T) { diff --git a/cmd/fyne_demo/tutorials/animation.go b/cmd/fyne_demo/tutorials/animation.go index 8cc3315e1e..46b8fe3b5e 100644 --- a/cmd/fyne_demo/tutorials/animation.go +++ b/cmd/fyne_demo/tutorials/animation.go @@ -34,7 +34,7 @@ func makeAnimationCanvas() fyne.CanvasObject { a2 = canvas.NewPositionAnimation(fyne.NewPos(0, 0), fyne.NewPos(350, 80), time.Second*3, func(p fyne.Position) { i.Move(p) - width := int(10 + (float64(p.X) / 7)) + width := 10 + (p.X / 7) i.Resize(fyne.NewSize(width, width)) }) a2.Repeat = true @@ -78,7 +78,7 @@ func makeAnimationCurves() fyne.CanvasObject { return fyne.NewContainerWithoutLayout(label1, label2, label3, label4, box1, box2, box3, box4, start) } -func makeAnimationCurveItem(label string, curve fyne.AnimationCurve, yOff int) ( +func makeAnimationCurveItem(label string, curve fyne.AnimationCurve, yOff float32) ( text *widget.Label, box fyne.CanvasObject, anim *fyne.Animation) { text = widget.NewLabel(label) text.Alignment = fyne.TextAlignCenter diff --git a/cmd/fyne_demo/tutorials/theme.go b/cmd/fyne_demo/tutorials/theme.go index a960fa02a4..2c9bbe0000 100644 --- a/cmd/fyne_demo/tutorials/theme.go +++ b/cmd/fyne_demo/tutorials/theme.go @@ -42,7 +42,7 @@ func (customTheme) Icon(n fyne.ThemeIconName) fyne.Resource { return theme.DefaultTheme().Icon(n) } -func (customTheme) Size(s fyne.ThemeSizeName) int { +func (customTheme) Size(s fyne.ThemeSizeName) float32 { switch s { case theme.SizeNamePadding: return 10 diff --git a/cmd/fyne_settings/settings/scale.go b/cmd/fyne_settings/settings/scale.go index 5fc5e01679..800aacb781 100644 --- a/cmd/fyne_settings/settings/scale.go +++ b/cmd/fyne_settings/settings/scale.go @@ -24,7 +24,7 @@ var scales = []*scaleItems{ func (s *Settings) appliedScale(value float32) { for _, scale := range scales { - scale.preview.TextSize = int(float32(theme.TextSize()) * scale.scale / value) + scale.preview.TextSize = theme.TextSize() * scale.scale / value } } @@ -72,7 +72,7 @@ func (s *Settings) makeScalePreviews(value float32) []fyne.CanvasObject { for i, scale := range scales { text := canvas.NewText("A", theme.TextColor()) text.Alignment = fyne.TextAlignCenter - text.TextSize = int(float32(theme.TextSize()) * scale.scale / value) + text.TextSize = theme.TextSize() * scale.scale / value scale.preview = text previews[i] = text diff --git a/cmd/fyne_settings/settings/scale_test.go b/cmd/fyne_settings/settings/scale_test.go index 801dd006df..78e0fa8069 100644 --- a/cmd/fyne_settings/settings/scale_test.go +++ b/cmd/fyne_settings/settings/scale_test.go @@ -40,5 +40,5 @@ func TestMakeScalePreviews(t *testing.T) { assert.Equal(t, theme.TextSize(), previews[2].(*canvas.Text).TextSize) s.appliedScale(1.5) - assert.Equal(t, int(float32(theme.TextSize())/1.5), previews[2].(*canvas.Text).TextSize) + assert.Equal(t, theme.TextSize()/1.5, previews[2].(*canvas.Text).TextSize) } diff --git a/container.go b/container.go index 2c5dc9bf65..eff6614ef6 100644 --- a/container.go +++ b/container.go @@ -73,7 +73,7 @@ func (c *Container) MinSize() Size { minSize := NewSize(1, 1) for _, child := range c.Objects { - minSize = minSize.Union(child.MinSize()) + minSize = minSize.Max(child.MinSize()) } return minSize diff --git a/data/binding/bindlists.go b/data/binding/bindlists.go index 445952679b..ee1210e469 100644 --- a/data/binding/bindlists.go +++ b/data/binding/bindlists.go @@ -112,8 +112,8 @@ func BindFloatList(v *[]float64) FloatList { b := &boundFloatList{val: v} - for _, i := range *v { - b.appendItem(BindFloat(&i)) + for i := range *v { + b.appendItem(BindFloat(&((*v)[i]))) } return b diff --git a/dialog/base.go b/dialog/base.go index bf4f967474..115233aee3 100644 --- a/dialog/base.go +++ b/dialog/base.go @@ -30,10 +30,9 @@ type Dialog interface { var _ Dialog = (*dialog)(nil) type dialog struct { - callback func(bool) - sendResponse bool - title string - icon fyne.Resource + callback func(bool) + title string + icon fyne.Resource win *widget.PopUp bg *canvas.Rectangle @@ -64,10 +63,6 @@ func NewCustomConfirm(title, confirm, dismiss string, content fyne.CanvasObject, callback func(bool), parent fyne.Window) Dialog { d := &dialog{content: content, title: title, icon: nil, parent: parent} d.callback = callback - // TODO: This is required to avoid confusion. - // Normally this function should only provide the dialog, but currently it is also displayed, which is wrong. - // For this case the ShowCustomConfirm() method was built. - d.sendResponse = true d.dismiss = &widget.Button{Text: dismiss, Icon: theme.CancelIcon(), OnTapped: d.Hide, @@ -103,7 +98,6 @@ func (d *dialog) Hide() { } func (d *dialog) Show() { - d.sendResponse = true d.win.Show() } @@ -111,7 +105,7 @@ func (d *dialog) Layout(obj []fyne.CanvasObject, size fyne.Size) { d.bg.Move(fyne.NewPos(0, 0)) d.bg.Resize(size) - btnMin := obj[3].MinSize().Union(obj[3].Size()) + btnMin := obj[3].MinSize().Max(obj[3].Size()) // icon iconHeight := padHeight*2 + d.label.MinSize().Height*2 - theme.Padding() @@ -131,7 +125,7 @@ func (d *dialog) Layout(obj []fyne.CanvasObject, size fyne.Size) { func (d *dialog) MinSize(obj []fyne.CanvasObject) fyne.Size { contentMin := obj[2].MinSize() - btnMin := obj[3].MinSize().Union(obj[3].Size()) + btnMin := obj[3].MinSize().Max(obj[3].Size()) width := fyne.Max(fyne.Max(contentMin.Width, btnMin.Width), obj[4].MinSize().Width) + padWidth height := contentMin.Height + btnMin.Height + d.label.MinSize().Height + theme.Padding() + padHeight*2 @@ -191,10 +185,9 @@ func (d *dialog) applyTheme() { func (d *dialog) hideWithResponse(resp bool) { d.win.Hide() - if d.sendResponse && d.callback != nil { + if d.callback != nil { d.callback(resp) } - d.sendResponse = false } func (d *dialog) setButtons(buttons fyne.CanvasObject) { diff --git a/dialog/color_wheel.go b/dialog/color_wheel.go index a3bce1c8f9..cfbdcf173e 100644 --- a/dialog/color_wheel.go +++ b/dialog/color_wheel.go @@ -131,20 +131,20 @@ func (a *colorWheel) colorAt(x, y, w, h int) color.Color { func (a *colorWheel) locationForPosition(pos fyne.Position) (x, y int) { can := fyne.CurrentApp().Driver().CanvasForObject(a) - x, y = pos.X, pos.Y + x, y = int(pos.X), int(pos.Y) if can != nil { x, y = can.PixelCoordinateForPosition(pos) } return } -func (a *colorWheel) selection(width, height int) (int, int) { +func (a *colorWheel) selection(width, height float32) (float32, float32) { w, h := float64(width), float64(height) radius := float64(a.Saturation) / 100.0 * math.Min(w, h) / 2.0 degrees := float64(a.Hue) radians := degrees * math.Pi / 180.0 c := cmplx.Rect(radius, radians) - return int(real(c) + w/2.0), int(imag(c) + h/2.0) + return float32(real(c) + w/2.0), float32(imag(c) + h/2.0) } func (a *colorWheel) trigger(pos fyne.Position) { diff --git a/dialog/confirm_test.go b/dialog/confirm_test.go index cd4a8d5a73..e9c4e2e925 100644 --- a/dialog/confirm_test.go +++ b/dialog/confirm_test.go @@ -67,13 +67,14 @@ func TestConfirmDialog_Resize(t *testing.T) { d := NewConfirm("Test", "Test", nil, window) theDialog := d.dialog + d.dialog.Show() // we cannot check window size if not shown //Test resize - normal size scenario size := fyne.NewSize(300, 180) //normal size to fit (600,400) theDialog.Resize(size) - expectedWidth := 300 + expectedWidth := float32(300) assert.Equal(t, expectedWidth, theDialog.win.Content.Size().Width+theme.Padding()*2) - expectedHeight := 180 + expectedHeight := float32(180) assert.Equal(t, expectedHeight, theDialog.win.Content.Size().Height+theme.Padding()*2) //Test resize - normal size scenario again size = fyne.NewSize(310, 280) //normal size to fit (600,400) diff --git a/dialog/file.go b/dialog/file.go index c2bf1852c2..a6868a260b 100644 --- a/dialog/file.go +++ b/dialog/file.go @@ -165,7 +165,7 @@ func (f *fileDialog) makeUI() fyne.CanvasObject { fileIconSize+theme.Padding()+fileTextSize)), ) f.fileScroll = widget.NewScrollContainer(f.files) - verticalExtra := int(float64(fileIconSize) * 0.25) + verticalExtra := float32(float64(fileIconSize) * 0.25) f.fileScroll.SetMinSize(fyne.NewSize(fileIconCellWidth*2+theme.Padding(), (fileIconSize+fileTextSize)+theme.Padding()*2+verticalExtra)) diff --git a/dialog/file_test.go b/dialog/file_test.go index 4647fd9548..5218e2c9d1 100644 --- a/dialog/file_test.go +++ b/dialog/file_test.go @@ -128,9 +128,9 @@ func TestFileDialogResize(t *testing.T) { //Test resize - normal size scenario size := fyne.NewSize(200, 180) //normal size to fit (600,400) file.Resize(size) - expectedWidth := 200 + expectedWidth := float32(200) assert.Equal(t, expectedWidth, file.dialog.win.Content.Size().Width+theme.Padding()*2) - expectedHeight := 180 + expectedHeight := float32(180) assert.Equal(t, expectedHeight, file.dialog.win.Content.Size().Height+theme.Padding()*2) //Test resize - normal size scenario again size = fyne.NewSize(300, 280) //normal size to fit (600,400) diff --git a/dialog/fileicon.go b/dialog/fileicon.go deleted file mode 100644 index c3853f2697..0000000000 --- a/dialog/fileicon.go +++ /dev/null @@ -1,12 +0,0 @@ -package dialog - -import ( - "fyne.io/fyne" - "fyne.io/fyne/widget" -) - -// NewFileIcon takes a filepath and creates an icon with an overlayed label using the detected mimetype and extension -// Deprecated: Use widget.NewFileIcon instead -func NewFileIcon(uri fyne.URI) *widget.FileIcon { - return widget.NewFileIcon(uri) -} diff --git a/dialog/form.go b/dialog/form.go index e7928c50c4..9e149452cd 100644 --- a/dialog/form.go +++ b/dialog/form.go @@ -54,12 +54,6 @@ func NewForm(title, confirm, dismiss string, items []*widget.FormItem, callback content := fyne.NewContainerWithLayout(layout.NewFormLayout(), itemObjects...) d := &dialog{content: content, callback: callback, title: title, parent: parent} - - // TODO: Copied from NewCustomConfirm above. - // This is still a problem because commenting out the `.Show()` call below will still result in the - // dialog being shown. - d.sendResponse = true - d.dismiss = &widget.Button{Text: dismiss, Icon: theme.CancelIcon(), OnTapped: d.Hide, } diff --git a/dialog/information_test.go b/dialog/information_test.go index d0725f5db7..36711b4db6 100644 --- a/dialog/information_test.go +++ b/dialog/information_test.go @@ -28,13 +28,14 @@ func TestDialog_Resize(t *testing.T) { defer window.Close() d := NewInformation("Looooooooooooooong title", "message...", window) theDialog := d.(*dialog) + d.Show() // we cannot check window size if not shown //Test resize - normal size scenario size := fyne.NewSize(300, 180) //normal size to fit (600,400) theDialog.Resize(size) - expectedWidth := 300 + expectedWidth := float32(300) assert.Equal(t, expectedWidth, theDialog.win.Content.Size().Width+theme.Padding()*2) - expectedHeight := 180 + expectedHeight := float32(180) assert.Equal(t, expectedHeight, theDialog.win.Content.Size().Height+theme.Padding()*2) //Test resize - normal size scenario again size = fyne.NewSize(310, 280) //normal size to fit (600,400) diff --git a/dialog/progressinfinite_test.go b/dialog/progressinfinite_test.go index ff0cdabf52..1a7f9493d5 100644 --- a/dialog/progressinfinite_test.go +++ b/dialog/progressinfinite_test.go @@ -27,13 +27,14 @@ func TestProgressInfiniteDialog_Resize(t *testing.T) { defer window.Close() d := NewProgressInfinite("title", "message", window) theDialog := d.dialog + d.dialog.Show() // we cannot check window size if not shown //Test resize - normal size scenario size := fyne.NewSize(300, 180) //normal size to fit (600,400) theDialog.Resize(size) - expectedWidth := 300 + expectedWidth := float32(300) assert.Equal(t, expectedWidth, theDialog.win.Content.Size().Width+theme.Padding()*2) - expectedHeight := 180 + expectedHeight := float32(180) assert.Equal(t, expectedHeight, theDialog.win.Content.Size().Height+theme.Padding()*2) //Test resize - normal size scenario again size = fyne.NewSize(310, 280) //normal size to fit (600,400) diff --git a/dialog/testdata/color/channel_layout_foobar_0.png b/dialog/testdata/color/channel_layout_foobar_0.png index e7b42e5075..a41d17d9bf 100644 Binary files a/dialog/testdata/color/channel_layout_foobar_0.png and b/dialog/testdata/color/channel_layout_foobar_0.png differ diff --git a/dialog/testdata/color/channel_layout_foobar_100.png b/dialog/testdata/color/channel_layout_foobar_100.png index eba251f8a2..3cc44f0e90 100644 Binary files a/dialog/testdata/color/channel_layout_foobar_100.png and b/dialog/testdata/color/channel_layout_foobar_100.png differ diff --git a/dialog/testdata/color/channel_layout_foobar_50.png b/dialog/testdata/color/channel_layout_foobar_50.png index 1ab1143926..091ea3833e 100644 Binary files a/dialog/testdata/color/channel_layout_foobar_50.png and b/dialog/testdata/color/channel_layout_foobar_50.png differ diff --git a/dialog/testdata/color/dialog_expanded_theme_default.png b/dialog/testdata/color/dialog_expanded_theme_default.png index ad75736063..37c898f830 100644 Binary files a/dialog/testdata/color/dialog_expanded_theme_default.png and b/dialog/testdata/color/dialog_expanded_theme_default.png differ diff --git a/dialog/testdata/color/dialog_expanded_theme_ugly.png b/dialog/testdata/color/dialog_expanded_theme_ugly.png index 45b72f3842..6875961f09 100644 Binary files a/dialog/testdata/color/dialog_expanded_theme_ugly.png and b/dialog/testdata/color/dialog_expanded_theme_ugly.png differ diff --git a/dialog/testdata/color/dialog_recents_theme_default.png b/dialog/testdata/color/dialog_recents_theme_default.png index 0d7a5f32e7..9fd09fdc18 100644 Binary files a/dialog/testdata/color/dialog_recents_theme_default.png and b/dialog/testdata/color/dialog_recents_theme_default.png differ diff --git a/dialog/testdata/color/dialog_recents_theme_ugly.png b/dialog/testdata/color/dialog_recents_theme_ugly.png index 7ca20e0159..aee2f7e4aa 100644 Binary files a/dialog/testdata/color/dialog_recents_theme_ugly.png and b/dialog/testdata/color/dialog_recents_theme_ugly.png differ diff --git a/dialog/testdata/color/dialog_simple_recents_theme_default.png b/dialog/testdata/color/dialog_simple_recents_theme_default.png index 8fcebe0df5..d062e52419 100644 Binary files a/dialog/testdata/color/dialog_simple_recents_theme_default.png and b/dialog/testdata/color/dialog_simple_recents_theme_default.png differ diff --git a/dialog/testdata/color/dialog_simple_recents_theme_ugly.png b/dialog/testdata/color/dialog_simple_recents_theme_ugly.png index c293c5296b..c4e1049d47 100644 Binary files a/dialog/testdata/color/dialog_simple_recents_theme_ugly.png and b/dialog/testdata/color/dialog_simple_recents_theme_ugly.png differ diff --git a/dialog/testdata/color/dialog_theme_default.png b/dialog/testdata/color/dialog_theme_default.png index f0f87f972f..a87a51ea42 100644 Binary files a/dialog/testdata/color/dialog_theme_default.png and b/dialog/testdata/color/dialog_theme_default.png differ diff --git a/dialog/testdata/color/dialog_theme_ugly.png b/dialog/testdata/color/dialog_theme_ugly.png index 7f3cc46402..e772d302e6 100644 Binary files a/dialog/testdata/color/dialog_theme_ugly.png and b/dialog/testdata/color/dialog_theme_ugly.png differ diff --git a/dialog/testdata/color/picker_layout_advanced.png b/dialog/testdata/color/picker_layout_advanced.png index 5ee0d7b2f4..91cad34b7e 100644 Binary files a/dialog/testdata/color/picker_layout_advanced.png and b/dialog/testdata/color/picker_layout_advanced.png differ diff --git a/dialog/testdata/dialog-custom-default.png b/dialog/testdata/dialog-custom-default.png index b0422325a0..3a7cb4f083 100644 Binary files a/dialog/testdata/dialog-custom-default.png and b/dialog/testdata/dialog-custom-default.png differ diff --git a/dialog/testdata/dialog-custom-ugly.png b/dialog/testdata/dialog-custom-ugly.png index 3ee64ccd72..9a182ed133 100644 Binary files a/dialog/testdata/dialog-custom-ugly.png and b/dialog/testdata/dialog-custom-ugly.png differ diff --git a/driver.go b/driver.go index 3f02079192..9cfc81d150 100644 --- a/driver.go +++ b/driver.go @@ -10,7 +10,7 @@ type Driver interface { // RenderedTextSize returns the size required to render the given string of specified // font size and style. - RenderedTextSize(string, int, TextStyle) Size + RenderedTextSize(string, float32, TextStyle) Size // FileReaderForURI opens a file reader for the given resource indicator. // This may refer to a filesystem (typical on desktop) or data from another application. diff --git a/event.go b/event.go index ddd627035e..435b39e30f 100644 --- a/event.go +++ b/event.go @@ -16,12 +16,12 @@ type PointEvent struct { // The DeltaX and DeltaY represent how large the scroll was in two dimensions. type ScrollEvent struct { PointEvent - DeltaX, DeltaY int + Scrolled Delta } // DragEvent defines the parameters of a pointer or other drag event. // The DraggedX and DraggedY fields show how far the item was dragged since the last event. type DragEvent struct { PointEvent - DraggedX, DraggedY int + Dragged Delta } diff --git a/geometry.go b/geometry.go index 1a1501704a..7e26f66659 100644 --- a/geometry.go +++ b/geometry.go @@ -1,81 +1,122 @@ package fyne +var _ Vector2 = (*Delta)(nil) +var _ Vector2 = (*Position)(nil) +var _ Vector2 = (*Size)(nil) + +// Vector2 marks geometry types that can operate as a coordinate vector. +type Vector2 interface { + Components() (float32, float32) + IsZero() bool +} + +// Delta is a generic X, Y coordinate, size or movement representation. +type Delta struct { + DX, DY float32 +} + +// NewDelta returns a newly allocated Delta representing a movement in the X and Y axis. +func NewDelta(dx float32, dy float32) Delta { + return Delta{DX: dx, DY: dy} +} + +// Components returns the X and Y elements of this Delta. +func (v Delta) Components() (float32, float32) { + return v.DX, v.DY +} + +// IsZero returns whether the Position is at the zero-point. +func (v Delta) IsZero() bool { + return v.DX == 0.0 && v.DY == 0.0 +} + // Position describes a generic X, Y coordinate relative to a parent Canvas // or CanvasObject. type Position struct { - X int // The position from the parent's left edge - Y int // The position from the parent's top edge + X float32 // The position from the parent's left edge + Y float32 // The position from the parent's top edge } // NewPos returns a newly allocated Position representing the specified coordinates. -func NewPos(x int, y int) Position { +func NewPos(x float32, y float32) Position { return Position{x, y} } // Add returns a new Position that is the result of offsetting the current // position by p2 X and Y. -func (p Position) Add(p2 Position) Position { - return Position{p.X + p2.X, p.Y + p2.Y} +func (p Position) Add(v Vector2) Position { + x, y := v.Components() + return Position{p.X + x, p.Y + y} +} + +// Components returns the X and Y elements of this Position +func (p Position) Components() (float32, float32) { + return p.X, p.Y } // IsZero returns whether the Position is at the zero-point. func (p Position) IsZero() bool { - return p.X == 0 && p.Y == 0 + return p.X == 0.0 && p.Y == 0.0 } // Subtract returns a new Position that is the result of offsetting the current // position by p2 -X and -Y. -func (p Position) Subtract(p2 Position) Position { - return Position{p.X - p2.X, p.Y - p2.Y} +func (p Position) Subtract(v Vector2) Position { + x, y := v.Components() + return Position{p.X - x, p.Y - y} } // Size describes something with width and height. type Size struct { - Width int // The number of units along the X axis. - Height int // The number of units along the Y axis. + Width float32 // The number of units along the X axis. + Height float32 // The number of units along the Y axis. } // NewSize returns a newly allocated Size of the specified dimensions. -func NewSize(w int, h int) Size { +func NewSize(w float32, h float32) Size { return Size{w, h} } // Add returns a new Size that is the result of increasing the current size by // s2 Width and Height. -func (s Size) Add(s2 Size) Size { - return Size{s.Width + s2.Width, s.Height + s2.Height} +func (s Size) Add(v Vector2) Size { + w, h := v.Components() + return Size{s.Width + w, s.Height + h} } // IsZero returns whether the Size has zero width and zero height. func (s Size) IsZero() bool { - return s.Width == 0 && s.Height == 0 + return s.Width == 0.0 && s.Height == 0.0 } // Max returns a new Size that is the maximum of the current Size and s2. -func (s Size) Max(s2 Size) Size { - maxW := Max(s.Width, s2.Width) - maxH := Max(s.Height, s2.Height) +func (s Size) Max(v Vector2) Size { + x, y := v.Components() + + maxW := Max(s.Width, x) + maxH := Max(s.Height, y) return NewSize(maxW, maxH) } // Min returns a new Size that is the minimum of the current Size and s2. -func (s Size) Min(s2 Size) Size { - minW := Min(s.Width, s2.Width) - minH := Min(s.Height, s2.Height) +func (s Size) Min(v Vector2) Size { + x, y := v.Components() + + minW := Min(s.Width, x) + minH := Min(s.Height, y) return NewSize(minW, minH) } -// Subtract returns a new Size that is the result of decreasing the current size -// by s2 Width and Height. -func (s Size) Subtract(s2 Size) Size { - return Size{s.Width - s2.Width, s.Height - s2.Height} +// Components returns the Width and Height elements of this Size +func (s Size) Components() (float32, float32) { + return s.Width, s.Height } -// Union returns a new Size that is the maximum of the current Size and s2. -// -// Deprecated: use Max() instead -func (s Size) Union(s2 Size) Size { - return s.Max(s2) +// Subtract returns a new Size that is the result of decreasing the current size +// by s2 Width and Height. +func (s Size) Subtract(v Vector2) Size { + w, h := v.Components() + return Size{s.Width - w, s.Height - h} } diff --git a/geometry_test.go b/geometry_test.go index 1e6c27523c..34619d4569 100644 --- a/geometry_test.go +++ b/geometry_test.go @@ -12,8 +12,28 @@ func TestPosition_Add(t *testing.T) { pos3 := pos1.Add(pos2) - assert.Equal(t, 35, pos3.X) - assert.Equal(t, 35, pos3.Y) + assert.Equal(t, float32(35), pos3.X) + assert.Equal(t, float32(35), pos3.Y) +} + +func TestPosition_Add_Size(t *testing.T) { + pos1 := NewPos(10, 10) + s := NewSize(25, 25) + + pos2 := pos1.Add(s) + + assert.Equal(t, float32(35), pos2.X) + assert.Equal(t, float32(35), pos2.Y) +} + +func TestPosition_Add_Vector(t *testing.T) { + pos1 := NewPos(10, 10) + v := NewDelta(25, 25) + + pos2 := pos1.Add(v) + + assert.Equal(t, float32(35), pos2.X) + assert.Equal(t, float32(35), pos2.Y) } func TestPosition_IsZero(t *testing.T) { @@ -39,8 +59,8 @@ func TestPosition_Subtract(t *testing.T) { pos3 := pos1.Subtract(pos2) - assert.Equal(t, 15, pos3.X) - assert.Equal(t, 15, pos3.Y) + assert.Equal(t, float32(15), pos3.X) + assert.Equal(t, float32(15), pos3.Y) } func TestSize_Add(t *testing.T) { @@ -49,8 +69,28 @@ func TestSize_Add(t *testing.T) { size3 := size1.Add(size2) - assert.Equal(t, 35, size3.Width) - assert.Equal(t, 35, size3.Height) + assert.Equal(t, float32(35), size3.Width) + assert.Equal(t, float32(35), size3.Height) +} + +func TestSize_Add_Position(t *testing.T) { + size1 := NewSize(10, 10) + p := NewSize(25, 25) + + size2 := size1.Add(p) + + assert.Equal(t, float32(35), size2.Width) + assert.Equal(t, float32(35), size2.Height) +} + +func TestSize_Add_Vector(t *testing.T) { + size1 := NewSize(10, 10) + v := NewDelta(25, 25) + + size2 := size1.Add(v) + + assert.Equal(t, float32(35), size2.Width) + assert.Equal(t, float32(35), size2.Height) } func TestSize_IsZero(t *testing.T) { @@ -76,8 +116,8 @@ func TestSize_Max(t *testing.T) { size3 := size1.Max(size2) - assert.Equal(t, 100, size3.Width) - assert.Equal(t, 100, size3.Height) + assert.Equal(t, float32(100), size3.Width) + assert.Equal(t, float32(100), size3.Height) } func TestSize_Min(t *testing.T) { @@ -86,8 +126,8 @@ func TestSize_Min(t *testing.T) { size3 := size1.Min(size2) - assert.Equal(t, 10, size3.Width) - assert.Equal(t, 10, size3.Height) + assert.Equal(t, float32(10), size3.Width) + assert.Equal(t, float32(10), size3.Height) } func TestSize_Subtract(t *testing.T) { @@ -96,16 +136,15 @@ func TestSize_Subtract(t *testing.T) { size3 := size1.Subtract(size2) - assert.Equal(t, 15, size3.Width) - assert.Equal(t, 15, size3.Height) + assert.Equal(t, float32(15), size3.Width) + assert.Equal(t, float32(15), size3.Height) } -func TestSize_Union(t *testing.T) { - size1 := NewSize(10, 100) - size2 := NewSize(100, 10) +func TestVector_IsZero(t *testing.T) { + v := NewDelta(0, 0) - size3 := size1.Union(size2) + assert.True(t, v.IsZero()) - assert.Equal(t, 100, size3.Width) - assert.Equal(t, 100, size3.Height) + v.DX = 1 + assert.False(t, v.IsZero()) } diff --git a/internal/driver/glfw/canvas.go b/internal/driver/glfw/canvas.go index 387a4e6742..694c4147c9 100644 --- a/internal/driver/glfw/canvas.go +++ b/internal/driver/glfw/canvas.go @@ -148,9 +148,9 @@ func (c *glCanvas) Padded() bool { func (c *glCanvas) PixelCoordinateForPosition(pos fyne.Position) (int, int) { texScale := c.texScale - multiple := float64(c.Scale() * texScale) - scaleInt := func(x int) int { - return int(math.Round(float64(x) * multiple)) + multiple := c.Scale() * texScale + scaleInt := func(x float32) int { + return int(math.Round(float64(x * multiple))) } return scaleInt(pos.X), scaleInt(pos.Y) @@ -394,7 +394,7 @@ func (c *glCanvas) isMenuActive() bool { return c.menu != nil && c.menu.(*MenuBar).IsActive() } -func (c *glCanvas) menuHeight() int { +func (c *glCanvas) menuHeight() float32 { switch c.menu { case nil: // no menu or native menu -> does not consume space on the canvas diff --git a/internal/driver/glfw/canvas_test.go b/internal/driver/glfw/canvas_test.go index d7ab0ae50a..2476fecb87 100644 --- a/internal/driver/glfw/canvas_test.go +++ b/internal/driver/glfw/canvas_test.go @@ -455,7 +455,7 @@ func TestGlCanvas_Scale(t *testing.T) { func TestGlCanvas_SetContent(t *testing.T) { fyne.CurrentApp().Settings().SetTheme(theme.DarkTheme()) - var menuHeight int + var menuHeight float32 if hasNativeMenu() { menuHeight = 0 } else { @@ -465,8 +465,8 @@ func TestGlCanvas_SetContent(t *testing.T) { name string padding bool menu bool - expectedPad int - expectedMenuHeight int + expectedPad float32 + expectedMenuHeight float32 }{ {"window without padding", false, false, 0, 0}, {"window with padding", true, false, theme.Padding(), 0}, @@ -481,7 +481,7 @@ func TestGlCanvas_SetContent(t *testing.T) { w.SetMainMenu(fyne.NewMainMenu(fyne.NewMenu("Test", fyne.NewMenuItem("Test", func() {})))) } content := canvas.NewCircle(color.Black) - canvasSize := 200 + canvasSize := float32(200) w.SetContent(content) w.Resize(fyne.NewSize(canvasSize, canvasSize)) diff --git a/internal/driver/glfw/driver.go b/internal/driver/glfw/driver.go index 213c544e29..4d58d9ff7b 100644 --- a/internal/driver/glfw/driver.go +++ b/internal/driver/glfw/driver.go @@ -35,7 +35,7 @@ type gLDriver struct { animation *animation.Runner } -func (d *gLDriver) RenderedTextSize(text string, size int, style fyne.TextStyle) fyne.Size { +func (d *gLDriver) RenderedTextSize(text string, size float32, style fyne.TextStyle) fyne.Size { return painter.RenderedTextSize(text, size, style) } diff --git a/internal/driver/glfw/driver_test.go b/internal/driver/glfw/driver_test.go index d951f874df..41ee2d6acd 100644 --- a/internal/driver/glfw/driver_test.go +++ b/internal/driver/glfw/driver_test.go @@ -42,7 +42,7 @@ func Test_gLDriver_AbsolutePositionForObject(t *testing.T) { movl := buildMenuOverlay(mm, c) c.setMenuOverlay(movl) w.SetContent(content) - w.Resize(fyne.NewSize(200, 200)) + w.Resize(fyne.NewSize(200, 199)) ovli1 := widget.NewLabel("Overlay Item 1") ovli2 := widget.NewLabel("Overlay Item 2") diff --git a/internal/driver/glfw/testdata/menu_bar_active_file.png b/internal/driver/glfw/testdata/menu_bar_active_file.png index cb1c0de760..8c3a63f84f 100644 Binary files a/internal/driver/glfw/testdata/menu_bar_active_file.png and b/internal/driver/glfw/testdata/menu_bar_active_file.png differ diff --git a/internal/driver/glfw/testdata/menu_bar_content_not_hoverable_with_active_menu.png b/internal/driver/glfw/testdata/menu_bar_content_not_hoverable_with_active_menu.png index cb1c0de760..8c3a63f84f 100644 Binary files a/internal/driver/glfw/testdata/menu_bar_content_not_hoverable_with_active_menu.png and b/internal/driver/glfw/testdata/menu_bar_content_not_hoverable_with_active_menu.png differ diff --git a/internal/driver/glfw/testdata/menu_bar_hovered_content_test_theme.png b/internal/driver/glfw/testdata/menu_bar_hovered_content_test_theme.png index 8c029c4a10..2e68361ccf 100644 Binary files a/internal/driver/glfw/testdata/menu_bar_hovered_content_test_theme.png and b/internal/driver/glfw/testdata/menu_bar_hovered_content_test_theme.png differ diff --git a/internal/driver/glfw/testdata/menu_bar_hovered_file_new.png b/internal/driver/glfw/testdata/menu_bar_hovered_file_new.png index 154626760a..97f8b506df 100644 Binary files a/internal/driver/glfw/testdata/menu_bar_hovered_file_new.png and b/internal/driver/glfw/testdata/menu_bar_hovered_file_new.png differ diff --git a/internal/driver/glfw/testdata/menu_bar_hovered_file_open.png b/internal/driver/glfw/testdata/menu_bar_hovered_file_open.png index 28e00fa685..4bc277eb0a 100644 Binary files a/internal/driver/glfw/testdata/menu_bar_hovered_file_open.png and b/internal/driver/glfw/testdata/menu_bar_hovered_file_open.png differ diff --git a/internal/driver/glfw/testdata/menu_bar_hovered_file_recent.png b/internal/driver/glfw/testdata/menu_bar_hovered_file_recent.png index f5784c1119..72b9f9d026 100644 Binary files a/internal/driver/glfw/testdata/menu_bar_hovered_file_recent.png and b/internal/driver/glfw/testdata/menu_bar_hovered_file_recent.png differ diff --git a/internal/driver/glfw/testdata/menu_bar_hovered_file_recent_older.png b/internal/driver/glfw/testdata/menu_bar_hovered_file_recent_older.png index 1bacf2cf43..61b004a6ea 100644 Binary files a/internal/driver/glfw/testdata/menu_bar_hovered_file_recent_older.png and b/internal/driver/glfw/testdata/menu_bar_hovered_file_recent_older.png differ diff --git a/internal/driver/glfw/testdata/menu_bar_hovered_file_recent_older_old1.png b/internal/driver/glfw/testdata/menu_bar_hovered_file_recent_older_old1.png index b273914796..cd35052f90 100644 Binary files a/internal/driver/glfw/testdata/menu_bar_hovered_file_recent_older_old1.png and b/internal/driver/glfw/testdata/menu_bar_hovered_file_recent_older_old1.png differ diff --git a/internal/driver/glfw/window.go b/internal/driver/glfw/window.go index 92bae385c3..2afa7db262 100644 --- a/internal/driver/glfw/window.go +++ b/internal/driver/glfw/window.go @@ -21,7 +21,7 @@ import ( ) const ( - scrollSpeed = 10 + scrollSpeed = float32(10) doubleClickDelay = 300 // ms (maximum interval between clicks for double click detection) ) @@ -637,8 +637,7 @@ func (w *window) mouseMoved(viewport *glfw.Window, xpos float64, ypos float64) { ev := new(fyne.DragEvent) ev.AbsolutePosition = w.mousePos ev.Position = w.mousePos.Subtract(w.mouseDraggedOffset).Subtract(draggedObjPos) - ev.DraggedX = w.mousePos.X - w.mouseDragPos.X - ev.DraggedY = w.mousePos.Y - w.mouseDragPos.Y + ev.Dragged = fyne.NewDelta(w.mousePos.X-w.mouseDragPos.X, w.mousePos.Y-w.mouseDragPos.Y) wd := w.mouseDragged w.queueEvent(func() { wd.Dragged(ev) }) @@ -804,8 +803,7 @@ func (w *window) mouseScrolled(viewport *glfw.Window, xoff float64, yoff float64 xoff, yoff = yoff, xoff } ev := &fyne.ScrollEvent{} - ev.DeltaX = int(xoff * scrollSpeed) - ev.DeltaY = int(yoff * scrollSpeed) + ev.Scrolled = fyne.NewDelta(float32(xoff)*scrollSpeed, float32(yoff)*scrollSpeed) wid.Scrolled(ev) } } @@ -1234,11 +1232,11 @@ func (w *window) create() { initWindowHints() pixWidth, pixHeight := w.screenSize(w.canvas.size) - pixWidth = fyne.Max(pixWidth, w.width) + pixWidth = int(fyne.Max(float32(pixWidth), float32(w.width))) if pixWidth == 0 { pixWidth = 10 } - pixHeight = fyne.Max(pixHeight, w.height) + pixHeight = int(fyne.Max(float32(pixHeight), float32(w.height))) if pixHeight == 0 { pixHeight = 10 } diff --git a/internal/driver/glfw/window_test.go b/internal/driver/glfw/window_test.go index c97fe5ad85..45e9374ba1 100644 --- a/internal/driver/glfw/window_test.go +++ b/internal/driver/glfw/window_test.go @@ -169,8 +169,7 @@ func TestWindow_HandleDragging(t *testing.T) { &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(4, 4), AbsolutePosition: fyne.NewPos(8, 8)}, - DraggedX: -1, - DraggedY: -1, + Dragged: fyne.NewDelta(-1, -1), }, d1.popDragEvent(), ) @@ -184,8 +183,7 @@ func TestWindow_HandleDragging(t *testing.T) { &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(12, 4), AbsolutePosition: fyne.NewPos(16, 8)}, - DraggedX: 8, - DraggedY: 0, + Dragged: fyne.NewDelta(8, 0), }, d1.popDragEvent(), ) @@ -199,8 +197,7 @@ func TestWindow_HandleDragging(t *testing.T) { &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(18, 1), AbsolutePosition: fyne.NewPos(22, 5)}, - DraggedX: 6, - DraggedY: -3, + Dragged: fyne.NewDelta(6, -3), }, d1.popDragEvent(), ) @@ -233,8 +230,7 @@ func TestWindow_HandleDragging(t *testing.T) { &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(4, 3), AbsolutePosition: fyne.NewPos(22, 7)}, - DraggedX: 0, - DraggedY: 1, + Dragged: fyne.NewDelta(0, 1), }, d2.popDragEvent(), ) @@ -258,8 +254,7 @@ func TestWindow_DragObjectThatMoves(t *testing.T) { &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(4, 4), AbsolutePosition: fyne.NewPos(8, 8)}, - DraggedX: -1, - DraggedY: -1, + Dragged: fyne.NewDelta(-1, -1), }, d1.popDragEvent(), ) @@ -275,8 +270,7 @@ func TestWindow_DragObjectThatMoves(t *testing.T) { &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(7, 7), AbsolutePosition: fyne.NewPos(10, 10)}, - DraggedX: 2, - DraggedY: 2, + Dragged: fyne.NewDelta(2, 2), }, d1.popDragEvent(), ) @@ -363,8 +357,7 @@ func TestWindow_HoverableOnDragging(t *testing.T) { &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(4, 4), AbsolutePosition: fyne.NewPos(8, 8)}, - DraggedX: 0, - DraggedY: 0, + Dragged: fyne.NewDelta(0, 0), }, dh.popDragEvent(), ) @@ -376,8 +369,7 @@ func TestWindow_HoverableOnDragging(t *testing.T) { &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(12, 4), AbsolutePosition: fyne.NewPos(16, 8)}, - DraggedX: 8, - DraggedY: 0, + Dragged: fyne.NewDelta(8, 0), }, dh.popDragEvent(), ) @@ -391,8 +383,7 @@ func TestWindow_HoverableOnDragging(t *testing.T) { &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(4, 4), AbsolutePosition: fyne.NewPos(8, 8)}, - DraggedX: -8, - DraggedY: 0, + Dragged: fyne.NewDelta(-8, 0), }, dh.popDragEvent(), ) @@ -743,12 +734,12 @@ func TestWindow_Padded(t *testing.T) { w.SetContent(content) width, _ := w.(*window).minSizeOnScreen() - assert.Equal(t, theme.Padding()*2+content.MinSize().Width, width) + assert.Equal(t, int(theme.Padding()*2+content.MinSize().Width), width) assert.Equal(t, theme.Padding(), content.Position().X) } func TestWindow_SetPadded(t *testing.T) { - var menuHeight int + var menuHeight float32 if hasNativeMenu() { menuHeight = 0 } else { @@ -759,8 +750,8 @@ func TestWindow_SetPadded(t *testing.T) { name string padding bool menu bool - expectedPad int - expectedMenuHeight int + expectedPad float32 + expectedMenuHeight float32 }{ {"window without padding", false, false, 0, 0}, {"window with padding", true, false, 4, 0}, diff --git a/internal/driver/gomobile/canvas.go b/internal/driver/gomobile/canvas.go index 0642d0d7ec..ad373f6142 100644 --- a/internal/driver/gomobile/canvas.go +++ b/internal/driver/gomobile/canvas.go @@ -61,8 +61,8 @@ func (c *mobileCanvas) InteractiveArea() (fyne.Position, fyne.Size) { return fyne.NewPos(0, 0), c.Size() // running in test mode } - return fyne.NewPos(int(float32(dev.safeLeft)/scale), int(float32(dev.safeTop)/scale)), - fyne.NewSize(int(float32(dev.safeWidth)/scale), int(float32(dev.safeHeight)/scale)) + return fyne.NewPos(float32(dev.safeLeft)/scale, float32(dev.safeTop)/scale), + fyne.NewSize(float32(dev.safeWidth)/scale, float32(dev.safeHeight)/scale) } func (c *mobileCanvas) SetContent(content fyne.CanvasObject) { @@ -269,7 +269,7 @@ func (c *mobileCanvas) ensureMinSize() { objToLayout = parent } else { size := obj.Size() - expectedSize := minSize.Union(size) + expectedSize := minSize.Max(size) if expectedSize != size && size != c.size { objToLayout = nil obj.Resize(expectedSize) @@ -406,8 +406,7 @@ func (c *mobileCanvas) tapMove(pos fyne.Position, tapID int, ev := new(fyne.DragEvent) ev.Position = objPos - ev.DraggedX = deltaX - ev.DraggedY = deltaY + ev.Dragged = fyne.Delta{DX: deltaX, DY: deltaY} dragCallback(c.dragging, ev) } diff --git a/internal/driver/gomobile/canvas_test.go b/internal/driver/gomobile/canvas_test.go index 3ffe6a5527..d94fc892d2 100644 --- a/internal/driver/gomobile/canvas_test.go +++ b/internal/driver/gomobile/canvas_test.go @@ -158,7 +158,7 @@ func TestCanvas_Dragged(t *testing.T) { c := NewCanvas().(*mobileCanvas) c.SetContent(scroll) c.resize(fyne.NewSize(40, 24)) - assert.Equal(t, 0, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.Y) c.tapDown(fyne.NewPos(32, 3), 0) c.tapMove(fyne.NewPos(32, 10), 0, func(wid fyne.Draggable, ev *fyne.DragEvent) { diff --git a/internal/driver/gomobile/driver.go b/internal/driver/gomobile/driver.go index 5f030cfa6e..3315c4faab 100644 --- a/internal/driver/gomobile/driver.go +++ b/internal/driver/gomobile/driver.go @@ -64,7 +64,7 @@ func (d *mobileDriver) currentWindow() fyne.Window { return d.windows[len(d.windows)-1] } -func (d *mobileDriver) RenderedTextSize(text string, size int, style fyne.TextStyle) fyne.Size { +func (d *mobileDriver) RenderedTextSize(text string, size float32, style fyne.TextStyle) fyne.Size { return painter.RenderedTextSize(text, size, style) } @@ -145,7 +145,7 @@ func (d *mobileDriver) Run() { } if d.freeDirtyTextures(canvas) { - newSize := fyne.NewSize(int(float32(currentSize.WidthPx)/canvas.scale), int(float32(currentSize.HeightPx)/canvas.scale)) + newSize := fyne.NewSize(float32(currentSize.WidthPx)/canvas.scale, float32(currentSize.HeightPx)/canvas.scale) if canvas.minSizeChanged() { canvas.ensureMinSize() diff --git a/internal/driver/gomobile/menu.go b/internal/driver/gomobile/menu.go index 72322bfb81..90fdd88d0a 100644 --- a/internal/driver/gomobile/menu.go +++ b/internal/driver/gomobile/menu.go @@ -5,7 +5,8 @@ import ( "fyne.io/fyne" "fyne.io/fyne/canvas" - internalWidget "fyne.io/fyne/internal/widget" + "fyne.io/fyne/container" + "fyne.io/fyne/internal/cache" "fyne.io/fyne/layout" "fyne.io/fyne/theme" "fyne.io/fyne/widget" @@ -22,10 +23,9 @@ type menuLabel struct { func (m *menuLabel) Tapped(*fyne.PointEvent) { pos := fyne.CurrentApp().Driver().AbsolutePositionForObject(m) - widget.ShowPopUpMenuAtPosition(m.menu, m.canvas, fyne.NewPos(pos.X+m.Size().Width, pos.Y)) + menu := widget.NewPopUpMenu(m.menu, m.canvas) + menu.ShowAtPosition(fyne.NewPos(pos.X+m.Size().Width, pos.Y)) - // TODO use NewPopUpMenu in 2.0 once the Deprecated - menu := m.canvas.Overlays().Top().(*internalWidget.OverlayContainer).Content.(*widget.Menu) menuDismiss := menu.OnDismiss // this dismisses the menu stack menu.OnDismiss = func() { menuDismiss() @@ -35,7 +35,7 @@ func (m *menuLabel) Tapped(*fyne.PointEvent) { } func (m *menuLabel) CreateRenderer() fyne.WidgetRenderer { - return widget.Renderer(m.Box) + return cache.Renderer(m.Box) } func newMenuLabel(item *fyne.Menu, parent *widget.Box, c *mobileCanvas) *menuLabel { @@ -57,7 +57,7 @@ func (c *mobileCanvas) showMenu(menu *fyne.MainMenu) { panel.Append(newMenuLabel(item, panel, c)) } shadow := canvas.NewHorizontalGradient(theme.ShadowColor(), color.Transparent) - c.menu = fyne.NewContainer(panel, shadow) + c.menu = container.NewWithoutLayout(panel, shadow) safePos, safeSize := c.InteractiveArea() panel.Move(safePos) diff --git a/internal/painter/draw.go b/internal/painter/draw.go index c67c24944c..91049d69d8 100644 --- a/internal/painter/draw.go +++ b/internal/painter/draw.go @@ -13,15 +13,15 @@ import ( // DrawCircle rasterizes the given circle object into an image. // The bounds of the output image will be increased by vectorPad to allow for stroke overflow at the edges. // The scale function is used to understand how many pixels are required per unit of size. -func DrawCircle(circle *canvas.Circle, vectorPad int, scale func(float32) int) *image.RGBA { +func DrawCircle(circle *canvas.Circle, vectorPad float32, scale func(float32) float32) *image.RGBA { radius := float32(math.Min(float64(circle.Size().Width), float64(circle.Size().Height)) / 2) - width := scale(float32(circle.Size().Width + vectorPad*2)) - height := scale(float32(circle.Size().Height + vectorPad*2)) + width := int(scale(circle.Size().Width + vectorPad*2)) + height := int(scale(circle.Size().Height + vectorPad*2)) stroke := scale(circle.StrokeWidth) raw := image.NewRGBA(image.Rect(0, 0, width, height)) - scanner := rasterx.NewScannerGV(circle.Size().Width, circle.Size().Height, raw, raw.Bounds()) + scanner := rasterx.NewScannerGV(int(circle.Size().Width), int(circle.Size().Height), raw, raw.Bounds()) if circle.FillColor != nil { filler := rasterx.NewFiller(width, height, scanner) @@ -42,19 +42,19 @@ func DrawCircle(circle *canvas.Circle, vectorPad int, scale func(float32) int) * // DrawLine rasterizes the given line object into an image. // The bounds of the output image will be increased by vectorPad to allow for stroke overflow at the edges. // The scale function is used to understand how many pixels are required per unit of size. -func DrawLine(line *canvas.Line, vectorPad int, scale func(float32) int) *image.RGBA { +func DrawLine(line *canvas.Line, vectorPad float32, scale func(float32) float32) *image.RGBA { col := line.StrokeColor - width := scale(float32(line.Size().Width + vectorPad*2)) - height := scale(float32(line.Size().Height + vectorPad*2)) + width := int(scale(line.Size().Width + vectorPad*2)) + height := int(scale(line.Size().Height + vectorPad*2)) stroke := scale(line.StrokeWidth) raw := image.NewRGBA(image.Rect(0, 0, width, height)) - scanner := rasterx.NewScannerGV(line.Size().Width, line.Size().Height, raw, raw.Bounds()) + scanner := rasterx.NewScannerGV(int(line.Size().Width), int(line.Size().Height), raw, raw.Bounds()) dasher := rasterx.NewDasher(width, height, scanner) dasher.SetColor(col) dasher.SetStroke(fixed.Int26_6(float64(stroke)*64), 0, nil, nil, nil, 0, nil, 0) - p1x, p1y := scale(float32(line.Position1.X-line.Position().X+vectorPad)), scale(float32(line.Position1.Y-line.Position().Y+vectorPad)) - p2x, p2y := scale(float32(line.Position2.X-line.Position().X+vectorPad)), scale(float32(line.Position2.Y-line.Position().Y+vectorPad)) + p1x, p1y := scale(line.Position1.X-line.Position().X+vectorPad), scale(line.Position1.Y-line.Position().Y+vectorPad) + p2x, p2y := scale(line.Position2.X-line.Position().X+vectorPad), scale(line.Position2.Y-line.Position().Y+vectorPad) dasher.Start(rasterx.ToFixedP(float64(p1x), float64(p1y))) dasher.Line(rasterx.ToFixedP(float64(p2x), float64(p2y))) @@ -67,19 +67,19 @@ func DrawLine(line *canvas.Line, vectorPad int, scale func(float32) int) *image. // DrawRectangle rasterizes the given rectangle object with stroke border into an image. // The bounds of the output image will be increased by vectorPad to allow for stroke overflow at the edges. // The scale function is used to understand how many pixels are required per unit of size. -func DrawRectangle(rect *canvas.Rectangle, vectorPad int, scale func(float32) int) *image.RGBA { - width := scale(float32(rect.Size().Width + vectorPad*2)) - height := scale(float32(rect.Size().Height + vectorPad*2)) +func DrawRectangle(rect *canvas.Rectangle, vectorPad float32, scale func(float32) float32) *image.RGBA { + width := int(scale(rect.Size().Width + vectorPad*2)) + height := int(scale(rect.Size().Height + vectorPad*2)) stroke := scale(rect.StrokeWidth) raw := image.NewRGBA(image.Rect(0, 0, width, height)) - scanner := rasterx.NewScannerGV(rect.Size().Width, rect.Size().Height, raw, raw.Bounds()) + scanner := rasterx.NewScannerGV(int(rect.Size().Width), int(rect.Size().Height), raw, raw.Bounds()) - scaledPad := scale(float32(vectorPad)) + scaledPad := scale(vectorPad) p1x, p1y := scaledPad, scaledPad - p2x, p2y := scale(float32(rect.Size().Width))+scaledPad, scaledPad - p3x, p3y := scale(float32(rect.Size().Width))+scaledPad, scale(float32(rect.Size().Height))+scaledPad - p4x, p4y := scaledPad, scale(float32(rect.Size().Height))+scaledPad + p2x, p2y := scale(rect.Size().Width)+scaledPad, scaledPad + p3x, p3y := scale(rect.Size().Width)+scaledPad, scale(rect.Size().Height)+scaledPad + p4x, p4y := scaledPad, scale(rect.Size().Height)+scaledPad if rect.FillColor != nil { filler := rasterx.NewFiller(width, height, scanner) diff --git a/internal/painter/font.go b/internal/painter/font.go index 1b8fb6e378..a9a91c8b70 100644 --- a/internal/painter/font.go +++ b/internal/painter/font.go @@ -4,11 +4,12 @@ import ( "image" "sync" - "fyne.io/fyne" - "fyne.io/fyne/theme" "github.com/goki/freetype/truetype" "golang.org/x/image/font" "golang.org/x/image/math/fixed" + + "fyne.io/fyne" + "fyne.io/fyne/theme" ) // TextDPI is a global constant that determines how text scales to interface sizes @@ -24,7 +25,7 @@ func loadFont(data fyne.Resource) *truetype.Font { } // RenderedTextSize looks up how bit a string would be if drawn on screen -func RenderedTextSize(text string, size int, style fyne.TextStyle) fyne.Size { +func RenderedTextSize(text string, size float32, style fyne.TextStyle) fyne.Size { var opts truetype.Options opts.Size = float64(size) opts.DPI = TextDPI @@ -32,7 +33,7 @@ func RenderedTextSize(text string, size int, style fyne.TextStyle) fyne.Size { face := CachedFontFace(style, &opts) advance := font.MeasureString(face, text) - return fyne.NewSize(advance.Ceil(), face.Metrics().Height.Ceil()) + return fyne.NewSize(float32(advance.Ceil()), float32(face.Metrics().Height.Ceil())) } type compositeFace struct { diff --git a/internal/painter/gl/draw.go b/internal/painter/gl/draw.go index a02eb35398..4096feb02f 100644 --- a/internal/painter/gl/draw.go +++ b/internal/painter/gl/draw.go @@ -13,15 +13,15 @@ func rectInnerCoords(size fyne.Size, pos fyne.Position, fill canvas.ImageFill, a if fill == canvas.ImageFillContain || fill == canvas.ImageFillOriginal { // change pos and size accordingly - viewAspect := float32(size.Width) / float32(size.Height) + viewAspect := size.Width / size.Height newWidth, newHeight := size.Width, size.Height - widthPad, heightPad := 0, 0 + widthPad, heightPad := float32(0), float32(0) if viewAspect > aspect { - newWidth = int(float32(size.Height) * aspect) + newWidth = size.Height * aspect widthPad = (size.Width - newWidth) / 2 } else if viewAspect < aspect { - newHeight = int(float32(size.Width) / aspect) + newHeight = size.Width / aspect heightPad = (size.Height - newHeight) / 2 } @@ -33,17 +33,17 @@ func rectInnerCoords(size fyne.Size, pos fyne.Position, fill canvas.ImageFill, a // rectCoords calculates the openGL coordinate space of a rectangle func (p *glPainter) rectCoords(size fyne.Size, pos fyne.Position, frame fyne.Size, - fill canvas.ImageFill, aspect float32, pad int) []float32 { + fill canvas.ImageFill, aspect float32, pad float32) []float32 { size, pos = rectInnerCoords(size, pos, fill, aspect) - xPos := float32(pos.X-pad) / float32(frame.Width) + xPos := (pos.X - pad) / frame.Width x1 := -1 + xPos*2 - x2Pos := float32(pos.X+size.Width+pad) / float32(frame.Width) + x2Pos := (pos.X + size.Width + pad) / frame.Width x2 := -1 + x2Pos*2 - yPos := float32(pos.Y-pad) / float32(frame.Height) + yPos := (pos.Y - pad) / frame.Height y1 := 1 - yPos*2 - y2Pos := float32(pos.Y+size.Height+pad) / float32(frame.Height) + y2Pos := (pos.Y + size.Height + pad) / frame.Height y2 := 1 - y2Pos*2 return []float32{ @@ -56,7 +56,7 @@ func (p *glPainter) rectCoords(size fyne.Size, pos fyne.Position, frame fyne.Siz } func (p *glPainter) drawTextureWithDetails(o fyne.CanvasObject, creator func(canvasObject fyne.CanvasObject) Texture, - pos fyne.Position, size, frame fyne.Size, fill canvas.ImageFill, alpha float32, pad int) { + pos fyne.Position, size, frame fyne.Size, fill canvas.ImageFill, alpha float32, pad float32) { texture := getTexture(o, creator) if texture == NoTexture { diff --git a/internal/painter/gl/gl_common.go b/internal/painter/gl/gl_common.go index 1f30b618fb..d8416311ac 100644 --- a/internal/painter/gl/gl_common.go +++ b/internal/painter/gl/gl_common.go @@ -84,8 +84,8 @@ func (p *glPainter) newGlTextTexture(obj fyne.CanvasObject) Texture { text := obj.(*canvas.Text) bounds := text.MinSize() - width := p.textureScaleInt(bounds.Width) - height := p.textureScaleInt(bounds.Height) + width := int(p.textureScale(bounds.Width)) + height := int(p.textureScale(bounds.Height)) img := image.NewRGBA(image.Rect(0, 0, width, height)) var opts truetype.Options @@ -107,10 +107,10 @@ func (p *glPainter) newGlTextTexture(obj fyne.CanvasObject) Texture { func (p *glPainter) newGlImageTexture(obj fyne.CanvasObject) Texture { img := obj.(*canvas.Image) - width := p.textureScaleInt(img.Size().Width) - height := p.textureScaleInt(img.Size().Height) + width := p.textureScale(img.Size().Width) + height := p.textureScale(img.Size().Height) - tex := painter.PaintImage(img, p.canvas, width, height) + tex := painter.PaintImage(img, p.canvas, int(width), int(height)) if tex == nil { return NoTexture } @@ -121,26 +121,26 @@ func (p *glPainter) newGlImageTexture(obj fyne.CanvasObject) Texture { func (p *glPainter) newGlRasterTexture(obj fyne.CanvasObject) Texture { rast := obj.(*canvas.Raster) - width := p.textureScaleInt(rast.Size().Width) - height := p.textureScaleInt(rast.Size().Height) + width := p.textureScale(rast.Size().Width) + height := p.textureScale(rast.Size().Height) - return p.imgToTexture(rast.Generator(width, height), rast.ScaleMode) + return p.imgToTexture(rast.Generator(int(width), int(height)), rast.ScaleMode) } func (p *glPainter) newGlLinearGradientTexture(obj fyne.CanvasObject) Texture { gradient := obj.(*canvas.LinearGradient) - width := p.textureScaleInt(gradient.Size().Width) - height := p.textureScaleInt(gradient.Size().Height) + width := p.textureScale(gradient.Size().Width) + height := p.textureScale(gradient.Size().Height) - return p.imgToTexture(gradient.Generate(width, height), canvas.ImageScaleSmooth) + return p.imgToTexture(gradient.Generate(int(width), int(height)), canvas.ImageScaleSmooth) } func (p *glPainter) newGlRadialGradientTexture(obj fyne.CanvasObject) Texture { gradient := obj.(*canvas.RadialGradient) - width := p.textureScaleInt(gradient.Size().Width) - height := p.textureScaleInt(gradient.Size().Height) + width := p.textureScale(gradient.Size().Width) + height := p.textureScale(gradient.Size().Height) - return p.imgToTexture(gradient.Generate(width, height), canvas.ImageScaleSmooth) + return p.imgToTexture(gradient.Generate(int(width), int(height)), canvas.ImageScaleSmooth) } diff --git a/internal/painter/gl/painter.go b/internal/painter/gl/painter.go index 7cb065e47b..70270b7054 100644 --- a/internal/painter/gl/painter.go +++ b/internal/painter/gl/painter.go @@ -52,10 +52,10 @@ func (p *glPainter) Clear() { } func (p *glPainter) StartClipping(pos fyne.Position, size fyne.Size) { - x := p.textureScaleInt(pos.X) - y := p.textureScaleInt(pos.Y) - w := p.textureScaleInt(size.Width) - h := p.textureScaleInt(size.Height) + x := p.textureScale(pos.X) + y := p.textureScale(pos.Y) + w := p.textureScale(size.Width) + h := p.textureScale(size.Height) p.glScissorOpen(int32(x), int32(y), int32(w), int32(h)) } @@ -73,18 +73,11 @@ func (p *glPainter) Free(obj fyne.CanvasObject) { p.freeTexture(obj) } -func (p *glPainter) textureScaleInt(v int) int { +func (p *glPainter) textureScale(v float32) float32 { if p.canvas.Scale() == 1.0 && p.texScale == 1.0 { return v } - return int(math.Round(float64(v) * float64(p.canvas.Scale()*p.texScale))) -} - -func (p *glPainter) textureScale(v float32) int { - if p.canvas.Scale() == 1.0 && p.texScale == 1.0 { - return int(v) - } - return int(math.Round(float64(v) * float64(p.canvas.Scale()*p.texScale))) + return float32(math.Round(float64(v * p.canvas.Scale() * p.texScale))) } var startCacheMonitor = &sync.Once{} diff --git a/internal/painter/image.go b/internal/painter/image.go index d3a59f5a8f..1fe80f7c29 100644 --- a/internal/painter/image.go +++ b/internal/painter/image.go @@ -129,8 +129,8 @@ func scaleImage(pixels image.Image, scaledW, scaledH int, scale canvas.ImageScal return pixels } - pixW := fyne.Min(scaledW, pixels.Bounds().Dx()) // don't push more pixels than we have to - pixH := fyne.Min(scaledH, pixels.Bounds().Dy()) // the GL calls will scale this up on GPU. + pixW := int(fyne.Min(float32(scaledW), float32(pixels.Bounds().Dx()))) // don't push more pixels than we have to + pixH := int(fyne.Min(float32(scaledH), float32(pixels.Bounds().Dy()))) // the GL calls will scale this up on GPU. scaledBounds := image.Rect(0, 0, pixW, pixH) tex := image.NewNRGBA(scaledBounds) switch scale { diff --git a/internal/painter/image_test.go b/internal/painter/image_test.go index 058d6beae0..325eb05067 100644 --- a/internal/painter/image_test.go +++ b/internal/painter/image_test.go @@ -14,8 +14,8 @@ func TestPaintImage_SVG(t *testing.T) { defer test.NewApp() for name, tt := range map[string]struct { - width int - height int + width float32 + height float32 fillMode canvas.ImageFill wantImage string }{ diff --git a/internal/painter/software/draw.go b/internal/painter/software/draw.go index 78e18379d6..8888a560cf 100644 --- a/internal/painter/software/draw.go +++ b/internal/painter/software/draw.go @@ -29,8 +29,8 @@ func drawCircle(c fyne.Canvas, circle *canvas.Circle, pos fyne.Position, base *i scaledX, scaledY := internal.ScaleInt(c, pos.X-pad), internal.ScaleInt(c, pos.Y-pad) bounds := clip.Intersect(image.Rect(scaledX, scaledY, scaledX+scaledWidth, scaledY+scaledHeight)) - raw := painter.DrawCircle(circle, pad, func(in float32) int { - return int(math.Round(float64(in) * float64(c.Scale()))) + raw := painter.DrawCircle(circle, pad, func(in float32) float32 { + return float32(math.Round(float64(in) * float64(c.Scale()))) }) // the clip intersect above cannot be negative, so we may need to compensate @@ -112,8 +112,8 @@ func drawLine(c fyne.Canvas, line *canvas.Line, pos fyne.Position, base *image.N scaledX, scaledY := internal.ScaleInt(c, pos.X-pad), internal.ScaleInt(c, pos.Y-pad) bounds := clip.Intersect(image.Rect(scaledX, scaledY, scaledX+scaledWidth, scaledY+scaledHeight)) - raw := painter.DrawLine(line, pad, func(in float32) int { - return int(math.Round(float64(in) * float64(c.Scale()))) + raw := painter.DrawLine(line, pad, func(in float32) float32 { + return float32(math.Round(float64(in) * float64(c.Scale()))) }) // the clip intersect above cannot be negative, so we may need to compensate @@ -141,8 +141,8 @@ func drawText(c fyne.Canvas, text *canvas.Text, pos fyne.Position, base *image.N txtImg := image.NewRGBA(image.Rect(0, 0, width, height)) var opts truetype.Options - fontSize := float64(text.TextSize) * float64(c.Scale()) - opts.Size = fontSize + fontSize := text.TextSize * c.Scale() + opts.Size = float64(fontSize) opts.DPI = painter.TextDPI face := painter.CachedFontFace(text.TextStyle, &opts) @@ -154,8 +154,8 @@ func drawText(c fyne.Canvas, text *canvas.Text, pos fyne.Position, base *image.N d.DrawString(text.Text) size := text.Size() - offsetX := 0 - offsetY := 0 + offsetX := float32(0) + offsetY := float32(0) switch text.Alignment { case fyne.TextAlignTrailing: offsetX = size.Width - bounds.Width @@ -197,8 +197,8 @@ func drawRectangleStroke(c fyne.Canvas, rect *canvas.Rectangle, pos fyne.Positio scaledX, scaledY := internal.ScaleInt(c, pos.X-pad), internal.ScaleInt(c, pos.Y-pad) bounds := clip.Intersect(image.Rect(scaledX, scaledY, scaledX+scaledWidth, scaledY+scaledHeight)) - raw := painter.DrawRectangle(rect, pad, func(in float32) int { - return int(math.Round(float64(in) * float64(c.Scale()))) + raw := painter.DrawRectangle(rect, pad, func(in float32) float32 { + return float32(math.Round(float64(in) * float64(c.Scale()))) }) // the clip intersect above cannot be negative, so we may need to compensate diff --git a/internal/painter/software/painter.go b/internal/painter/software/painter.go index c75b7b5b40..79be9ed78d 100644 --- a/internal/painter/software/painter.go +++ b/internal/painter/software/painter.go @@ -29,11 +29,13 @@ func (*Painter) Paint(c fyne.Canvas) image.Image { draw.Draw(base, bounds, image.NewUniform(theme.BackgroundColor()), image.Point{}, draw.Src) paint := func(obj fyne.CanvasObject, pos, clipPos fyne.Position, clipSize fyne.Size) bool { + w := fyne.Min(clipPos.X+clipSize.Width, c.Size().Width) + h := fyne.Min(clipPos.Y+clipSize.Height, c.Size().Height) clip := image.Rect( internal.ScaleInt(c, clipPos.X), internal.ScaleInt(c, clipPos.Y), - internal.ScaleInt(c, clipPos.X+clipSize.Width), - internal.ScaleInt(c, clipPos.Y+clipSize.Height), + internal.ScaleInt(c, w), + internal.ScaleInt(c, h), ) switch o := obj.(type) { case *canvas.Image: diff --git a/internal/painter/software/painter_test.go b/internal/painter/software/painter_test.go index 7d52544f18..b3b9fd06a3 100644 --- a/internal/painter/software/painter_test.go +++ b/internal/painter/software/painter_test.go @@ -54,7 +54,7 @@ func TestPainter_paintGradient_clipped(t *testing.T) { scroll := widget.NewScrollContainer(g) scroll.Move(fyne.NewPos(10, 10)) scroll.Resize(fyne.NewSize(50, 50)) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -30, DeltaY: -30}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-30, -30)}) cont := fyne.NewContainer(scroll) c := test.NewCanvas() c.SetPadded(false) @@ -86,7 +86,7 @@ func TestPainter_paintImage_clipped(t *testing.T) { scroll := widget.NewScrollContainer(img) scroll.Move(fyne.NewPos(10, 10)) scroll.Resize(fyne.NewSize(50, 50)) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -15, DeltaY: -15}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-15, -15)}) cont := fyne.NewContainer(scroll) c := test.NewCanvas() c.SetPadded(false) @@ -292,7 +292,7 @@ func TestPainter_paintRectangle_clipped(t *testing.T) { scroll := widget.NewScrollContainer(box) scroll.Move(fyne.NewPos(10, 10)) scroll.Resize(fyne.NewSize(50, 50)) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -10, DeltaY: -10}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-10, -10)}) cont := fyne.NewContainer(scroll) c := test.NewCanvas() c.SetPadded(false) @@ -323,7 +323,7 @@ func TestPainter_paintText_clipped(t *testing.T) { scroll := widget.NewScrollContainer(widget.NewLabel("some text\nis here\nand here")) scroll.Move(fyne.NewPos(10, 10)) scroll.Resize(fyne.NewSize(50, 50)) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -10, DeltaY: -10}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-10, -10)}) cont := fyne.NewContainer(scroll) c := test.NewCanvas() c.SetPadded(false) @@ -340,7 +340,7 @@ func TestPainter_paintWidgetBackground_clipped(t *testing.T) { scroll := widget.NewScrollContainer(w) scroll.Move(fyne.NewPos(10, 10)) scroll.Resize(fyne.NewSize(50, 50)) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -10, DeltaY: -10}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-10, -10)}) cont := fyne.NewContainer(scroll) c := test.NewCanvas() c.SetPadded(false) diff --git a/internal/painter/software/testdata/draw_image_clipped.png b/internal/painter/software/testdata/draw_image_clipped.png index 30cf7b86a4..09fbd0f9a0 100644 Binary files a/internal/painter/software/testdata/draw_image_clipped.png and b/internal/painter/software/testdata/draw_image_clipped.png differ diff --git a/internal/painter/software/testdata/draw_rect_clipped.png b/internal/painter/software/testdata/draw_rect_clipped.png index 77b63f3ba1..9713ddb5d6 100644 Binary files a/internal/painter/software/testdata/draw_rect_clipped.png and b/internal/painter/software/testdata/draw_rect_clipped.png differ diff --git a/internal/painter/software/testdata/draw_text_clipped.png b/internal/painter/software/testdata/draw_text_clipped.png index 1404f19785..755dce022f 100644 Binary files a/internal/painter/software/testdata/draw_text_clipped.png and b/internal/painter/software/testdata/draw_text_clipped.png differ diff --git a/internal/painter/vector.go b/internal/painter/vector.go index 116cbdfb3b..ef1cf41ddb 100644 --- a/internal/painter/vector.go +++ b/internal/painter/vector.go @@ -8,19 +8,19 @@ import ( // VectorPad returns the number of additional points that should be added around a texture. // This is to accommodate overflow caused by stroke and line endings etc. // THe result is in fyne.Size type coordinates and should be scaled for output. -func VectorPad(obj fyne.CanvasObject) int { +func VectorPad(obj fyne.CanvasObject) float32 { switch co := obj.(type) { case *canvas.Circle: if co.StrokeWidth > 0 && co.StrokeColor != nil { - return int(co.StrokeWidth) + 2 + return co.StrokeWidth + 2 } case *canvas.Line: if co.StrokeWidth > 0 { - return int(co.StrokeWidth) + 2 + return co.StrokeWidth + 2 } case *canvas.Rectangle: if co.StrokeWidth > 0 && co.StrokeColor != nil { - return int(co.StrokeWidth) + 2 + return co.StrokeWidth + 2 } } diff --git a/internal/scale.go b/internal/scale.go index 67a5ac4876..a56a692ed8 100644 --- a/internal/scale.go +++ b/internal/scale.go @@ -7,21 +7,16 @@ import ( ) // ScaleInt converts a fyne coordinate in the given canvas to a screen coordinate -func ScaleInt(c fyne.Canvas, v int) int { - switch c.Scale() { - case 1.0: - return v - default: - return int(math.Round(float64(v) * float64(c.Scale()))) - } +func ScaleInt(c fyne.Canvas, v float32) int { + return int(math.Round(float64(v * c.Scale()))) } // UnscaleInt converts a screen coordinate for a given canvas to a fyne coordinate -func UnscaleInt(c fyne.Canvas, v int) int { +func UnscaleInt(c fyne.Canvas, v int) float32 { switch c.Scale() { case 1.0: - return v + return float32(v) default: - return int(float32(v) / c.Scale()) + return float32(v) / c.Scale() } } diff --git a/internal/widget/shadow.go b/internal/widget/shadow.go index 6e370434a5..d4abaafb28 100644 --- a/internal/widget/shadow.go +++ b/internal/widget/shadow.go @@ -113,7 +113,7 @@ func (r *shadowRenderer) BackgroundColor() color.Color { } func (r *shadowRenderer) Layout(size fyne.Size) { - depth := int(r.s.level) + depth := float32(r.s.level) if r.tl != nil { r.tl.Resize(fyne.NewSize(depth, depth)) r.tl.Move(fyne.NewPos(-depth, -depth)) diff --git a/layout/borderlayout.go b/layout/borderlayout.go index 6c46127270..d329331f69 100644 --- a/layout/borderlayout.go +++ b/layout/borderlayout.go @@ -71,7 +71,7 @@ func (b *borderLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { } if child != b.top && child != b.bottom && child != b.left && child != b.right { - minSize = minSize.Union(child.MinSize()) + minSize = minSize.Max(child.MinSize()) } } diff --git a/layout/borderlayout_test.go b/layout/borderlayout_test.go index 2d6538868c..7fff3c8027 100644 --- a/layout/borderlayout_test.go +++ b/layout/borderlayout_test.go @@ -24,11 +24,11 @@ func TestNewBorderContainer(t *testing.T) { assert.Equal(t, 3, len(c.Objects)) c.Resize(fyne.NewSize(100, 100)) - assert.Equal(t, 0, top.Position().X) - assert.Equal(t, 0, top.Position().Y) - assert.Equal(t, 90, right.Position().X) + assert.Equal(t, float32(0), top.Position().X) + assert.Equal(t, float32(0), top.Position().Y) + assert.Equal(t, float32(90), right.Position().X) assert.Equal(t, 10+theme.Padding(), right.Position().Y) - assert.Equal(t, 0, middle.Position().X) + assert.Equal(t, float32(0), middle.Position().X) assert.Equal(t, 10+theme.Padding(), middle.Position().Y) assert.Equal(t, 90-theme.Padding(), middle.Size().Width) assert.Equal(t, 90-theme.Padding(), middle.Size().Height) diff --git a/layout/boxlayout.go b/layout/boxlayout.go index ca99f04ee2..7737d66b22 100644 --- a/layout/boxlayout.go +++ b/layout/boxlayout.go @@ -58,7 +58,7 @@ func (g *boxLayout) isSpacer(obj fyne.CanvasObject) bool { // Any spacers added will pad the view, sharing the space if there are two or more. func (g *boxLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { spacers := make([]fyne.CanvasObject, 0) - total := 0 + total := float32(0) for _, child := range objects { if !child.Visible() { continue @@ -75,16 +75,16 @@ func (g *boxLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { } } - x, y := 0, 0 - var extra int + x, y := float32(0), float32(0) + var extra float32 if g.horizontal { - extra = size.Width - total - (theme.Padding() * (len(objects) - len(spacers) - 1)) + extra = size.Width - total - (theme.Padding() * float32(len(objects)-len(spacers)-1)) } else { - extra = size.Height - total - (theme.Padding() * (len(objects) - len(spacers) - 1)) + extra = size.Height - total - (theme.Padding() * float32(len(objects)-len(spacers)-1)) } - extraCell := 0 + extraCell := float32(0) if len(spacers) > 0 { - extraCell = int(float64(extra) / float64(len(spacers))) + extraCell = extra / float32(len(spacers)) } for _, child := range objects { diff --git a/layout/boxlayout_test.go b/layout/boxlayout_test.go index dbc877dd09..e8ecee42a0 100644 --- a/layout/boxlayout_test.go +++ b/layout/boxlayout_test.go @@ -63,8 +63,8 @@ func TestHBoxLayout_Wide(t *testing.T) { container.Resize(fyne.NewSize(308, 100)) assert.Equal(t, fyne.NewSize(150+(theme.Padding()*2), 100), container.MinSize()) - assert.Equal(t, 50, obj1.Size().Width) - assert.Equal(t, 50, obj2.Size().Width) + assert.Equal(t, float32(50), obj1.Size().Width) + assert.Equal(t, float32(50), obj2.Size().Width) cell2Pos := fyne.NewPos(50+theme.Padding(), 0) assert.Equal(t, cell2Pos, obj2.Position()) cell3Pos := fyne.NewPos(100+theme.Padding()*2, 0) @@ -100,8 +100,8 @@ func TestHBoxLayout_Spacer(t *testing.T) { container.Resize(fyne.NewSize(300, 100)) assert.Equal(t, container.MinSize(), fyne.NewSize(150+(theme.Padding()*2), 100)) - assert.Equal(t, 50, obj1.Size().Width) - assert.Equal(t, 50, obj2.Size().Width) + assert.Equal(t, float32(50), obj1.Size().Width) + assert.Equal(t, float32(50), obj2.Size().Width) cell2Pos := fyne.NewPos(200-theme.Padding(), 0) assert.Equal(t, cell2Pos, obj2.Position()) cell3Pos := fyne.NewPos(250, 0) @@ -119,8 +119,8 @@ func TestHBoxLayout_MiddleSpacer(t *testing.T) { container.Resize(fyne.NewSize(300, 100)) assert.Equal(t, container.MinSize(), fyne.NewSize(150+(theme.Padding()*2), 100)) - assert.Equal(t, 50, obj1.Size().Width) - assert.Equal(t, 50, obj2.Size().Width) + assert.Equal(t, float32(50), obj1.Size().Width) + assert.Equal(t, float32(50), obj2.Size().Width) cell2Pos := fyne.NewPos(50+theme.Padding(), 0) assert.Equal(t, cell2Pos, obj2.Position()) cell3Pos := fyne.NewPos(250, 0) @@ -189,8 +189,8 @@ func TestVBoxLayout_Tall(t *testing.T) { container.Resize(fyne.NewSize(100, 308)) assert.Equal(t, container.MinSize(), fyne.NewSize(100, 150+(theme.Padding()*2))) - assert.Equal(t, 50, obj1.Size().Height) - assert.Equal(t, 50, obj2.Size().Height) + assert.Equal(t, float32(50), obj1.Size().Height) + assert.Equal(t, float32(50), obj2.Size().Height) cell2Pos := fyne.NewPos(0, 50+theme.Padding()) assert.Equal(t, cell2Pos, obj2.Position()) cell3Pos := fyne.NewPos(0, 100+theme.Padding()*2) @@ -208,8 +208,8 @@ func TestVBoxLayout_Spacer(t *testing.T) { container.Resize(fyne.NewSize(100, 300)) assert.Equal(t, container.MinSize(), fyne.NewSize(100, 150+(theme.Padding()*2))) - assert.Equal(t, 50, obj1.Size().Height) - assert.Equal(t, 50, obj2.Size().Height) + assert.Equal(t, float32(50), obj1.Size().Height) + assert.Equal(t, float32(50), obj2.Size().Height) cell2Pos := fyne.NewPos(0, 200-theme.Padding()) assert.Equal(t, cell2Pos, obj2.Position()) cell3Pos := fyne.NewPos(0, 250) @@ -227,8 +227,8 @@ func TestVBoxLayout_MiddleSpacer(t *testing.T) { container.Resize(fyne.NewSize(100, 300)) assert.Equal(t, container.MinSize(), fyne.NewSize(100, 150+(theme.Padding()*2))) - assert.Equal(t, 50, obj1.Size().Height) - assert.Equal(t, 50, obj2.Size().Height) + assert.Equal(t, float32(50), obj1.Size().Height) + assert.Equal(t, float32(50), obj2.Size().Height) cell2Pos := fyne.NewPos(0, 50+theme.Padding()) assert.Equal(t, cell2Pos, obj2.Position()) cell3Pos := fyne.NewPos(0, 250) diff --git a/layout/centerlayout.go b/layout/centerlayout.go index 122260e554..fc733c69aa 100644 --- a/layout/centerlayout.go +++ b/layout/centerlayout.go @@ -19,7 +19,7 @@ func (c *centerLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { for _, child := range objects { childMin := child.MinSize() child.Resize(childMin) - child.Move(fyne.NewPos(int(float32(size.Width-childMin.Width)/2), int(float32(size.Height-childMin.Height)/2))) + child.Move(fyne.NewPos(float32(size.Width-childMin.Width)/2, float32(size.Height-childMin.Height)/2)) } } @@ -32,7 +32,7 @@ func (c *centerLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { continue } - minSize = minSize.Union(child.MinSize()) + minSize = minSize.Max(child.MinSize()) } return minSize diff --git a/layout/formlayout.go b/layout/formlayout.go index 4e604626f6..5a8cf40354 100644 --- a/layout/formlayout.go +++ b/layout/formlayout.go @@ -32,7 +32,7 @@ func (f *formLayout) countRows(objects []fyne.CanvasObject) int { // The width of the label column will be set as the max width value between all the label cells. // The width of the content column will be set as the max width value between all the content cells // or the remaining space of the bounding containerWidth, if it is larger. -func (f *formLayout) tableCellsSize(objects []fyne.CanvasObject, containerWidth int) [][2]fyne.Size { +func (f *formLayout) tableCellsSize(objects []fyne.CanvasObject, containerWidth float32) [][2]fyne.Size { rows := f.countRows(objects) table := make([][2]fyne.Size, rows) @@ -42,8 +42,8 @@ func (f *formLayout) tableCellsSize(objects []fyne.CanvasObject, containerWidth lowBound := 0 highBound := 2 - labelCellMaxWidth := 0 - contentCellMaxWidth := 0 + labelCellMaxWidth := float32(0) + contentCellMaxWidth := float32(0) for row := 0; row < rows; { currentRow := objects[lowBound:highBound] lowBound = highBound @@ -82,7 +82,7 @@ func (f *formLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { table := f.tableCellsSize(objects, size.Width) row := 0 - y := 0 + y := float32(0) for i := 0; i < len(objects); i += formLayoutCols { if !objects[i].Visible() && (i+1 < len(objects) && !objects[i+1].Visible()) { continue diff --git a/layout/formlayout_test.go b/layout/formlayout_test.go index 591f89c560..33691f246f 100644 --- a/layout/formlayout_test.go +++ b/layout/formlayout_test.go @@ -129,6 +129,6 @@ func TestFormLayout_MinSize_Hidden(t *testing.T) { l := layout.NewFormLayout() layoutMin := l.MinSize(container.Objects) expectedRowWidth := 50 + 100 + theme.Padding() - expectedRowHeight := 100 + expectedRowHeight := float32(100) assert.Equal(t, fyne.NewSize(expectedRowWidth, expectedRowHeight), layoutMin) } diff --git a/layout/gridlayout.go b/layout/gridlayout.go index 1b8986672f..b76b583d64 100644 --- a/layout/gridlayout.go +++ b/layout/gridlayout.go @@ -57,15 +57,15 @@ func (g *gridLayout) countRows(objects []fyne.CanvasObject) int { // Get the leading (top or left) edge of a grid cell. // size is the ideal cell size and the offset is which col or row its on. -func getLeading(size float64, offset int) int { +func getLeading(size float64, offset int) float32 { ret := (size + float64(theme.Padding())) * float64(offset) - return int(math.Round(ret)) + return float32(math.Round(ret)) } // Get the trailing (bottom or right) edge of a grid cell. // size is the ideal cell size and the offset is which col or row its on. -func getTrailing(size float64, offset int) int { +func getTrailing(size float64, offset int) float32 { return getLeading(size, offset+1) - theme.Padding() } @@ -75,8 +75,8 @@ func getTrailing(size float64, offset int) int { func (g *gridLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { rows := g.countRows(objects) - padWidth := (g.Cols - 1) * theme.Padding() - padHeight := (rows - 1) * theme.Padding() + padWidth := float32(g.Cols-1) * theme.Padding() + padHeight := float32(rows-1) * theme.Padding() cellWidth := float64(size.Width-padWidth) / float64(g.Cols) cellHeight := float64(size.Height-padHeight) / float64(rows) @@ -132,14 +132,14 @@ func (g *gridLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { continue } - minSize = minSize.Union(child.MinSize()) + minSize = minSize.Max(child.MinSize()) } if g.horizontal() { - minContentSize := fyne.NewSize(minSize.Width*g.Cols, minSize.Height*rows) - return minContentSize.Add(fyne.NewSize(theme.Padding()*fyne.Max(g.Cols-1, 0), theme.Padding()*fyne.Max(rows-1, 0))) + minContentSize := fyne.NewSize(minSize.Width*float32(g.Cols), minSize.Height*float32(rows)) + return minContentSize.Add(fyne.NewSize(theme.Padding()*fyne.Max(float32(g.Cols-1), 0), theme.Padding()*fyne.Max(float32(rows-1), 0))) } - minContentSize := fyne.NewSize(minSize.Width*rows, minSize.Height*g.Cols) - return minContentSize.Add(fyne.NewSize(theme.Padding()*fyne.Max(rows-1, 0), theme.Padding()*fyne.Max(g.Cols-1, 0))) + minContentSize := fyne.NewSize(minSize.Width*float32(rows), minSize.Height*float32(g.Cols)) + return minContentSize.Add(fyne.NewSize(theme.Padding()*fyne.Max(float32(rows-1), 0), theme.Padding()*fyne.Max(float32(g.Cols-1), 0))) } diff --git a/layout/gridwraplayout.go b/layout/gridwraplayout.go index 989a7f3a10..ab077462cd 100644 --- a/layout/gridwraplayout.go +++ b/layout/gridwraplayout.go @@ -32,7 +32,7 @@ func (g *gridWrapLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { g.colCount = int(math.Floor(float64(size.Width+theme.Padding()) / float64(g.CellSize.Width+theme.Padding()))) } - i, x, y := 0, 0, 0 + i, x, y := 0, float32(0), float32(0) for _, child := range objects { if !child.Visible() { continue @@ -60,5 +60,5 @@ func (g *gridWrapLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { // of columns as this layout re-flows dynamically. func (g *gridWrapLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { return fyne.NewSize(g.CellSize.Width, - (g.CellSize.Height*g.rowCount)+((g.rowCount-1)*theme.Padding())) + (g.CellSize.Height*float32(g.rowCount))+(float32(g.rowCount-1)*theme.Padding())) } diff --git a/layout/maxlayout.go b/layout/maxlayout.go index 31bde0871a..492b5fcade 100644 --- a/layout/maxlayout.go +++ b/layout/maxlayout.go @@ -33,7 +33,7 @@ func (m *maxLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { continue } - minSize = minSize.Union(child.MinSize()) + minSize = minSize.Max(child.MinSize()) } return minSize diff --git a/layout/paddedlayout.go b/layout/paddedlayout.go index fd71b68512..2d15202fd7 100644 --- a/layout/paddedlayout.go +++ b/layout/paddedlayout.go @@ -30,7 +30,7 @@ func (l *paddedLayout) MinSize(objects []fyne.CanvasObject) (min fyne.Size) { continue } - min = min.Union(child.MinSize()) + min = min.Max(child.MinSize()) } min = min.Add(fyne.NewSize(2*theme.Padding(), 2*theme.Padding())) return diff --git a/math.go b/math.go index 8867d20478..3f66064cbe 100644 --- a/math.go +++ b/math.go @@ -1,7 +1,7 @@ package fyne // Min returns the smaller of the passed values. -func Min(x, y int) int { +func Min(x, y float32) float32 { if x < y { return x } @@ -9,7 +9,7 @@ func Min(x, y int) int { } // Max returns the larger of the passed values. -func Max(x, y int) int { +func Max(x, y float32) float32 { if x > y { return x } diff --git a/math_test.go b/math_test.go index 144755411e..a5ed76f8c1 100644 --- a/math_test.go +++ b/math_test.go @@ -7,11 +7,11 @@ import ( ) func TestMin(t *testing.T) { - assert.Equal(t, Min(1, 3), 1) - assert.Equal(t, Min(1, -3), -3) + assert.Equal(t, float32(1), Min(1, 3)) + assert.Equal(t, float32(-3), Min(1, -3)) } func TestMax(t *testing.T) { - assert.Equal(t, Max(1, 3), 3) - assert.Equal(t, Max(1, -3), 1) + assert.Equal(t, float32(3), Max(1, 3)) + assert.Equal(t, float32(1), Max(1, -3)) } diff --git a/test/markup_renderer.go b/test/markup_renderer.go index ba8697c460..77f00af61c 100644 --- a/test/markup_renderer.go +++ b/test/markup_renderer.go @@ -110,19 +110,19 @@ func (r *markupRenderer) setFloatPosAttr(attrs map[string]*string, name string, attrs[name] = &value } -func (r *markupRenderer) setIntAttrWithDefault(attrs map[string]*string, name string, i int, d int) { - if i == d { +func (r *markupRenderer) setSizeAttrWithDefault(attrs map[string]*string, name string, i float32, d float32) { + if int(i) == int(d) { return } - value := fmt.Sprintf("%d", i) + value := fmt.Sprintf("%d", int(i)) attrs[name] = &value } func (r *markupRenderer) setPosAttr(attrs map[string]*string, name string, pos fyne.Position) { - if pos.X == 0 && pos.Y == 0 { + if int(pos.X) == 0 && int(pos.Y) == 0 { return } - value := fmt.Sprintf("%d,%d", pos.X, pos.Y) + value := fmt.Sprintf("%d,%d", int(pos.X), int(pos.Y)) attrs[name] = &value } @@ -174,7 +174,7 @@ func (r *markupRenderer) setScaleModeAttr(attrs map[string]*string, name string, } func (r *markupRenderer) setSizeAttr(attrs map[string]*string, name string, size fyne.Size) { - value := fmt.Sprintf("%dx%d", size.Width, size.Height) + value := fmt.Sprintf("%dx%d", int(size.Width), int(size.Height)) attrs[name] = &value } @@ -360,7 +360,7 @@ func (r *markupRenderer) writeTag(name string, isEmpty bool, attrs map[string]*s func (r *markupRenderer) writeText(t *canvas.Text, attrs map[string]*string) { r.setColorAttrWithDefault(attrs, "color", t.Color, theme.TextColor()) r.setAlignmentAttr(attrs, "alignment", t.Alignment) - r.setIntAttrWithDefault(attrs, "textSize", t.TextSize, theme.TextSize()) + r.setSizeAttrWithDefault(attrs, "textSize", t.TextSize, theme.TextSize()) r.setBoolAttr(attrs, "bold", t.TextStyle.Bold) r.setBoolAttr(attrs, "italic", t.TextStyle.Italic) r.setBoolAttr(attrs, "monospace", t.TextStyle.Monospace) diff --git a/test/test.go b/test/test.go index ca4184817e..7e84ba328b 100644 --- a/test/test.go +++ b/test/test.go @@ -50,7 +50,7 @@ func AssertRendersToMarkup(t *testing.T, expected string, c fyne.Canvas, msgAndA // Drag drags at an absolute position on the canvas. // deltaX/Y is the dragging distance: <0 for dragging up/left, >0 for dragging down/right. -func Drag(c fyne.Canvas, pos fyne.Position, deltaX, deltaY int) { +func Drag(c fyne.Canvas, pos fyne.Position, deltaX, deltaY float32) { matches := func(object fyne.CanvasObject) bool { if _, ok := object.(fyne.Draggable); ok { return true @@ -63,8 +63,7 @@ func Drag(c fyne.Canvas, pos fyne.Position, deltaX, deltaY int) { } e := &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: p}, - DraggedX: deltaX, - DraggedY: deltaY, + Dragged: fyne.Delta{DX: deltaX, DY: deltaY}, } o.(fyne.Draggable).Dragged(e) o.(fyne.Draggable).DragEnd() @@ -140,7 +139,7 @@ func MoveMouse(c fyne.Canvas, pos fyne.Position) { // Scroll scrolls at an absolute position on the canvas. // deltaX/Y is the scrolling distance: <0 for scrolling up/left, >0 for scrolling down/right. -func Scroll(c fyne.Canvas, pos fyne.Position, deltaX, deltaY int) { +func Scroll(c fyne.Canvas, pos fyne.Position, deltaX, deltaY float32) { matches := func(object fyne.CanvasObject) bool { if _, ok := object.(fyne.Scrollable); ok { return true @@ -152,7 +151,7 @@ func Scroll(c fyne.Canvas, pos fyne.Position, deltaX, deltaY int) { return } - e := &fyne.ScrollEvent{DeltaX: deltaX, DeltaY: deltaY} + e := &fyne.ScrollEvent{Scrolled: fyne.Delta{DX: deltaX, DY: deltaY}} o.(fyne.Scrollable).Scrolled(e) } diff --git a/test/test_test.go b/test/test_test.go index b29be4fe6b..3273d5a5a4 100644 --- a/test/test_test.go +++ b/test/test_test.go @@ -106,8 +106,7 @@ func TestDrag(t *testing.T) { test.Drag(c, fyne.NewPos(15, 15), 17, 42) assert.Equal(t, &fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.Position{X: 5, Y: 5}}, - DraggedX: 17, - DraggedY: 42, + Dragged: fyne.NewDelta(17, 42), }, d.event) assert.True(t, d.wasDragged) } @@ -199,7 +198,7 @@ func TestScroll(t *testing.T) { assert.Nil(t, s.event, "nothing happens if no scrollable was found at position") test.Scroll(c, fyne.NewPos(15, 15), 17, 42) - assert.Equal(t, &fyne.ScrollEvent{DeltaX: 17, DeltaY: 42}, s.event) + assert.Equal(t, &fyne.ScrollEvent{Scrolled: fyne.NewDelta(17, 42)}, s.event) } var _ fyne.Draggable = (*draggable)(nil) diff --git a/test/testdriver.go b/test/testdriver.go index 070d136b04..0895512486 100644 --- a/test/testdriver.go +++ b/test/testdriver.go @@ -98,7 +98,7 @@ func (d *testDriver) Device() fyne.Device { } // RenderedTextSize looks up how bit a string would be if drawn on screen -func (d *testDriver) RenderedTextSize(text string, size int, style fyne.TextStyle) fyne.Size { +func (d *testDriver) RenderedTextSize(text string, size float32, style fyne.TextStyle) fyne.Size { var opts truetype.Options opts.Size = float64(size) opts.DPI = painter.TextDPI @@ -106,7 +106,7 @@ func (d *testDriver) RenderedTextSize(text string, size int, style fyne.TextStyl face := painter.CachedFontFace(style, &opts) advance := font.MeasureString(face, text) - sws := fyne.NewSize(advance.Ceil(), face.Metrics().Height.Ceil()) + sws := fyne.NewSize(float32(advance.Ceil()), float32(face.Metrics().Height.Ceil())) gls := painter.RenderedTextSize(text, size, style) if sws != gls { log.Println("SoftwareTextSize:", sws) diff --git a/test/testtheme.go b/test/testtheme.go index 2967d11943..25a8585b33 100644 --- a/test/testtheme.go +++ b/test/testtheme.go @@ -36,12 +36,12 @@ func NewTheme() fyne.Theme { fyne.TextStyle{Italic: true}: theme.DefaultTextBoldItalicFont(), fyne.TextStyle{Monospace: true}: theme.DefaultTextFont(), }, - sizes: map[fyne.ThemeSizeName]int{ - theme.SizeNameInlineIcon: 24, - theme.SizeNamePadding: 10, - theme.SizeNameScrollBar: 10, - theme.SizeNameScrollBarSmall: 2, - theme.SizeNameText: 18, + sizes: map[fyne.ThemeSizeName]float32{ + theme.SizeNameInlineIcon: float32(24), + theme.SizeNamePadding: float32(10), + theme.SizeNameScrollBar: float32(10), + theme.SizeNameScrollBarSmall: float32(2), + theme.SizeNameText: float32(18), }, } } diff --git a/test/theme.go b/test/theme.go index cd18eb29f2..07b52cea73 100644 --- a/test/theme.go +++ b/test/theme.go @@ -14,7 +14,7 @@ var _ fyne.Theme = (*configurableTheme)(nil) type configurableTheme struct { colors map[fyne.ThemeColorName]color.Color fonts map[fyne.TextStyle]fyne.Resource - sizes map[fyne.ThemeSizeName]int + sizes map[fyne.ThemeSizeName]float32 } // Theme returns a theme useful for image based tests. @@ -41,12 +41,12 @@ func Theme() fyne.Theme { fyne.TextStyle{Italic: true}: theme.DefaultTextItalicFont(), fyne.TextStyle{Monospace: true}: theme.DefaultTextMonospaceFont(), }, - sizes: map[fyne.ThemeSizeName]int{ - theme.SizeNameInlineIcon: 20, - theme.SizeNamePadding: 4, - theme.SizeNameScrollBar: 16, - theme.SizeNameScrollBarSmall: 3, - theme.SizeNameText: 14, + sizes: map[fyne.ThemeSizeName]float32{ + theme.SizeNameInlineIcon: float32(20), + theme.SizeNamePadding: float32(4), + theme.SizeNameScrollBar: float32(16), + theme.SizeNameScrollBarSmall: float32(3), + theme.SizeNameText: float32(14), }, } } @@ -65,6 +65,6 @@ func (t *configurableTheme) Icon(n fyne.ThemeIconName) fyne.Resource { return theme.DefaultTheme().Icon(n) } -func (t *configurableTheme) Size(s fyne.ThemeSizeName) int { +func (t *configurableTheme) Size(s fyne.ThemeSizeName) float32 { return t.sizes[s] } diff --git a/text.go b/text.go index aa8b3747e8..4acf92fb45 100644 --- a/text.go +++ b/text.go @@ -36,6 +36,6 @@ type TextStyle struct { } // MeasureText uses the current driver to calculate the size of text when rendered. -func MeasureText(text string, size int, style TextStyle) Size { +func MeasureText(text string, size float32, style TextStyle) Size { return CurrentApp().Driver().RenderedTextSize(text, size, style) } diff --git a/theme.go b/theme.go index ceb9dd7b1f..0296213e5d 100644 --- a/theme.go +++ b/theme.go @@ -29,7 +29,7 @@ type Theme interface { Color(ThemeColorName, ThemeVariant) color.Color Font(TextStyle) Resource Icon(ThemeIconName) Resource - Size(ThemeSizeName) int + Size(ThemeSizeName) float32 } // LegacyTheme defines the requirements of any Fyne theme. diff --git a/theme/legacy.go b/theme/legacy.go index dccd275ede..16f0c22bd3 100644 --- a/theme/legacy.go +++ b/theme/legacy.go @@ -69,18 +69,18 @@ func (l *legacyWrapper) Icon(n fyne.ThemeIconName) fyne.Resource { return DefaultTheme().Icon(n) } -func (l *legacyWrapper) Size(n fyne.ThemeSizeName) int { +func (l *legacyWrapper) Size(n fyne.ThemeSizeName) float32 { switch n { case SizeNameInlineIcon: - return l.old.IconInlineSize() + return float32(l.old.IconInlineSize()) case SizeNamePadding: - return l.old.Padding() + return float32(l.old.Padding()) case SizeNameScrollBar: - return l.old.ScrollBarSize() + return float32(l.old.ScrollBarSize()) case SizeNameScrollBarSmall: - return l.old.ScrollBarSmallSize() + return float32(l.old.ScrollBarSmallSize()) case SizeNameText: - return l.old.TextSize() + return float32(l.old.TextSize()) default: return DefaultTheme().Size(n) } diff --git a/theme/legacy_test.go b/theme/legacy_test.go index 302db8fabe..d090340ad4 100644 --- a/theme/legacy_test.go +++ b/theme/legacy_test.go @@ -34,9 +34,9 @@ func TestLegacyWrapper_Font(t *testing.T) { func TestLegacyWrapper_Size(t *testing.T) { newTheme := FromLegacy(oldTheme) - assert.Equal(t, oldTheme.IconInlineSize(), newTheme.Size(SizeNameInlineIcon)) - assert.Equal(t, oldTheme.Padding(), newTheme.Size(SizeNamePadding)) - assert.Equal(t, oldTheme.TextSize(), newTheme.Size(SizeNameText)) + assert.Equal(t, oldTheme.IconInlineSize(), int(newTheme.Size(SizeNameInlineIcon))) + assert.Equal(t, oldTheme.Padding(), int(newTheme.Size(SizeNamePadding))) + assert.Equal(t, oldTheme.TextSize(), int(newTheme.Size(SizeNameText))) } var _ fyne.LegacyTheme = (*legacyTheme)(nil) @@ -89,7 +89,7 @@ func (t *legacyTheme) TextColor() color.Color { } func (t *legacyTheme) TextSize() int { - return TextSize() + return int(TextSize()) } func (t *legacyTheme) TextFont() fyne.Resource { @@ -113,17 +113,17 @@ func (t *legacyTheme) TextMonospaceFont() fyne.Resource { } func (t *legacyTheme) Padding() int { - return Padding() + return int(Padding()) } func (t *legacyTheme) IconInlineSize() int { - return IconInlineSize() + return int(IconInlineSize()) } func (t *legacyTheme) ScrollBarSize() int { - return ScrollBarSize() + return int(ScrollBarSize()) } func (t *legacyTheme) ScrollBarSmallSize() int { - return ScrollBarSmallSize() + return int(ScrollBarSmallSize()) } diff --git a/theme/theme.go b/theme/theme.go index 101d6a3766..0788c2ff19 100644 --- a/theme/theme.go +++ b/theme/theme.go @@ -259,7 +259,7 @@ func (t *builtinTheme) Font(style fyne.TextStyle) fyne.Resource { return t.regular } -func (t *builtinTheme) Size(s fyne.ThemeSizeName) int { +func (t *builtinTheme) Size(s fyne.ThemeSizeName) float32 { switch s { case SizeNameInlineIcon: return 20 @@ -358,7 +358,7 @@ func ShadowColor() color.Color { } // TextSize returns the standard text size -func TextSize() int { +func TextSize() float32 { return current().Size(SizeNameText) } @@ -389,22 +389,22 @@ func TextMonospaceFont() fyne.Resource { // Padding is the standard gap between elements and the border around interface // elements -func Padding() int { +func Padding() float32 { return current().Size(SizeNamePadding) } // IconInlineSize is the standard size of icons which appear within buttons, labels etc. -func IconInlineSize() int { +func IconInlineSize() float32 { return current().Size(SizeNameInlineIcon) } // ScrollBarSize is the width (or height) of the bars on a ScrollContainer -func ScrollBarSize() int { +func ScrollBarSize() float32 { return current().Size(SizeNameScrollBar) } // ScrollBarSmallSize is the width (or height) of the minimized bars on a ScrollContainer -func ScrollBarSmallSize() int { +func ScrollBarSmallSize() float32 { return current().Size(SizeNameScrollBarSmall) } diff --git a/widget/accordion.go b/widget/accordion.go index fd8cfcf87a..8cdc3258f2 100644 --- a/widget/accordion.go +++ b/widget/accordion.go @@ -137,8 +137,8 @@ type accordionRenderer struct { } func (r *accordionRenderer) Layout(size fyne.Size) { - x := 0 - y := 0 + x := float32(0) + y := float32(0) for i, ai := range r.container.Items { if i != 0 { div := r.dividers[i-1] diff --git a/widget/accordion_internal_test.go b/widget/accordion_internal_test.go index f950897544..15be3e391c 100644 --- a/widget/accordion_internal_test.go +++ b/widget/accordion_internal_test.go @@ -44,15 +44,15 @@ func TestAccordionRenderer_Layout(t *testing.T) { ac.CloseAll() min := ac.MinSize() ar.Layout(min) - assert.Equal(t, 0, aih0.Position().X) + assert.Equal(t, float32(0), aih0.Position().X) assert.Equal(t, theme.Padding(), aih0.Position().Y) assert.Equal(t, min.Width, aih0.Size().Width) assert.Equal(t, aih0.MinSize().Height, aih0.Size().Height) - assert.Equal(t, 0, aih1.Position().X) + assert.Equal(t, float32(0), aih1.Position().X) assert.Equal(t, aih0.MinSize().Height+theme.Padding()*3+1, aih1.Position().Y) assert.Equal(t, min.Width, aih1.Size().Width) assert.Equal(t, aih1.MinSize().Height, aih1.Size().Height) - assert.Equal(t, 0, aih2.Position().X) + assert.Equal(t, float32(0), aih2.Position().X) assert.Equal(t, aih0.MinSize().Height+aih1.MinSize().Height+5*theme.Padding()+2, aih2.Position().Y) assert.Equal(t, min.Width, aih2.Size().Width) assert.Equal(t, aih2.MinSize().Height, aih2.Size().Height) @@ -64,23 +64,23 @@ func TestAccordionRenderer_Layout(t *testing.T) { ac.Open(2) min := ac.MinSize() ar.Layout(min) - assert.Equal(t, 0, aih0.Position().X) + assert.Equal(t, float32(0), aih0.Position().X) assert.Equal(t, theme.Padding(), aih0.Position().Y) assert.Equal(t, min.Width, aih0.Size().Width) assert.Equal(t, aih0.MinSize().Height, aih0.Size().Height) - assert.Equal(t, 0, aih1.Position().X) + assert.Equal(t, float32(0), aih1.Position().X) assert.Equal(t, aih0.MinSize().Height+3*theme.Padding()+1, aih1.Position().Y) assert.Equal(t, min.Width, aih1.Size().Width) assert.Equal(t, aih1.MinSize().Height, aih1.Size().Height) - assert.Equal(t, 0, aih2.Position().X) + assert.Equal(t, float32(0), aih2.Position().X) assert.Equal(t, aih0.MinSize().Height+aih1.MinSize().Height+aid1.MinSize().Height+6*theme.Padding()+2, aih2.Position().Y) assert.Equal(t, min.Width, aih2.Size().Width) assert.Equal(t, aih2.MinSize().Height, aih2.Size().Height) - assert.Equal(t, 0, aid1.Position().X) + assert.Equal(t, float32(0), aid1.Position().X) assert.Equal(t, aih0.MinSize().Height+aih1.MinSize().Height+4*theme.Padding()+1, aid1.Position().Y) assert.Equal(t, min.Width, aid1.Size().Width) assert.Equal(t, aid1.MinSize().Height, aid1.Size().Height) - assert.Equal(t, 0, aid2.Position().X) + assert.Equal(t, float32(0), aid2.Position().X) assert.Equal(t, aih0.MinSize().Height+aih1.MinSize().Height+aid1.MinSize().Height+aih2.MinSize().Height+7*theme.Padding()+2, aid2.Position().Y) assert.Equal(t, min.Width, aid2.Size().Width) assert.Equal(t, aid2.MinSize().Height, aid2.Size().Height) @@ -91,19 +91,19 @@ func TestAccordionRenderer_Layout(t *testing.T) { ac.Open(2) min := ac.MinSize() ar.Layout(min) - assert.Equal(t, 0, aih0.Position().X) + assert.Equal(t, float32(0), aih0.Position().X) assert.Equal(t, theme.Padding(), aih0.Position().Y) assert.Equal(t, min.Width, aih0.Size().Width) assert.Equal(t, aih0.MinSize().Height, aih0.Size().Height) - assert.Equal(t, 0, aih1.Position().X) + assert.Equal(t, float32(0), aih1.Position().X) assert.Equal(t, aih0.MinSize().Height+3*theme.Padding()+1, aih1.Position().Y) assert.Equal(t, min.Width, aih1.Size().Width) assert.Equal(t, aih1.MinSize().Height, aih1.Size().Height) - assert.Equal(t, 0, aih2.Position().X) + assert.Equal(t, float32(0), aih2.Position().X) assert.Equal(t, aih0.MinSize().Height+aih1.MinSize().Height+5*theme.Padding()+2, aih2.Position().Y) assert.Equal(t, min.Width, aih2.Size().Width) assert.Equal(t, aih2.MinSize().Height, aih2.Size().Height) - assert.Equal(t, 0, aid2.Position().X) + assert.Equal(t, float32(0), aid2.Position().X) assert.Equal(t, aih0.MinSize().Height+aih1.MinSize().Height+aih2.MinSize().Height+6*theme.Padding()+2, aid2.Position().Y) assert.Equal(t, min.Width, aid2.Size().Width) assert.Equal(t, aid2.MinSize().Height, aid2.Size().Height) @@ -113,27 +113,27 @@ func TestAccordionRenderer_Layout(t *testing.T) { ac.OpenAll() min := ac.MinSize() ar.Layout(min) - assert.Equal(t, 0, aih0.Position().X) + assert.Equal(t, float32(0), aih0.Position().X) assert.Equal(t, theme.Padding(), aih0.Position().Y) assert.Equal(t, min.Width, aih0.Size().Width) assert.Equal(t, aih0.MinSize().Height, aih0.Size().Height) - assert.Equal(t, 0, aih1.Position().X) + assert.Equal(t, float32(0), aih1.Position().X) assert.Equal(t, aih0.MinSize().Height+aid0.MinSize().Height+4*theme.Padding()+1, aih1.Position().Y) assert.Equal(t, min.Width, aih1.Size().Width) assert.Equal(t, aih1.MinSize().Height, aih1.Size().Height) - assert.Equal(t, 0, aih2.Position().X) + assert.Equal(t, float32(0), aih2.Position().X) assert.Equal(t, aih0.MinSize().Height+aid0.MinSize().Height+aih1.MinSize().Height+aid1.MinSize().Height+7*theme.Padding()+2, aih2.Position().Y) assert.Equal(t, min.Width, aih2.Size().Width) assert.Equal(t, aih2.MinSize().Height, aih2.Size().Height) - assert.Equal(t, 0, aid0.Position().X) + assert.Equal(t, float32(0), aid0.Position().X) assert.Equal(t, aih0.MinSize().Height+theme.Padding()*2, aid0.Position().Y) assert.Equal(t, min.Width, aid0.Size().Width) assert.Equal(t, aid0.MinSize().Height, aid0.Size().Height) - assert.Equal(t, 0, aid1.Position().X) + assert.Equal(t, float32(0), aid1.Position().X) assert.Equal(t, aih0.MinSize().Height+aid0.MinSize().Height+aih1.MinSize().Height+5*theme.Padding()+1, aid1.Position().Y) assert.Equal(t, min.Width, aid1.Size().Width) assert.Equal(t, aid1.MinSize().Height, aid1.Size().Height) - assert.Equal(t, 0, aid2.Position().X) + assert.Equal(t, float32(0), aid2.Position().X) assert.Equal(t, aih0.MinSize().Height+aid0.MinSize().Height+aih1.MinSize().Height+aid1.MinSize().Height+aih2.MinSize().Height+8*theme.Padding()+2, aid2.Position().Y) assert.Equal(t, min.Width, aid2.Size().Width) assert.Equal(t, aid2.MinSize().Height, aid2.Size().Height) @@ -145,8 +145,8 @@ func TestAccordionRenderer_MinSize(t *testing.T) { ac := NewAccordion() ar := test.WidgetRenderer(ac).(*accordionRenderer) min := ar.MinSize() - assert.Equal(t, 0, min.Width) - assert.Equal(t, 0, min.Height) + assert.Equal(t, float32(0), min.Width) + assert.Equal(t, float32(0), min.Height) }) t.Run("Single", func(t *testing.T) { ai := NewAccordionItem("foo", NewLabel("foobar")) diff --git a/widget/button_internal_test.go b/widget/button_internal_test.go index 49d8d5ff18..0f6313b3d5 100644 --- a/widget/button_internal_test.go +++ b/widget/button_internal_test.go @@ -99,20 +99,14 @@ func TestButtonRenderer_Layout_Stretch(t *testing.T) { button.Resize(button.MinSize().Add(fyne.NewSize(100, 100))) render := test.WidgetRenderer(button).(*buttonRenderer) - iconYOffset, labelYOffset := 0, 0 textHeight := render.label.MinSize().Height - if theme.IconInlineSize() > textHeight { - labelYOffset = (theme.IconInlineSize() - textHeight) / 2 - } else { - iconYOffset = (textHeight - theme.IconInlineSize()) / 2 - } minIconHeight := fyne.Max(theme.IconInlineSize(), textHeight) assert.Equal(t, 50+theme.Padding()*3, render.icon.Position().X, "icon x") - assert.Equal(t, 50+theme.Padding()*2+iconYOffset, render.icon.Position().Y, "icon y") + assert.Equal(t, 50+theme.Padding()*2, render.icon.Position().Y, "icon y") assert.Equal(t, theme.IconInlineSize(), render.icon.Size().Width, "icon width") assert.Equal(t, minIconHeight, render.icon.Size().Height, "icon height") assert.Equal(t, 50+theme.Padding()*4+theme.IconInlineSize(), render.label.Position().X, "label x") - assert.Equal(t, 50+theme.Padding()*2+labelYOffset, render.label.Position().Y, "label y") + assert.Equal(t, 50+theme.Padding()*2, render.label.Position().Y, "label y") assert.Equal(t, render.label.MinSize(), render.label.Size(), "label size") } diff --git a/widget/card.go b/widget/card.go index 9c75042bc9..3707322c10 100644 --- a/widget/card.go +++ b/widget/card.go @@ -220,7 +220,7 @@ func (c *cardRenderer) Refresh() { // applyTheme updates this button to match the current theme func (c *cardRenderer) applyTheme() { if c.header != nil { - c.header.TextSize = int(float32(theme.TextSize()) * 1.7) + c.header.TextSize = theme.TextSize() * 1.7 c.header.Color = theme.TextColor() } if c.subHeader != nil { diff --git a/widget/card_test.go b/widget/card_test.go index 62dd6bb76e..e7223824b2 100644 --- a/widget/card_test.go +++ b/widget/card_test.go @@ -48,20 +48,20 @@ func TestCard_Layout(t *testing.T) { icon: nil, content: nil, want: ` - + - - + + - - - - - + + + + + - Title + Title @@ -100,21 +100,21 @@ func TestCard_Layout(t *testing.T) { icon: nil, content: nil, want: ` - + - - + + - - - - - + + + + + - Title - Subtitle + Title + Subtitle @@ -126,21 +126,21 @@ func TestCard_Layout(t *testing.T) { icon: canvas.NewImageFromResource(theme.FyneLogo()), content: nil, want: ` - + - - + + - - - - - + + + + + - Title - Subtitle + Title + Subtitle @@ -207,22 +207,22 @@ func TestCard_Layout(t *testing.T) { icon: nil, content: newContentRect(), want: ` - + - - + + - - - - - - - + + + + + + + - Hello + Hello - + @@ -262,23 +262,23 @@ func TestCard_Layout(t *testing.T) { icon: canvas.NewImageFromResource(theme.FyneLogo()), content: newContentRect(), want: ` - + - - + + - - - - - - - + + + + + + + - Longer title - subtitle with length - - + Longer title + subtitle with length + + @@ -297,7 +297,7 @@ func TestCard_Layout(t *testing.T) { size := card.MinSize().Max(fyne.NewSize(80, 0)) // give a little width for image only tests window.Resize(size.Add(fyne.NewSize(theme.Padding()*2, theme.Padding()*2))) if tt.content != nil { - assert.Equal(t, 10, tt.content.Size().Height) + assert.Equal(t, float32(10), tt.content.Size().Height) } test.AssertRendersToMarkup(t, tt.want, window.Canvas()) diff --git a/widget/entry.go b/widget/entry.go index 1b4e70f493..48ea5083cb 100644 --- a/widget/entry.go +++ b/widget/entry.go @@ -492,7 +492,7 @@ func (e *Entry) TappedSecondary(pe *fyne.PointEvent) { menu = fyne.NewMenu("", cutItem, copyItem, pasteItem, selectAllItem) } - e.popUp = newPopUpMenu(menu, c) + e.popUp = NewPopUpMenu(menu, c) e.popUp.ShowAtPosition(popUpPos) } @@ -1236,9 +1236,9 @@ func (r *entryRenderer) buildSelection() { provider := r.entry.textProvider() // Convert column, row into x,y - getCoordinates := func(column int, row int) (int, int) { + getCoordinates := func(column int, row int) (float32, float32) { sz := provider.lineSizeToColumn(column, row) - return sz.Width + theme.Padding()*2, sz.Height*row + theme.Padding()*2 + return sz.Width + theme.Padding()*2, sz.Height*float32(row) + theme.Padding()*2 } lineHeight := r.entry.text.charMinSize().Height @@ -1314,7 +1314,7 @@ func (r *entryRenderer) moveCursor() { size := provider.lineSizeToColumn(r.entry.CursorColumn, r.entry.CursorRow) provider.propertyLock.RUnlock() xPos := size.Width - yPos := size.Height * r.entry.CursorRow + yPos := size.Height * float32(r.entry.CursorRow) r.entry.propertyLock.RUnlock() r.entry.propertyLock.Lock() diff --git a/widget/entry_internal_test.go b/widget/entry_internal_test.go index 9205b8ec75..e12a939d8e 100644 --- a/widget/entry_internal_test.go +++ b/widget/entry_internal_test.go @@ -107,7 +107,7 @@ func TestEntry_MouseClickAndDragOutsideText(t *testing.T) { me := &desktop.MouseEvent{PointEvent: *ev, Button: desktop.MouseButtonPrimary} entry.MouseDown(me) - de := &fyne.DragEvent{PointEvent: *ev, DraggedX: 1, DraggedY: 0} + de := &fyne.DragEvent{PointEvent: *ev, Dragged: fyne.NewDelta(1, 0)} entry.Dragged(de) entry.MouseUp(me) assert.False(t, entry.selecting) diff --git a/widget/entry_test.go b/widget/entry_test.go index 3888ab7712..972568d148 100644 --- a/widget/entry_test.go +++ b/widget/entry_test.go @@ -346,7 +346,7 @@ func TestEntry_DragSelect(t *testing.T) { me := &desktop.MouseEvent{PointEvent: *ev1, Button: desktop.MouseButtonPrimary} entry.MouseDown(me) for ; ev1.Position.X < ev2.Position.X; ev1.Position.X++ { - de := &fyne.DragEvent{PointEvent: *ev1, DraggedX: 1, DraggedY: 0} + de := &fyne.DragEvent{PointEvent: *ev1, Dragged: fyne.NewDelta(1, 0)} entry.Dragged(de) } me = &desktop.MouseEvent{PointEvent: *ev1, Button: desktop.MouseButtonPrimary} @@ -2414,7 +2414,7 @@ func TestEntry_Tapped(t *testing.T) { `, c) testCharSize := theme.TextSize() - pos := fyne.NewPos(int(float32(testCharSize)*1.5), testCharSize/2) // tap in the middle of the 2nd "M" + pos := fyne.NewPos(testCharSize*1.5, testCharSize/2) // tap in the middle of the 2nd "M" ev := &fyne.PointEvent{Position: pos} entry.Tapped(ev) test.AssertRendersToMarkup(t, ` @@ -2435,7 +2435,7 @@ func TestEntry_Tapped(t *testing.T) { assert.Equal(t, 0, entry.CursorRow) assert.Equal(t, 1, entry.CursorColumn) - pos = fyne.NewPos(int(float32(testCharSize)*2.5), testCharSize/2) // tap in the middle of the 3rd "M" + pos = fyne.NewPos(testCharSize*2.5, testCharSize/2) // tap in the middle of the 3rd "M" ev = &fyne.PointEvent{Position: pos} entry.Tapped(ev) test.AssertRendersToMarkup(t, ` @@ -3098,7 +3098,7 @@ func getClickPosition(str string, row int) *fyne.PointEvent { x := fyne.MeasureText(str, theme.TextSize(), fyne.TextStyle{}).Width + theme.Padding() rowHeight := fyne.MeasureText("M", theme.TextSize(), fyne.TextStyle{}).Height - y := theme.Padding() + row*rowHeight + rowHeight/2 + y := theme.Padding() + float32(row)*rowHeight + rowHeight/2 pos := fyne.NewPos(x, y) return &fyne.PointEvent{Position: pos} diff --git a/widget/fileicon.go b/widget/fileicon.go index 3905d5b766..3550ad890e 100644 --- a/widget/fileicon.go +++ b/widget/fileicon.go @@ -141,15 +141,15 @@ func (s *fileIconRenderer) MinSize() fyne.Size { func (s *fileIconRenderer) Layout(size fyne.Size) { isize := fyne.Min(size.Width, size.Height) - xoff := 0 + xoff := float32(0) yoff := (size.Height - isize) / 2 if size.Width > size.Height { xoff = (size.Width - isize) / 2 } - yoff += int(float64(isize) * ratioDown) + yoff += isize * ratioDown - s.ext.TextSize = int(float64(isize) * ratioTextSize) + s.ext.TextSize = float32(int(isize * ratioTextSize)) s.ext.Resize(fyne.NewSize(isize, s.ext.MinSize().Height)) s.ext.Move(fyne.NewPos(xoff, yoff)) diff --git a/widget/label_test.go b/widget/label_test.go index 45124c7c80..305673a791 100644 --- a/widget/label_test.go +++ b/widget/label_test.go @@ -129,7 +129,7 @@ func TestText_MinSize_MultiLine(t *testing.T) { assert.True(t, min2.Width < min.Width) assert.True(t, min2.Height > min.Height) - yPos := -1 + yPos := float32(-1) for _, text := range test.WidgetRenderer(textMultiLine).(*textRenderer).texts { assert.True(t, text.Size().Height < min2.Height) assert.True(t, text.Position().Y > yPos) diff --git a/widget/list.go b/widget/list.go index d12f4aed82..6a0ca45eb1 100644 --- a/widget/list.go +++ b/widget/list.go @@ -34,7 +34,7 @@ type List struct { scroller *ScrollContainer selected []ListItemID itemMin fyne.Size - offsetY int + offsetY float32 } // NewList creates and returns a list widget for displaying items in @@ -111,7 +111,7 @@ func (l *List) Select(id ListItemID) { if l.scroller == nil { return } - y := (id * l.itemMin.Height) + (id * separatorThickness) + y := (float32(id) * l.itemMin.Height) + (float32(id) * separatorThickness) if y < l.scroller.Offset.Y { l.scroller.Offset.Y = y } else if y+l.itemMin.Height > l.scroller.Offset.Y+l.scroller.Size().Height { @@ -149,7 +149,7 @@ type listRenderer struct { visibleItemCount int firstItemIndex ListItemID lastItemIndex ListItemID - previousOffsetY int + previousOffsetY float32 } func newListRenderer(objects []fyne.CanvasObject, l *List, scroller *ScrollContainer, layout *fyne.Container) *listRenderer { @@ -204,7 +204,7 @@ func (l *listRenderer) Layout(size fyne.Size) { if l.visibleItemCount <= 0 { return } - min := fyne.Min(length, l.visibleItemCount) + min := int(fyne.Min(float32(length), float32(l.visibleItemCount))) if len(l.children) > min { for i := len(l.children); i >= min; i-- { l.itemPool.Release(l.children[i-1]) @@ -262,7 +262,7 @@ func (l *listRenderer) getItem() fyne.CanvasObject { } func (l *listRenderer) offsetChanged() { - offsetChange := int(math.Abs(float64(l.previousOffsetY - l.list.offsetY))) + offsetChange := float32(math.Abs(float64(l.previousOffsetY - l.list.offsetY))) if l.previousOffsetY < l.list.offsetY { // Scrolling Down. @@ -283,7 +283,7 @@ func (l *listRenderer) prependItem(id ListItemID) { l.layout.Objects = l.layout.Layout.(*listLayout).getObjects() } -func (l *listRenderer) scrollDown(offsetChange int) { +func (l *listRenderer) scrollDown(offsetChange float32) { itemChange := 0 layoutEndY := l.children[len(l.children)-1].Position().Y + l.list.itemMin.Height + separatorThickness scrollerEndY := l.scroller.Offset.Y + l.scroller.Size().Height @@ -311,7 +311,7 @@ func (l *listRenderer) scrollDown(offsetChange int) { } } -func (l *listRenderer) scrollUp(offsetChange int) { +func (l *listRenderer) scrollUp(offsetChange float32) { itemChange := 0 layoutStartY := l.children[0].Position().Y if layoutStartY > l.scroller.Offset.Y { @@ -464,7 +464,7 @@ type listLayout struct { list *List dividers []fyne.CanvasObject children []fyne.CanvasObject - layoutEndY int + layoutEndY float32 } func newListLayout(list *List) fyne.Layout { @@ -475,7 +475,7 @@ func (l *listLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { if l.list.offsetY != 0 { return } - y := 0 + y := float32(0) for _, child := range l.children { child.Move(fyne.NewPos(0, y)) y += l.list.itemMin.Height + separatorThickness @@ -488,7 +488,7 @@ func (l *listLayout) Layout(objects []fyne.CanvasObject, size fyne.Size) { func (l *listLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { if f := l.list.Length; f != nil { return fyne.NewSize(l.list.itemMin.Width, - (l.list.itemMin.Height+separatorThickness)*f()-separatorThickness) + (l.list.itemMin.Height+separatorThickness)*float32(f())-separatorThickness) } return fyne.NewSize(0, 0) } diff --git a/widget/list_test.go b/widget/list_test.go index 6e2441ee9b..d80f459162 100644 --- a/widget/list_test.go +++ b/widget/list_test.go @@ -360,7 +360,7 @@ func TestList_OffsetChange(t *testing.T) { assert.Equal(t, visibleCount, lastItemIndex-firstItemIndex) scroll := test.WidgetRenderer(list).(*listRenderer).scroller - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: 0, DeltaY: -300}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(0, -300)}) indexChange := int(math.Floor(float64(300) / float64(template.MinSize().Height))) diff --git a/widget/menu_desktop_test.go b/widget/menu_desktop_test.go index 9c2ee44052..dfceef5112 100644 --- a/widget/menu_desktop_test.go +++ b/widget/menu_desktop_test.go @@ -854,7 +854,7 @@ func TestMenu_Scrolling(t *testing.T) { - + diff --git a/widget/menu_item.go b/widget/menu_item.go index 0b651b8e79..9304e1d1fe 100644 --- a/widget/menu_item.go +++ b/widget/menu_item.go @@ -143,7 +143,7 @@ type menuItemRenderer struct { widget.BaseRenderer i *menuItem icon *canvas.Image - lastThemePadding int + lastThemePadding float32 minSize fyne.Size text *canvas.Text } diff --git a/widget/menu_mobile_test.go b/widget/menu_mobile_test.go index 4f87aebb71..8593d6c7b1 100644 --- a/widget/menu_mobile_test.go +++ b/widget/menu_mobile_test.go @@ -854,7 +854,7 @@ func TestMenu_Dragging(t *testing.T) { - + diff --git a/widget/popup.go b/widget/popup.go index ac6b58d26d..313de322fe 100644 --- a/widget/popup.go +++ b/widget/popup.go @@ -112,16 +112,6 @@ func (p *PopUp) CreateRenderer() fyne.WidgetRenderer { } } -// NewPopUpAtPosition creates a new popUp for the specified content at the specified absolute position. -// It will then display the popup on the passed canvas. -// -// Deprecated: Use ShowPopUpAtPosition() instead. -func NewPopUpAtPosition(content fyne.CanvasObject, canvas fyne.Canvas, pos fyne.Position) *PopUp { - p := newPopUp(content, canvas) - p.ShowAtPosition(pos) - return p -} - // ShowPopUpAtPosition creates a new popUp for the specified content at the specified absolute position. // It will then display the popup on the passed canvas. func ShowPopUpAtPosition(content fyne.CanvasObject, canvas fyne.Canvas, pos fyne.Position) { @@ -135,10 +125,8 @@ func newPopUp(content fyne.CanvasObject, canvas fyne.Canvas) *PopUp { } // NewPopUp creates a new popUp for the specified content and displays it on the passed canvas. -// -// Deprecated: This will no longer show the pop-up in 2.0. Use ShowPopUp() instead. func NewPopUp(content fyne.CanvasObject, canvas fyne.Canvas) *PopUp { - return NewPopUpAtPosition(content, canvas, fyne.NewPos(0, 0)) + return newPopUp(content, canvas) } // ShowPopUp creates a new popUp for the specified content and displays it on the passed canvas. @@ -154,12 +142,8 @@ func newModalPopUp(content fyne.CanvasObject, canvas fyne.Canvas) *PopUp { // NewModalPopUp creates a new popUp for the specified content and displays it on the passed canvas. // A modal PopUp blocks interactions with underlying elements, covered with a semi-transparent overlay. -// -// Deprecated: This will no longer show the pop-up in 2.0. Use ShowModalPopUp instead. func NewModalPopUp(content fyne.CanvasObject, canvas fyne.Canvas) *PopUp { - p := newModalPopUp(content, canvas) - p.Show() - return p + return newModalPopUp(content, canvas) } // ShowModalPopUp creates a new popUp for the specified content and displays it on the passed canvas. diff --git a/widget/popup_menu.go b/widget/popup_menu.go index aeab6e0149..4e68428bd2 100644 --- a/widget/popup_menu.go +++ b/widget/popup_menu.go @@ -1,13 +1,8 @@ package widget import ( - "image/color" - "fyne.io/fyne" - "fyne.io/fyne/canvas" - "fyne.io/fyne/driver/desktop" "fyne.io/fyne/internal/widget" - "fyne.io/fyne/theme" ) // PopUpMenu is a Menu which displays itself in an OverlayContainer. @@ -17,14 +12,10 @@ type PopUpMenu struct { overlay *widget.OverlayContainer } -// ShowPopUpMenuAtPosition creates a PopUp menu populated with items from the passed menu structure. -// It will automatically be positioned at the provided location and shown as an overlay on the specified canvas. -func ShowPopUpMenuAtPosition(menu *fyne.Menu, c fyne.Canvas, pos fyne.Position) { - m := newPopUpMenu(menu, c) - m.ShowAtPosition(pos) -} - -func newPopUpMenu(menu *fyne.Menu, c fyne.Canvas) *PopUpMenu { +// NewPopUpMenu creates a new, reusable popup menu. You can show it using ShowAtPosition. +// +// Since: 2.0.0 +func NewPopUpMenu(menu *fyne.Menu, c fyne.Canvas) *PopUpMenu { p := &PopUpMenu{Menu: NewMenu(menu), canvas: c} p.Menu.Resize(p.Menu.MinSize()) p.Menu.customSized = true @@ -37,6 +28,13 @@ func newPopUpMenu(menu *fyne.Menu, c fyne.Canvas) *PopUpMenu { return p } +// ShowPopUpMenuAtPosition creates a PopUp menu populated with items from the passed menu structure. +// It will automatically be positioned at the provided location and shown as an overlay on the specified canvas. +func ShowPopUpMenuAtPosition(menu *fyne.Menu, c fyne.Canvas, pos fyne.Position) { + m := NewPopUpMenu(menu, c) + m.ShowAtPosition(pos) +} + // CreateRenderer returns a new renderer for the pop-up menu. // // Implements: fyne.Widget @@ -99,99 +97,3 @@ func (p *PopUpMenu) adjustedPosition(pos fyne.Position, size fyne.Size) fyne.Pos } return fyne.NewPos(x, y) } - -// -// Deprecated pop-up menu implementation -// - -// NewPopUpMenuAtPosition creates a PopUp widget populated with menu items from the passed menu structure. -// It will automatically be positioned at the provided location and shown as an overlay on the specified canvas. -// -// Deprecated: Use ShowPopUpMenuAtPosition() instead. -func NewPopUpMenuAtPosition(menu *fyne.Menu, c fyne.Canvas, pos fyne.Position) *PopUp { - options := NewVBox() - for _, option := range menu.Items { - opt := option // capture value - if opt.IsSeparator { - options.Append(newSeparator()) - } else { - options.Append(newMenuItemWidget(opt.Label)) - } - } - pop := NewPopUpAtPosition(options, c, pos) - for i, o := range options.Children { - if label, ok := o.(*menuItemWidget); ok { - item := menu.Items[i] - label.OnTapped = func() { - pop.Hide() - item.Action() - } - } - } - return pop -} - -// NewPopUpMenu creates a PopUp widget populated with menu items from the passed menu structure. -// It will automatically be shown as an overlay on the specified canvas. -// -// Deprecated: Use ShowPopUpMenuAtPosition() with a zero position instead. -func NewPopUpMenu(menu *fyne.Menu, c fyne.Canvas) *PopUp { - return NewPopUpMenuAtPosition(menu, c, fyne.NewPos(0, 0)) -} - -type menuItemWidget struct { - *Label - OnTapped func() - hovered bool -} - -func (t *menuItemWidget) Tapped(*fyne.PointEvent) { - t.OnTapped() -} - -func (t *menuItemWidget) CreateRenderer() fyne.WidgetRenderer { - return &menuItemWidgetRenderer{t.Label.CreateRenderer().(*textRenderer), t} -} - -// MouseIn is called when a desktop pointer enters the widget -func (t *menuItemWidget) MouseIn(*desktop.MouseEvent) { - t.hovered = true - - canvas.Refresh(t) -} - -// MouseOut is called when a desktop pointer exits the widget -func (t *menuItemWidget) MouseOut() { - t.hovered = false - - canvas.Refresh(t) -} - -// MouseMoved is called when a desktop pointer hovers over the widget -func (t *menuItemWidget) MouseMoved(*desktop.MouseEvent) { -} - -func newMenuItemWidget(label string) *menuItemWidget { - ret := &menuItemWidget{Label: NewLabel(label)} - ret.ExtendBaseWidget(ret) - return ret -} - -type menuItemWidgetRenderer struct { - *textRenderer - label *menuItemWidget -} - -func (h *menuItemWidgetRenderer) BackgroundColor() color.Color { - if h.label.hovered { - return theme.HoverColor() - } - - return color.Transparent -} - -func newSeparator() fyne.CanvasObject { - s := canvas.NewRectangle(theme.DisabledTextColor()) - s.SetMinSize(fyne.NewSize(1, 2)) - return s -} diff --git a/widget/popup_menu_test.go b/widget/popup_menu_test.go index 9246b38665..12d950f845 100644 --- a/widget/popup_menu_test.go +++ b/widget/popup_menu_test.go @@ -4,13 +4,11 @@ import ( "image/color" "testing" + "github.com/stretchr/testify/assert" + "fyne.io/fyne" "fyne.io/fyne/canvas" - "fyne.io/fyne/internal/widget" "fyne.io/fyne/test" - "fyne.io/fyne/theme" - - "github.com/stretchr/testify/assert" ) func TestPopUpMenu_Move(t *testing.T) { @@ -517,7 +515,7 @@ func setupPopUpMenuTest() (*PopUpMenu, fyne.Window) { w := test.NewWindow(canvas.NewRectangle(color.NRGBA{G: 150, B: 150, A: 255})) w.Resize(fyne.NewSize(200, 200)) - m := newPopUpMenu(fyne.NewMenu( + m := NewPopUpMenu(fyne.NewMenu( "", fyne.NewMenuItem("Option A", nil), fyne.NewMenuItem("Option B", nil), @@ -529,42 +527,3 @@ func tearDownPopUpMenuTest(w fyne.Window) { w.Close() test.NewApp() } - -// -// Old pop-up menu tests -// - -func TestNewPopUpMenu(t *testing.T) { - c := test.Canvas() - menu := fyne.NewMenu("Foo", fyne.NewMenuItem("Bar", func() {})) - - pop := NewPopUpMenu(menu, c) - assert.Equal(t, 1, len(c.Overlays().List())) - assert.Equal(t, pop, c.Overlays().List()[0]) - - pop.Hide() - assert.Equal(t, 0, len(c.Overlays().List())) -} - -func TestPopUpMenu_Size(t *testing.T) { - win := test.NewWindow(NewLabel("OK")) - defer win.Close() - win.Resize(fyne.NewSize(100, 100)) - menu := fyne.NewMenu("Foo", - fyne.NewMenuItem("A", func() {}), - fyne.NewMenuItem("A", func() {}), - ) - menuItemSize := canvas.NewText("A", color.Black).MinSize().Add(fyne.NewSize(theme.Padding()*2, theme.Padding()*2)) - expectedSize := menuItemSize.Add(fyne.NewSize(0, menuItemSize.Height)).Add(fyne.NewSize(0, theme.Padding())) - c := win.Canvas() - - pop := NewPopUpMenu(menu, c) - defer pop.Hide() - assert.Equal(t, expectedSize, pop.Content.Size()) - - for _, o := range test.LaidOutObjects(pop) { - if s, ok := o.(*widget.Shadow); ok { - assert.Equal(t, expectedSize.Add(fyne.NewSize(theme.Padding()*2, theme.Padding()*2)), s.Size()) - } - } -} diff --git a/widget/popup_test.go b/widget/popup_test.go index 3e317dc1ff..2dcd70f57b 100644 --- a/widget/popup_test.go +++ b/widget/popup_test.go @@ -20,6 +20,9 @@ func TestNewPopUp(t *testing.T) { pop := NewPopUp(label, test.Canvas()) defer test.Canvas().Overlays().Remove(pop) + assert.Equal(t, 0, len(test.Canvas().Overlays().List())) + pop.Show() + assert.True(t, pop.Visible()) assert.Equal(t, 1, len(test.Canvas().Overlays().List())) assert.Equal(t, pop, test.Canvas().Overlays().List()[0]) @@ -89,7 +92,7 @@ func TestShowModalPopUp(t *testing.T) { defer test.NewApp() w := test.NewWindow(canvas.NewRectangle(color.Transparent)) - w.Resize(fyne.NewSize(200, 200)) + w.Resize(fyne.NewSize(200, 199)) require.Nil(t, w.Canvas().Overlays().Top()) label := NewLabel("Hi") @@ -103,12 +106,12 @@ func TestShowModalPopUp(t *testing.T) { } test.AssertRendersToMarkup(t, ` - + - + - + @@ -164,6 +167,7 @@ func TestPopUp_ShowAtPosition(t *testing.T) { func TestPopUp_Hide(t *testing.T) { label := NewLabel("Hi") pop := NewPopUp(label, test.Canvas()) + pop.Show() assert.True(t, pop.Visible()) pop.Hide() @@ -174,7 +178,6 @@ func TestPopUp_Hide(t *testing.T) { func TestPopUp_MinSize(t *testing.T) { label := NewLabel("Hi") pop := NewPopUp(label, test.Canvas()) - defer test.Canvas().Overlays().Remove(pop) inner := pop.Content.MinSize() assert.Equal(t, label.MinSize().Width, inner.Width) @@ -199,8 +202,8 @@ func TestPopUp_Move(t *testing.T) { assert.Equal(t, pos.Add(fyne.NewPos(theme.Padding(), theme.Padding())), pop.Content.Position()) popPos := pop.Position() - assert.Equal(t, 0, popPos.X) // these are 0 as the popUp must fill our overlay - assert.Equal(t, 0, popPos.Y) + assert.Equal(t, float32(0), popPos.X) // these are 0 as the popUp must fill our overlay + assert.Equal(t, float32(0), popPos.Y) } func TestPopUp_Move_Constrained(t *testing.T) { @@ -209,6 +212,7 @@ func TestPopUp_Move_Constrained(t *testing.T) { defer win.Close() win.Resize(fyne.NewSize(60, 40)) pop := NewPopUp(label, win.Canvas()) + pop.Show() defer test.Canvas().Overlays().Remove(pop) pos := fyne.NewPos(30, 20) @@ -231,6 +235,7 @@ func TestPopUp_Move_ConstrainedWindowToSmall(t *testing.T) { defer win.Close() win.Resize(fyne.NewSize(10, 5)) pop := NewPopUp(label, win.Canvas()) + pop.Show() defer test.Canvas().Overlays().Remove(pop) pos := fyne.NewPos(20, 10) @@ -256,13 +261,14 @@ func TestPopUp_Resize(t *testing.T) { assert.Equal(t, size.Subtract(fyne.NewSize(theme.Padding()*2, theme.Padding()*2)), pop.Content.Size()) popSize := pop.Size() - assert.Equal(t, 80, popSize.Width) // these are 80 as the popUp must fill our overlay - assert.Equal(t, 80, popSize.Height) + assert.Equal(t, float32(80), popSize.Width) // these are 80 as the popUp must fill our overlay + assert.Equal(t, float32(80), popSize.Height) } func TestPopUp_Tapped(t *testing.T) { label := NewLabel("Hi") pop := NewPopUp(label, test.Canvas()) + pop.Show() assert.True(t, pop.Visible()) test.Tap(pop) @@ -273,6 +279,7 @@ func TestPopUp_Tapped(t *testing.T) { func TestPopUp_TappedSecondary(t *testing.T) { label := NewLabel("Hi") pop := NewPopUp(label, test.Canvas()) + pop.Show() assert.True(t, pop.Visible()) test.TapSecondary(pop) @@ -285,17 +292,20 @@ func TestPopUp_Stacked(t *testing.T) { assert.Empty(t, test.Canvas().Overlays().List()) pop1 := NewPopUp(NewLabel("Hi"), test.Canvas()) + pop1.Show() assert.True(t, pop1.Visible()) assert.Equal(t, pop1, test.Canvas().Overlays().Top()) assert.Equal(t, []fyne.CanvasObject{pop1}, test.Canvas().Overlays().List()) pop2 := NewPopUp(NewLabel("Hi"), test.Canvas()) + pop2.Show() assert.True(t, pop1.Visible()) assert.True(t, pop2.Visible()) assert.Equal(t, pop2, test.Canvas().Overlays().Top()) assert.Equal(t, []fyne.CanvasObject{pop1, pop2}, test.Canvas().Overlays().List()) pop3 := NewPopUp(NewLabel("Hi"), test.Canvas()) + pop3.Show() assert.True(t, pop1.Visible()) assert.True(t, pop2.Visible()) assert.True(t, pop3.Visible()) @@ -347,6 +357,7 @@ func TestPopUp_Layout(t *testing.T) { func TestModalPopUp_Tapped(t *testing.T) { label := NewLabel("Hi") pop := NewModalPopUp(label, test.Canvas()) + pop.Show() defer test.Canvas().Overlays().Remove(pop) assert.True(t, pop.Visible()) @@ -359,6 +370,7 @@ func TestModalPopUp_Tapped(t *testing.T) { func TestModalPopUp_TappedSecondary(t *testing.T) { label := NewLabel("Hi") pop := NewModalPopUp(label, test.Canvas()) + pop.Show() defer test.Canvas().Overlays().Remove(pop) assert.True(t, pop.Visible()) @@ -383,8 +395,8 @@ func TestModalPopUp_Resize(t *testing.T) { assert.Equal(t, size.Subtract(fyne.NewSize(theme.Padding()*2, theme.Padding()*2)), pop.Content.Size()) popSize := pop.Size() - assert.Equal(t, 80, popSize.Width) // these are 80 as the popUp must fill our overlay - assert.Equal(t, 80, popSize.Height) + assert.Equal(t, float32(80), popSize.Width) // these are 80 as the popUp must fill our overlay + assert.Equal(t, float32(80), popSize.Height) } func TestModalPopUp_Resize_Constrained(t *testing.T) { @@ -392,11 +404,10 @@ func TestModalPopUp_Resize_Constrained(t *testing.T) { win := test.NewWindow(NewLabel("OK")) win.Resize(fyne.NewSize(80, 80)) pop := NewModalPopUp(label, win.Canvas()) - defer win.Canvas().Overlays().Remove(pop) pop.Resize(fyne.NewSize(90, 100)) assert.Equal(t, 80-theme.Padding()*2, pop.Content.Size().Width) assert.Equal(t, 80-theme.Padding()*2, pop.Content.Size().Height) - assert.Equal(t, 80, pop.Size().Width) - assert.Equal(t, 80, pop.Size().Height) + assert.Equal(t, float32(80), pop.Size().Width) + assert.Equal(t, float32(80), pop.Size().Height) } diff --git a/widget/progressbar.go b/widget/progressbar.go index 0f8d5c0d2f..b961959dcd 100644 --- a/widget/progressbar.go +++ b/widget/progressbar.go @@ -52,7 +52,7 @@ func (p *progressRenderer) updateBar() { } size := p.progress.Size() - p.bar.Resize(fyne.NewSize(int(float32(size.Width)*ratio), size.Height)) + p.bar.Resize(fyne.NewSize(size.Width*ratio, size.Height)) } // Layout the components of the check widget diff --git a/widget/progressbar_extend_test.go b/widget/progressbar_extend_test.go index 0e33f573d2..5b7a4cbd4b 100644 --- a/widget/progressbar_extend_test.go +++ b/widget/progressbar_extend_test.go @@ -25,9 +25,9 @@ func TestProgressBarRenderer_Extended_Layout(t *testing.T) { r := test.WidgetRenderer(bar).(*progressRenderer) assert.Equal(t, 0.0, bar.Value) - assert.Equal(t, 0, r.bar.Size().Width) + assert.Equal(t, float32(0), r.bar.Size().Width) bar.SetValue(.5) assert.Equal(t, .5, bar.Value) - assert.Equal(t, 50, r.bar.Size().Width) + assert.Equal(t, float32(50), r.bar.Size().Width) } diff --git a/widget/progressbar_test.go b/widget/progressbar_test.go index eeabba91c2..407e4ba5cd 100644 --- a/widget/progressbar_test.go +++ b/widget/progressbar_test.go @@ -72,10 +72,10 @@ func TestProgressRenderer_Layout(t *testing.T) { bar.Resize(fyne.NewSize(100, 10)) render := test.WidgetRenderer(bar).(*progressRenderer) - assert.Equal(t, 0, render.bar.Size().Width) + assert.Equal(t, float32(0), render.bar.Size().Width) bar.SetValue(.5) - assert.Equal(t, 50, render.bar.Size().Width) + assert.Equal(t, float32(50), render.bar.Size().Width) bar.SetValue(1) assert.Equal(t, bar.Size().Width, render.bar.Size().Width) diff --git a/widget/progressbarinfinite.go b/widget/progressbarinfinite.go index 2636fd686e..9c5fbf38b8 100644 --- a/widget/progressbarinfinite.go +++ b/widget/progressbarinfinite.go @@ -39,9 +39,9 @@ func (p *infProgressRenderer) updateBar() { barWidth := p.bar.Size().Width barPos := p.bar.Position() - maxBarWidth := int(float64(progressSize.Width) * maxProgressBarInfiniteWidthRatio) - minBarWidth := int(float64(progressSize.Width) * minProgressBarInfiniteWidthRatio) - stepSize := int(float64(progressSize.Width) * progressBarInfiniteStepSizeRatio) + maxBarWidth := progressSize.Width * maxProgressBarInfiniteWidthRatio + minBarWidth := progressSize.Width * minProgressBarInfiniteWidthRatio + stepSize := progressSize.Width * progressBarInfiniteStepSizeRatio // check to make sure inner bar is sized correctly // if bar is on the first half of the progress bar, grow it up to maxProgressBarInfiniteWidthPercent diff --git a/widget/progressbarinfinite_test.go b/widget/progressbarinfinite_test.go index 41f117dfbb..4d937d1b3a 100644 --- a/widget/progressbarinfinite_test.go +++ b/widget/progressbarinfinite_test.go @@ -47,18 +47,18 @@ func TestProgressBarInfinite_Reshown(t *testing.T) { func TestInfiniteProgressRenderer_Layout(t *testing.T) { bar := NewProgressBarInfinite() - width := 100.0 - bar.Resize(fyne.NewSize(int(width), 10)) + width := float32(100.0) + bar.Resize(fyne.NewSize(width, 10)) render := test.WidgetRenderer(bar).(*infProgressRenderer) // width of bar is one step size because updateBar() will have run once - assert.Equal(t, int(width*progressBarInfiniteStepSizeRatio), render.bar.Size().Width) + assert.Equal(t, width*progressBarInfiniteStepSizeRatio, render.bar.Size().Width) // make sure the inner progress bar grows in size // call updateBar() enough times to grow the inner bar - maxWidth := int(width * maxProgressBarInfiniteWidthRatio) - for i := 0; i < maxWidth; i++ { + maxWidth := width * maxProgressBarInfiniteWidthRatio + for i := 0; i < int(maxWidth); i++ { render.updateBar() } diff --git a/widget/radio.go b/widget/radio.go index 44952d41e5..06194a8b23 100644 --- a/widget/radio.go +++ b/widget/radio.go @@ -171,7 +171,7 @@ func (r *Radio) indexByPosition(pos fyne.Position) int { return index } -func (r *Radio) itemHeight() int { +func (r *Radio) itemHeight() float32 { if r.Horizontal { return r.MinSize().Height } @@ -180,10 +180,10 @@ func (r *Radio) itemHeight() int { if r.Options != nil && len(r.Options) > 0 { count = len(r.Options) } - return r.MinSize().Height / count + return r.MinSize().Height / float32(count) } -func (r *Radio) itemWidth() int { +func (r *Radio) itemWidth() float32 { if !r.Horizontal { return r.MinSize().Width } @@ -192,7 +192,7 @@ func (r *Radio) itemWidth() int { if r.Options != nil && len(r.Options) > 0 { count = len(r.Options) } - return r.MinSize().Width / count + return r.MinSize().Width / float32(count) } func (r *Radio) removeDuplicateOptions() { @@ -219,7 +219,7 @@ func (r *radioRenderer) Layout(size fyne.Size) { labelSize := fyne.NewSize(itemWidth, itemHeight) focusIndicatorSize := fyne.NewSize(theme.IconInlineSize()+theme.Padding()*2, theme.IconInlineSize()+theme.Padding()*2) - x, y := 0, 0 + x, y := float32(0), float32(0) for _, item := range r.items { item.focusIndicator.Resize(focusIndicatorSize) item.focusIndicator.Move(fyne.NewPos(x, y+(itemHeight-focusIndicatorSize.Height)/2)) @@ -243,8 +243,8 @@ func (r *radioRenderer) Layout(size fyne.Size) { // This is based on the contained text, the radio icon and a standard amount of padding // between each item. func (r *radioRenderer) MinSize() fyne.Size { - width := 0 - height := 0 + width := float32(0) + height := float32(0) for _, item := range r.items { itemMin := item.label.MinSize().Add(fyne.NewSize(theme.Padding()*4, theme.Padding()*2)) itemMin = itemMin.Add(fyne.NewSize(theme.IconInlineSize()+theme.Padding(), 0)) diff --git a/widget/radio_group.go b/widget/radio_group.go index cfca81fc0f..23783d983d 100644 --- a/widget/radio_group.go +++ b/widget/radio_group.go @@ -142,18 +142,18 @@ func (r *radioGroupRenderer) Layout(_ fyne.Size) { if r.items != nil && len(r.items) > 0 { count = len(r.items) } - var itemHeight, itemWidth int + var itemHeight, itemWidth float32 minSize := r.radio.MinSize() if r.radio.Horizontal { itemHeight = minSize.Height - itemWidth = minSize.Width / count + itemWidth = minSize.Width / float32(count) } else { - itemHeight = minSize.Height / count + itemHeight = minSize.Height / float32(count) itemWidth = minSize.Width } itemSize := fyne.NewSize(itemWidth, itemHeight) - x, y := 0, 0 + x, y := float32(0), float32(0) for _, item := range r.items { item.Resize(itemSize) item.Move(fyne.NewPos(x, y)) @@ -169,8 +169,8 @@ func (r *radioGroupRenderer) Layout(_ fyne.Size) { // This is based on the contained text, the radio icon and a standard amount of padding // between each item. func (r *radioGroupRenderer) MinSize() fyne.Size { - width := 0 - height := 0 + width := float32(0) + height := float32(0) for _, item := range r.items { itemMin := item.MinSize() if r.radio.Horizontal { diff --git a/widget/radio_internal_test.go b/widget/radio_internal_test.go index 702e6aea37..865d0e9fe4 100644 --- a/widget/radio_internal_test.go +++ b/widget/radio_internal_test.go @@ -334,12 +334,12 @@ func TestRadio_FocusIndicator_Centered_Vertically(t *testing.T) { heightCenterOffset := (radio.itemHeight() - focusIndicatorSize) / 2 for i, item := range render.items { - x, y := 0, heightCenterOffset + x, y := float32(0), heightCenterOffset if tt.isHorizontal { - x = i * radio.itemWidth() + x = float32(i) * radio.itemWidth() } else { - y = i*radio.itemHeight() + heightCenterOffset + y = float32(i)*radio.itemHeight() + heightCenterOffset } assert.Equal(t, fyne.NewPos(x, y), item.focusIndicator.Position1) diff --git a/widget/scroller.go b/widget/scroller.go index 81a92912c1..5c54c30ef7 100644 --- a/widget/scroller.go +++ b/widget/scroller.go @@ -31,7 +31,7 @@ type scrollBarOrientation int const ( scrollBarOrientationVertical scrollBarOrientation = 0 scrollBarOrientationHorizontal scrollBarOrientation = 1 - scrollContainerMinSize = 32 // TODO consider the smallest useful scroll view? + scrollContainerMinSize = float32(32) // TODO consider the smallest useful scroll view? ) type scrollBarRenderer struct { @@ -60,8 +60,8 @@ var _ fyne.Draggable = (*scrollBar)(nil) type scrollBar struct { BaseWidget area *scrollBarArea - draggedDistance int - dragStart int + draggedDistance float32 + dragStart float32 isDragged bool orientation scrollBarOrientation } @@ -92,9 +92,9 @@ func (b *scrollBar) Dragged(e *fyne.DragEvent) { switch b.orientation { case scrollBarOrientationHorizontal: - b.draggedDistance += e.DraggedX + b.draggedDistance += e.Dragged.DX case scrollBarOrientationVertical: - b.draggedDistance += e.DraggedY + b.draggedDistance += e.Dragged.DY } b.area.moveBar(b.draggedDistance+b.dragStart, b.Size()) } @@ -127,7 +127,7 @@ func (r *scrollBarAreaRenderer) BackgroundColor() color.Color { } func (r *scrollBarAreaRenderer) Layout(_ fyne.Size) { - var barHeight, barWidth, barX, barY int + var barHeight, barWidth, barX, barY float32 switch r.area.orientation { case scrollBarOrientationHorizontal: barWidth, barHeight, barX, barY = r.barSizeAndOffset(r.area.scroll.Offset.X, r.area.scroll.Content.Size().Width, r.area.scroll.Size().Width) @@ -139,8 +139,7 @@ func (r *scrollBarAreaRenderer) Layout(_ fyne.Size) { } func (r *scrollBarAreaRenderer) MinSize() fyne.Size { - var min int - min = theme.ScrollBarSize() + min := theme.ScrollBarSize() if !r.area.isLarge { min = theme.ScrollBarSmallSize() * 2 } @@ -157,10 +156,10 @@ func (r *scrollBarAreaRenderer) Refresh() { canvas.Refresh(r.bar) } -func (r *scrollBarAreaRenderer) barSizeAndOffset(contentOffset, contentLength, scrollLength int) (length, width, lengthOffset, widthOffset int) { +func (r *scrollBarAreaRenderer) barSizeAndOffset(contentOffset, contentLength, scrollLength float32) (length, width, lengthOffset, widthOffset float32) { if scrollLength < contentLength { - portion := float64(scrollLength) / float64(contentLength) - length = int(float64(scrollLength) * portion) + portion := scrollLength / contentLength + length = float32(int(scrollLength)) * portion if length < theme.ScrollBarSize() { length = theme.ScrollBarSize() } @@ -168,7 +167,7 @@ func (r *scrollBarAreaRenderer) barSizeAndOffset(contentOffset, contentLength, s length = scrollLength } if contentOffset != 0 { - lengthOffset = int(float64(scrollLength-length) * (float64(contentOffset) / float64(contentLength-scrollLength))) + lengthOffset = (scrollLength - length) * (contentOffset / (contentLength - scrollLength)) } if r.area.isLarge { width = theme.ScrollBarSize() @@ -207,7 +206,7 @@ func (a *scrollBarArea) MouseOut() { a.scroll.Refresh() } -func (a *scrollBarArea) moveBar(offset int, barSize fyne.Size) { +func (a *scrollBarArea) moveBar(offset float32, barSize fyne.Size) { switch a.orientation { case scrollBarOrientationHorizontal: a.scroll.Offset.X = a.computeScrollOffset(barSize.Width, offset, a.scroll.Size().Width, a.scroll.Content.Size().Width) @@ -220,15 +219,15 @@ func (a *scrollBarArea) moveBar(offset int, barSize fyne.Size) { a.scroll.refreshWithoutOffsetUpdate() } -func (a *scrollBarArea) computeScrollOffset(length, offset, scrollLength, contentLength int) int { +func (a *scrollBarArea) computeScrollOffset(length, offset, scrollLength, contentLength float32) float32 { maxOffset := scrollLength - length if offset < 0 { offset = 0 } else if offset > maxOffset { offset = maxOffset } - ratio := float32(offset) / float32(maxOffset) - scrollOffset := int(ratio * float32(contentLength-scrollLength)) + ratio := offset / maxOffset + scrollOffset := ratio * (contentLength - scrollLength) return scrollOffset } @@ -294,7 +293,7 @@ func (r *scrollContainerRenderer) Refresh() { r.Layout(r.scroll.Size()) } -func (r *scrollContainerRenderer) handleAreaVisibility(contentSize int, scrollSize int, area *scrollBarArea) { +func (r *scrollContainerRenderer) handleAreaVisibility(contentSize, scrollSize float32, area *scrollBarArea) { if contentSize <= scrollSize { area.Hide() } else if r.scroll.Visible() { @@ -302,7 +301,7 @@ func (r *scrollContainerRenderer) handleAreaVisibility(contentSize int, scrollSi } } -func (r *scrollContainerRenderer) handleShadowVisibility(offset int, contentSize int, scrollSize int, shadowStart fyne.CanvasObject, shadowEnd fyne.CanvasObject) { +func (r *scrollContainerRenderer) handleShadowVisibility(offset, contentSize, scrollSize float32, shadowStart fyne.CanvasObject, shadowEnd fyne.CanvasObject) { if !r.scroll.Visible() { return } @@ -399,7 +398,7 @@ func (s *ScrollContainer) Dragged(e *fyne.DragEvent) { return } - if s.updateOffset(e.DraggedX, e.DraggedY) { + if s.updateOffset(e.Dragged.DX, e.Dragged.DY) { s.refreshWithoutOffsetUpdate() } } @@ -443,7 +442,7 @@ func (s *ScrollContainer) Resize(size fyne.Size) { // Scrolled is called when an input device triggers a scroll event func (s *ScrollContainer) Scrolled(ev *fyne.ScrollEvent) { - dx, dy := ev.DeltaX, ev.DeltaY + dx, dy := ev.Scrolled.DX, ev.Scrolled.DY if s.Size().Width < s.Content.MinSize().Width && s.Size().Height >= s.Content.MinSize().Height && dx == 0 { dx, dy = dy, dx } @@ -452,7 +451,7 @@ func (s *ScrollContainer) Scrolled(ev *fyne.ScrollEvent) { } } -func (s *ScrollContainer) updateOffset(deltaX, deltaY int) bool { +func (s *ScrollContainer) updateOffset(deltaX, deltaY float32) bool { if s.Content.Size().Width <= s.Size().Width && s.Content.Size().Height <= s.Size().Height { if s.Offset.X != 0 || s.Offset.Y != 0 { s.Offset.X = 0 @@ -469,7 +468,7 @@ func (s *ScrollContainer) updateOffset(deltaX, deltaY int) bool { return true } -func computeOffset(start, delta, outerWidth, innerWidth int) int { +func computeOffset(start, delta, outerWidth, innerWidth float32) float32 { offset := start + delta if offset+outerWidth >= innerWidth { offset = innerWidth - outerWidth diff --git a/widget/scroller_test.go b/widget/scroller_test.go index d52139fccd..7165465ac4 100644 --- a/widget/scroller_test.go +++ b/widget/scroller_test.go @@ -20,7 +20,7 @@ func TestNewScrollContainer(t *testing.T) { scroll.Resize(fyne.NewSize(100, 100)) barArea := test.WidgetRenderer(scroll).(*scrollContainerRenderer).vertArea bar := test.WidgetRenderer(barArea).(*scrollBarAreaRenderer).bar - assert.Equal(t, 0, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.Y) assert.Equal(t, theme.ScrollBarSmallSize()*2, barArea.Size().Width) assert.Equal(t, theme.ScrollBarSmallSize(), bar.Size().Width) assert.Equal(t, theme.ScrollBarSmallSize(), bar.Position().X) @@ -39,8 +39,8 @@ func TestScrollContainer_MinSize(t *testing.T) { assert.Equal(t, scrollMin, scroll.MinSize()) assert.Equal(t, fyne.NewSize(500, 100), rect.Size()) - assert.Equal(t, 0, scroll.Offset.X) - assert.Equal(t, 0, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.Y) } func TestScrollContainer_ScrollToTop(t *testing.T) { @@ -49,7 +49,7 @@ func TestScrollContainer_ScrollToTop(t *testing.T) { scroll := NewScrollContainer(rect) scroll.ScrollToTop() Y := scroll.Offset.Y - assert.Equal(t, 0, Y) + assert.Equal(t, float32(0), Y) } func TestScrollContainer_ScrollToBottom(t *testing.T) { @@ -57,7 +57,7 @@ func TestScrollContainer_ScrollToBottom(t *testing.T) { rect.SetMinSize(fyne.NewSize(500, 50)) scroll := NewScrollContainer(rect) scroll.ScrollToBottom() - ExpectedY := 50 + ExpectedY := float32(50) Y := scroll.Content.Size().Height - scroll.Size().Height assert.Equal(t, ExpectedY, Y) } @@ -68,24 +68,24 @@ func TestScrollContainer_MinSize_Direction(t *testing.T) { rect.SetMinSize(fyne.NewSize(100, 100)) scroll := NewScrollContainer(rect) size := scroll.MinSize() - assert.Equal(t, 32, size.Height) - assert.Equal(t, 32, size.Width) + assert.Equal(t, float32(32), size.Height) + assert.Equal(t, float32(32), size.Width) }) t.Run("HorizontalOnly", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) rect.SetMinSize(fyne.NewSize(100, 100)) scroll := NewHScrollContainer(rect) size := scroll.MinSize() - assert.Equal(t, 100, size.Height) - assert.Equal(t, 32, size.Width) + assert.Equal(t, float32(100), size.Height) + assert.Equal(t, float32(32), size.Width) }) t.Run("VerticalOnly", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) rect.SetMinSize(fyne.NewSize(100, 100)) scroll := NewVScrollContainer(rect) size := scroll.MinSize() - assert.Equal(t, 32, size.Height) - assert.Equal(t, 100, size.Width) + assert.Equal(t, float32(32), size.Height) + assert.Equal(t, float32(100), size.Width) }) } @@ -96,8 +96,8 @@ func TestScrollContainer_SetMinSize_Direction(t *testing.T) { scroll := NewScrollContainer(rect) scroll.SetMinSize(fyne.NewSize(50, 50)) size := scroll.MinSize() - assert.Equal(t, 50, size.Height) - assert.Equal(t, 50, size.Width) + assert.Equal(t, float32(50), size.Height) + assert.Equal(t, float32(50), size.Width) }) t.Run("HorizontalOnly", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) @@ -105,8 +105,8 @@ func TestScrollContainer_SetMinSize_Direction(t *testing.T) { scroll := NewHScrollContainer(rect) scroll.SetMinSize(fyne.NewSize(50, 50)) size := scroll.MinSize() - assert.Equal(t, 100, size.Height) - assert.Equal(t, 50, size.Width) + assert.Equal(t, float32(100), size.Height) + assert.Equal(t, float32(50), size.Width) }) t.Run("VerticalOnly", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) @@ -114,8 +114,8 @@ func TestScrollContainer_SetMinSize_Direction(t *testing.T) { scroll := NewVScrollContainer(rect) scroll.SetMinSize(fyne.NewSize(50, 50)) size := scroll.MinSize() - assert.Equal(t, 50, size.Height) - assert.Equal(t, 100, size.Width) + assert.Equal(t, float32(50), size.Height) + assert.Equal(t, float32(100), size.Width) }) } @@ -126,8 +126,8 @@ func TestScrollContainer_Resize_Direction(t *testing.T) { scroll := NewScrollContainer(rect) scroll.Resize(scroll.MinSize()) size := scroll.Size() - assert.Equal(t, 32, size.Height) - assert.Equal(t, 32, size.Width) + assert.Equal(t, float32(32), size.Height) + assert.Equal(t, float32(32), size.Width) }) t.Run("HorizontalOnly", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) @@ -135,8 +135,8 @@ func TestScrollContainer_Resize_Direction(t *testing.T) { scroll := NewHScrollContainer(rect) scroll.Resize(scroll.MinSize()) size := scroll.Size() - assert.Equal(t, 100, size.Height) - assert.Equal(t, 32, size.Width) + assert.Equal(t, float32(100), size.Height) + assert.Equal(t, float32(32), size.Width) }) t.Run("VerticalOnly", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) @@ -144,8 +144,8 @@ func TestScrollContainer_Resize_Direction(t *testing.T) { scroll := NewVScrollContainer(rect) scroll.Resize(scroll.MinSize()) size := scroll.Size() - assert.Equal(t, 32, size.Height) - assert.Equal(t, 100, size.Width) + assert.Equal(t, float32(32), size.Height) + assert.Equal(t, float32(100), size.Width) }) } @@ -155,13 +155,13 @@ func TestScrollContainer_Refresh(t *testing.T) { scroll := NewScrollContainer(rect) scroll.Resize(fyne.NewSize(100, 100)) assert.Equal(t, fyne.NewSize(1000, 1000), rect.Size()) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -1000, DeltaY: -1000}) - assert.Equal(t, 900, scroll.Offset.X) - assert.Equal(t, 900, scroll.Offset.Y) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-1000, -1000)}) + assert.Equal(t, float32(900), scroll.Offset.X) + assert.Equal(t, float32(900), scroll.Offset.Y) assert.Equal(t, fyne.NewSize(1000, 1000), rect.Size()) rect.SetMinSize(fyne.NewSize(500, 500)) Refresh(scroll) - assert.Equal(t, 400, scroll.Offset.X) + assert.Equal(t, float32(400), scroll.Offset.X) assert.Equal(t, fyne.NewSize(500, 500), rect.Size()) rect2 := canvas.NewRectangle(color.White) @@ -175,11 +175,11 @@ func TestScrollContainer_Scrolled(t *testing.T) { rect.SetMinSize(fyne.NewSize(1000, 1000)) scroll := NewScrollContainer(rect) scroll.Resize(fyne.NewSize(100, 100)) - assert.Equal(t, 0, scroll.Offset.X) - assert.Equal(t, 0, scroll.Offset.Y) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -10, DeltaY: -10}) - assert.Equal(t, 10, scroll.Offset.X) - assert.Equal(t, 10, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.Y) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-10, -10)}) + assert.Equal(t, float32(10), scroll.Offset.X) + assert.Equal(t, float32(10), scroll.Offset.Y) } @@ -188,8 +188,8 @@ func TestScrollContainer_Scrolled_Limit(t *testing.T) { rect.SetMinSize(fyne.NewSize(100, 100)) scroll := NewScrollContainer(rect) scroll.Resize(fyne.NewSize(80, 80)) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -25, DeltaY: -25}) - assert.Equal(t, 20, scroll.Offset.X) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-25, -25)}) + assert.Equal(t, float32(20), scroll.Offset.X) } func TestScrollContainer_Scrolled_Back(t *testing.T) { @@ -199,9 +199,9 @@ func TestScrollContainer_Scrolled_Back(t *testing.T) { scroll.Resize(fyne.NewSize(100, 100)) scroll.Offset.X = 10 scroll.Offset.Y = 10 - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: 10, DeltaY: 10}) - assert.Equal(t, 0, scroll.Offset.X) - assert.Equal(t, 0, scroll.Offset.Y) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(10, 10)}) + assert.Equal(t, float32(0), scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.Y) } func TestScrollContainer_Scrolled_BackLimit(t *testing.T) { @@ -211,9 +211,9 @@ func TestScrollContainer_Scrolled_BackLimit(t *testing.T) { scroll.Resize(fyne.NewSize(100, 100)) scroll.Offset.X = 10 scroll.Offset.Y = 10 - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: 20, DeltaY: 20}) - assert.Equal(t, 0, scroll.Offset.X) - assert.Equal(t, 0, scroll.Offset.Y) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(20, 20)}) + assert.Equal(t, float32(0), scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.Y) } @@ -222,10 +222,10 @@ func TestScrollContainer_Resize(t *testing.T) { scroll := NewScrollContainer(rect) rect.SetMinSize(fyne.NewSize(100, 100)) scroll.Resize(fyne.NewSize(80, 80)) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -20, DeltaY: -20}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-20, -20)}) scroll.Resize(fyne.NewSize(100, 100)) - assert.Equal(t, 0, scroll.Offset.X) - assert.Equal(t, 0, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.Y) } @@ -234,10 +234,10 @@ func TestScrollContainer_ResizeOffset(t *testing.T) { scroll := NewScrollContainer(rect) rect.SetMinSize(fyne.NewSize(100, 100)) scroll.Resize(fyne.NewSize(80, 80)) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -20, DeltaY: -20}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-20, -20)}) scroll.Resize(fyne.NewSize(90, 90)) - assert.Equal(t, 10, scroll.Offset.X) - assert.Equal(t, 10, scroll.Offset.Y) + assert.Equal(t, float32(10), scroll.Offset.X) + assert.Equal(t, float32(10), scroll.Offset.Y) } func TestScrollContainer_ResizeExpand(t *testing.T) { @@ -245,8 +245,8 @@ func TestScrollContainer_ResizeExpand(t *testing.T) { rect.SetMinSize(fyne.NewSize(100, 100)) scroll := NewScrollContainer(rect) scroll.Resize(fyne.NewSize(120, 140)) - assert.Equal(t, 120, rect.Size().Width) - assert.Equal(t, 140, rect.Size().Height) + assert.Equal(t, float32(120), rect.Size().Width) + assert.Equal(t, float32(140), rect.Size().Height) } func TestScrollContainer_ScrollBarForSmallContentIsHidden(t *testing.T) { @@ -330,7 +330,7 @@ func TestScrollContainer_ScrollBarGrowsAndShrinksOnMouseInAndMouseOut(t *testing assert.Equal(t, theme.ScrollBarSize(), areaHoriz.Size().Height) assert.Equal(t, fyne.NewPos(0, 100-theme.ScrollBarSize()), areaHoriz.Position()) assert.Equal(t, theme.ScrollBarSize(), barHoriz.Size().Height) - assert.Equal(t, 0, barHoriz.Position().Y) + assert.Equal(t, float32(0), barHoriz.Position().Y) barHoriz.MouseOut() assert.Equal(t, theme.ScrollBarSmallSize()*2, areaHoriz.Size().Height) assert.Equal(t, fyne.NewPos(0, 100-theme.ScrollBarSmallSize()*2), areaHoriz.Position()) @@ -346,7 +346,7 @@ func TestScrollContainer_ScrollBarGrowsAndShrinksOnMouseInAndMouseOut(t *testing assert.Equal(t, theme.ScrollBarSize(), areaVert.Size().Width) assert.Equal(t, fyne.NewPos(100-theme.ScrollBarSize(), 0), areaVert.Position()) assert.Equal(t, theme.ScrollBarSize(), barVert.Size().Width) - assert.Equal(t, 0, barVert.Position().X) + assert.Equal(t, float32(0), barVert.Position().X) barVert.MouseOut() assert.Equal(t, theme.ScrollBarSmallSize()*2, areaVert.Size().Width) assert.Equal(t, fyne.NewPos(100-theme.ScrollBarSmallSize()*2, 0), areaVert.Position()) @@ -363,10 +363,10 @@ func TestScrollContainer_ShowShadowOnLeftIfContentIsScrolled(t *testing.T) { assert.False(t, r.leftShadow.Visible()) assert.Equal(t, fyne.NewPos(0, 0), r.leftShadow.Position()) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -1}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.Delta{DX: -1}}) assert.True(t, r.leftShadow.Visible()) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: 1}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.Delta{DX: 1}}) assert.False(t, r.leftShadow.Visible()) } @@ -379,10 +379,10 @@ func TestScrollContainer_ShowShadowOnRightIfContentCanScroll(t *testing.T) { assert.True(t, r.rightShadow.Visible()) assert.Equal(t, scroll.size.Width, r.rightShadow.Position().X+r.rightShadow.Size().Width) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -400}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.Delta{DX: -400}}) assert.False(t, r.rightShadow.Visible()) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: 100}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.Delta{DX: 100}}) assert.True(t, r.rightShadow.Visible()) } @@ -395,10 +395,10 @@ func TestScrollContainer_ShowShadowOnTopIfContentIsScrolled(t *testing.T) { assert.False(t, r.topShadow.Visible()) assert.Equal(t, fyne.NewPos(0, 0), r.topShadow.Position()) - scroll.Scrolled(&fyne.ScrollEvent{DeltaY: -1}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.Delta{DY: -1}}) assert.True(t, r.topShadow.Visible()) - scroll.Scrolled(&fyne.ScrollEvent{DeltaY: 1}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.Delta{DY: 1}}) assert.False(t, r.topShadow.Visible()) } @@ -411,10 +411,10 @@ func TestScrollContainer_ShowShadowOnBottomIfContentCanScroll(t *testing.T) { assert.True(t, r.bottomShadow.Visible()) assert.Equal(t, scroll.size.Height, r.bottomShadow.Position().Y+r.bottomShadow.Size().Height) - scroll.Scrolled(&fyne.ScrollEvent{DeltaY: -400}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.Delta{DY: -400}}) assert.False(t, r.bottomShadow.Visible()) - scroll.Scrolled(&fyne.ScrollEvent{DeltaY: 100}) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.Delta{DY: 100}}) assert.True(t, r.bottomShadow.Visible()) } @@ -423,22 +423,22 @@ func TestScrollContainer_ScrollHorizontallyWithVerticalMouseScroll(t *testing.T) rect.SetMinSize(fyne.NewSize(1000, 50)) scroll := NewScrollContainer(rect) scroll.Resize(fyne.NewSize(100, 100)) - assert.Equal(t, 0, scroll.Offset.X) - assert.Equal(t, 0, scroll.Offset.Y) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: 0, DeltaY: -10}) - assert.Equal(t, 10, scroll.Offset.X) - assert.Equal(t, 0, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.Y) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(0, -10)}) + assert.Equal(t, float32(10), scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.Y) t.Run("not if scroll event includes horizontal offset", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) rect.SetMinSize(fyne.NewSize(1000, 50)) scroll := NewScrollContainer(rect) scroll.Resize(fyne.NewSize(100, 100)) - assert.Equal(t, 0, scroll.Offset.X) - assert.Equal(t, 0, scroll.Offset.Y) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: -20, DeltaY: -40}) - assert.Equal(t, 20, scroll.Offset.X) - assert.Equal(t, 0, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.Y) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(-20, -40)}) + assert.Equal(t, float32(20), scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.Y) }) t.Run("not if content is vertically scrollable", func(t *testing.T) { @@ -446,11 +446,11 @@ func TestScrollContainer_ScrollHorizontallyWithVerticalMouseScroll(t *testing.T) rect.SetMinSize(fyne.NewSize(1000, 1000)) scroll := NewScrollContainer(rect) scroll.Resize(fyne.NewSize(100, 100)) - assert.Equal(t, 0, scroll.Offset.X) - assert.Equal(t, 0, scroll.Offset.Y) - scroll.Scrolled(&fyne.ScrollEvent{DeltaX: 0, DeltaY: -10}) - assert.Equal(t, 0, scroll.Offset.X) - assert.Equal(t, 10, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.Y) + scroll.Scrolled(&fyne.ScrollEvent{Scrolled: fyne.NewDelta(0, -10)}) + assert.Equal(t, float32(0), scroll.Offset.X) + assert.Equal(t, float32(10), scroll.Offset.Y) }) } @@ -462,13 +462,13 @@ func TestScrollBarRenderer_BarSize(t *testing.T) { areaHoriz := test.WidgetRenderer(test.WidgetRenderer(scroll).(*scrollContainerRenderer).horizArea).(*scrollBarAreaRenderer) areaVert := test.WidgetRenderer(test.WidgetRenderer(scroll).(*scrollContainerRenderer).vertArea).(*scrollBarAreaRenderer) - assert.Equal(t, 100, areaHoriz.bar.Size().Width) - assert.Equal(t, 100, areaVert.bar.Size().Height) + assert.Equal(t, float32(100), areaHoriz.bar.Size().Width) + assert.Equal(t, float32(100), areaVert.bar.Size().Height) // resize so content is twice our size. Bar should therefore be half again. scroll.Resize(fyne.NewSize(50, 50)) - assert.Equal(t, 25, areaHoriz.bar.Size().Width) - assert.Equal(t, 25, areaVert.bar.Size().Height) + assert.Equal(t, float32(25), areaHoriz.bar.Size().Width) + assert.Equal(t, float32(25), areaVert.bar.Size().Height) } func TestScrollContainerRenderer_LimitBarSize(t *testing.T) { @@ -479,8 +479,8 @@ func TestScrollContainerRenderer_LimitBarSize(t *testing.T) { areaHoriz := test.WidgetRenderer(test.WidgetRenderer(scroll).(*scrollContainerRenderer).horizArea).(*scrollBarAreaRenderer) areaVert := test.WidgetRenderer(test.WidgetRenderer(scroll).(*scrollContainerRenderer).vertArea).(*scrollBarAreaRenderer) - assert.Equal(t, 120, areaHoriz.bar.Size().Width) - assert.Equal(t, 120, areaVert.bar.Size().Height) + assert.Equal(t, float32(120), areaHoriz.bar.Size().Width) + assert.Equal(t, float32(120), areaVert.bar.Size().Height) } func TestScrollContainerRenderer_Direction(t *testing.T) { @@ -528,24 +528,24 @@ func TestScrollContainerRenderer_MinSize_Direction(t *testing.T) { rect.SetMinSize(fyne.NewSize(100, 100)) scroll := NewScrollContainer(rect) size := test.WidgetRenderer(scroll).MinSize() - assert.Equal(t, 32, size.Height) - assert.Equal(t, 32, size.Width) + assert.Equal(t, float32(32), size.Height) + assert.Equal(t, float32(32), size.Width) }) t.Run("HorizontalOnly", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) rect.SetMinSize(fyne.NewSize(100, 100)) scroll := NewHScrollContainer(rect) size := test.WidgetRenderer(scroll).MinSize() - assert.Equal(t, 100, size.Height) - assert.Equal(t, 32, size.Width) + assert.Equal(t, float32(100), size.Height) + assert.Equal(t, float32(32), size.Width) }) t.Run("VerticalOnly", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) rect.SetMinSize(fyne.NewSize(100, 100)) scroll := NewVScrollContainer(rect) size := test.WidgetRenderer(scroll).MinSize() - assert.Equal(t, 32, size.Height) - assert.Equal(t, 100, size.Width) + assert.Equal(t, float32(32), size.Height) + assert.Equal(t, float32(100), size.Width) }) } @@ -556,8 +556,8 @@ func TestScrollContainerRenderer_SetMinSize_Direction(t *testing.T) { scroll := NewScrollContainer(rect) scroll.SetMinSize(fyne.NewSize(50, 50)) size := test.WidgetRenderer(scroll).MinSize() - assert.Equal(t, 50, size.Height) - assert.Equal(t, 50, size.Width) + assert.Equal(t, float32(50), size.Height) + assert.Equal(t, float32(50), size.Width) }) t.Run("HorizontalOnly", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) @@ -565,8 +565,8 @@ func TestScrollContainerRenderer_SetMinSize_Direction(t *testing.T) { scroll := NewHScrollContainer(rect) scroll.SetMinSize(fyne.NewSize(50, 50)) size := test.WidgetRenderer(scroll).MinSize() - assert.Equal(t, 100, size.Height) - assert.Equal(t, 50, size.Width) + assert.Equal(t, float32(100), size.Height) + assert.Equal(t, float32(50), size.Width) }) t.Run("VerticalOnly", func(t *testing.T) { rect := canvas.NewRectangle(color.Black) @@ -574,8 +574,8 @@ func TestScrollContainerRenderer_SetMinSize_Direction(t *testing.T) { scroll := NewVScrollContainer(rect) scroll.SetMinSize(fyne.NewSize(50, 50)) size := test.WidgetRenderer(scroll).MinSize() - assert.Equal(t, 50, size.Height) - assert.Equal(t, 100, size.Width) + assert.Equal(t, float32(50), size.Height) + assert.Equal(t, float32(100), size.Width) }) } @@ -588,15 +588,15 @@ func TestScrollBar_Dragged_ClickedInside(t *testing.T) { scrollBarVert := test.WidgetRenderer(test.WidgetRenderer(scroll).(*scrollContainerRenderer).vertArea).(*scrollBarAreaRenderer).bar // Create drag event with starting position inside scroll rectangle area - dragEvent := fyne.DragEvent{DraggedX: 20} - assert.Equal(t, 0, scroll.Offset.X) + dragEvent := fyne.DragEvent{Dragged: fyne.Delta{DX: 20}} + assert.Equal(t, float32(0), scroll.Offset.X) scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 100, scroll.Offset.X) + assert.Equal(t, float32(100), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: 20} - assert.Equal(t, 0, scroll.Offset.Y) + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: 20}} + assert.Equal(t, float32(0), scroll.Offset.Y) scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 100, scroll.Offset.Y) + assert.Equal(t, float32(100), scroll.Offset.Y) } func TestScrollBar_DraggedBack_ClickedInside(t *testing.T) { @@ -608,21 +608,21 @@ func TestScrollBar_DraggedBack_ClickedInside(t *testing.T) { scrollBarVert := test.WidgetRenderer(test.WidgetRenderer(scroll).(*scrollContainerRenderer).vertArea).(*scrollBarAreaRenderer).bar // Drag forward - dragEvent := fyne.DragEvent{DraggedX: 20} + dragEvent := fyne.DragEvent{Dragged: fyne.Delta{DX: 20}} scrollBarHoriz.Dragged(&dragEvent) - dragEvent = fyne.DragEvent{DraggedY: 20} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: 20}} scrollBarVert.Dragged(&dragEvent) // Drag back - dragEvent = fyne.DragEvent{DraggedX: -10} - assert.Equal(t, 100, scroll.Offset.X) + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DX: -10}} + assert.Equal(t, float32(100), scroll.Offset.X) scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 50, scroll.Offset.X) + assert.Equal(t, float32(50), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: -10} - assert.Equal(t, 100, scroll.Offset.Y) + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: -10}} + assert.Equal(t, float32(100), scroll.Offset.Y) scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 50, scroll.Offset.Y) + assert.Equal(t, float32(50), scroll.Offset.Y) } func TestScrollBar_Dragged_Limit(t *testing.T) { @@ -634,46 +634,46 @@ func TestScrollBar_Dragged_Limit(t *testing.T) { scrollBarVert := test.WidgetRenderer(test.WidgetRenderer(scroll).(*scrollContainerRenderer).vertArea).(*scrollBarAreaRenderer).bar // Drag over limit - dragEvent := fyne.DragEvent{DraggedX: 2000} - assert.Equal(t, 0, scroll.Offset.X) + dragEvent := fyne.DragEvent{Dragged: fyne.Delta{DX: 2000}} + assert.Equal(t, float32(0), scroll.Offset.X) scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 800, scroll.Offset.X) + assert.Equal(t, float32(800), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: 2000} - assert.Equal(t, 0, scroll.Offset.Y) + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: 2000}} + assert.Equal(t, float32(0), scroll.Offset.Y) scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 800, scroll.Offset.Y) + assert.Equal(t, float32(800), scroll.Offset.Y) // Drag again - dragEvent = fyne.DragEvent{DraggedX: 100} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DX: 100}} // Offset doesn't go over limit - assert.Equal(t, 800, scroll.Offset.X) + assert.Equal(t, float32(800), scroll.Offset.X) scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 800, scroll.Offset.X) + assert.Equal(t, float32(800), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: 100} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: 100}} // Offset doesn't go over limit - assert.Equal(t, 800, scroll.Offset.Y) + assert.Equal(t, float32(800), scroll.Offset.Y) scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 800, scroll.Offset.Y) + assert.Equal(t, float32(800), scroll.Offset.Y) // Drag back (still outside limit) - dragEvent = fyne.DragEvent{DraggedX: -1000} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DX: -1000}} scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 800, scroll.Offset.X) + assert.Equal(t, float32(800), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: -1000} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: -1000}} scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 800, scroll.Offset.Y) + assert.Equal(t, float32(800), scroll.Offset.Y) // Drag back (inside limit) - dragEvent = fyne.DragEvent{DraggedX: -1040} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DX: -1040}} scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 300, scroll.Offset.X) + assert.Equal(t, float32(300), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: -1040} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: -1040}} scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 300, scroll.Offset.Y) + assert.Equal(t, float32(300), scroll.Offset.Y) } func TestScrollBar_Dragged_BackLimit(t *testing.T) { @@ -685,35 +685,35 @@ func TestScrollBar_Dragged_BackLimit(t *testing.T) { scrollBarVert := test.WidgetRenderer(test.WidgetRenderer(scroll).(*scrollContainerRenderer).vertArea).(*scrollBarAreaRenderer).bar // Drag over back limit - dragEvent := fyne.DragEvent{DraggedX: -1000} + dragEvent := fyne.DragEvent{Dragged: fyne.Delta{DX: -1000}} // Offset doesn't go over limit - assert.Equal(t, 0, scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.X) scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 0, scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: -1000} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: -1000}} // Offset doesn't go over limit - assert.Equal(t, 0, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.Y) scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 0, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.Y) // Drag (still outside limit) - dragEvent = fyne.DragEvent{DraggedX: 500} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DX: 500}} scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 0, scroll.Offset.X) + assert.Equal(t, float32(0), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: 500} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: 500}} scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 0, scroll.Offset.Y) + assert.Equal(t, float32(0), scroll.Offset.Y) // Drag (inside limit) - dragEvent = fyne.DragEvent{DraggedX: 520} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DX: 520}} scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 100, scroll.Offset.X) + assert.Equal(t, float32(100), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: 520} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: 520}} scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 100, scroll.Offset.Y) + assert.Equal(t, float32(100), scroll.Offset.Y) } func TestScrollBar_DraggedWithNonZeroStartPosition(t *testing.T) { @@ -724,22 +724,22 @@ func TestScrollBar_DraggedWithNonZeroStartPosition(t *testing.T) { scrollBarHoriz := test.WidgetRenderer(test.WidgetRenderer(scroll).(*scrollContainerRenderer).horizArea).(*scrollBarAreaRenderer).bar scrollBarVert := test.WidgetRenderer(test.WidgetRenderer(scroll).(*scrollContainerRenderer).vertArea).(*scrollBarAreaRenderer).bar - dragEvent := fyne.DragEvent{DraggedX: 50} - assert.Equal(t, 0, scroll.Offset.X) + dragEvent := fyne.DragEvent{Dragged: fyne.Delta{DX: 50}} + assert.Equal(t, float32(0), scroll.Offset.X) scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 250, scroll.Offset.X) + assert.Equal(t, float32(250), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: 50} - assert.Equal(t, 0, scroll.Offset.Y) + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: 50}} + assert.Equal(t, float32(0), scroll.Offset.Y) scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 250, scroll.Offset.Y) + assert.Equal(t, float32(250), scroll.Offset.Y) // Drag again (after releasing mouse button) - dragEvent = fyne.DragEvent{DraggedX: 20} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DX: 20}} scrollBarHoriz.Dragged(&dragEvent) - assert.Equal(t, 350, scroll.Offset.X) + assert.Equal(t, float32(350), scroll.Offset.X) - dragEvent = fyne.DragEvent{DraggedY: 20} + dragEvent = fyne.DragEvent{Dragged: fyne.Delta{DY: 20}} scrollBarVert.Dragged(&dragEvent) - assert.Equal(t, 350, scroll.Offset.Y) + assert.Equal(t, float32(350), scroll.Offset.Y) } diff --git a/widget/select.go b/widget/select.go index 3fbd3f4a83..4fa4fed47b 100644 --- a/widget/select.go +++ b/widget/select.go @@ -258,7 +258,7 @@ func (s *Select) showPopUp() { } c := fyne.CurrentApp().Driver().CanvasForObject(s.super()) - s.popUp = newPopUpMenu(fyne.NewMenu("", items...), c) + s.popUp = NewPopUpMenu(fyne.NewMenu("", items...), c) s.popUp.ShowAtPosition(s.popUpPos()) s.popUp.Resize(fyne.NewSize(s.Size().Width-theme.Padding()*2, s.popUp.MinSize().Height)) } diff --git a/widget/select_entry.go b/widget/select_entry.go index 232b2840c7..1a669a0f85 100644 --- a/widget/select_entry.go +++ b/widget/select_entry.go @@ -101,7 +101,7 @@ func (e *SelectEntry) setupDropDown() *Button { entryPos := fyne.CurrentApp().Driver().AbsolutePositionForObject(e.super()) popUpPos := entryPos.Add(fyne.NewPos(theme.Padding(), e.Size().Height)) - e.popUp = newPopUpMenu(e.dropDown, c) + e.popUp = NewPopUpMenu(e.dropDown, c) e.popUp.ShowAtPosition(popUpPos) e.popUp.Resize(fyne.NewSize(e.Size().Width-theme.Padding()*2, e.popUp.MinSize().Height)) }) diff --git a/widget/select_entry_test.go b/widget/select_entry_test.go index d5d9564825..f3d7f1e91d 100644 --- a/widget/select_entry_test.go +++ b/widget/select_entry_test.go @@ -708,11 +708,11 @@ func TestSelectEntry_SetOptions_Empty(t *testing.T) { `, c) } -func dropDownIconWidth() int { +func dropDownIconWidth() float32 { return theme.IconInlineSize() + theme.Padding() } -func emptyTextWidth() int { +func emptyTextWidth() float32 { return widget.NewLabel("M").MinSize().Width } @@ -721,8 +721,8 @@ func optionsMinSize(options []string) fyne.Size { for _, option := range options { labels = append(labels, widget.NewLabel(option)) } - minWidth := 0 - minHeight := 0 + minWidth := float32(0) + minHeight := float32(0) for _, label := range labels { if minWidth < label.MinSize().Width { minWidth = label.MinSize().Width @@ -730,6 +730,6 @@ func optionsMinSize(options []string) fyne.Size { minHeight += label.MinSize().Height } // padding between all options - minHeight += (len(labels) - 1) * theme.Padding() + minHeight += float32(len(labels)-1) * theme.Padding() return fyne.NewSize(minWidth, minHeight) } diff --git a/widget/separator.go b/widget/separator.go index d55c7fd003..ae0b51fe09 100644 --- a/widget/separator.go +++ b/widget/separator.go @@ -7,7 +7,7 @@ import ( "fyne.io/fyne/theme" ) -const separatorThickness = 1 +const separatorThickness = float32(1) var _ fyne.Widget = (*Separator)(nil) diff --git a/widget/slider.go b/widget/slider.go index 355c1b52be..df5d02b9f2 100644 --- a/widget/slider.go +++ b/widget/slider.go @@ -97,11 +97,11 @@ func (s *Slider) Dragged(e *fyne.DragEvent) { } } -func (s *Slider) buttonDiameter() int { +func (s *Slider) buttonDiameter() float32 { return theme.Padding() * standardScale } -func (s *Slider) endOffset() int { +func (s *Slider) endOffset() float32 { return s.buttonDiameter()/2 + theme.Padding() } @@ -211,8 +211,8 @@ func (s *Slider) Unbind() { } const ( - standardScale = 4 - minLongSide = 50 + standardScale = float32(4) + minLongSide = float32(50) ) type sliderRenderer struct { @@ -293,7 +293,7 @@ func (s *sliderRenderer) MinSize() fyne.Size { return fyne.Size{Width: 0, Height: 0} } -func (s *sliderRenderer) getOffset() int { +func (s *sliderRenderer) getOffset() float32 { endPad := s.slider.endOffset() w := s.slider size := s.track.Size() @@ -305,14 +305,14 @@ func (s *sliderRenderer) getOffset() int { return endPad } } - ratio := (w.Value - w.Min) / (w.Max - w.Min) + ratio := float32((w.Value - w.Min) / (w.Max - w.Min)) switch w.Orientation { case Vertical: - y := int(float64(size.Height)-ratio*float64(size.Height)) + endPad + y := size.Height - ratio*size.Height + endPad return y case Horizontal: - x := int(ratio*float64(size.Width)) + endPad + x := ratio*size.Width + endPad return x } diff --git a/widget/slider_extend_test.go b/widget/slider_extend_test.go index a5a3254f64..76df3f65a7 100644 --- a/widget/slider_extend_test.go +++ b/widget/slider_extend_test.go @@ -42,7 +42,7 @@ func TestSlider_Extended_Drag(t *testing.T) { thumb := objs[2] thumbPos := thumb.Position() - drag := &fyne.DragEvent{DraggedX: 10, DraggedY: 2} + drag := &fyne.DragEvent{Dragged: fyne.NewDelta(10, 2)} slider.Dragged(drag) assert.Greater(t, thumbPos.X, thumb.Position().X) assert.Equal(t, thumbPos.Y, thumb.Position().Y) diff --git a/widget/slider_test.go b/widget/slider_test.go index ea4f25fbc7..dae00a0b8c 100644 --- a/widget/slider_test.go +++ b/widget/slider_test.go @@ -146,7 +146,7 @@ func TestSlider_OnChanged(t *testing.T) { slider.SetValue(0.5) assert.Equal(t, 1, changes) - drag := &fyne.DragEvent{DraggedX: 10, DraggedY: 2} + drag := &fyne.DragEvent{Dragged: fyne.NewDelta(10, 2)} slider.Dragged(drag) assert.Equal(t, 2, changes) } diff --git a/widget/splitcontainer.go b/widget/splitcontainer.go index 8a97b1c922..e47bd68042 100644 --- a/widget/splitcontainer.go +++ b/widget/splitcontainer.go @@ -151,7 +151,7 @@ func (r *splitContainerRenderer) Refresh() { canvas.Refresh(r.split) } -func (r *splitContainerRenderer) computeSplitLengths(total, lMin, tMin int) (int, int) { +func (r *splitContainerRenderer) computeSplitLengths(total, lMin, tMin float32) (float32, float32) { available := float64(total - dividerThickness()) if available <= 0 { return 0, 0 @@ -175,7 +175,7 @@ func (r *splitContainerRenderer) computeSplitLengths(total, lMin, tMin int) (int ld = offset * available tr = available - ld - return int(ld), int(tr) + return float32(ld), float32(tr) } // Declare conformity with interfaces @@ -228,7 +228,7 @@ func (d *divider) Dragged(event *fyne.DragEvent) { if trailingRatio := 1. - (float64(d.split.Trailing.Size().Width) / float64(d.split.Size().Width)); offset > trailingRatio { offset = trailingRatio } - offset += float64(event.DraggedX) / float64(d.split.Size().Width) + offset += float64(event.Dragged.DX) / float64(d.split.Size().Width) } else { if leadingRatio := float64(d.split.Leading.Size().Height) / float64(d.split.Size().Height); offset < leadingRatio { offset = leadingRatio @@ -236,7 +236,7 @@ func (d *divider) Dragged(event *fyne.DragEvent) { if trailingRatio := 1. - (float64(d.split.Trailing.Size().Height) / float64(d.split.Size().Height)); offset > trailingRatio { offset = trailingRatio } - offset += float64(event.DraggedY) / float64(d.split.Size().Height) + offset += float64(event.Dragged.DY) / float64(d.split.Size().Height) } d.split.SetOffset(offset) } @@ -272,7 +272,7 @@ func (r *dividerRenderer) Destroy() { } func (r *dividerRenderer) Layout(size fyne.Size) { - var x, y, w, h int + var x, y, w, h float32 if r.divider.split.Horizontal { x = (dividerThickness() - handleThickness()) / 2 y = (size.Height - handleLength()) / 2 @@ -304,18 +304,18 @@ func (r *dividerRenderer) Refresh() { r.Layout(r.divider.Size()) } -func dividerThickness() int { +func dividerThickness() float32 { return theme.Padding() * 2 } -func dividerLength() int { +func dividerLength() float32 { return theme.Padding() * 6 } -func handleThickness() int { +func handleThickness() float32 { return theme.Padding() / 2 } -func handleLength() int { +func handleLength() float32 { return theme.Padding() * 4 } diff --git a/widget/splitcontainer_test.go b/widget/splitcontainer_test.go index bb847c69f9..a3dd45aba1 100644 --- a/widget/splitcontainer_test.go +++ b/widget/splitcontainer_test.go @@ -136,19 +136,19 @@ func TestSplitContainer_SetRatio(t *testing.T) { sc.SetOffset(0.75) sizeA := objA.Size() sizeB := objB.Size() - assert.Equal(t, int(0.75*usableLength), sizeA.Width) - assert.Equal(t, 100, sizeA.Height) - assert.Equal(t, int(0.25*usableLength), sizeB.Width) - assert.Equal(t, 100, sizeB.Height) + assert.Equal(t, float32(0.75*usableLength), sizeA.Width) + assert.Equal(t, float32(100), sizeA.Height) + assert.Equal(t, float32(0.25*usableLength), sizeB.Width) + assert.Equal(t, float32(100), sizeB.Height) }) t.Run("Trailing", func(t *testing.T) { sc.SetOffset(0.25) sizeA := objA.Size() sizeB := objB.Size() - assert.Equal(t, int(0.25*usableLength), sizeA.Width) - assert.Equal(t, 100, sizeA.Height) - assert.Equal(t, int(0.75*usableLength), sizeB.Width) - assert.Equal(t, 100, sizeB.Height) + assert.Equal(t, float32(0.25*usableLength), sizeA.Width) + assert.Equal(t, float32(100), sizeA.Height) + assert.Equal(t, float32(0.75*usableLength), sizeB.Width) + assert.Equal(t, float32(100), sizeB.Height) }) }) t.Run("Vertical", func(t *testing.T) { @@ -158,19 +158,19 @@ func TestSplitContainer_SetRatio(t *testing.T) { sc.SetOffset(0.75) sizeA := objA.Size() sizeB := objB.Size() - assert.Equal(t, 100, sizeA.Width) - assert.Equal(t, int(0.75*usableLength), sizeA.Height) - assert.Equal(t, 100, sizeB.Width) - assert.Equal(t, int(0.25*usableLength), sizeB.Height) + assert.Equal(t, float32(100), sizeA.Width) + assert.Equal(t, float32(0.75*usableLength), sizeA.Height) + assert.Equal(t, float32(100), sizeB.Width) + assert.Equal(t, float32(0.25*usableLength), sizeB.Height) }) t.Run("Trailing", func(t *testing.T) { sc.SetOffset(0.25) sizeA := objA.Size() sizeB := objB.Size() - assert.Equal(t, 100, sizeA.Width) - assert.Equal(t, int(0.25*usableLength), sizeA.Height) - assert.Equal(t, 100, sizeB.Width) - assert.Equal(t, int(0.75*usableLength), sizeB.Height) + assert.Equal(t, float32(100), sizeA.Width) + assert.Equal(t, float32(0.25*usableLength), sizeA.Height) + assert.Equal(t, float32(100), sizeB.Width) + assert.Equal(t, float32(0.75*usableLength), sizeB.Height) }) }) } @@ -189,19 +189,19 @@ func TestSplitContainer_SetRatio_limits(t *testing.T) { sizeA := objA.Size() sizeB := objB.Size() assert.Equal(t, 150-dividerThickness(), sizeA.Width) - assert.Equal(t, 50, sizeA.Height) - assert.Equal(t, 50, sizeB.Width) - assert.Equal(t, 50, sizeB.Height) + assert.Equal(t, float32(50), sizeA.Height) + assert.Equal(t, float32(50), sizeB.Width) + assert.Equal(t, float32(50), sizeB.Height) }) t.Run("Trailing", func(t *testing.T) { sc.SetOffset(0.0) sc.Resize(fyne.NewSize(200, 50)) sizeA := objA.Size() sizeB := objB.Size() - assert.Equal(t, 50, sizeA.Width) - assert.Equal(t, 50, sizeA.Height) + assert.Equal(t, float32(50), sizeA.Width) + assert.Equal(t, float32(50), sizeA.Height) assert.Equal(t, 150-dividerThickness(), sizeB.Width) - assert.Equal(t, 50, sizeB.Height) + assert.Equal(t, float32(50), sizeB.Height) }) }) t.Run("Vertical", func(t *testing.T) { @@ -211,19 +211,19 @@ func TestSplitContainer_SetRatio_limits(t *testing.T) { sc.Resize(fyne.NewSize(50, 200)) sizeA := objA.Size() sizeB := objB.Size() - assert.Equal(t, 50, sizeA.Width) + assert.Equal(t, float32(50), sizeA.Width) assert.Equal(t, 150-dividerThickness(), sizeA.Height) - assert.Equal(t, 50, sizeB.Width) - assert.Equal(t, 50, sizeB.Height) + assert.Equal(t, float32(50), sizeB.Width) + assert.Equal(t, float32(50), sizeB.Height) }) t.Run("Trailing", func(t *testing.T) { sc.SetOffset(0.0) sc.Resize(fyne.NewSize(50, 200)) sizeA := objA.Size() sizeB := objB.Size() - assert.Equal(t, 50, sizeA.Width) - assert.Equal(t, 50, sizeA.Height) - assert.Equal(t, 50, sizeB.Width) + assert.Equal(t, float32(50), sizeA.Width) + assert.Equal(t, float32(50), sizeA.Height) + assert.Equal(t, float32(50), sizeB.Width) assert.Equal(t, 150-dividerThickness(), sizeB.Height) }) }) @@ -254,8 +254,7 @@ func TestSplitContainer_divider_drag(t *testing.T) { divider.Dragged(&fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(20, 9)}, - DraggedX: 10, - DraggedY: -1, + Dragged: fyne.NewDelta(10, -1), }) assert.Equal(t, 0.6, split.Offset) @@ -270,8 +269,7 @@ func TestSplitContainer_divider_drag(t *testing.T) { divider.Dragged(&fyne.DragEvent{ PointEvent: fyne.PointEvent{Position: fyne.NewPos(9, 20)}, - DraggedX: -1, - DraggedY: 10, + Dragged: fyne.NewDelta(-1, 10), }) assert.Equal(t, 0.6, split.Offset) @@ -294,7 +292,7 @@ func TestSplitContainer_divider_drag_StartOffsetLessThanMinSize(t *testing.T) { split.SetOffset(0.1) divider.Dragged(&fyne.DragEvent{ - DraggedX: 10, + Dragged: fyne.NewDelta(10, 0), }) divider.DragEnd() @@ -304,7 +302,7 @@ func TestSplitContainer_divider_drag_StartOffsetLessThanMinSize(t *testing.T) { split.SetOffset(0.9) divider.Dragged(&fyne.DragEvent{ - DraggedX: -10, + Dragged: fyne.NewDelta(-10, 0), }) divider.DragEnd() @@ -319,7 +317,7 @@ func TestSplitContainer_divider_drag_StartOffsetLessThanMinSize(t *testing.T) { split.SetOffset(0.1) divider.Dragged(&fyne.DragEvent{ - DraggedY: 10, + Dragged: fyne.NewDelta(0, 10), }) divider.DragEnd() @@ -329,7 +327,7 @@ func TestSplitContainer_divider_drag_StartOffsetLessThanMinSize(t *testing.T) { split.SetOffset(0.9) divider.Dragged(&fyne.DragEvent{ - DraggedY: -10, + Dragged: fyne.NewDelta(0, -10), }) divider.DragEnd() diff --git a/widget/tabcontainer.go b/widget/tabcontainer.go index d81d37d812..c03c5e7e5d 100644 --- a/widget/tabcontainer.go +++ b/widget/tabcontainer.go @@ -266,7 +266,7 @@ func (r *tabContainerRenderer) MinSize() fyne.Size { childMin := fyne.NewSize(0, 0) for _, child := range r.container.Items { - childMin = childMin.Union(child.Content.MinSize()) + childMin = childMin.Max(child.Content.MinSize()) } tabLocation := r.container.tabLocation @@ -561,7 +561,7 @@ func (r *tabButtonRenderer) Layout(size fyne.Size) { padding := r.padding() innerSize := size.Subtract(padding) innerOffset := fyne.NewPos(padding.Width/2, padding.Height/2) - labelShift := 0 + labelShift := float32(0) if r.icon != nil { var iconOffset fyne.Position if r.button.IconPosition == buttonIconTop { @@ -589,7 +589,7 @@ func (r *tabButtonRenderer) Layout(size fyne.Size) { } func (r *tabButtonRenderer) MinSize() fyne.Size { - var contentWidth, contentHeight int + var contentWidth, contentHeight float32 textSize := r.label.MinSize() if r.button.IconPosition == buttonIconTop { contentWidth = fyne.Max(textSize.Width, r.iconSize()) @@ -653,7 +653,7 @@ func (r *tabButtonRenderer) Refresh() { canvas.Refresh(r.button) } -func (r *tabButtonRenderer) iconSize() int { +func (r *tabButtonRenderer) iconSize() float32 { switch r.button.IconPosition { case buttonIconTop: return 2 * theme.IconInlineSize() diff --git a/widget/tabcontainer_mobile_test.go b/widget/tabcontainer_mobile_test.go index 29191897ff..2dadafab89 100644 --- a/widget/tabcontainer_mobile_test.go +++ b/widget/tabcontainer_mobile_test.go @@ -462,14 +462,14 @@ func TestTabContainer_HoverButtons(t *testing.T) { - Test1 + Test1 Test2 - + diff --git a/widget/tabcontainer_test.go b/widget/tabcontainer_test.go index bb4d3adad9..b16b4bd0ec 100644 --- a/widget/tabcontainer_test.go +++ b/widget/tabcontainer_test.go @@ -32,7 +32,7 @@ func TestTabContainer_Empty(t *testing.T) { assert.Equal(t, -1, tabs.CurrentTabIndex()) assert.Nil(t, tabs.CurrentTab()) min := tabs.MinSize() - assert.Equal(t, 0, min.Width) + assert.Equal(t, float32(0), min.Width) assert.Equal(t, theme.Padding(), min.Height) } @@ -56,8 +56,8 @@ func TestTabContainer_Resize_Empty(t *testing.T) { tabs := widget.NewTabContainer() tabs.Resize(fyne.NewSize(10, 10)) size := tabs.Size() - assert.Equal(t, 10, size.Height) - assert.Equal(t, 10, size.Width) + assert.Equal(t, float32(10), size.Height) + assert.Equal(t, float32(10), size.Width) } func TestTabContainer_SelectTab(t *testing.T) { diff --git a/widget/table.go b/widget/table.go index 1281784470..ae2a583353 100644 --- a/widget/table.go +++ b/widget/table.go @@ -35,7 +35,7 @@ type Table struct { selectedCell, hoveredCell *TableCellID cells *tableCells - columnWidths map[int]int + columnWidths map[int]float32 moveCallback func() offset fyne.Position scroll *ScrollContainer @@ -107,9 +107,9 @@ func (t *Table) Select(id TableCellID) { // to the internal content width not including any standard padding or divider size. // // Since: 1.4.1 -func (t *Table) SetColumnWidth(id, width int) { +func (t *Table) SetColumnWidth(id int, width float32) { if t.columnWidths == nil { - t.columnWidths = make(map[int]int) + t.columnWidths = make(map[int]float32) } t.columnWidths[id] = width + 2*theme.Padding() // The API uses content size so it's consistent with templates t.Refresh() @@ -139,8 +139,8 @@ func (t *Table) scrollTo(id TableCellID) { minSize := t.templateSize() cellPadded := minSize.Add(fyne.NewSize(theme.Padding()*2, theme.Padding()*2)) - cellX := 0 - cellWidth := 0 + cellX := float32(0) + cellWidth := float32(0) for i := 0; i <= id.Col; i++ { if cellWidth > 0 { cellX += cellWidth + separatorThickness @@ -159,7 +159,7 @@ func (t *Table) scrollTo(id TableCellID) { scrollPos.X = cellX + cellWidth - t.scroll.size.Width } - cellY := id.Row * (cellPadded.Height + separatorThickness) + cellY := float32(id.Row) * (cellPadded.Height + separatorThickness) if cellY < scrollPos.Y { scrollPos.Y = cellY } else if cellY+cellPadded.Height > scrollPos.Y+t.scroll.size.Height { @@ -184,11 +184,11 @@ func (t *Table) templateSize() fyne.Size { return fyne.Size{} } -func (t *Table) visibleColumnWidths(colWidth, cols int) (visible map[int]int, offX, minCol, maxCol int) { +func (t *Table) visibleColumnWidths(colWidth float32, cols int) (visible map[int]float32, offX float32, minCol, maxCol int) { maxCol = cols - colOffset := 0 + colOffset := float32(0) isVisible := false - visible = make(map[int]int) + visible = make(map[int]float32) if t.scroll.size.Width <= 0 { return @@ -264,7 +264,7 @@ func (t *tableRenderer) Refresh() { t.t.cells.Refresh() } -func (t *tableRenderer) moveColumnMarker(marker fyne.CanvasObject, col, offX, minCol int, widths map[int]int) { +func (t *tableRenderer) moveColumnMarker(marker fyne.CanvasObject, col int, offX float32, minCol int, widths map[int]float32) { if col == -1 { marker.Hide() } else { @@ -339,7 +339,8 @@ func (t *tableRenderer) moveIndicators() { } i = 0 - for y := theme.Padding() + t.scroll.Offset.Y - (t.scroll.Offset.Y % (t.cellSize.Height + separatorThickness)) - separatorThickness; y < t.scroll.Offset.Y+t.t.size.Height && i < rows-1; y += t.cellSize.Height + separatorThickness { + count := int(t.scroll.Offset.Y) % int(t.cellSize.Height+separatorThickness) + for y := theme.Padding() + t.scroll.Offset.Y - float32(count) - separatorThickness; y < t.scroll.Offset.Y+t.t.size.Height && i < rows-1; y += t.cellSize.Height + separatorThickness { if y < theme.Padding()+t.scroll.Offset.Y { continue } @@ -361,7 +362,7 @@ func (t *tableRenderer) moveRowMarker(marker fyne.CanvasObject, row int) { if row == -1 { marker.Hide() } else { - offY := row*(t.cellSize.Height+separatorThickness) - t.scroll.Offset.Y + offY := float32(row)*(t.cellSize.Height+separatorThickness) - t.scroll.Offset.Y y1 := theme.Padding() + offY y2 := y1 + t.cellSize.Height if y2 < theme.Padding() || y1 > t.t.size.Height { @@ -430,7 +431,7 @@ func (c *tableCells) Tapped(e *fyne.PointEvent) { } col := c.columnAt(e.Position) - row := e.Position.Y / (c.cellSize.Height + separatorThickness) + row := int(e.Position.Y / (c.cellSize.Height + separatorThickness)) c.t.Select(TableCellID{row, col}) } @@ -459,7 +460,7 @@ func (c *tableCells) hoverAt(pos fyne.Position) { } col := c.columnAt(pos) - row := pos.Y / (c.cellSize.Height + separatorThickness) + row := int(pos.Y / (c.cellSize.Height + separatorThickness)) c.t.hoveredCell = &TableCellID{row, col} rows, cols := 0, 0 @@ -506,7 +507,7 @@ func (r *tableCellsRenderer) MinSize() fyne.Size { } else { fyne.LogError("Missing Length callback required for Table", nil) } - return fyne.NewSize(r.cells.cellSize.Width*cols+(cols-1), r.cells.cellSize.Height*rows+(rows-1)) + return fyne.NewSize(r.cells.cellSize.Width*float32(cols)+float32(cols-1), r.cells.cellSize.Height*float32(rows)+float32(rows-1)) } func (r *tableCellsRenderer) Refresh() { @@ -527,9 +528,9 @@ func (r *tableCellsRenderer) Refresh() { if len(visibleColWidths) == 0 { // we can't show anything until we have some dimensions return } - offY := r.cells.t.offset.Y - (r.cells.t.offset.Y % (r.cells.cellSize.Height + separatorThickness)) - minRow := offY / (r.cells.cellSize.Height + separatorThickness) - maxRow := fyne.Min(minRow+rows, dataRows) + offY := r.cells.t.offset.Y - float32(int(r.cells.t.offset.Y)%int(r.cells.cellSize.Height+separatorThickness)) + minRow := int(offY / (r.cells.cellSize.Height + separatorThickness)) + maxRow := int(fyne.Min(float32(minRow+rows), float32(dataRows))) updateCell := r.cells.t.UpdateCell if updateCell == nil { @@ -555,7 +556,7 @@ func (r *tableCellsRenderer) Refresh() { } c.Move(fyne.NewPos(theme.Padding()+cellOffset, - theme.Padding()+row*(r.cells.cellSize.Height+separatorThickness))) + theme.Padding()+float32(row)*(r.cells.cellSize.Height+separatorThickness))) c.Resize(fyne.NewSize(colWidth-theme.Padding()*2, r.cells.cellSize.Height-theme.Padding()*2)) } @@ -591,5 +592,5 @@ func (r *tableCellsRenderer) visibleRows() int { if f := r.cells.t.Length; f != nil { dataRows, _ = r.cells.t.Length() } - return fyne.Min(int(rows), dataRows) + return int(fyne.Min(float32(rows), float32(dataRows))) } diff --git a/widget/table_test.go b/widget/table_test.go index c92dd03b17..af7a84ca1c 100644 --- a/widget/table_test.go +++ b/widget/table_test.go @@ -45,8 +45,8 @@ func TestTable_Cache(t *testing.T) { objRef := cellRenderer.Objects()[0].(*Label) test.Scroll(c, fyne.NewPos(10, 10), -150, -150) - assert.Equal(t, 0, renderer.scroll.Offset.Y) // we didn't scroll as data shorter - assert.Equal(t, 150, renderer.scroll.Offset.X) + assert.Equal(t, float32(0), renderer.scroll.Offset.Y) // we didn't scroll as data shorter + assert.Equal(t, float32(150), renderer.scroll.Offset.X) assert.Equal(t, 6, len(cellRenderer.Objects())) assert.Equal(t, "Cell 0, 1", cellRenderer.Objects()[0].(*Label).Text) assert.NotEqual(t, objRef, cellRenderer.Objects()[0].(*Label)) // we want to re-use visible cells without rewriting them @@ -429,14 +429,14 @@ func TestTable_Select(t *testing.T) { - + - + @@ -494,7 +494,7 @@ func TestTable_SetColumnWidth(t *testing.T) { cellRenderer := test.WidgetRenderer(renderer.scroll.Content.(*tableCells)) cellRenderer.Refresh() assert.Equal(t, 10, len(cellRenderer.Objects())) - assert.Equal(t, 16, cellRenderer.(*tableCellsRenderer).Objects()[0].Size().Width) + assert.Equal(t, float32(16), cellRenderer.(*tableCellsRenderer).Objects()[0].Size().Width) w := test.NewWindow(table) defer w.Close() diff --git a/widget/testdata/fileicon/fileicon_text_txt.png b/widget/testdata/fileicon/fileicon_text_txt.png index 089962d0fa..b945add941 100644 Binary files a/widget/testdata/fileicon/fileicon_text_txt.png and b/widget/testdata/fileicon/fileicon_text_txt.png differ diff --git a/widget/testdata/menu/layout_normal.png b/widget/testdata/menu/layout_normal.png index 5c80fa72b9..748109011f 100644 Binary files a/widget/testdata/menu/layout_normal.png and b/widget/testdata/menu/layout_normal.png differ diff --git a/widget/testdata/menu/layout_theme_changed.png b/widget/testdata/menu/layout_theme_changed.png index 76b74b095b..66e88a0eb7 100644 Binary files a/widget/testdata/menu/layout_theme_changed.png and b/widget/testdata/menu/layout_theme_changed.png differ diff --git a/widget/testdata/select/theme_changed.png b/widget/testdata/select/theme_changed.png index 9bf097dd8b..a28483f7ac 100644 Binary files a/widget/testdata/select/theme_changed.png and b/widget/testdata/select/theme_changed.png differ diff --git a/widget/testdata/select/theme_initial.png b/widget/testdata/select/theme_initial.png index 63624ecd3a..f0733856b7 100644 Binary files a/widget/testdata/select/theme_initial.png and b/widget/testdata/select/theme_initial.png differ diff --git a/widget/testdata/tabcontainer/mobile/theme_ugly.png b/widget/testdata/tabcontainer/mobile/theme_ugly.png index 3f637fd483..4295040fba 100644 Binary files a/widget/testdata/tabcontainer/mobile/theme_ugly.png and b/widget/testdata/tabcontainer/mobile/theme_ugly.png differ diff --git a/widget/testdata/tree/theme_changed.png b/widget/testdata/tree/theme_changed.png index 7cdedbd65e..d547b4805a 100644 Binary files a/widget/testdata/tree/theme_changed.png and b/widget/testdata/tree/theme_changed.png differ diff --git a/widget/text.go b/widget/text.go index 55a879b0c0..738d85dee1 100644 --- a/widget/text.go +++ b/widget/text.go @@ -103,7 +103,7 @@ func (t *textProvider) updateRowBounds() { textSize := theme.TextSize() maxWidth := t.size.Width - 2*theme.Padding() - t.rowBounds = lineBounds(t.buffer, textWrap, maxWidth, func(text []rune) int { + t.rowBounds = lineBounds(t.buffer, textWrap, maxWidth, func(text []rune) float32 { return fyne.MeasureText(string(text), textSize, textStyle).Width }) } @@ -253,13 +253,13 @@ func (r *textRenderer) MinSize() fyne.Size { r.provider.propertyLock.RUnlock() charMinSize := r.provider.charMinSize() - height := 0 - width := 0 + height := float32(0) + width := float32(0) i := 0 r.provider.propertyLock.RLock() texts := r.texts - count := fyne.Min(len(texts), r.provider.rows()) + count := int(fyne.Min(float32(len(texts)), float32(r.provider.rows()))) r.provider.propertyLock.RUnlock() for ; i < count; i++ { @@ -419,7 +419,7 @@ func findSpaceIndex(text []rune, fallback int) int { // lineBounds accepts a slice of runes, a wrapping mode, a maximum line width and a function to measure line width. // lineBounds returns a slice containing the start and end indicies of each line with the given wrapping applied. -func lineBounds(text []rune, wrap fyne.TextWrap, maxWidth int, measurer func([]rune) int) [][2]int { +func lineBounds(text []rune, wrap fyne.TextWrap, maxWidth float32, measurer func([]rune) float32) [][2]int { lines := splitLines(text) if maxWidth <= 0 || wrap == fyne.TextWrapOff { diff --git a/widget/text_benchmark_test.go b/widget/text_benchmark_test.go index 3ecb875fd1..f397e9cc30 100644 --- a/widget/text_benchmark_test.go +++ b/widget/text_benchmark_test.go @@ -35,9 +35,9 @@ func BenchmarkText_splitLines(b *testing.B) { func benchmarkTextLineBounds(wrap fyne.TextWrap, b *testing.B) { text := []rune(loremIpsum) - textSize := 10 + textSize := float32(10) textStyle := fyne.TextStyle{} - measurer := func(text []rune) int { + measurer := func(text []rune) float32 { return fyne.MeasureText(string(text), textSize, textStyle).Width } for n := 0; n < b.N; n++ { diff --git a/widget/text_test.go b/widget/text_test.go index 4230e93db6..b84dcba67f 100644 --- a/widget/text_test.go +++ b/widget/text_test.go @@ -320,8 +320,8 @@ func TestText_splitLines(t *testing.T) { } func TestText_lineBounds(t *testing.T) { - mockMeasurer := func(text []rune) int { - return len(text) + mockMeasurer := func(text []rune) float32 { + return float32(len(text)) } tests := []struct { name string @@ -697,9 +697,9 @@ func TestText_lineBounds_variable_char_width(t *testing.T) { }, }, } - textSize := 10 + textSize := float32(10) textStyle := fyne.TextStyle{} - measurer := func(text []rune) int { + measurer := func(text []rune) float32 { return fyne.MeasureText(string(text), textSize, textStyle).Width } for _, tt := range tests { @@ -710,10 +710,10 @@ func TestText_lineBounds_variable_char_width(t *testing.T) { } func TestText_binarySearch(t *testing.T) { - maxWidth := 50 - textSize := 10 + maxWidth := float32(50) + textSize := float32(10) textStyle := fyne.TextStyle{} - measurer := func(text []rune) int { + measurer := func(text []rune) float32 { return fyne.MeasureText(string(text), textSize, textStyle).Width } for name, tt := range map[string]struct { diff --git a/widget/textgrid.go b/widget/textgrid.go index d484ad73bd..c81e4a5478 100644 --- a/widget/textgrid.go +++ b/widget/textgrid.go @@ -457,12 +457,12 @@ func (t *textGridRenderer) Layout(size fyne.Size) { } func (t *textGridRenderer) MinSize() fyne.Size { - longestRow := 0 + longestRow := float32(0) for _, row := range t.text.Rows { - longestRow = int(math.Max(float64(longestRow), float64(len(row.Cells)))) + longestRow = float32(math.Max(float64(longestRow), float64(len(row.Cells)))) } return fyne.NewSize(t.cellSize.Width*longestRow, - t.cellSize.Height*len(t.text.Rows)) + t.cellSize.Height*float32(len(t.text.Rows))) } func (t *textGridRenderer) Refresh() { diff --git a/widget/tree.go b/widget/tree.go index 1a3810207a..1e54b6f7b6 100644 --- a/widget/tree.go +++ b/widget/tree.go @@ -193,7 +193,7 @@ func (t *Tree) Select(uid TreeNodeID) { t.selected = []TreeNodeID{uid} if t.scroller != nil { var found bool - var y int + var y float32 var size fyne.Size t.walkAll(func(id TreeNodeID, branch bool, depth int) { m := t.leafMinSize @@ -391,7 +391,7 @@ func (r *treeContentRenderer) Layout(size fyne.Size) { offsetY := r.treeContent.tree.offset.Y viewport := r.treeContent.viewport width := fyne.Max(size.Width, viewport.Width) - y := 0 + y := float32(0) numDividers := 0 // walkAll open branches and obtain nodes to render in scroller's viewport r.treeContent.tree.walkAll(func(uid string, isBranch bool, depth int) { @@ -512,7 +512,7 @@ func (r *treeContentRenderer) MinSize() (min fyne.Size) { if isBranch { m = r.treeContent.tree.branchMinSize } - m.Width += depth * (theme.IconInlineSize() + theme.Padding()) + m.Width += float32(depth) * (theme.IconInlineSize() + theme.Padding()) min.Width = fyne.Max(min.Width, m.Width) min.Height += m.Height }) @@ -595,8 +595,8 @@ func (n *treeNode) CreateRenderer() fyne.WidgetRenderer { } } -func (n *treeNode) Indent() int { - return n.depth * (theme.IconInlineSize() + theme.Padding()) +func (n *treeNode) Indent() float32 { + return float32(n.depth) * (theme.IconInlineSize() + theme.Padding()) } // MouseIn is called when a desktop pointer enters the widget @@ -643,8 +643,8 @@ type treeNodeRenderer struct { } func (r *treeNodeRenderer) Layout(size fyne.Size) { - x := 0 - y := 0 + x := float32(0) + y := float32(0) r.indicator.Move(fyne.NewPos(x, y)) s := fyne.NewSize(theme.Padding(), size.Height) r.indicator.SetMinSize(s) diff --git a/widget/tree_internal_test.go b/widget/tree_internal_test.go index 87c8652cdc..65054439d7 100644 --- a/widget/tree_internal_test.go +++ b/widget/tree_internal_test.go @@ -16,12 +16,12 @@ import ( ) var ( - treeSize = 200 + treeSize = float32(200) templateMinSize = NewLabel("Template Object").MinSize() doublePadding = 2 * theme.Padding() ) -func indentation() int { +func indentation() float32 { return theme.IconInlineSize() + theme.Padding() } @@ -203,17 +203,17 @@ func TestTree_Resize(t *testing.T) { b := getBranch(t, tree, "B") c := getLeaf(t, tree, "C") - assert.Equal(t, 0, a.Position().X) - assert.Equal(t, 0, a.Position().Y) + assert.Equal(t, float32(0), a.Position().X) + assert.Equal(t, float32(0), a.Position().Y) assert.Equal(t, treeSize, a.Size().Width) assert.Equal(t, fyne.Max(templateMinSize.Height, theme.IconInlineSize())+doublePadding, a.Size().Height) - assert.Equal(t, 0, b.Position().X) + assert.Equal(t, float32(0), b.Position().X) assert.Equal(t, fyne.Max(templateMinSize.Height, theme.IconInlineSize())+doublePadding+separatorThickness, b.Position().Y) assert.Equal(t, treeSize, b.Size().Width) assert.Equal(t, fyne.Max(templateMinSize.Height, theme.IconInlineSize())+doublePadding, b.Size().Height) - assert.Equal(t, 0, c.Position().X) + assert.Equal(t, float32(0), c.Position().X) assert.Equal(t, 2*(fyne.Max(templateMinSize.Height, theme.IconInlineSize())+doublePadding+separatorThickness), c.Position().Y) assert.Equal(t, treeSize, c.Size().Width) assert.Equal(t, fyne.Max(templateMinSize.Height, theme.IconInlineSize())+doublePadding, c.Size().Height) @@ -414,7 +414,7 @@ func TestTree_ScrollToSelection(t *testing.T) { tree.Refresh() // Force layout tree.Select("A") // Tree should scroll to the top to show A - assert.Equal(t, 0, tree.scroller.Offset.Y) + assert.Equal(t, float32(0), tree.scroller.Offset.Y) // Below tree.scroller.Offset.Y = 0 // Showing "A" & "B"