class TicTacToe::TUI::Status

Public Class Methods

new(window) click to toggle source
# File lib/tic_tac_toe/tui/status.rb, line 6
def initialize(window)
  @window = window
end

Public Instance Methods

update(players, current_player = nil) click to toggle source
# File lib/tic_tac_toe/tui/status.rb, line 10
def update(players, current_player = nil)
  cursor_position = [@window.cury, @window.curx]
  do_update(players, current_player)
  Curses.refresh
  @window.setpos(*cursor_position)
end

Private Instance Methods

do_update(players, current_player = nil) click to toggle source
# File lib/tic_tac_toe/tui/status.rb, line 19
def do_update(players, current_player = nil)
  max_cols = (Curses.lines / 2 - @window.maxy / 2)
  start = (max_cols - (players.count * 2 - 1)) / 2

  players.each.with_index do |player, idx|
    line = "Player #{player.symbol}".center(Curses.cols)[1..-1]
    scanner = StringScanner.new(line)

    Curses.setpos(start + idx * 2, 0)

    Curses.attron(Curses::A_BOLD) if player == current_player

    text = scanner.scan_until(/(?=#{player.symbol})/)
    Curses.addstr(text)

    write_symbol(scanner.getch, player.color)

    text = scanner.scan_until(/\Z/)
    Curses.addstr(text)

    Curses.attroff(Curses::A_BOLD) if player == current_player
  end
end
write_symbol(symbol, color_name) click to toggle source
# File lib/tic_tac_toe/tui/status.rb, line 43
def write_symbol(symbol, color_name)
  color = Curses.const_get("COLOR_#{color_name.upcase}")
  Curses.attron(Curses.color_pair(color)) do
    Curses.addstr(symbol)
  end
end