class Ui

Player UI

SCREEN_TOP, SCREEN_LEFT |—–|————-SCREEN_WIDTH———————–| | PLAYER_X | | |————————————————| | |PLAYER_TITLE_Y | | |————————————————| | |PLAYER_STATUS_Y | | | | | |————————————————| | |PLAYER_CONTENT_Y | | | | | | | | | |SCREEN_HEIGHT | | | | | | | | | | | | | | | | | | | | | | |————————————————| | |PLAYER_INFO_Y | |—–|————————————————|

Constants

PLAYER_CONTENT_Y
PLAYER_INFO_Y
PLAYER_NOTE_X
PLAYER_POINTER_X
PLAYER_STATUS_Y
PLAYER_TITLE_Y
PLAYER_X
SCREEN_HEIGHT
SCREEN_LEFT
SCREEN_TOP
SCREEN_WIDTH

Attributes

screen[R]

Public Class Methods

new() click to toggle source
# File lib/mplug163/ui.rb, line 46
def initialize
  Curses.init_screen
  Curses.start_color
  Curses.cbreak
  Curses.stdscr.keypad(true)
  Curses.init_pair(1, Curses::COLOR_BLUE, Curses::COLOR_BLACK)
  Curses.init_pair(2, Curses::COLOR_CYAN, Curses::COLOR_BLACK)
  Curses.init_pair(3, Curses::COLOR_RED, Curses::COLOR_BLACK)
  Curses.init_pair(4, Curses::COLOR_MAGENTA, Curses::COLOR_BLACK)

  # height, width, top, left
  @screen = Curses::Window.new(SCREEN_HEIGHT, SCREEN_WIDTH, 0, 0)

  @netease = NetEase.new
end

Public Instance Methods

build_favorite_menu() click to toggle source
# File lib/mplug163/ui.rb, line 222
def build_favorite_menu
  clear_to_bottom(@screen, PLAYER_CONTENT_Y, SCREEN_HEIGHT)
  putstr(@screen, PLAYER_CONTENT_Y, PLAYER_X, '选择收藏条目类型:', Curses.color_pair(1))
  putstr(@screen, PLAYER_CONTENT_Y + 1, PLAYER_X, '1 - 歌曲')
  putstr(@screen, PLAYER_CONTENT_Y + 2, PLAYER_X, '2 - 精选歌单')
  putstr(@screen, PLAYER_CONTENT_Y + 3, PLAYER_X, '3 - 专辑')
  putstr(@screen, PLAYER_CONTENT_Y + 4, PLAYER_X, '4 - DJ 节目')
  putstr(@screen, PLAYER_CONTENT_Y + 6, PLAYER_X, '请键入对应数字:', Curses.color_pair(2))
  @screen.refresh
  @screen.getch
end
build_loading() click to toggle source
# File lib/mplug163/ui.rb, line 75
def build_loading
  clear_to_bottom(@screen, PLAYER_CONTENT_Y, SCREEN_HEIGHT)
  putstr(@screen, PLAYER_CONTENT_Y, PLAYER_X, 'loading...', Curses.color_pair(1))
  @screen.refresh
end
build_login() click to toggle source
# File lib/mplug163/ui.rb, line 246
def build_login
  params = get_param('请输入登录信息:(e.g. foobar@163.com foobar)')
  account = params.split(' ')
  return build_login if account.size != 2

  login_info = @netease.login(account[0], account[1])
  if login_info['code'] != 200
    x = build_login_error
    return x == '1' ? build_login : -1
  else
    return [login_info, account]
  end
end
build_login_error() click to toggle source
# File lib/mplug163/ui.rb, line 260
def build_login_error
  clear_to_bottom(@screen, PLAYER_CONTENT_Y, SCREEN_HEIGHT)
  putstr(@screen, PLAYER_CONTENT_Y + 1, PLAYER_X, 'oh,出现错误 Orz', Curses.color_pair(2))
  putstr(@screen, PLAYER_CONTENT_Y + 2, PLAYER_X, '1 - 再试一次')
  putstr(@screen, PLAYER_CONTENT_Y + 3, PLAYER_X, '2 - 稍后再试')
  putstr(@screen, PLAYER_CONTENT_Y + 5, PLAYER_X, '请键入对应数字:', Curses.color_pair(2))
  @screen.refresh
  @screen.getch
end
build_menu(datatype, title, datalist, offset, index, step) click to toggle source
# File lib/mplug163/ui.rb, line 81
def build_menu(datatype, title, datalist, offset, index, step)
  title = pretty_format(title, 0, 52)

  clear_to_bottom(@screen, PLAYER_CONTENT_Y, SCREEN_HEIGHT)
  putstr(@screen, PLAYER_TITLE_Y, PLAYER_X, title, Curses.color_pair(1))

  if datalist.size == 0
    putstr(@screen, PLAYER_CONTENT_Y, PLAYER_X, '没有内容 Orz')
  else
    case datatype
    when 'main'
      (offset...[datalist.length, offset + step].min).each do |i|
        if i == index
          line_info = "♩ #{i}. #{datalist[i]}"
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
        else
          line_info = "#{i}. #{datalist[i]}"
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
        end
      end

      putstr(@screen, PLAYER_INFO_Y, PLAYER_X, 'Crafted with ❤ by Ripple Yui', Curses.color_pair(3))

    when 'songs'
      (offset...[datalist.length, offset + step].min).each do |i|
        if i == index
          info = "♩ #{i}. #{datalist[i]['song_name']} - #{datalist[i]['artist']} - #{datalist[i]['album_name']}"
          line_info = pretty_format(info, 0, 52)
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
        else
          info = "#{i}. #{datalist[i]['song_name']} - #{datalist[i]['artist']} - #{datalist[i]['album_name']}"
          line_info = pretty_format(info, 0, 50)
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
        end
      end

    when 'artists'
      (offset...[datalist.length, offset + step].min).each do |i|
        if i == index
          line_info = "♩ #{i}. #{datalist[i]['artists_name']} - #{datalist[i]['artist']} #{datalist[i]['alias']}"
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
        else
          line_info = "#{i}. #{datalist[i]['artists_name']} - #{datalist[i]['artist']} #{datalist[i]['alias']}"
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
        end
      end

    when 'albums'
      (offset...[datalist.length, offset + step].min).each do |i|
        if i == index
          info = "♩ #{i}. #{datalist[i]['albums_name']} - #{datalist[i]['artists_name']}"
          line_info = pretty_format(info, 0, 52)
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
        else
          info = "#{i}. #{datalist[i]['albums_name']} - #{datalist[i]['artists_name']}"
          line_info = pretty_format(info, 0, 50)
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
        end
      end

    when 'playlists'
      (offset...[datalist.length, offset + step].min).each do |i|
        if i == index
          info = "♩ #{i}. #{datalist[i]['playlists_name']} - #{datalist[i]['creator_name']}"
          line_info = pretty_format(info, 0, 52)
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
        else
          info = "#{i}. #{datalist[i]['playlists_name']} - #{datalist[i]['creator_name']}"
          line_info = pretty_format(info, 0, 50)
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
        end
      end

    when 'djchannels'
      (offset...[datalist.length, offset + step].min).each do |i|
        if i == index
          info = "♩ #{i}. #{datalist[i][0]['song_name']}"
          line_info = pretty_format(info, 0, 52)
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_POINTER_X, line_info, Curses.color_pair(2))
        else
          info = "#{i}. #{datalist[i][0]['song_name']}"
          line_info = pretty_format(info, 0, 50)
          putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
        end
      end

    when 'help'
      (offset...[datalist.length, offset + step].min).each do |i|
        line_info = "#{i}. #{datalist[i][0]} #{datalist[i][1]} #{datalist[i][2]}"
        putstr(@screen, i-offset+PLAYER_CONTENT_Y, PLAYER_X, line_info)
      end
    end
  end

end
build_playinfo(song_name, artist, pause = false) click to toggle source
# File lib/mplug163/ui.rb, line 62
def build_playinfo(song_name, artist, pause = false)
  if pause
    putstr(@screen, PLAYER_STATUS_Y, PLAYER_NOTE_X, '■', Curses.color_pair(3))
  else
    putstr(@screen, PLAYER_STATUS_Y, PLAYER_NOTE_X, '▶', Curses.color_pair(3))
  end

  info = "#{song_name} - #{artist}"
  song_info = pretty_format(info, 0, 50)
  putstr(@screen, PLAYER_STATUS_Y, PLAYER_X, song_info, Curses.color_pair(4))
  @screen.refresh
end
build_search_menu() click to toggle source
# File lib/mplug163/ui.rb, line 234
def build_search_menu
  clear_to_bottom(@screen, PLAYER_CONTENT_Y, SCREEN_HEIGHT)
  putstr(@screen, PLAYER_CONTENT_Y, PLAYER_X, '选择搜索类型:', Curses.color_pair(1))
  putstr(@screen, PLAYER_CONTENT_Y + 1, PLAYER_X, '1 - 歌曲')
  putstr(@screen, PLAYER_CONTENT_Y + 2, PLAYER_X, '2 - 艺术家')
  putstr(@screen, PLAYER_CONTENT_Y + 3, PLAYER_X, '3 - 专辑')
  putstr(@screen, PLAYER_CONTENT_Y + 4, PLAYER_X, '4 - 精选歌单')
  putstr(@screen, PLAYER_CONTENT_Y + 6, PLAYER_X, '请键入对应数字:', Curses.color_pair(2))
  @screen.refresh
  @screen.getch
end
get_param(prompt_str) click to toggle source
# File lib/mplug163/ui.rb, line 270
def get_param(prompt_str)
  clear_to_bottom(@screen, PLAYER_CONTENT_Y, SCREEN_HEIGHT)
  putstr(@screen, PLAYER_CONTENT_Y, PLAYER_X, prompt_str, Curses.color_pair(1))
  @screen.setpos(PLAYER_CONTENT_Y + 2, PLAYER_X)
  params = @screen.getstr
  if params.strip.nil?
    return get_param(prompt_str)
  else
    return params
  end
end

Private Instance Methods

clear_to_bottom(screen, top, bottom) click to toggle source
# File lib/mplug163/ui.rb, line 291
def clear_to_bottom(screen, top, bottom)
  (top..bottom).each do |i|
    screen.setpos(i, 0)
    screen.clrtoeol
  end
end
pretty_format(info, start, length) click to toggle source
# File lib/mplug163/ui.rb, line 298
def pretty_format(info, start, length)
  if info.size >= length
    "#{info[start, length]}..."
  else
    info
  end
end
putstr(screen, y, x, string, color = Curses.color_pair(0)) click to toggle source
# File lib/mplug163/ui.rb, line 284
def putstr(screen, y, x, string, color = Curses.color_pair(0))
  screen.setpos(y, x)
  screen.clrtoeol
  screen.attrset(color)
  screen.addstr(string)
end