1 require "euphoria/playlist_item"
6 def initialize(xmms, on_cur_item_changed)
10 @on_cur_item_changed = on_cur_item_changed
15 @xmms.playlist.entries.notifier { |res| push(*res.value) }
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_changed.notifier do |res|
36 when Xmms::Playlist::ADD
37 self << res.value[:id]
38 when Xmms::Playlist::REMOVE
39 # the daemon sends the position of the song, not the
41 delete(self[res.value[:position]])
42 when Xmms::Playlist::CLEAR
47 @xmms.broadcast_medialib_entry_changed.notifier do |res|
48 @xmms.medialib_get_info(res.value).notifier do |res2|
51 find_all { |i| i.id == props[:id] }.each do |item|
52 item.properties = props
54 if current_item && current_item.id == item.id
55 @on_cur_item_changed.call(item)
63 @current_pos && self[@current_pos]
66 def show(eet, is_separate)
67 return unless @ee.nil?
74 @ee = Euphoria.instance.ee
75 @edje = Euphoria.instance.edje
78 @container = Esmart::Container.new(@edje.evas)
79 @container.name = "playlist"
80 @container.direction = Esmart::Container::VERTICAL
81 @container.spacing = 0
82 @container.fill_policy = Esmart::Container::FILL_X
85 @edje.part("playlist.container").swallow(@container)
88 @edje.on_signal("close") do
99 @edje.on_signal("drag", "playlist.scrollbar.handle") do
100 @container.scroll_percent =
101 @edje.part("playlist.scrollbar.handle").
106 @edje.on_signal("file_dialog.open") do
107 Euphoria.instance.show_file_dialog
111 @edje.on_signal("playlist_item.remove") do
112 find_all { |i| i.selected }.each do |i|
113 @xmms.playlist_remove(i.position)
117 each { |i| i.show(eet) }
119 current_item && (current_item.hilighted = true)
128 item = PlaylistItem.new(id, @xmms, self)
131 item.show(@eet) unless @container.nil?
132 (item.selected = true) if size == 1
139 unless item.is_a?(PlaylistItem)
140 item = find { |i| i.id == item }
143 item.hide if item.visible?
146 # fix up positions of the remaining items
147 self[item.position..-1].each do |item|
153 each { |i| i.hide if i.visible? }
159 @ee = Ecore::Evas::SoftwareX11.new
160 @ee.title = "Euphoria Playlist"
161 @ee.borderless = true
162 @ee.evas.font_hinting = Evas::Evas::AUTO
164 @ee.on_pre_render { Edje::thaw }
165 @ee.on_post_render { Edje::freeze }
168 x, y, w, h = @ee.geometry
171 @dragger.resize(w, h)
174 @dragger = Esmart::Draggies.new(@ee)
175 @dragger.name = "dragger"
179 @edje = Edje::Edje.new(@ee.evas)
180 @edje.load(@eet, "playlist")
184 w, h = @edje.get_size_max
185 @ee.set_size_max(w, h)
187 w, h = @edje.get_size_min
188 @ee.set_size_min(w, h)
193 @ee.shaped = !@edje.data("shaped").nil?