class UpperSectionBase
Attributes
max_elements[RW]
Public Class Methods
new(x, y, w, h, col)
click to toggle source
Calls superclass method
ViewBase::new
# File lib/akane_sound/class.upper_section_base.rb, line 3 def initialize(x, y, w, h, col) super @view = nil @element_h = nil @offset = nil @max_elements = 0 @element_h = (@@config[:font_size] * @@config[:line_height_mod]).to_i @offset = @element_h @max_elements = 0 set_view @txt_color = Util.to_col_ar(@@config[:text_color]) @txt_col_dis = Util.to_col_ar(@@config[:text_color_disabled]) @txt_color_sel = Util.to_col_ar(@@config[:text_color_selected]) @elements = Array.new @title = @@font.render_blended(@title, @txt_color) @title_rect = SDL2::Rect[8, @element_h/2-@title.h/2, @title.w, @title.h] update_element_strings set_page update_element_positions end
Public Instance Methods
draw()
click to toggle source
Calls superclass method
ViewBase#draw
# File lib/akane_sound/class.upper_section_base.rb, line 221 def draw super @@renderer.viewport = @view_base @@renderer.fill_rect(SDL2::Rect[0, 0, @view_base.w, @view_base.h]) # draw border @@renderer.viewport = @border @@renderer.draw_blend_mode = SDL2::BlendMode::BLEND @@renderer.draw_color = [@@config[:fg_color][:red], @@config[:fg_color][:green], @@config[:fg_color][:blue], @@config[:fg_color][:alpha]] @@renderer.draw_rect(SDL2::Rect[0, 0, @border.w, @border.h]) @@renderer.viewport = @view_base # draw title @@renderer.copy(@@renderer.create_texture_from(@title), nil, @title_rect) # draw item list @@renderer.viewport = @view i = @max_elements*(@page-1) j = -1 @elements.each do |el| j +=1 next if j < i txt = nil if @pointer == i if @focus_flag @@renderer.draw_color = [@@config[:select_bg_color][:red], @@config[:select_bg_color][:green], @@config[:select_bg_color][:blue], @@config[:select_bg_color][:alpha]] @@renderer.fill_rect(el.bg_rect) end case self.class.to_s when "SectionDir" if File.join(@dir_stack.join(nil), @playlist[i][:filename]) == @@sound.get_play_path("left") && @focus_flag txt = el.txt_sel_bld else txt = el.txt_bld end when "SectionPlaylist" if @playlist[i][:filename] == @@sound.get_play_path("right") && @focus_flag txt = el.txt_sel_bld else txt = el.txt_bld end end else case self.class.to_s when "SectionDir" if File.join(@dir_stack.join(nil), @playlist[i][:filename]) == @@sound.get_play_path("left") && @focus_flag txt = el.txt_sel else txt = el.txt end when "SectionPlaylist" if @playlist[i][:filename] == @@sound.get_play_path("right") && @focus_flag txt = el.txt_sel else txt = el.txt end end end @@renderer.copy(@@renderer.create_texture_from(txt), el.txt_src, el.txt_dst) if el.dur @@renderer.copy(@@renderer.create_texture_from(el.dur), nil, el.dur_dst) end i += 1 break if i >= @elements.length end end
get_cache(dir)
click to toggle source
# File lib/akane_sound/class.upper_section_base.rb, line 302 def get_cache(dir) dir += "/" if dir[-1] != "/" #cache = get_cache_name(dir) return @@cache[dir] if @@cache.has_key?(dir) return nil =begin if File.exist?(cache) ar = YAML.load(File.open(cache)) return ar end return nil =end end
get_playlist(dir)
click to toggle source
# File lib/akane_sound/class.upper_section_base.rb, line 316 def get_playlist(dir) #cache = get_cache_name(dir) ar = Array.new dir_contents_dir = Dir.entries(dir).sort.select do |entry| if dir == @@config[:root_dir] File.directory?(File.join(dir, entry)) and !(entry == '.' || entry == '..') else File.directory?(File.join(dir, entry)) and !(entry == '.') end end dir_contents_dir.each do |entry| ar.push({ filename: entry+'/', dir_flag: true, duration: nil, bps: nil, br: nil, artist: nil, album: nil, pl_time: nil, type: nil, tag: nil, title: nil, pl_flag: false, sample: nil, path: nil }) end dir_contents_file = Dir.entries(dir).sort.select do |entry| !File.directory?(File.join(dir, entry)) and (/\.mp3|ogg|m4a|wav|mid|flac\z/ === entry) end dir_contents_file.each do |entry| dur = %x( mediainfo --Inform="Audio;%Duration%" "#{dir+entry}" ) bps = %x( mediainfo --Inform="Audio;%BitRate%" "#{dir+entry}" ) br = %x( mediainfo --Inform="Audio;%BitRate_Mode%" "#{dir+entry}" ) sample = %x( mediainfo --Inform="Audio;%SamplingRate%" "#{dir+entry}" ) #sample2 = %x( mediainfo --Inform="Audio;%SamplingRate/String%" "#{dir+entry}" ) artist = %x(ffprobe -loglevel error -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 "#{dir+entry}" ) album = %x(ffprobe -loglevel error -show_entries format_tags=album -of default=noprint_wrappers=1:nokey=1 "#{dir+entry}" ) title = %x(ffprobe -loglevel error -show_entries format_tags=title -of default=noprint_wrappers=1:nokey=1 "#{dir+entry}" ) artist.delete!("\n") title.delete!("\n") album.delete!("\n") pltime = Util.ms_to_time_str(dur.to_i) type = entry[-3..-1].upcase tag = '['+pltime+'|'+type+']' ar.push({ filename: entry, dir_flag: false, duration: dur.to_i, bps: bps.to_i, br: br[0..2], artist: artist, album: album, pl_time: pltime, type: type, tag: tag, title: title, pl_flag: false, sample: sample, path: dir+entry }) #@tracks += 1 end dir_contents_pl = Dir.entries(dir).sort.select do |entry| !File.directory?(File.join(dir, entry)) and (/\.apl.yaml\z/ === entry) end dir_contents_pl.each do |entry| ar.push({ filename: entry, dir_flag: false, duration: nil, bps: nil, br: nil, artist: nil, album: nil, pl_time: nil, type: nil, tag: nil, title: nil, pl_flag: true, sample: nil, path: nil }) end # write cache dir += "/" if dir[-1] != "/" @@cache[dir] = ar str = (@@debug_flag) ? "cache_debug.yaml" : "cache.yaml" File.open( File.join(@@pref_dir, str), 'w') { |file| file.write(@@cache.to_yaml) } ar end
update()
click to toggle source
# File lib/akane_sound/class.upper_section_base.rb, line 25 def update if @focus_flag if (@@inp.down == 1 || @@inp.down >= 20) && @playlist.length > 0 if @@inp.down == 1 @pointer = (@pointer+1) % @elements.length set_page update_element_positions elsif @@inp.down == 22 @pointer = (@pointer+1) % @elements.length set_page update_element_positions @@inp.down = 20 end end if (@@inp.up == 1 || @@inp.up >= 20) && @playlist.length > 0 if @@inp.up == 1 @pointer = (@pointer+(@elements.length-1)) % @elements.length set_page update_element_positions elsif @@inp.up == 22 @pointer = (@pointer+(@elements.length-1)) % @elements.length set_page update_element_positions @@inp.up = 20 end end if @@inp.pagedown == 1 && @playlist.length > 0 @pointer = @max_elements*@page @pointer = @elements.length-1 if @pointer > @elements.length-1 set_page update_element_positions end if @@inp.pageup == 1 && @playlist.length > 0 @pointer = @max_elements*(@page-2) @pointer = 0 if @pointer < 0 set_page update_element_positions end if @@inp.first == 1 && @playlist.length > 0 @pointer = 0 set_page update_element_positions end if @@inp.last == 1 && @playlist.length > 0 @pointer = @elements.length-1 set_page update_element_positions end if @@inp.accept == 1 #Util.p (@elements.length.to_f/@max_elements.to_f).ceil.to_s end end end
update_element_positions()
click to toggle source
# File lib/akane_sound/class.upper_section_base.rb, line 88 def update_element_positions j = 0 i = @max_elements*(@page-1) k = -1 @elements.each do |e| k += 1 next if k < i unless @playlist[i][:dir_flag] || @playlist[i][:pl_flag] overshoot = ((@view.w-8)-@elements[i].dur.w-4) unless i == @pointer if @elements[i].txt.w >= overshoot sprite_w = @elements[i].txt.w-(@elements[i].txt.w-overshoot) else sprite_w = @elements[i].txt.w end sprite_h = @elements[i].txt.h else if @elements[i].txt_bld.w >= overshoot sprite_w = @elements[i].txt_bld.w-(@elements[i].txt_bld.w-overshoot) else sprite_w = @elements[i].txt_bld.w end sprite_h = @elements[i].txt_bld.h end else unless i == @pointer sprite_w = @elements[i].txt.w sprite_h = @elements[i].txt.h else sprite_w = @elements[i].txt_bld.w sprite_h = @elements[i].txt_bld.h end end y = (0+(j*@element_h))+((@element_h/2)-(sprite_h/2)) @elements[i].txt_src = SDL2::Rect[0, 0, sprite_w, sprite_h] @elements[i].txt_dst = SDL2::Rect[4, y, sprite_w, sprite_h] @elements[i].bg_rect = SDL2::Rect[0, j*@element_h, @view.w, @element_h] unless @playlist[i][:dir_flag] || @playlist[i][:pl_flag] @elements[i].dur_dst = SDL2::Rect[(@view.w-@elements[i].dur.w)-4, y, @elements[i].dur.w, @elements[i].dur.h] end i+= 1 j+= 1 end end
update_element_strings()
click to toggle source
j = 0 i = @max_elements*(@page-1) Util.p i.to_s @playlist.each do |item| unless item[:dir_flag] overshoot = ((@view.w-8)-@elements[i].dur.w-4) unless i == @pointer if @elements[i].txt.w >= overshoot sprite_w = @elements[i].txt.w-(@elements[i].txt.w-overshoot) else sprite_w = @elements[i].txt.w end sprite_h = @elements[i].txt.h else if @elements[i].txt_bld.w >= overshoot sprite_w = @elements[i].txt_bld.w-(@elements[i].txt_bld.w-overshoot) else sprite_w = @elements[i].txt_bld.w end sprite_h = @elements[i].txt_bld.h end else unless i == @pointer sprite_w = @elements[i].txt.w sprite_h = @elements[i].txt.h else sprite_w = @elements[i].txt_bld.w sprite_h = @elements[i].txt_bld.h end end y = (0+(j*@element_h))+((@element_h/2)-(sprite_h/2)) @elements[i].txt_src = SDL2::Rect[0, 0, sprite_w, sprite_h] @elements[i].txt_dst = SDL2::Rect[4, y, sprite_w, sprite_h] @elements[i].bg_rect = SDL2::Rect[0, j*@element_h, @view.w, @element_h] unless item[:dir_flag] @elements[i].dur_dst = SDL2::Rect[(@view.w-@elements[i].dur.w)-4, y, @elements[i].dur.w, @elements[i].dur.h] end i+= 1 j+= 1 break if i >= @playlist.length end
end
# File lib/akane_sound/class.upper_section_base.rb, line 186 def update_element_strings @border = SDL2::Rect[@view.x-1, @view.y-1, @view.w+2, @view.h+2] i = 0 txtcol = (@focus_flag) ? @txt_color : @txt_col_dis @elements.each { |e| e.destroy } @elements.clear @playlist.each do |item| el = Element.new unless item[:dir_flag] || item[:pl_flag] str = String.new unless item[:artist].empty? str = item[:artist]+' - ' end unless item[:title].empty? str += item[:title] else str += item[:filename] end unless item[:album].empty? str += ' ('+item[:album]+')' end el.dur = @@font_bold.render_blended(item[:tag], txtcol) else str = item[:filename] end el.txt = @@font.render_blended(str, txtcol) el.txt_bld = @@font_bold.render_blended(str, txtcol) el.txt_sel = @@font.render_blended(str, @txt_color_sel) el.txt_sel_bld = @@font_bold.render_blended(str, @txt_color_sel) @elements.push(el) i += 1 end end
update_size(x, y, w, h)
click to toggle source
Calls superclass method
ViewBase#update_size
# File lib/akane_sound/class.upper_section_base.rb, line 79 def update_size(x, y, w, h) super @max_elements = 0 set_view set_page update_element_strings update_element_positions end
Private Instance Methods
get_cache_name(dir)
click to toggle source
# File lib/akane_sound/class.upper_section_base.rb, line 413 def get_cache_name(dir) unless @@debug_flag return File.join(dir, ".cache.yaml") else return File.join(dir, ".cache_debug.yaml") end end
get_page(max, pointer)
click to toggle source
# File lib/akane_sound/class.upper_section_base.rb, line 400 def get_page(max, pointer) page = 1 i = 0 while i <= pointer if i == max*page page += 1 end i += 1 end return page end
set_page()
click to toggle source
# File lib/akane_sound/class.upper_section_base.rb, line 395 def set_page #@page = 1 if @pointer < @max_elements-1 @page = get_page((@max_elements), @pointer) end
set_view()
click to toggle source
# File lib/akane_sound/class.upper_section_base.rb, line 378 def set_view @view = SDL2::Rect[@view_base.x+@offset_left, @view_base.y+@offset, @view_base.w - (@offset_left+@offset_right), view_height] end
view_height()
click to toggle source
# File lib/akane_sound/class.upper_section_base.rb, line 385 def view_height height = 0 max_h = @view_base.h - @offset*2 while height < max_h height += @element_h @max_elements += 1 end return height end