Class: RoadToRubykaigi::CalibrationBar

Inherits:
Object
  • Object
show all
Defined in:
lib/road_to_rubykaigi/calibration_bar.rb

Constant Summary collapse

BAR_WIDTH =
100
BAR_MAX =
2.5
EMOJI_WIDTH =
2
BOUNCE_HZ =
4
BASE_X =
5
EMOJI_BOUNCE_Y =
6
EMOJI_BASE_Y =
EMOJI_BOUNCE_Y + 1
MESSAGES =
{
  remaining: [5, 5, "#{ANSI::BOLD}%-20s#{ANSI::RESET}  %5.1fs"],
  intensity: [5, 8, '[%s] %.4f'],
}.freeze
LABELS =
{
  static: { text: 'Hold still', emoji: '🧍' },
  walk:   { text: 'Walk',       emoji: 'πŸšΆβ€βž‘οΈ', emoji_bounce: 'πŸƒβ€βž‘οΈ' },
  jump:   { text: 'Jump',       emoji: '🧍',    emoji_bounce: '🀸' },
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.clear_emojiObject



25
26
27
28
29
30
31
# File 'lib/road_to_rubykaigi/calibration_bar.rb', line 25

def self.clear_emoji
  blank = ' ' * (BAR_WIDTH + EMOJI_WIDTH)
  [
    [BASE_X + 1, EMOJI_BOUNCE_Y, blank],
    [BASE_X + 1, EMOJI_BASE_Y, blank],
  ]
end

.statesObject



23
# File 'lib/road_to_rubykaigi/calibration_bar.rb', line 23

def self.states = LABELS.keys.dup

Instance Method Details

#renderObject



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/road_to_rubykaigi/calibration_bar.rb', line 33

def render
  result = [
    format_line(MESSAGES[:remaining], "β–Ά #{@label[:text]}", @sampler.remaining),
    format_line(MESSAGES[:intensity], bar, @sampler.intensity),
  ]

  if bouncing_state?
    emoji_x = BASE_X + 1 + (@sampler.progress * BAR_WIDTH).to_i.clamp(0, BAR_WIDTH)
    # Clear previous emoji
    unless @prev_emoji_x == emoji_x
      result << [@prev_emoji_x, EMOJI_BOUNCE_Y, ' ' * EMOJI_WIDTH]
      result << [@prev_emoji_x, EMOJI_BASE_Y, ' ' * EMOJI_WIDTH]
      @prev_emoji_x = emoji_x
    end

    if bouncing?
      result << [emoji_x, EMOJI_BOUNCE_Y, @label[:emoji_bounce]]
      result << [emoji_x, EMOJI_BASE_Y, ' ' * EMOJI_WIDTH]
    else
      result << [emoji_x, EMOJI_BOUNCE_Y, ' ' * EMOJI_WIDTH]
      result << [emoji_x, EMOJI_BASE_Y, @label[:emoji]]
    end
  else
    result << [BASE_X + 1, EMOJI_BASE_Y, @label[:emoji]]
  end

  result
end