2020-02-23 14:47:20 +01:00
|
|
|
import util.format
|
|
|
|
|
|
|
|
def scrollable(func):
|
|
|
|
def wrapper(module, widget):
|
|
|
|
text = func(module, widget)
|
2020-03-06 14:14:34 +01:00
|
|
|
widget.set('_raw', text)
|
2020-02-23 14:47:20 +01:00
|
|
|
if not text:
|
|
|
|
return text
|
|
|
|
width = widget.get('theme.width', util.format.asint(module.parameter('width', 30)))
|
|
|
|
if util.format.asbool(module.parameter('scrolling.makewide', True)):
|
2020-03-07 13:21:19 +01:00
|
|
|
widget.set('theme.minwidth', 'A'*width)
|
2020-02-23 14:47:20 +01:00
|
|
|
if width < 0 or len(text) <= width:
|
|
|
|
return text
|
|
|
|
|
2020-02-29 14:05:02 +01:00
|
|
|
start = widget.get('scrolling.start', 0)
|
2020-02-23 14:52:58 +01:00
|
|
|
bounce = util.format.asbool(module.parameter('scrolling.bounce', True))
|
2020-02-23 14:47:20 +01:00
|
|
|
scroll_speed = util.format.asint(module.parameter('scrolling.speed', 1))
|
2020-02-27 21:39:04 +01:00
|
|
|
direction = widget.get('scrolling.direction', 'right')
|
2020-02-29 14:05:02 +01:00
|
|
|
|
2020-02-27 21:39:04 +01:00
|
|
|
if direction == 'left':
|
|
|
|
scroll_speed = -scroll_speed
|
2020-02-29 14:05:02 +01:00
|
|
|
if start + scroll_speed <= 0: # bounce back
|
|
|
|
widget.set('scrolling.direction', 'right')
|
|
|
|
|
|
|
|
next_start = start + scroll_speed
|
|
|
|
if next_start + width > len(text):
|
|
|
|
if not bounce:
|
|
|
|
next_start = 0
|
|
|
|
else:
|
|
|
|
next_start = start - scroll_speed
|
|
|
|
widget.set('scrolling.direction', 'left')
|
|
|
|
|
|
|
|
widget.set('scrolling.start', next_start)
|
2020-02-23 14:47:20 +01:00
|
|
|
|
2020-02-29 14:05:02 +01:00
|
|
|
return text[start:start+width]
|
2020-02-23 14:47:20 +01:00
|
|
|
return wrapper
|
|
|
|
|
|
|
|
# vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
|