Initialize a song's properties to an empty hash.
[euphoria.git] / lib / playlist_item.rb
1 class PlaylistItem
2         attr_reader :id, :edje, :position, :selected, :hilighted
3
4         def initialize(id, xmms, playlist)
5                 @id = id
6                 @position = playlist.size
7
8                 @xmms = xmms
9                 @playlist = playlist
10
11                 @edje = nil
12                 @height = 0
13                 @selected = false
14                 @hilighted = false
15
16                 @props = {}
17
18                 @xmms.medialib_get_info(id).notifier do |res|
19                         self.properties = res.value
20                 end
21         end
22
23         def method_missing(method)
24                 @props[method] || "unknown #{method}"
25         end
26
27         def duration
28                 @props[:duration].to_i / 1000
29         end
30
31         def show(eet)
32                 @edje = Edje::Edje.new(@playlist.container.evas)
33                 @edje.load(eet, "playlist_item")
34                 w, @height = @edje.get_size_min
35
36                 set_parts_text
37
38                 w, h = @edje.get_size_min
39                 @edje.resize(w, h)
40
41                 @playlist.container.append_element(@edje)
42
43                 self.selected = @selected
44
45                 @edje.on_signal("playlist_item.selected") do |sig, src|
46                         next if src == "Euphoria"
47
48                         @playlist.each do |item|
49                                 item.selected = (item == self)
50                         end
51                 end
52
53                 @edje.on_signal("playlist_item.hilighted") do |sig, src|
54                         next if src == "Euphoria"
55
56                         @playlist.each do |item|
57                                 item.hilighted = (item == self)
58                         end
59                 end
60
61                 @edje.on_signal("playlist_item.play") do
62                         @xmms.playlist_set_next(@position).wait
63                         @xmms.playback_tickle.wait
64                         @xmms.playback_start.wait
65                 end
66
67                 @edje.on_signal("PLAYLIST_SCROLL_UP", "") do
68                         @playlist.container.scroll(h * 3)
69                 end
70
71                 @edje.on_signal("PLAYLIST_SCROLL_DOWN", "") do
72                         @playlist.container.scroll(h * -3)
73                 end
74         end
75
76         def hilighted=(b)
77                 @hilighted = b
78
79                 sig = b ? "hilighted" : "unhilighted"
80                 unless @edje.nil?
81                         @edje.emit_signal("playlist_item.#{sig}", "Euphoria")
82                 end
83         end
84
85         def selected=(b)
86                 @selected = b
87
88                 sig = b ? "selected" : "unselected"
89                 unless @edje.nil?
90                         @edje.emit_signal("playlist_item.#{sig}", "Euphoria")
91                 end
92         end
93
94         def visible?
95                 # since we don't actually hide the edje, but just delete it,
96                 # we don't need to check @edje.visible? here
97                 !@edje.nil?
98         end
99
100         def hide
101                 @playlist.container.remove_element(@edje)
102                 @edje.delete
103                 @edje = nil
104         end
105
106         def properties=(hash)
107                 @props = hash || {}
108
109                 set_parts_text unless @edje.nil?
110         end
111
112         def position=(pos)
113                 @position = pos
114                 set_parts_text unless @edje.nil?
115         end
116
117         def track_info_message
118                 unless @props[:channel].nil?
119                         Edje::Message.new(0, channel)
120                 else
121                         Edje::Message.new(0, artist, title, album)
122                 end
123         end
124
125         private
126         def set_parts_text
127                 tmp = (duration == -1) ? "" :
128                       ("%i:%02i" % [duration / 60, duration % 60])
129                 @edje.part("duration").text = tmp
130                 @edje.part("title").text = "%i %s - %s" % [@position + 1, artist, title]
131         end
132 end