class Listpager::Scrollbar

Constants

DOWN_ARROW
UP_ARROW

Attributes

list[R]

Public Class Methods

new(list) click to toggle source
# File lib/listpager/scrollbar.rb, line 11
def initialize(list)
  @list = list
  @memo_keys = nil
  @memo_val = nil
end

Public Instance Methods

can_scroll_down?() click to toggle source
# File lib/listpager/scrollbar.rb, line 103
def can_scroll_down?
  _, maxy = getmaxxy
  list.values.size > list.offset + maxy
end
can_scroll_up?() click to toggle source
# File lib/listpager/scrollbar.rb, line 99
def can_scroll_up?
  list.offset > 0
end
getmaxxy() click to toggle source
# File lib/listpager/scrollbar.rb, line 62
def getmaxxy
  list.getmaxxy
end
render() click to toggle source
# File lib/listpager/scrollbar.rb, line 66
def render
  maxx, maxy = getmaxxy
  x = maxx - self.width

  # If we don't need a scroll bar...
  return if list.values.size <= maxy

  # Both arrows
  window.color_set(Color[:scroll_arrow], nil)
  window.move(0, x)
  window.addstr(UP_ARROW)
  window.move(maxy - 1, x)
  window.addstr(DOWN_ARROW)

  # The full track
  window.color_set(Color[:scroll_track], nil)
  (1 ... maxy - 1).each do |y|
    window.move(y, x)
    window.addstr(' ')
  end

  # Scroll thumb on top of it
  window.color_set(Color[:scroll_thumb], nil)
  scroll_thumb_range.each do |y|
    window.move(y, x)
    window.addstr(' ')
  end

  # Set our drawing cursor at the origin
  window.color_set(Color[:list_default], nil)
  window.move(0, 0)
end
scroll_thumb_range() click to toggle source
# File lib/listpager/scrollbar.rb, line 21
def scroll_thumb_range
  maxx, maxy = getmaxxy

  # We memoize these based on the inputs that effect the output
  memo_keys = [list.values.size, list.offset, maxy]
  return @memo_val if @memo_keys == memo_keys

  # Ref: http://csdgn.org/inform/scrollbar-mechanics
  #  using original camelCasedVariableNames for clarity with the source.
  contentSize = list.values.size.to_f
  windowSize = maxy.to_f
  trackSize = windowSize - 2
  windowContentRatio = windowSize / contentSize
  gripSize = trackSize * windowContentRatio

  minimalGripSize = 1.0
  if gripSize < minimalGripSize
    gripSize = minimalGripSize
  end

  windowScrollAreaSize = contentSize - windowSize
  windowPosition = list.offset.to_f
  windowPositionRatio = windowPosition / windowScrollAreaSize

  trackScrollAreaSize = trackSize - gripSize
  gripPositionOnTrack = trackScrollAreaSize * windowPositionRatio

  st = 1 + gripPositionOnTrack.floor.to_i
  e = (st + gripSize.ceil).to_i

  st = 1 if st < 1
  e = maxy - 1 if e > maxy - 1

  @memo_keys = memo_keys
  return (@memo_val = st ... e)
end
width() click to toggle source
# File lib/listpager/scrollbar.rb, line 17
def width
  1
end
window() click to toggle source
# File lib/listpager/scrollbar.rb, line 58
def window
  list.window
end