9 require "esmart_draggies"
10 require "esmart_container"
12 require "xmmsclient_ecore"
18 require "euphoria/playlist"
19 require "euphoria/playlist_item"
20 require "euphoria/slider"
21 require "euphoria/volume_box"
22 require "euphoria/playtime_updater"
23 require "euphoria/playback_status_handler"
24 #require "euphoria/file_dialog"
26 Config = Struct.new("Config", :ipc_path, :theme, :time_display_elapsed)
28 # backwards compatibility w/ DrFeelgood and earlier
29 unless Xmms.respond_to?(:userconfdir)
31 File.join(File.expand_path("~"), ".xmms2")
36 DATA_DIR = "/usr/local/share/euphoria"
37 DATA_DIR_PRIV = File.join(Xmms.userconfdir,
43 attr_reader :xmms, :ee, :edje
51 unless File.directory?(DATA_DIR_PRIV)
52 FileUtils.mkdir_p(DATA_DIR_PRIV)
55 @config_file = DATA_DIR_PRIV + "/config.yaml"
61 blk = lambda { |item| ui_fill_track_info(item) }
62 @playlist = Playlist.new(@xmms, blk)
66 @playtime_updater = PlaytimeUpdater.new(xmms) do |current_pos|
67 ui_refresh_time(current_pos)
70 if !@playlist.current_item.nil?
71 d = @playlist.current_item.duration
73 ui_refresh_seeker(current_pos / d.to_f)
78 PlaybackStatusHandler.new(xmms) do |state|
79 @playback_state = state
82 @playtime_updater.enabled =
83 (@playback_state == Xmms::Client::PLAY)
87 s = @xmms.configval_get("playlist.repeat_all").wait.value
89 @edje.emit_signal("TOGGLE_REPEAT_MODE", "Euphoria") if @repeat
93 unless @edje.data("has_volume_slider").nil?
94 @sliders["volume"] = VolumeSlider.new(@edje, @xmms,
95 "player.slider.volume")
98 if @edje.part_exists?("vol_display_text")
99 # FIXME Maybe rename the part to volume_box
100 @volume_box = VolumeBox.new(@edje, @xmms, "player.volumeBox")
104 unless @edje.data("has_eq_slider").nil?
106 p = "player.slider.eq.band%02i" % i
107 k = "equalizer.gain#{i - 1}"
108 @sliders[k] = EqSlider.new(@edje, @xmms, p, k)
113 handle_current_pos(@xmms.playlist.current_pos.wait)
117 if @edje.data("has_separate_playlist").nil?
118 @playlist.show(@theme, false)
125 File.open(@config_file, "w") { |fo| YAML.dump(@config, fo) }
129 if @file_dialog_theme.nil?
130 puts "file dialog edje not found"
134 FileDialog.open(@file_dialog_theme) do |sel|
135 if File.directory?(sel)
137 Find.find(sel) { |f| files << f if File.file?(f) }
139 files.sort.each do |f|
140 @xmms.playlist_add("file://" + f).wait
142 elsif File.exists?(sel)
143 @xmms.playlist_add("file://" + sel).wait
150 @ee = Ecore::Evas::SoftwareX11.new
151 @ee.title = "Euphoria"
152 @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")
158 @ee.evas.font_hinting = Evas::Evas::AUTO
160 @ee.on_pre_render { Edje::thaw }
161 @ee.on_post_render { Edje::freeze }
164 x, y, w, h = @ee.geometry
167 @dragger.resize(w, h)
170 @dragger = Esmart::Draggies.new(@ee)
171 @dragger.name = "dragger"
175 @theme = find_theme(@config.theme)
176 raise "Cannot find theme - #{@config.theme}" if @theme.nil?
178 if Edje.collections(@theme).include?("esmart.filedialog")
179 @file_dialog_theme = @theme
181 @file_dialog_theme = find_theme("file_dialog")
184 @edje = Edje::Edje.new(@ee.evas)
185 @edje.load(@theme, "euphoria")
189 w, h = @edje.get_size_max
190 @ee.set_size_max(w, h)
192 w, h = @edje.get_size_min
193 @ee.set_size_min(w, h)
201 @xmms = Xmms::Client.new("Euphoria")
202 @xmms.connect(ENV["XMMS_PATH"] || @config.ipc_path)
203 @xmms.add_to_ecore_mainloop
205 @xmms.on_disconnect do
206 puts "daemon exited, shutting down"
212 @edje.on_signal("quit") do
213 Ecore::main_loop_quit
216 @edje.on_signal("close") do
217 Ecore::main_loop_quit
220 @edje.on_signal("playback.play") do
222 when Xmms::Client::PLAY
223 @xmms.playback_stop.wait
224 sleep(0.5) # evil hack, fix xmms2d instead
225 @xmms.playback_start.wait
227 @xmms.playback_start.wait
231 @edje.on_signal("playback.stop") do
232 @xmms.playback_stop.wait
235 @edje.on_signal("playback.pause") do
237 when Xmms::Client::PLAY
238 @xmms.playback_pause.wait
239 when Xmms::Client::PAUSE
240 @xmms.playback_start.wait
244 @edje.on_signal("playback.next") do
245 @xmms.playlist_set_next_rel(1).wait
246 @xmms.playback_tickle.wait
248 if @playback_state != Xmms::Client::PLAY
249 @xmms.playback_start.wait
253 @edje.on_signal("playback.prev") do
254 @xmms.playlist_set_next_rel(-1).wait
255 @xmms.playback_tickle.wait
257 if @playback_state != Xmms::Client::PLAY
258 @xmms.playback_start.wait
262 @edje.on_signal("TOGGLE_TIME_DISPLAY_MODE") do
263 @config.time_display_elapsed = !@config.time_display_elapsed
266 @edje.on_signal("DEBUG") do |sig, source|
270 @edje.on_signal("playlist.open") { @playlist.show(@theme, true) }
272 @edje.on_signal("file_dialog.open") do
276 @edje.on_signal("TOGGLE_REPEAT_MODE") do |sig, source|
277 # don't react on our own emission
278 next if source == "Euphoria"
282 v = @repeat ? "1" : "0"
283 @xmms.configval_set("playlist.repeat_all", v).wait
286 @xmms.broadcast_configval_changed.notifier do |res|
287 k = res.value.keys.first
288 v = res.value.values.first
291 when "playlist.repeat_all"
295 @edje.emit_signal("TOGGLE_REPEAT_MODE", "Euphoria")
297 when /equalizer\.gain(\d+)/
298 @sliders[k].value = v.to_f
302 @xmms.broadcast_playback_volume_changed.notifier do |res|
303 if @edje.data("has_volume_slider")
304 @sliders["volume"].value = res.value
307 if @edje.part_exists?("vol_display_text")
308 @volume_box.value = res.value
312 @xmms.broadcast_playlist_current_pos.notifier do |res|
313 handle_current_pos(res)
317 def handle_current_pos(res)
320 rescue Xmms::Result::ValueError
322 ui_fill_track_info(@playlist[pos])
326 def ui_fill_track_info(item)
328 @edje.send_message(item.track_info_message)
332 def ui_refresh_time(time)
333 return unless @edje.part_exists?("player.time")
337 unless @config.time_display_elapsed
338 time = @playlist.current_item.duration - time
342 tmp = fmt % [time / 60, time % 60]
343 @edje.part("player.time").text = tmp
346 def ui_refresh_seeker(pos)
347 if @edje.part_exists?("seeker")
348 @edje.part("seeker").set_drag_value(pos, 0.1)
354 def signal_playback_state
355 sig = case @playback_state
356 when Xmms::Client::PAUSE
357 "PLAYBACK_STATE_PAUSED"
358 when Xmms::Client::PLAY
359 "PLAYBACK_STATE_PLAYING"
361 "PLAYBACK_STATE_STOPPED"
364 @edje.emit_signal(sig, "Euphoria")
370 if File.exist?(@config_file)
371 File.open(@config_file) { |fo| @config = YAML.load(fo) }
374 if @config.nil? || !@config.is_a?(Config)
376 @config.ipc_path = nil
377 @config.theme = "winter"
378 @config.time_display_elapsed = true
383 dirs = [DATA_DIR_PRIV, DATA_DIR]
385 tmp = File.join(dir, "themes/#{name}.edj")
386 return tmp if File.exist?(tmp)
393 $x = Euphoria.instance
394 Euphoria.instance.show
395 Ecore::main_loop_begin
396 Euphoria.instance.save_config