ektoplayer 0.1.12 → 0.1.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ektoplayer/application.rb +49 -19
  3. data/lib/ektoplayer/bindings.rb +91 -87
  4. data/lib/ektoplayer/browsepage.rb +14 -27
  5. data/lib/ektoplayer/common.rb +12 -67
  6. data/lib/ektoplayer/compat.rb +5 -11
  7. data/lib/ektoplayer/config.rb +52 -17
  8. data/lib/ektoplayer/controllers/browser.rb +10 -5
  9. data/lib/ektoplayer/database.rb +7 -20
  10. data/lib/ektoplayer/download/externaldownload.rb +65 -0
  11. data/lib/ektoplayer/download/rubydownload.rb +69 -0
  12. data/lib/ektoplayer/icurses/curses.rb +18 -2
  13. data/lib/ektoplayer/icurses/{ffi_ncurses.rb → ffi-ncurses.rb} +1 -0
  14. data/lib/ektoplayer/icurses/ncurses.rb +10 -0
  15. data/lib/ektoplayer/icurses.rb +13 -5
  16. data/lib/ektoplayer/models/browser.rb +11 -11
  17. data/lib/ektoplayer/models/player.rb +4 -5
  18. data/lib/ektoplayer/operations/browser.rb +9 -1
  19. data/lib/ektoplayer/operations/playlist.rb +1 -1
  20. data/lib/ektoplayer/players/mpg_wrapper_player.rb +98 -40
  21. data/lib/ektoplayer/theme.rb +78 -63
  22. data/lib/ektoplayer/trackloader.rb +25 -74
  23. data/lib/ektoplayer/ui/colors.rb +33 -5
  24. data/lib/ektoplayer/ui/widgets/container.rb +1 -1
  25. data/lib/ektoplayer/ui/widgets/listwidget.rb +35 -34
  26. data/lib/ektoplayer/ui/widgets.rb +19 -0
  27. data/lib/ektoplayer/ui.rb +22 -23
  28. data/lib/ektoplayer/updater.rb +3 -4
  29. data/lib/ektoplayer/views/browser.rb +7 -2
  30. data/lib/ektoplayer/views/help.rb +5 -2
  31. data/lib/ektoplayer/views/info.rb +22 -27
  32. data/lib/ektoplayer/views/playinginfo.rb +20 -19
  33. data/lib/ektoplayer/views/playlist.rb +8 -3
  34. data/lib/ektoplayer/views/progressbar.rb +26 -33
  35. data/lib/ektoplayer/views/splash.rb +14 -22
  36. data/lib/ektoplayer/views/trackrenderer.rb +14 -10
  37. metadata +7 -5
@@ -20,6 +20,7 @@ module UI
20
20
 
21
21
  class ListSelector
22
22
  attr_reader :start_pos
23
+
23
24
  def start(pos)
24
25
  @start_pos = pos
25
26
  end
@@ -35,51 +36,49 @@ module UI
35
36
  end
36
37
 
37
38
  class ListSearch
38
- attr_accessor :direction, :source
39
+ attr_accessor :direction
40
+
41
+ def initialize(search: '', direction: :down)
42
+ @search, @direction = search, direction
43
+ end
39
44
 
40
- def initialize(search: '', source: [], direction: :down)
41
- @source, @result, @current = source, [], 0
42
- @direction = direction
43
- self.search=(search)
45
+ def search=(search)
46
+ @search = Regexp.new(search.downcase) rescue search.downcase
44
47
  end
45
48
 
46
- def comp(item, search)
49
+ private def comp(item)
47
50
  if item.is_a?String or item.is_a?Symbol
48
- return item.downcase =~ Regexp.new(search.downcase)
51
+ return item.downcase =~ @search
49
52
  elsif item.is_a?Hash
50
53
  %w(title artist album).each do |key|
51
- return true if self.comp(item[key], search)
54
+ return true if comp(item[key])
52
55
  end
53
56
  end
54
57
 
55
58
  false
56
59
  end
57
60
 
58
- def search=(search)
59
- fail unless search
60
- @search = search
61
- @current = 0
62
- @result = @source.size.times.select {|i| self.comp(@source[i], search) }
63
- end
61
+ def next(*a) @direction == :up ? search_up(*a): search_down(*a) end
62
+ def prev(*a) @direction == :up ? search_down(*a) : search_up(*a) end
64
63
 
65
- def current; @current or 0 end #or 0 end
66
- def next(p) @direction == :up ? search_up(p): search_down(p) end
67
- def prev(p) @direction == :up ? search_down(p) : search_up(p) end
64
+ def search_up(current_pos, source)
65
+ start_pos = (current_pos - 1).clamp(0, source.size)
68
66
 
69
- def search_up(p)
70
- @current = (
71
- @result.reverse.select { |v| v < p }[0] or @result[-1]
72
- )
67
+ start_pos.downto(0).each do |i|
68
+ return i if comp(source[i])
69
+ end
73
70
 
74
- self
71
+ source.size
75
72
  end
76
73
 
77
- def search_down(p)
78
- @current = (
79
- @result.select { |v| v > p }[0] or @result[0]
80
- )
74
+ def search_down(current_pos, source)
75
+ start_pos = (current_pos + 1).clamp(0, source.size)
76
+
77
+ start_pos.upto(source.size).each do |i|
78
+ return i if comp(source[i])
79
+ end
81
80
 
82
- self
81
+ 0
83
82
  end
84
83
  end
85
84
 
@@ -96,14 +95,13 @@ module UI
96
95
  @selection = ListSelector.new
97
96
  end
98
97
 
99
- def search_next; self.selected=(@search.next(@selected).current) end
100
- def search_prev; self.selected=(@search.prev(@selected).current) end
101
- def search_up; self.search_start(:up) end
102
- def search_down; self.search_start(:down) end
98
+ def search_next; self.selected=(@search.next(@selected, @list)) end
99
+ def search_prev; self.selected=(@search.prev(@selected, @list)) end
100
+ def search_up; self.search_start(:up) end
101
+ def search_down; self.search_start(:down) end
103
102
  def search_start(direction)
104
103
  UI::Input.readline(@pos, @size.update(height: 1), prompt: '> ', add_hist: true) do |result|
105
104
  if result
106
- @search.source=(@list)
107
105
  @search.direction=(direction)
108
106
  @search.search=(result)
109
107
  search_next
@@ -163,8 +161,11 @@ module UI
163
161
  def list=(list)
164
162
  with_lock do
165
163
  @list = list
164
+
166
165
  @cursor = @selected = 0
167
166
  self.selected=(0)
167
+ self.force_cursorpos(0)
168
+
168
169
  want_redraw
169
170
  end
170
171
  end
@@ -178,7 +179,7 @@ module UI
178
179
 
179
180
  self.lock
180
181
 
181
- old_cursor, new_cursor = @cursor, @cursor + @selected - old_selected
182
+ old_cursor, new_cursor = @cursor, @cursor + (@selected - old_selected)
182
183
 
183
184
  if new_cursor.between?(0, @size.height - 1)
184
185
  # new selected item resides in current screen,
@@ -189,7 +190,7 @@ module UI
189
190
  return want_redraw if @selection.started?
190
191
 
191
192
  write_at(old_cursor); render(old_selected)
192
- write_at(new_cursor); render(new_index, selected: true)
193
+ write_at(new_cursor); render(@selected, selected: true)
193
194
  _check
194
195
  want_refresh
195
196
  elsif (new_cursor.between?(-(@size.height - 1), (2 * @size.height - 1)))
@@ -145,6 +145,9 @@ module UI
145
145
  super(**opts)
146
146
  @win = ICurses.newwin(@size.height, @size.width, @pos.y, @pos.x)
147
147
  @win.keypad(true)
148
+ @win.idlok(true)
149
+ @win.leaveok(true)
150
+ @win.bkgdset(UI::Colors.init_pair_cached(:default, :default))
148
151
  end
149
152
 
150
153
  def layout
@@ -154,6 +157,10 @@ module UI
154
157
  end
155
158
 
156
159
  def refresh
160
+ @win.refresh
161
+ end
162
+
163
+ def noutrefresh
157
164
  @win.noutrefresh
158
165
  end
159
166
  end
@@ -164,6 +171,10 @@ module UI
164
171
  def initialize(**opts)
165
172
  super(**opts)
166
173
  @win = ICurses.newpad(@size.height, @size.width)
174
+ @win.keypad(true)
175
+ @win.idlok(true)
176
+ @win.leaveok(true)
177
+ @win.bkgdset(UI::Colors.init_pair_cached(:default, :default))
167
178
  @pad_minrow = @pad_mincol = 0
168
179
  end
169
180
 
@@ -230,6 +241,14 @@ module UI
230
241
  end
231
242
 
232
243
  def refresh
244
+ @win.prefresh(
245
+ @pad_minrow, @pad_mincol,
246
+ @pos.y, @pos.x,
247
+ @pos.y + @size.height - 1, @pos.x + @size.width - 1
248
+ )
249
+ end
250
+
251
+ def noutrefresh
233
252
  @win.pnoutrefresh(
234
253
  @pad_minrow, @pad_mincol,
235
254
  @pos.y, @pos.x,
data/lib/ektoplayer/ui.rb CHANGED
@@ -27,7 +27,7 @@ module UI
27
27
  @@widget = nil
28
28
 
29
29
  %w(initscr cbreak noecho start_color use_default_colors).
30
- each {|_|ICurses.send(_)}
30
+ each(&ICurses.method(:send))
31
31
  ICurses.mousemask(ICurses::ALL_MOUSE_EVENTS | ICurses::REPORT_MOUSE_POSITION)
32
32
  ICurses.stdscr.keypad(true)
33
33
  UI::Colors.start
@@ -50,11 +50,6 @@ module UI
50
50
  widget
51
51
  end
52
52
 
53
- #def self.getch(timeout=-1)
54
- # ICurses.stdscr.timeout(timeout)
55
- # UI::Input::KEYMAP_WORKAROUND[ICurses.stdscr.getch]
56
- #end
57
-
58
53
  def self.update_screen(force_redraw=false, force_resize=false)
59
54
  @@updating ||= Mutex.new
60
55
  @@want_resize ||= false
@@ -97,12 +92,9 @@ module UI
97
92
  KEYMAP_WORKAROUND.default_proc = proc { |h,k| k }
98
93
  KEYMAP_WORKAROUND.freeze
99
94
 
100
- #def self.getch(timeout=-1)
101
- # KEYMAP_WORKAROUND[@@widget.getch(timeout)]
102
- #end
103
-
104
95
  def self.start_loop
105
96
  @@readline_obj ||= ReadlineWindow.new
97
+ inactive = 0
106
98
 
107
99
  loop do
108
100
  unless @@readline_obj.active?
@@ -112,14 +104,20 @@ module UI
112
104
  begin
113
105
  UI::Canvas.widget.win.keypad(true)
114
106
 
115
- if (c = UI::Canvas.widget.win.getch1(600))
107
+ if (c = (UI::Canvas.widget.win.getch1(500).ord rescue -1)) > -1
108
+ inactive = 0
109
+
116
110
  if c == ICurses::KEY_MOUSE
117
111
  if c = ICurses.getmouse
118
112
  UI::Canvas.widget.mouse_click(c)
119
113
  end
120
114
  else
121
- c = KEYMAP_WORKAROUND[c.ord]
122
- UI::Canvas.widget.key_press(c) if c >= 0
115
+ UI::Canvas.widget.key_press(KEYMAP_WORKAROUND[c])
116
+ end
117
+ else
118
+ if (inactive += 1) > 40
119
+ s = STDIN.readpartial(10)
120
+ ICurses.ungetch(s[0].ord) if s.size == 1
123
121
  end
124
122
  end
125
123
 
@@ -133,7 +131,7 @@ module UI
133
131
  win = UI::Canvas.widget.win
134
132
  win.keypad(false)
135
133
  @@readline_obj.redraw
136
- next unless (c = (win.getch1(100).ord rescue -1)) > 0
134
+ next unless (c = (win.getch1(100).ord rescue -1)) > -1
137
135
 
138
136
  if c == 10 or c == 4
139
137
  @@readline_obj.feed(?\n.ord)
@@ -142,16 +140,14 @@ module UI
142
140
 
143
141
  if c == 27 # pass 3-character escape sequence
144
142
  win.timeout(5)
145
- if (c = (win.getch.ord rescue -1)) > 0
143
+ if (c = (win.getch.ord rescue -1)) > -1
146
144
  @@readline_obj.feed(c)
147
- if (c = (win.getch.ord rescue -1)) > 0
145
+ if (c = (win.getch.ord rescue -1)) > -1
148
146
  @@readline_obj.feed(c)
149
147
  end
150
148
  end
151
149
  end
152
150
  end
153
- #rescue
154
- # getch() returned something weird that could not be chr()d
155
151
  end while @@readline_obj.active?
156
152
  end
157
153
  end
@@ -168,24 +164,27 @@ module UI
168
164
  def initialize
169
165
  Readline.input, @readline_in_write = IO.pipe
170
166
  Readline.output = File.open(File::NULL, ?w)
167
+ @window = ICurses.newwin(0,0,0,0)
171
168
  @thread = nil
172
169
  end
173
170
 
174
171
  def active?; @thread; end
175
172
 
176
173
  def redraw
177
- return unless @window
174
+ @window.resize(@size.height, @size.width)
175
+ @window.mvwin(@pos.y, @pos.x)
178
176
  @window.erase
179
177
  buffer = @prompt + Readline.line_buffer.to_s
180
178
  @window.addstr(buffer[(buffer.size - @size.width).clamp(0, buffer.size)..-1])
181
179
  @window.move(0, Readline.point + @prompt.size)
182
180
  @window.refresh
181
+ rescue
182
+ nil
183
183
  end
184
184
 
185
185
  def readline(pos, size, prompt: '', add_hist: false, &block)
186
186
  @thread ||= Thread.new do
187
- @size, @prompt = size, prompt
188
- @window = ICurses.newwin(size.height, size.width, pos.y, pos.x)
187
+ @size, @pos, @prompt = size, pos, prompt
189
188
 
190
189
  begin
191
190
  Readline.set_screen_size(size.height, size.width)
@@ -194,7 +193,7 @@ module UI
194
193
  block.(Readline.readline(prompt, add_hist))
195
194
  ensure
196
195
  @window.clear
197
- @window = @thread = nil
196
+ @thread = nil
198
197
  UI::Canvas.update_screen(true)
199
198
  end
200
199
  end
@@ -308,7 +307,7 @@ module ICurses
308
307
  def size; UI::Size.new(height: maxy, width: maxx) end
309
308
 
310
309
  def cursor=(new)
311
- move(new.y, new.x) # or fail "Could not set cursor: #{new} #{size}"
310
+ move(new.y, new.x) #or warn "Could not set cursor: #{new} #{size}"
312
311
  end
313
312
 
314
313
  def pos=(new)
@@ -9,9 +9,8 @@ module Ektoplayer
9
9
  FREE_MUSIC_URL = "#{MAIN_URL}/section/free-music".freeze
10
10
 
11
11
  class DatabaseUpdater
12
- ALBUM_STR_TAGS = Set.new(%w(url title date category cover_url
13
- description download_count rating votes
14
- released_by released_by_url posted_by posted_by_url).map(&:to_sym)).freeze
12
+ ALBUM_STR_TAGS = Set.new(%w(url title date cover_url
13
+ description download_count rating votes).map(&:to_sym)).freeze
15
14
 
16
15
  TRACK_STR_TAGS = Set.new(%w(url number title remix artist bpm).map(&:to_sym)).freeze
17
16
 
@@ -33,7 +32,7 @@ module Ektoplayer
33
32
  queue << Thread.new do
34
33
  results << BrowsePage.new(url)
35
34
  queue.pop # unregister our thread
36
- end.priority=(-10)
35
+ end.priority
37
36
 
38
37
  if results.size > 40
39
38
  @db.transaction
@@ -6,8 +6,13 @@ module Ektoplayer
6
6
  class Browser < UI::ListWidget
7
7
  def initialize(**opts)
8
8
  super(**opts)
9
- self.item_renderer=(TrackRenderer.new(
10
- width: @size.width, format: Config[:'browser.format']))
9
+ if ICurses.colors == 256
10
+ f = Config[:'playlist.format_256']
11
+ else
12
+ f = Config[:'playlist.format']
13
+ end
14
+
15
+ self.item_renderer=(TrackRenderer.new(width: @size.width, format: f))
11
16
  end
12
17
 
13
18
  def attach(browser)
@@ -5,7 +5,10 @@ require_relative '../theme'
5
5
  module Ektoplayer
6
6
  module Views
7
7
  class Help < UI::Pad
8
- def draw
8
+ def draw;
9
+ end
10
+
11
+ def layout
9
12
  self.pad_size=(UI::Size.new(
10
13
  height: (Bindings.bindings.values.map(&:size).sum +
11
14
  Bindings.bindings.size * 2),
@@ -32,7 +35,7 @@ module Ektoplayer
32
35
  @win.mvaddstr(@win.cury, 18, name.to_s)
33
36
 
34
37
  @win.attrset(Theme[:'help.command_desc'])
35
- @win.mvaddstr(@win.cury, 43, Bindings.commands[name.to_sym])
38
+ @win.mvaddstr(@win.cury, 45, Bindings.commands[name.to_sym])
36
39
 
37
40
  @win.next_line
38
41
  end
@@ -20,7 +20,7 @@ module Ektoplayer
20
20
  player, playlist, trackloader, database
21
21
 
22
22
  Thread.new do
23
- loop { sleep 1; with_lock { want_redraw } }
23
+ loop { sleep 1; draw if visible? }
24
24
  end.priority=(-10)
25
25
  end
26
26
 
@@ -59,20 +59,18 @@ module Ektoplayer
59
59
  def draw_download(file, percent, error)
60
60
  @win.attrset(Theme[:'info.download.file'])
61
61
  @win.mvaddstr(@win.cury + 1, START_TAG, file)
62
+ @win.addch(32) # ' '
62
63
 
63
64
  @win.attrset(Theme[:'info.download.percent'])
64
- @win.addstr(" #{percent}")
65
+ @win.addstr(percent.to_s)
65
66
 
66
67
  if error
68
+ @win.addch(32) # ' '
67
69
  @win.attrset(Theme[:'info.download.error'])
68
- @win.addstr(" #{error}")
70
+ @win.addstr(error.to_s)
69
71
  end
70
72
  end
71
73
 
72
- def get_cover_url(album)
73
- "#{Application::EKTOPLAZM_COVER_BASE_URL}/#{album}"
74
- end
75
-
76
74
  def draw
77
75
  return unless @player
78
76
 
@@ -87,7 +85,7 @@ module Ektoplayer
87
85
 
88
86
  if @track = (@playlist[@playlist.current_playing] rescue nil)
89
87
  draw_heading('Current track')
90
- draw_tag('Number', "%0.2d" % @track['number'])
88
+ draw_tag('Number', '%0.2d' % @track['number'])
91
89
  draw_tag('Title', @track['title'])
92
90
  draw_tag('Remix', @track['remix']) if @track['remix']
93
91
  draw_tag('Artist', @track['artist'])
@@ -97,22 +95,18 @@ module Ektoplayer
97
95
  @win.next_line
98
96
 
99
97
  draw_heading('Current album')
100
- draw_tag('Album'); draw_url(@track['album_url'], @track['album'])
98
+
99
+ draw_tag('Album')
100
+ draw_url(Application.album_url(@track['album_url']), @track['album'])
101
101
  draw_tag('Artist', @track['album__artist']) if @track['album_artist']
102
102
  draw_tag('Date', @track['date'])
103
103
 
104
- if url = @track['released_by_url']
105
- draw_tag('Released by'); draw_url(url, @track['released_by'])
106
- end
107
-
108
- if url = @track['posted_by_url']
109
- draw_tag('Posted by'); draw_url(url, @track['posted_by'])
110
- end
111
-
112
104
  draw_tag('Styles', @track['styles'].gsub(?,, ', '))
113
105
  draw_tag('Downloads', @track['download_count'])
114
- draw_tag('Rating', "%0.2d%% (%d Votes)" % [@track['rating'], @track['votes']])
115
- draw_tag('Cover'); draw_url(get_cover_url(@track['cover_url']), 'Cover')
106
+ draw_tag('Rating', '%0.2d%% (%d Votes)' % [@track['rating'], @track['votes']])
107
+ draw_tag('Cover')
108
+ draw_url(Application.cover_url(@track['cover_url']), 'Cover')
109
+
116
110
  @win.next_line
117
111
 
118
112
  # -- description
@@ -123,14 +117,14 @@ module Ektoplayer
123
117
 
124
118
  Nokogiri::HTML("<p>#{@track['description']}</p>").css(?p).each do |p|
125
119
  p.children.each do |element|
126
- if element[:href]
120
+ if element['href']
127
121
  if (line_length += element.text.size) > wrap_length
128
122
  @win.move(@win.cury + 1, START_TAG)
129
123
  line_length = START_TAG
130
124
  end
131
125
 
132
- draw_url(element[:href], element.text.strip)
133
126
  @win.addch(32) # ' '
127
+ draw_url(element['href'], element.text.strip)
134
128
  else
135
129
  element.text.split(' ').each do |text|
136
130
  if (line_length += text.size) > wrap_length
@@ -138,10 +132,10 @@ module Ektoplayer
138
132
  line_length = START_TAG
139
133
  end
140
134
 
135
+ @win.addch(32) # ' '
141
136
  @win.attrset(Theme[:'info.description'])
142
137
  @win.mv_left(1) if text =~ /^[\.,:;]$/
143
138
  @win << text
144
- @win.addch(32) # ' '
145
139
  end
146
140
  end
147
141
  end
@@ -155,9 +149,8 @@ module Ektoplayer
155
149
  draw_heading('Downloads')
156
150
  @trackloader.downloads.each do |dl|
157
151
  name = File.basename(dl.filename)
158
- percent = Float(dl.progress) / dl.total * 100
159
- percent = '%0.2f' % percent
160
- draw_download(name, ?( + percent + '%)', dl.error)
152
+ percent = '%0.2f' % dl.progress
153
+ draw_download(name, "(#{percent}%)", dl.error)
161
154
  end
162
155
  @win.next_line
163
156
  end
@@ -166,12 +159,14 @@ module Ektoplayer
166
159
  draw_info('Version', Application::VERSION)
167
160
  draw_info('Tracks in database', @database.track_count)
168
161
  draw_info('Albums in database', @database.album_count)
169
- draw_info('Cache dir size', "%dMB" % (Dir.size(Config[:cache_dir]) / (1024 ** 2)))
170
- draw_info('Archive dir size', "%dMB" % (Dir.size(Config[:archive_dir]) / (1024 ** 2)))
162
+ draw_info('Tracks in playlist', @playlist.size)
163
+ draw_info('Cache dir size', '%dMB' % (Dir.size(Config[:cache_dir]) / (1024 ** 2) rescue 0))
164
+ draw_info('Archive dir size', '%dMB' % (Dir.size(Config[:archive_dir]) / (1024 ** 2) rescue 0))
171
165
  draw_info('Ektoplazm URL'); draw_url(Application::EKTOPLAZM_URL)
172
166
  draw_info('Github URL'); draw_url(Application::GITHUB_URL)
173
167
 
174
168
  self.pad_size=(@size.update(height: [@win.cursor.y + 2, @size.height].max))
169
+ noutrefresh
175
170
  end
176
171
  end
177
172
  end
@@ -28,23 +28,9 @@ module Ektoplayer
28
28
  with_lock { @track = t; want_redraw }
29
29
  end
30
30
 
31
- def length=(l)
32
- return if @length == l.to_i
33
- @length = l.to_i
34
- draw_position_and_length
35
- end
36
-
37
- def position=(p)
38
- return if @position == p.to_i
39
- @position = p.to_i
40
- draw_position_and_length
41
- end
42
-
43
31
  def draw_position_and_length
44
- return unless visible?
45
32
  @win.attrset(Theme[:'playinginfo.position'])
46
33
  @win.mvaddstr(0, 0, "[#{Common::to_time(@position)}/#{Common::to_time(@length)}]")
47
- @win.noutrefresh
48
34
  end
49
35
 
50
36
  def attach(playlist, player)
@@ -53,15 +39,22 @@ module Ektoplayer
53
39
  player.events.on(:play) { self.playing! }
54
40
 
55
41
  player.events.on(:position_change) do
56
- self.position=(player.position)
57
- self.length=(player.length)
42
+ old_pos, old_length = @position, @length
43
+ @position = player.position.to_i
44
+ @length = player.length.to_i
45
+
46
+ if old_pos != @position or old_length != @length
47
+ if visible?
48
+ draw_position_and_length
49
+ refresh
50
+ end
51
+ end
58
52
  end
59
53
 
60
54
  playlist.events.on(:current_changed) {
61
55
  self.track=(playlist[playlist.current_playing])
62
56
  }
63
57
 
64
- # TODO: move mouse?
65
58
  self.mouse.on(ICurses::BUTTON1_CLICKED) do |mevent|
66
59
  player.toggle
67
60
  end
@@ -88,9 +81,17 @@ module Ektoplayer
88
81
  def draw
89
82
  @win.erase
90
83
  draw_position_and_length
84
+
85
+ if ICurses.colors == 256
86
+ top_format = Config[:'playinginfo.format_top_256']
87
+ bottom_format = Config[:'playinginfo.format_bottom_256']
88
+ else
89
+ top_format = Config[:'playinginfo.format_top']
90
+ bottom_format = Config[:'playinginfo.format_bottom']
91
+ end
91
92
 
92
93
  if @track
93
- fill(Config[:'playinginfo.format1']).each_with_index do |fmt,i|
94
+ fill(top_format).each_with_index do |fmt,i|
94
95
  @win.center(fmt[:sum]) if i == 0
95
96
  @win.attrset(UI::Colors.set(nil, *fmt[:curses_attrs]))
96
97
  @win << fmt[:filled]
@@ -101,7 +102,7 @@ module Ektoplayer
101
102
 
102
103
  @win.next_line
103
104
 
104
- fill(Config[:'playinginfo.format2']).each_with_index do |fmt,i|
105
+ fill(bottom_format).each_with_index do |fmt,i|
105
106
  @win.center(fmt[:sum]) if i == 0
106
107
  @win.attrset(UI::Colors.set(nil, *fmt[:curses_attrs]))
107
108
  @win << fmt[:filled]
@@ -8,9 +8,14 @@ module Ektoplayer
8
8
  class Playlist < UI::ListWidget
9
9
  def initialize(**opts)
10
10
  super(**opts)
11
- self.item_renderer=(TrackRenderer.new(
12
- width: @size.width, format: Config[:'playlist.format']
13
- ))
11
+
12
+ if ICurses.colors == 256
13
+ f = Config[:'playlist.format_256']
14
+ else
15
+ f = Config[:'playlist.format']
16
+ end
17
+
18
+ self.item_renderer=(TrackRenderer.new(width: @size.width, format: f))
14
19
  end
15
20
 
16
21
  def attach(playlist)