3 # $Id: euphoria,v 1.41 2006/09/07 13:38:26 tilman Exp $
10 require "esmart_draggies"
11 require "esmart_container"
13 require "xmmsclient_ecore"
19 require "euphoria/playlist"
20 require "euphoria/playlist_item"
21 require "euphoria/slider"
22 require "euphoria/volume_box"
23 require "euphoria/playtime_updater"
24 require "euphoria/playback_status_handler"
25 require "euphoria/file_dialog"
27 Config = Struct.new("Config", :ipc_path, :theme, :time_display_elapsed)
29 # backwards compatibility w/ DrFeelgood and earlier
30 unless Xmms.respond_to?(:userconfdir)
32 File.join(File.expand_path("~"), ".xmms2")
37 DATA_DIR = "/usr/local/share/euphoria"
38 DATA_DIR_PRIV = File.join(Xmms.userconfdir,
44 attr_reader :xmms, :ee, :edje
52 unless File.directory?(DATA_DIR_PRIV)
53 FileUtils.mkdir_p(DATA_DIR_PRIV)
56 @config_file = DATA_DIR_PRIV + "/config.yaml"
62 blk = lambda { |item| ui_fill_track_info(item) }
63 @playlist = Playlist.new(@xmms, blk)
67 @playtime_updater = PlaytimeUpdater.new(xmms) do |current_pos|
68 ui_refresh_time(current_pos)
71 if !@playlist.current_item.nil?
72 d = @playlist.current_item.duration
74 ui_refresh_seeker(current_pos / d.to_f)
79 PlaybackStatusHandler.new(xmms) do |state|
80 @playback_state = state
83 @playtime_updater.enabled =
84 (@playback_state == Xmms::Client::PLAY)
88 s = @xmms.configval_get("playlist.repeat_all").wait.value
90 @edje.emit_signal("TOGGLE_REPEAT_MODE", "Euphoria") if @repeat
94 unless @edje.data("has_volume_slider").nil?
95 @sliders["volume"] = VolumeSlider.new(@edje, @xmms,
96 "player.slider.volume")
99 if @edje.part_exists?("vol_display_text")
100 # FIXME Maybe rename the part to volume_box
101 @volume_box = VolumeBox.new(@edje, @xmms, "player.volumeBox")
105 unless @edje.data("has_eq_slider").nil?
107 p = "player.slider.eq.band%02i" % i
108 k = "equalizer.gain#{i - 1}"
109 @sliders[k] = EqSlider.new(@edje, @xmms, p, k)
114 handle_current_pos(@xmms.playlist_current_pos.wait)
118 if @edje.data("has_separate_playlist").nil?
119 @playlist.show(@theme, false)
126 File.open(@config_file, "w") { |fo| YAML.dump(@config, fo) }
130 if @file_dialog_theme.nil?
131 puts "file dialog edje not found"
135 FileDialog.open(@file_dialog_theme) do |sel|
136 if File.directory?(sel)
138 Find.find(sel) { |f| files << f if File.file?(f) }
140 files.sort.each do |f|
141 @xmms.playlist_add("file://" + f).wait
143 elsif File.exists?(sel)
144 @xmms.playlist_add("file://" + sel).wait
151 @ee = Ecore::Evas::SoftwareX11.new
152 @ee.title = "Euphoria"
153 @ee.name_class = ["Euphoria", "Euphoria"]
154 @ee.borderless = true
156 #@ee.evas.font_path_append("/usr/X11R6/lib/X11/fonts/TTF")
157 #@ee.evas.font_path_append(ENV["HOME"] + "/.fonts")
159 @ee.on_pre_render { Edje::thaw }
160 @ee.on_post_render { Edje::freeze }
163 x, y, w, h = @ee.geometry
166 @dragger.resize(w, h)
169 @dragger = Esmart::Draggies.new(@ee)
170 @dragger.name = "dragger"
174 @theme = find_theme(@config.theme)
175 raise "Cannot find theme - #{@config.theme}" if @theme.nil?
177 if Edje.collections(@theme).include?("esmart.filedialog")
178 @file_dialog_theme = @theme
180 @file_dialog_theme = find_theme("file_dialog")
183 @edje = Edje::Edje.new(@ee.evas)
184 @edje.load(@theme, "euphoria")
188 w, h = @edje.get_size_max
189 @ee.set_size_max(w, h)
191 w, h = @edje.get_size_min
192 @ee.set_size_min(w, h)
196 @ee.shaped = !@edje.data("shaped").nil?
202 @xmms = Xmms::Client.new("Euphoria")
203 @xmms.connect(ENV["XMMS_PATH"] || @config.ipc_path)
204 @xmms.add_to_ecore_mainloop
206 @xmms.on_disconnect do
207 puts "daemon exited, shutting down"
213 @edje.on_signal("quit") do
214 Ecore::main_loop_quit
217 @edje.on_signal("close") do
218 Ecore::main_loop_quit
221 @edje.on_signal("playback.play") do
223 when Xmms::Client::PLAY
224 @xmms.playback_stop.wait
225 sleep(0.5) # evil hack, fix xmms2d instead
226 @xmms.playback_start.wait
228 @xmms.playback_start.wait
232 @edje.on_signal("playback.stop") do
233 @xmms.playback_stop.wait
236 @edje.on_signal("playback.pause") do
238 when Xmms::Client::PLAY
239 @xmms.playback_pause.wait
240 when Xmms::Client::PAUSE
241 @xmms.playback_start.wait
245 @edje.on_signal("playback.next") do
246 @xmms.playlist_set_next_rel(1).wait
247 @xmms.playback_tickle.wait
249 if @playback_state != Xmms::Client::PLAY
250 @xmms.playback_start.wait
254 @edje.on_signal("playback.prev") do
255 @xmms.playlist_set_next_rel(-1).wait
256 @xmms.playback_tickle.wait
258 if @playback_state != Xmms::Client::PLAY
259 @xmms.playback_start.wait
263 @edje.on_signal("TOGGLE_TIME_DISPLAY_MODE") do
264 @config.time_display_elapsed = !@config.time_display_elapsed
267 @edje.on_signal("DEBUG") do |sig, source|
271 @edje.on_signal("playlist.open") { @playlist.show(@theme, true) }
273 @edje.on_signal("file_dialog.open") do
277 @edje.on_signal("TOGGLE_REPEAT_MODE") do |sig, source|
278 # don't react on our own emission
279 next if source == "Euphoria"
283 v = @repeat ? "1" : "0"
284 @xmms.configval_set("playlist.repeat_all", v).wait
287 @xmms.broadcast_configval_changed.notifier do |res|
288 k = res.value.keys.first
289 v = res.value.values.first
292 when "playlist.repeat_all"
296 @edje.emit_signal("TOGGLE_REPEAT_MODE", "Euphoria")
298 when /equalizer\.gain(\d+)/
299 @sliders[k].value = v.to_f
303 @xmms.broadcast_playback_volume_changed.notifier do |res|
304 if @edje.data("has_volume_slider")
305 @sliders["volume"].value = res.value
308 if @edje.part_exists?("vol_display_text")
309 @volume_box.value = res.value
313 @xmms.broadcast_playlist_current_pos.notifier do |res|
314 handle_current_pos(res)
318 def handle_current_pos(res)
321 rescue Xmms::Result::ValueError
323 ui_fill_track_info(@playlist[pos])
327 def ui_fill_track_info(item)
330 msg = Edje::Message.new(0, item.artist, item.title, item.album)
332 msg = Edje::Message.new(0, "", item.title, "")
334 @edje.send_message(msg)
338 def ui_refresh_time(time)
339 return unless @edje.part_exists?("player.time")
343 unless @config.time_display_elapsed
344 time = @playlist.current_item.duration - time
348 tmp = fmt % [time / 60, time % 60]
349 @edje.part("player.time").text = tmp
352 def ui_refresh_seeker(pos)
353 if @edje.part_exists?("seeker")
354 @edje.part("seeker").set_drag_value(pos, 0.1)
360 def signal_playback_state
361 sig = case @playback_state
362 when Xmms::Client::PAUSE
363 "PLAYBACK_STATE_PAUSED"
364 when Xmms::Client::PLAY
365 "PLAYBACK_STATE_PLAYING"
367 "PLAYBACK_STATE_STOPPED"
370 @edje.emit_signal(sig, "Euphoria")
376 if File.exist?(@config_file)
377 File.open(@config_file) { |fo| @config = YAML.load(fo) }
380 if @config.nil? || !@config.is_a?(Config)
382 @config.ipc_path = nil
383 @config.theme = "winter"
384 @config.time_display_elapsed = true
389 dirs = [DATA_DIR_PRIV, DATA_DIR]
391 tmp = File.join(dir, "themes/#{name}.edj")
392 return tmp if File.exist?(tmp)
399 $x = Euphoria.instance
400 Euphoria.instance.show
401 Ecore::main_loop_begin
402 Euphoria.instance.save_config