Skip to content

Commit

Permalink
Merge pull request #4202 from andydotxyz/fix/4201
Browse files Browse the repository at this point in the history
Fix issues with release regarding scrolling wrapped rich text content
  • Loading branch information
andydotxyz committed Aug 28, 2023
2 parents 31e5985 + 5b55656 commit b0093ff
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 33 deletions.
9 changes: 3 additions & 6 deletions widget/richtext.go
Original file line number Diff line number Diff line change
Expand Up @@ -560,12 +560,9 @@ func (r *textRenderer) MinSize() fyne.Size {
r.obj.propertyLock.RUnlock()

charMinSize := r.obj.charMinSize(false, fyne.TextStyle{})
min := r.obj.prop.MinSize()
if min.Height < 2 { // prop (Rectangle) defaults to 1 min
min = r.calculateMin(bounds, wrap, objs, charMinSize)
if r.obj.scr != nil {
r.obj.prop.SetMinSize(min)
}
min := r.calculateMin(bounds, wrap, objs, charMinSize)
if r.obj.scr != nil {
r.obj.prop.SetMinSize(min)
}

if trunc != fyne.TextTruncateOff && r.obj.Scroll == widget.ScrollNone {
Expand Down
57 changes: 30 additions & 27 deletions widget/richtext_objects.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/internal/scale"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
)

Expand Down Expand Up @@ -455,11 +454,11 @@ func (t *TextSegment) size() float32 {

type richImage struct {
BaseWidget
align fyne.TextAlign
img *canvas.Image
oldMin fyne.Size
layout *fyne.Container
pad1, pad2 fyne.CanvasObject
align fyne.TextAlign
img *canvas.Image
oldMin fyne.Size
layout *fyne.Container
min fyne.Size
}

func newRichImage(u fyne.URI, align fyne.TextAlign) *richImage {
Expand All @@ -471,15 +470,7 @@ func newRichImage(u fyne.URI, align fyne.TextAlign) *richImage {
}

func (r *richImage) CreateRenderer() fyne.WidgetRenderer {
r.pad1 = layout.NewSpacer()
if r.align == fyne.TextAlignLeading {
r.pad1.Hide()
}
r.pad2 = layout.NewSpacer()
if r.align == fyne.TextAlignTrailing {
r.pad2.Hide()
}
r.layout = &fyne.Container{Layout: layout.NewHBoxLayout(), Objects: []fyne.CanvasObject{r.pad1, r.img, r.pad2}}
r.layout = &fyne.Container{Layout: &richImageLayout{r}, Objects: []fyne.CanvasObject{r.img}}
return NewSimpleRenderer(r.layout)
}

Expand All @@ -494,27 +485,39 @@ func (r *richImage) MinSize() fyne.Size {
w := scale.ToScreenCoordinate(c, orig.Width)
h := scale.ToScreenCoordinate(c, orig.Height)
// we return size / 2 as this assumes a HiDPI / 2x image scaling
return fyne.NewSize(float32(w)/2, float32(h)/2)
r.min = fyne.NewSize(float32(w)/2, float32(h)/2)
return r.min
}

func (r *richImage) setAlign(a fyne.TextAlign) {
if r.layout != nil {
switch a {
case fyne.TextAlignLeading:
r.pad1.Hide()
r.pad2.Show()
case fyne.TextAlignTrailing:
r.pad1.Show()
r.pad2.Hide()
default:
r.pad1.Show()
r.pad2.Show()
}
r.layout.Refresh()
}
r.align = a
}

type richImageLayout struct {
r *richImage
}

func (r *richImageLayout) Layout(_ []fyne.CanvasObject, s fyne.Size) {
r.r.img.Resize(r.r.min)
gap := float32(0)

switch r.r.align {
case fyne.TextAlignCenter:
gap = (s.Width - r.r.min.Width) / 2
case fyne.TextAlignTrailing:
gap = s.Width - r.r.min.Width
}

r.r.img.Move(fyne.NewPos(gap, 0))
}

func (r *richImageLayout) MinSize(_ []fyne.CanvasObject) fyne.Size {
return r.r.min
}

type unpadTextWidgetLayout struct {
}

Expand Down
14 changes: 14 additions & 0 deletions widget/richtext_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,20 @@ func TestText_Scroll(t *testing.T) {
text3.Scroll = widget.ScrollVerticalOnly
assert.Equal(t, text3.MinSize().Width, text1.MinSize().Width)
assert.Less(t, text3.MinSize().Height, text1.MinSize().Height)

text4 := NewRichTextWithText("test1\ntest2")
text4.Scroll = widget.ScrollVerticalOnly
text4.Wrapping = fyne.TextWrapBreak

text3.Resize(fyne.NewSize(32, 32))
text4.Resize(fyne.NewSize(32, 32))
assert.Less(t, text4.MinSize().Width, text3.MinSize().Width)
assert.Equal(t, text4.MinSize().Height, text3.MinSize().Height)

content3 := test.WidgetRenderer(text3).Objects()[0].(*widget.Scroll).Content
content4 := test.WidgetRenderer(text4).Objects()[0].(*widget.Scroll).Content
assert.Less(t, content4.MinSize().Width, content3.MinSize().Width)
assert.Greater(t, content4.MinSize().Height, content3.MinSize().Height)
}

func TestText_InsertAt(t *testing.T) {
Expand Down

0 comments on commit b0093ff

Please sign in to comment.