Skip to content

Commit

Permalink
Start fixing scrolling containing entries
Browse files Browse the repository at this point in the history
When setting up an entry do not expose a scroll container unless multiline or scrolling is specified.
Fixes #1939
  • Loading branch information
andydotxyz committed Feb 26, 2021
1 parent b4e99a1 commit fcf6f30
Show file tree
Hide file tree
Showing 41 changed files with 224 additions and 280 deletions.
31 changes: 23 additions & 8 deletions widget/entry.go
Expand Up @@ -158,13 +158,21 @@ func (e *Entry) CreateRenderer() fyne.WidgetRenderer {
// initialise
e.textProvider()
e.placeholderProvider()
scrolling := e.Wrapping != fyne.TextWrapOff

box := canvas.NewRectangle(theme.InputBackgroundColor())
line := canvas.NewRectangle(theme.ShadowColor())

e.content = &entryContent{entry: e}
e.scroll = widget.NewScroll(e.content)
objects := []fyne.CanvasObject{box, line, e.scroll}
e.scroll = &widget.Scroll{}
objects := []fyne.CanvasObject{box, line}
if scrolling {
e.scroll.Content = e.content
objects = append(objects, e.scroll)
} else {
e.scroll.Hide()
objects = append(objects, e.content)
}
e.content.scroll = e.scroll

if e.Password && e.ActionItem == nil {
Expand Down Expand Up @@ -1118,16 +1126,21 @@ func (r *entryRenderer) Layout(size fyne.Size) {

entrySize := size.Subtract(fyne.NewSize(xInset, theme.InputBorderSize()*2))
entryPos := fyne.NewPos(0, theme.InputBorderSize())
r.scroll.Resize(entrySize)
r.scroll.Move(entryPos)
if r.entry.Wrapping == fyne.TextWrapOff {
r.entry.content.Resize(entrySize)
r.entry.content.Move(entryPos)
} else {
r.scroll.Resize(entrySize)
r.scroll.Move(entryPos)
}
}

// MinSize calculates the minimum size of an entry widget.
// This is based on the contained text with a standard amount of padding added.
// If MultiLine is true then we will reserve space for at leasts 3 lines
func (r *entryRenderer) MinSize() fyne.Size {
if r.scroll.Direction == widget.ScrollNone {
return r.scroll.MinSize().Add(fyne.NewSize(0, theme.InputBorderSize()*2))
return r.entry.content.MinSize().Add(fyne.NewSize(0, theme.InputBorderSize()*2))
}

minSize := r.entry.placeholderProvider().charMinSize().Add(fyne.NewSize(theme.Padding()*2, theme.Padding()*2))
Expand Down Expand Up @@ -1194,7 +1207,7 @@ func (r *entryRenderer) Refresh() {
r.entry.validationStatus.Hide()
}

cache.Renderer(r.scroll.Content.(*entryContent)).Refresh()
cache.Renderer(r.entry.content).Refresh()
canvas.Refresh(r.entry.super())
}

Expand Down Expand Up @@ -1456,8 +1469,10 @@ func (r *entryContentRenderer) ensureCursorVisible() {
} else if cy2 >= offset.X+size.Height {
move.DY += cy2 - (offset.Y + size.Height)
}
r.content.scroll.Offset = r.content.scroll.Offset.Add(move)
r.content.scroll.Refresh()
if r.content.scroll.Content != nil {
r.content.scroll.Offset = r.content.scroll.Offset.Add(move)
r.content.scroll.Refresh()
}
}

func (r *entryContentRenderer) moveCursor() {
Expand Down
10 changes: 7 additions & 3 deletions widget/entry_test.go
Expand Up @@ -1567,8 +1567,7 @@ func TestPasswordEntry_Reveal(t *testing.T) {
// the Password field is set to true.
// In this case the action item will be set when the renderer is created.
t.Run("Entry with Password field", func(t *testing.T) {
entry := &widget.Entry{}
entry.Password = true
entry := &widget.Entry{Password: true, Wrapping: fyne.TextWrapWord}
entry.Refresh()
window := test.NewWindow(entry)
defer window.Close()
Expand Down Expand Up @@ -1657,7 +1656,12 @@ func checkNewlineIgnored(t *testing.T, entry *widget.Entry) {
func setupImageTest(t *testing.T, multiLine bool) (*widget.Entry, fyne.Window) {
test.NewApp()

entry := &widget.Entry{MultiLine: multiLine}
var entry *widget.Entry
if multiLine {
entry = &widget.Entry{MultiLine: true, Wrapping: fyne.TextWrapWord}
} else {
entry = &widget.Entry{Wrapping: fyne.TextWrapOff}
}
w := test.NewWindow(entry)
w.Resize(fyne.NewSize(150, 200))

Expand Down
1 change: 1 addition & 0 deletions widget/select_entry.go
Expand Up @@ -17,6 +17,7 @@ type SelectEntry struct {
func NewSelectEntry(options []string) *SelectEntry {
e := &SelectEntry{}
e.ExtendBaseWidget(e)
e.Wrapping = fyne.TextTruncate
e.options = options
return e
}
Expand Down
8 changes: 3 additions & 5 deletions widget/testdata/entry/disableable_disabled_custom_value.xml
Expand Up @@ -3,11 +3,9 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="disabled" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21">Hello</text>
</widget>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21">Hello</text>
</widget>
</widget>
</widget>
Expand Down
14 changes: 6 additions & 8 deletions widget/testdata/entry/disableable_disabled_empty.xml
Expand Up @@ -3,14 +3,12 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="disabled" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21"></text>
</widget>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21"></text>
</widget>
</widget>
</widget>
Expand Down
14 changes: 6 additions & 8 deletions widget/testdata/entry/disableable_disabled_placeholder.xml
Expand Up @@ -3,14 +3,12 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="disabled" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21">Type!</text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21"></text>
</widget>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21">Type!</text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21"></text>
</widget>
</widget>
</widget>
Expand Down
8 changes: 3 additions & 5 deletions widget/testdata/entry/disableable_enabled_custom_value.xml
Expand Up @@ -3,11 +3,9 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="shadow" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21">Hello</text>
</widget>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21">Hello</text>
</widget>
</widget>
</widget>
Expand Down
14 changes: 6 additions & 8 deletions widget/testdata/entry/disableable_enabled_empty.xml
Expand Up @@ -3,14 +3,12 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="shadow" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
</widget>
</widget>
Expand Down
14 changes: 6 additions & 8 deletions widget/testdata/entry/disableable_enabled_placeholder.xml
Expand Up @@ -3,14 +3,12 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="shadow" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21">Type!</text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21">Type!</text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
</widget>
</widget>
Expand Down
16 changes: 7 additions & 9 deletions widget/testdata/entry/focus_gained.xml
Expand Up @@ -3,16 +3,14 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="primary" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<rectangle fillColor="primary" pos="7,6" size="2x21"/>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<rectangle fillColor="primary" pos="7,6" size="2x21"/>
</widget>
</widget>
</content>
Expand Down
14 changes: 6 additions & 8 deletions widget/testdata/entry/focus_lost.xml
Expand Up @@ -3,14 +3,12 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="shadow" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
</widget>
</widget>
Expand Down
16 changes: 7 additions & 9 deletions widget/testdata/entry/focus_with_popup_dismissed.xml
Expand Up @@ -3,16 +3,14 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="primary" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<rectangle fillColor="primary" pos="7,6" size="2x21"/>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<rectangle fillColor="primary" pos="7,6" size="2x21"/>
</widget>
</widget>
</content>
Expand Down
16 changes: 7 additions & 9 deletions widget/testdata/entry/focus_with_popup_entry_selected.xml
Expand Up @@ -3,16 +3,14 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="primary" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<rectangle fillColor="primary" pos="7,6" size="2x21"/>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<rectangle fillColor="primary" pos="7,6" size="2x21"/>
</widget>
</widget>
</content>
Expand Down
16 changes: 7 additions & 9 deletions widget/testdata/entry/focus_with_popup_initial.xml
Expand Up @@ -3,16 +3,14 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="primary" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<rectangle fillColor="primary" pos="7,6" size="2x21"/>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<rectangle fillColor="primary" pos="7,6" size="2x21"/>
</widget>
</widget>
</content>
Expand Down
14 changes: 6 additions & 8 deletions widget/testdata/entry/focused_disabled.xml
Expand Up @@ -3,14 +3,12 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="disabled" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21"></text>
</widget>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text color="disabled" pos="8,6" size="112x21"></text>
</widget>
</widget>
</widget>
Expand Down
16 changes: 7 additions & 9 deletions widget/testdata/entry/focused_enabled.xml
Expand Up @@ -3,16 +3,14 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="primary" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<rectangle fillColor="primary" pos="7,6" size="2x21"/>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<rectangle fillColor="primary" pos="7,6" size="2x21"/>
</widget>
</widget>
</content>
Expand Down
14 changes: 6 additions & 8 deletions widget/testdata/entry/initial.xml
Expand Up @@ -3,14 +3,12 @@
<widget pos="10,10" size="120x37" type="*widget.Entry">
<rectangle fillColor="rgba(102,102,102,255)" pos="0,2" size="120x33"/>
<rectangle fillColor="shadow" pos="0,35" size="120x2"/>
<widget pos="0,2" size="120x33" type="*widget.Scroll">
<widget size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
<widget pos="0,2" size="120x33" type="*widget.entryContent">
<widget size="120x33" type="*widget.textProvider">
<text color="placeholder" pos="8,6" size="112x21"></text>
</widget>
<widget size="120x33" type="*widget.textProvider">
<text pos="8,6" size="112x21"></text>
</widget>
</widget>
</widget>
Expand Down

0 comments on commit fcf6f30

Please sign in to comment.