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"]
153 @ee.borderless = true
155 #@ee.evas.font_path_append("/usr/X11R6/lib/X11/fonts/TTF")
156 #@ee.evas.font_path_append(ENV["HOME"] + "/.fonts")
157 @ee.evas.font_hinting = Evas::Evas::AUTO
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)
329 @edje.send_message(item.track_info_message)
333 def ui_refresh_time(time)
334 return unless @edje.part_exists?("player.time")
338 unless @config.time_display_elapsed
339 time = @playlist.current_item.duration - time
343 tmp = fmt % [time / 60, time % 60]
344 @edje.part("player.time").text = tmp
347 def ui_refresh_seeker(pos)
348 if @edje.part_exists?("seeker")
349 @edje.part("seeker").set_drag_value(pos, 0.1)
355 def signal_playback_state
356 sig = case @playback_state
357 when Xmms::Client::PAUSE
358 "PLAYBACK_STATE_PAUSED"
359 when Xmms::Client::PLAY
360 "PLAYBACK_STATE_PLAYING"
362 "PLAYBACK_STATE_STOPPED"
365 @edje.emit_signal(sig, "Euphoria")
371 if File.exist?(@config_file)
372 File.open(@config_file) { |fo| @config = YAML.load(fo) }
375 if @config.nil? || !@config.is_a?(Config)
377 @config.ipc_path = nil
378 @config.theme = "winter"
379 @config.time_display_elapsed = true
384 dirs = [DATA_DIR_PRIV, DATA_DIR]
386 tmp = File.join(dir, "themes/#{name}.edj")
387 return tmp if File.exist?(tmp)
394 $x = Euphoria.instance
395 Euphoria.instance.show
396 Ecore::main_loop_begin
397 Euphoria.instance.save_config