diff --git a/docs/changelog.txt b/docs/changelog.txt index f83892e69..5e114c5e2 100644 --- a/docs/changelog.txt +++ b/docs/changelog.txt @@ -47,6 +47,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences: ## API ## Lua +- ``widgets.Label``: ``label.scroll()`` now understands ``home`` and ``end`` keywords for scrolling to the top or bottom ## Removed diff --git a/docs/dev/Lua API.rst b/docs/dev/Lua API.rst index 8b2d8b513..c696248ab 100644 --- a/docs/dev/Lua API.rst +++ b/docs/dev/Lua API.rst @@ -4684,8 +4684,8 @@ The Label widget implements the following methods: This method takes the number of lines to scroll as positive or negative integers or one of the following keywords: ``+page``, ``-page``, - ``+halfpage``, or ``-halfpage``. It returns the number of lines that were - actually scrolled (negative for scrolling up). + ``+halfpage``, ``-halfpage``, ``home``, or ``end``. It returns the number of + lines that were actually scrolled (negative for scrolling up). WrappedLabel class ------------------ diff --git a/library/lua/gui/widgets.lua b/library/lua/gui/widgets.lua index f56eff096..f0129ffe3 100644 --- a/library/lua/gui/widgets.lua +++ b/library/lua/gui/widgets.lua @@ -1315,6 +1315,7 @@ end function Label:scroll(nlines) if not nlines then return end + local text_height = math.max(1, self:getTextHeight()) if type(nlines) == 'string' then if nlines == '+page' then nlines = self.frame_body.height @@ -1324,12 +1325,15 @@ function Label:scroll(nlines) nlines = math.ceil(self.frame_body.height/2) elseif nlines == '-halfpage' then nlines = -math.ceil(self.frame_body.height/2) + elseif nlines == 'home' then + nlines = 1 - self.start_line_num + elseif nlines == 'end' then + nlines = text_height else error(('unhandled scroll keyword: "%s"'):format(nlines)) end end local n = self.start_line_num + nlines - local text_height = math.max(1, self:getTextHeight()) n = math.min(n, text_height - self.frame_body.height + 1) n = math.max(n, 1) nlines = n - self.start_line_num