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