1 require "euphoria/playlist_item"
6 def initialize(xmms, on_cur_item_changed)
10 @on_cur_item_changed = on_cur_item_changed
17 @xmms.playlist.current_pos.notifier do |res|
19 @current_pos = res.value
20 rescue Xmms::Result::ValueError
25 @xmms.broadcast_playlist_current_pos.notifier do |res|
26 @current_pos = res.value
28 tmp = find { |i| i.hilighted }
29 tmp.hilighted = false unless tmp.nil?
31 current_item.hilighted = true
34 @xmms.broadcast_playlist_loaded.
35 notifier(&method(:on_playlist_loaded))
37 @xmms.broadcast_playlist_changed.notifier do |res|
39 when Xmms::Playlist::ADD
40 self << res.value[:id]
41 when Xmms::Playlist::REMOVE
42 # the daemon sends the position of the song, not the
44 delete(self[res.value[:position]])
45 when Xmms::Playlist::CLEAR
50 @xmms.broadcast_medialib_entry_changed.notifier do |res|
51 @xmms.medialib_get_info(res.value).notifier do |res2|
54 find_all { |i| i.id == props[:id] }.each do |item|
55 item.properties = props
57 if current_item && current_item.id == item.id
58 @on_cur_item_changed.call(item)
66 @current_pos && self[@current_pos]
69 def show(eet, is_separate)
70 return unless @ee.nil?
77 @ee = Euphoria.instance.ee
78 @edje = Euphoria.instance.edje
81 @container = Esmart::Container.new(@edje.evas)
82 @container.name = "playlist"
83 @container.direction = Esmart::Container::VERTICAL
84 @container.spacing = 0
85 @container.fill_policy = Esmart::Container::FILL_X
88 @edje.part("playlist.container").swallow(@container)
91 @edje.on_signal("close") do
102 @edje.on_signal("drag", "playlist.scrollbar.handle") do
103 @container.scroll_percent =
104 @edje.part("playlist.scrollbar.handle").
109 @edje.on_signal("file_dialog.open") do
110 Euphoria.instance.show_file_dialog
114 @edje.on_signal("playlist_item.remove") do
115 find_all { |i| i.selected }.each do |i|
116 @xmms.playlist_remove(i.position)
120 each { |i| i.show(eet) }
122 current_item && (current_item.hilighted = true)
131 item = PlaylistItem.new(id, @xmms, self)
134 item.show(@eet) unless @container.nil?
135 (item.selected = true) if size == 1
142 unless item.is_a?(PlaylistItem)
143 item = find { |i| i.id == item }
146 item.hide if item.visible?
149 # fix up positions of the remaining items
150 self[item.position..-1].each do |item|
156 each { |i| i.hide if i.visible? }
162 @ee = Ecore::Evas::SoftwareX11.new
163 @ee.title = "Euphoria Playlist"
164 @ee.borderless = true
165 @ee.evas.font_hinting = Evas::Evas::AUTO
167 @ee.on_pre_render { Edje::thaw }
168 @ee.on_post_render { Edje::freeze }
171 x, y, w, h = @ee.geometry
174 @dragger.resize(w, h)
177 @dragger = Esmart::Draggies.new(@ee)
178 @dragger.name = "dragger"
182 @edje = Edje::Edje.new(@ee.evas)
183 @edje.load(@eet, "playlist")
187 w, h = @edje.get_size_max
188 @ee.set_size_max(w, h)
190 w, h = @edje.get_size_min
191 @ee.set_size_min(w, h)
196 @ee.shaped = !@edje.data("shaped").nil?
200 @xmms.playlist.entries.notifier do |res|
205 def on_playlist_loaded(res)