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_list.notifier { |res| push(*res.value) }
18 @current_pos = @xmms.playlist_current_pos.wait.value
19 rescue Xmms::Result::ValueError
23 @xmms.broadcast_playlist_current_pos.notifier do |res|
24 @current_pos = res.value
26 tmp = find { |i| i.hilighted }
27 tmp.hilighted = false unless tmp.nil?
29 current_item.hilighted = true
32 @xmms.broadcast_playlist_changed.notifier do |res|
34 when Xmms::Result::PLAYLIST_CHANGED_ADD
35 self << res.value[:id]
36 when Xmms::Result::PLAYLIST_CHANGED_REMOVE
37 # the daemon sends the position of the song, not the
39 delete(self[res.value[:position]])
40 when Xmms::Result::PLAYLIST_CHANGED_CLEAR
45 @xmms.broadcast_medialib_entry_changed.notifier do |res|
46 @xmms.medialib_get_info(res.value).notifier do |res2|
49 find_all { |i| i.id == props[:id] }.each do |item|
50 item.properties = props
52 if current_item && current_item.id == item.id
53 @on_cur_item_changed.call(item)
61 @current_pos && self[@current_pos]
64 def show(eet, is_separate)
65 return unless @ee.nil?
72 @ee = Euphoria.instance.ee
73 @edje = Euphoria.instance.edje
76 @container = Esmart::Container.new(@edje.evas)
77 @container.name = "playlist"
78 @container.direction = Esmart::Container::VERTICAL
79 @container.spacing = 0
80 @container.fill_policy = Esmart::Container::FILL_X
83 @edje.part("playlist.container").swallow(@container)
86 @edje.on_signal("close") do
97 @edje.on_signal("drag", "playlist.scrollbar.handle") do
98 @container.scroll_percent =
99 @edje.part("playlist.scrollbar.handle").
104 @edje.on_signal("file_dialog.open") do
105 Euphoria.instance.show_file_dialog
109 @edje.on_signal("playlist_item.remove") do
110 find_all { |i| i.selected }.each do |i|
111 @xmms.playlist_remove(i.position)
115 each { |i| i.show(eet) }
117 current_item && (current_item.hilighted = true)
126 item = PlaylistItem.new(id, @xmms, self)
129 item.show(@eet) unless @container.nil?
130 (item.selected = true) if size == 1
137 unless item.is_a?(PlaylistItem)
138 item = find { |i| i.id == item }
141 item.hide if item.visible?
144 # fix up positions of the remaining items
145 self[item.position..-1].each do |item|
151 each { |i| i.hide if i.visible? }
157 @ee = Ecore::Evas::SoftwareX11.new
158 @ee.title = "Euphoria Playlist"
159 @ee.borderless = true
161 @ee.on_pre_render { Edje::thaw }
162 @ee.on_post_render { Edje::freeze }
165 x, y, w, h = @ee.geometry
168 @dragger.resize(w, h)
171 @dragger = Esmart::Draggies.new(@ee)
172 @dragger.name = "dragger"
176 @edje = Edje::Edje.new(@ee.evas)
177 @edje.load(@eet, "playlist")
181 w, h = @edje.get_size_max
182 @ee.set_size_max(w, h)
184 w, h = @edje.get_size_min
185 @ee.set_size_min(w, h)
190 @ee.shaped = !@edje.data("shaped").nil?