Skip to content

Instantly share code, notes, and snippets.

@jashank
Created August 9, 2012 02:21
Show Gist options
  • Save jashank/3300366 to your computer and use it in GitHub Desktop.
Save jashank/3300366 to your computer and use it in GitHub Desktop.
Nonsense values for selected_line
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'plist'
require 'curses'
#require 'mplayer'
class Library
def initialize()
@itml = Plist::parse_xml('iTML.xml')
@tracks = @itml['Tracks']
@playlists = @itml['Playlists']
@_tracks_by_album_name = {}
@lines = []
@line_begin = 0
@selected_line = 10
# sort by something sensible
@tracks.each do |tid, track|
label = sprintf("%s%04d", (track['Album'] ? track['Album'] : '').gsub(' ', '-'), track['Track Number'] ? track['Track Number'] : 0)
unless @_tracks_by_album_name.has_key?(label)
@_tracks_by_album_name[label] = []
end
@_tracks_by_album_name[label] << tid
end
@_tracks_by_album_name.sort.each do |uuid, tracks|
tracks.each do |tid|
track = @tracks[tid]
return unless track != nil
name = track['Name'][0..29]
album = (track['Album'] ? track['Album'] : '')[0..19]
artist = (track['Artist'] ? track['Artist'] : '')[0..19]
d_m = ((track['Total Time'] ? track['Total Time'] : 0)/1000)/60
d_s = ((track['Total Time'] ? track['Total Time'] : 0)/1000)%60
@lines << sprintf("%30s | %20s | %20s | %02d:%02d", name, artist, album, d_m, d_s)
end
end
end
def display_at()
@line = 6
selected = false
# XXX autocalculate number of displayable rows
thisLine = 0
@display_end = Curses.lines-1 - @line
@display_endbound = @line_begin + @display_end
Curses.setpos(0, 10)
Curses.addstr("library position: at #{@selected_line}: #{@line_begin}..#{@display_endbound} (window: #{@display_end}l) #{@line_begin.class} #{@display_endbound.class}")
@lines[@line_begin..@display_endbound].each do |row|
if (@line_begin + thisLine) == @selected_line
selected = true
else
selected = false
end
Curses.setpos(@line, 0)
is_selected(selected) do
Curses.addstr(row)
end
@line += 1
thisLine += 1
end
Curses.refresh
end
def is_selected(selected)
if selected
Curses.attron(Curses::A_REVERSE)
end
yield
if selected
Curses.attroff(Curses::A_REVERSE)
end
return
end
def select_next()
@display_end = Curses.lines-1 - @line
@display_endbound = @line_begin + @display_end
if @selected_line > @display_endbound
@line_begin += 1
end
@selected_line += 1
display_at()
end
def select_nextpg()
@display_end = Curses.lines-1 - 6
@display_endbound = @line_begin + @display_end
@line_begin += @display_end
@selected_line += @display_end
display_at()
end
def select_prev()
if @selected_line <= @line_begin
@line_begin -= 1
end
@selected_line -= 1
display_at()
end
def select_prevpg()
@display_end = Curses.lines-1 - 6
@display_endbound = @line_begin + @display_end
@line_begin -= @display_end
@selected_line -= @display_end
display_at()
end
def search()
Curses.setpos(5, 0)
Curses.addstr("Enter search term: ")
str = ""
while (c = Curses.getch) != 10
str += c
Curses.addstr(c)
end
str
end
end
class NowPlay
end
STATUS_LINE = 1
NOWPLAY_BEGIN = 2
LIBRARY_BEGIN = 6
def write(line, column, text)
Curses.setpos(line, column)
Curses.addstr(text)
end
def init_screen
Curses.noecho # do not show typed keys
Curses.init_screen
Curses.stdscr.keypad(true) # enable arrow keys
begin
yield
ensure
Curses.close_screen
end
end
init_screen do
write(STATUS_LINE, 0, "spoons - not playing")
library = Library.new
# nowplay = NowPlay.new
library.display_at()
# nowplay.display_at()
Curses.refresh
loop do
case Curses.getch
when Curses::Key::UP then library.select_prev
when Curses::Key::DOWN then library.select_next
when Curses::Key::PPAGE then library.select_prevpg
when Curses::Key::NPAGE then library.select_nextpg
when Curses::Key::RIGHT then nowplay.ff
when Curses::Key::LEFT then nowplay.rev
when ' ' then nowplay.playpause
when 10 then nowplay.select(library.selected)
when '/' then library.search
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment