8 require "esmart_draggies"
9 require "esmart_container"
11 require "xmmsclient_ecore"
17 require "euphoria/playlist"
18 require "euphoria/playlist_item"
19 require "euphoria/slider"
20 require "euphoria/volume_box"
21 require "euphoria/playtime_updater"
22 require "euphoria/playback_status_handler"
23 require "euphoria/file_dialog"
25 Config = Struct.new("Config", :ipc_path, :theme, :time_display_elapsed)
27 # backwards compatibility w/ DrFeelgood and earlier
28 unless Xmms.respond_to?(:userconfdir)
30 File.join(File.expand_path("~"), ".xmms2")
35 DATA_DIR = "/usr/local/share/euphoria"
36 DATA_DIR_PRIV = File.join(Xmms.userconfdir,
42 attr_reader :xmms, :ee, :edje
50 unless File.directory?(DATA_DIR_PRIV)
51 FileUtils.mkdir_p(DATA_DIR_PRIV)
54 @config_file = DATA_DIR_PRIV + "/config.yaml"
60 blk = lambda { |item| ui_fill_track_info(item) }
61 @playlist = Playlist.new(@xmms, blk)
65 @playtime_updater = PlaytimeUpdater.new(xmms) do |current_pos|
66 ui_refresh_time(current_pos)
69 if !@playlist.current_item.nil?
70 d = @playlist.current_item.duration
72 ui_refresh_seeker(current_pos / d.to_f)
77 PlaybackStatusHandler.new(xmms) do |state|
78 @playback_state = state
81 @playtime_updater.enabled =
82 (@playback_state == Xmms::Client::PLAY)
86 s = @xmms.configval_get("playlist.repeat_all").wait.value
88 @edje.emit_signal("TOGGLE_REPEAT_MODE", "Euphoria") if @repeat
92 unless @edje.data("has_volume_slider").nil?
93 @sliders["volume"] = VolumeSlider.new(@edje, @xmms,
94 "player.slider.volume")
97 if @edje.part_exists?("vol_display_text")
98 # FIXME Maybe rename the part to volume_box
99 @volume_box = VolumeBox.new(@edje, @xmms, "player.volumeBox")
103 unless @edje.data("has_eq_slider").nil?
105 p = "player.slider.eq.band%02i" % i
106 k = "equalizer.gain#{i - 1}"
107 @sliders[k] = EqSlider.new(@edje, @xmms, p, k)
112 handle_current_pos(@xmms.playlist_current_pos.wait)
116 if @edje.data("has_separate_playlist").nil?
117 @playlist.show(@theme, false)
124 File.open(@config_file, "w") { |fo| YAML.dump(@config, fo) }
128 if @file_dialog_theme.nil?
129 puts "file dialog edje not found"
133 FileDialog.open(@file_dialog_theme) do |sel|
134 if File.directory?(sel)
136 Find.find(sel) { |f| files << f if File.file?(f) }
138 files.sort.each do |f|
139 @xmms.playlist_add("file://" + f).wait
141 elsif File.exists?(sel)
142 @xmms.playlist_add("file://" + sel).wait
149 @ee = Ecore::Evas::SoftwareX11.new
150 @ee.title = "Euphoria"
151 @ee.name_class = ["Euphoria", "Euphoria"]
152 @ee.borderless = true
154 #@ee.evas.font_path_append("/usr/X11R6/lib/X11/fonts/TTF")
155 #@ee.evas.font_path_append(ENV["HOME"] + "/.fonts")
157 @ee.on_pre_render { Edje::thaw }
158 @ee.on_post_render { Edje::freeze }
161 x, y, w, h = @ee.geometry
164 @dragger.resize(w, h)
167 @dragger = Esmart::Draggies.new(@ee)
168 @dragger.name = "dragger"
172 @theme = find_theme(@config.theme)
173 raise "Cannot find theme - #{@config.theme}" if @theme.nil?
175 if Edje.collections(@theme).include?("esmart.filedialog")
176 @file_dialog_theme = @theme
178 @file_dialog_theme = find_theme("file_dialog")
181 @edje = Edje::Edje.new(@ee.evas)
182 @edje.load(@theme, "euphoria")
186 w, h = @edje.get_size_max
187 @ee.set_size_max(w, h)
189 w, h = @edje.get_size_min
190 @ee.set_size_min(w, h)
194 @ee.shaped = !@edje.data("shaped").nil?
200 @xmms = Xmms::Client.new("Euphoria")
201 @xmms.connect(ENV["XMMS_PATH"] || @config.ipc_path)
202 @xmms.add_to_ecore_mainloop
204 @xmms.on_disconnect do
205 puts "daemon exited, shutting down"
211 @edje.on_signal("quit") do
212 Ecore::main_loop_quit
215 @edje.on_signal("close") do
216 Ecore::main_loop_quit
219 @edje.on_signal("playback.play") do
221 when Xmms::Client::PLAY
222 @xmms.playback_stop.wait
223 sleep(0.5) # evil hack, fix xmms2d instead
224 @xmms.playback_start.wait
226 @xmms.playback_start.wait
230 @edje.on_signal("playback.stop") do
231 @xmms.playback_stop.wait
234 @edje.on_signal("playback.pause") do
236 when Xmms::Client::PLAY
237 @xmms.playback_pause.wait
238 when Xmms::Client::PAUSE
239 @xmms.playback_start.wait
243 @edje.on_signal("playback.next") do
244 @xmms.playlist_set_next_rel(1).wait
245 @xmms.playback_tickle.wait
247 if @playback_state != Xmms::Client::PLAY
248 @xmms.playback_start.wait
252 @edje.on_signal("playback.prev") do
253 @xmms.playlist_set_next_rel(-1).wait
254 @xmms.playback_tickle.wait
256 if @playback_state != Xmms::Client::PLAY
257 @xmms.playback_start.wait
261 @edje.on_signal("TOGGLE_TIME_DISPLAY_MODE") do
262 @config.time_display_elapsed = !@config.time_display_elapsed
265 @edje.on_signal("DEBUG") do |sig, source|
269 @edje.on_signal("playlist.open") { @playlist.show(@theme, true) }
271 @edje.on_signal("file_dialog.open") do
275 @edje.on_signal("TOGGLE_REPEAT_MODE") do |sig, source|
276 # don't react on our own emission
277 next if source == "Euphoria"
281 v = @repeat ? "1" : "0"
282 @xmms.configval_set("playlist.repeat_all", v).wait
285 @xmms.broadcast_configval_changed.notifier do |res|
286 k = res.value.keys.first
287 v = res.value.values.first
290 when "playlist.repeat_all"
294 @edje.emit_signal("TOGGLE_REPEAT_MODE", "Euphoria")
296 when /equalizer\.gain(\d+)/
297 @sliders[k].value = v.to_f
301 @xmms.broadcast_playback_volume_changed.notifier do |res|
302 if @edje.data("has_volume_slider")
303 @sliders["volume"].value = res.value
306 if @edje.part_exists?("vol_display_text")
307 @volume_box.value = res.value
311 @xmms.broadcast_playlist_current_pos.notifier do |res|
312 handle_current_pos(res)
316 def handle_current_pos(res)
319 rescue Xmms::Result::ValueError
321 ui_fill_track_info(@playlist[pos])
325 def ui_fill_track_info(item)
327 @edje.send_message(item.track_info_message)
331 def ui_refresh_time(time)
332 return unless @edje.part_exists?("player.time")
336 unless @config.time_display_elapsed
337 time = @playlist.current_item.duration - time
341 tmp = fmt % [time / 60, time % 60]
342 @edje.part("player.time").text = tmp
345 def ui_refresh_seeker(pos)
346 if @edje.part_exists?("seeker")
347 @edje.part("seeker").set_drag_value(pos, 0.1)
353 def signal_playback_state
354 sig = case @playback_state
355 when Xmms::Client::PAUSE
356 "PLAYBACK_STATE_PAUSED"
357 when Xmms::Client::PLAY
358 "PLAYBACK_STATE_PLAYING"
360 "PLAYBACK_STATE_STOPPED"
363 @edje.emit_signal(sig, "Euphoria")
369 if File.exist?(@config_file)
370 File.open(@config_file) { |fo| @config = YAML.load(fo) }
373 if @config.nil? || !@config.is_a?(Config)
375 @config.ipc_path = nil
376 @config.theme = "winter"
377 @config.time_display_elapsed = true
382 dirs = [DATA_DIR_PRIV, DATA_DIR]
384 tmp = File.join(dir, "themes/#{name}.edj")
385 return tmp if File.exist?(tmp)
392 $x = Euphoria.instance
393 Euphoria.instance.show
394 Ecore::main_loop_begin
395 Euphoria.instance.save_config