3 #$: << File.expand_path(File.dirname(FILE) + “/../lib”))
5 #require 'libgruxclient'
8 require 'xmmsclient_glib'
13 class Grux::ClientWin < Gtk::VBox
17 @server = Xmms::Client.new( 'Grux' )
19 @cntrlBtnBox = Gtk::HButtonBox.new
20 @statusLblBox = Gtk::VBox.new
21 @playlistViewWin = Gtk::ScrolledWindow.new
23 @playlistTextRenderer = Gtk::CellRendererText.new
24 @playlistView = Gtk::TreeView.new
25 @playlistList = Gtk::ListStore.new( String, String )
26 @playlistColumns = [ 'artist', 'title' ]
27 @playlistColumns.each_with_index do |tag, index|
28 @playlistView.append_column Gtk::TreeViewColumn.new( tag, @playlistTextRenderer, :text => index )
30 @playlistViewWin << @playlistView
31 @statusBar = Gtk::Statusbar.new
34 @playBtn = Gtk::Button.new('_Play/Pause'),
35 @stopBtn = Gtk::Button.new('_Stop'),
36 @nextBtn = Gtk::Button.new('_Next'),
37 @prevBtn = Gtk::Button.new('Pre_vious'),
38 @rndmBtn = Gtk::Button.new('_Random'),
39 @rptBtn = Gtk::Button.new('Re_peat')
42 @stateLbl = Gtk::Label.new,
43 @repeatLbl = Gtk::Label.new,
44 @playbackLbl = Gtk::Label.new,
45 @nextSongLbl = Gtk::Label.new
48 @cntrlbtns.each do |button|
49 @cntrlBtnBox.pack_start button
51 @statusLbls.each do |label|
52 @statusLblBox.pack_start label, false
55 self.pack_start @cntrlBtnBox, false
56 self.pack_start @statusLblBox
57 self.pack_start @playlistViewWin
58 self.pack_end @statusBar, false
62 @server.connect( ENV['XMMS_PATH'] )
63 @server.add_to_glib_mainloop
65 @statusBar.push( @statusBar.get_context_id( "connection" ), "Failed to connect to #{ENV['XMMS_PATH']}" )
68 @playBtn.signal_connect :clicked do
71 @stopBtn.signal_connect :clicked do
74 @nextBtn.signal_connect :clicked do
75 self.step_in_playlist 1
77 @prevBtn.signal_connect :clicked do
78 self.step_in_playlist -1
80 @rptBtn.signal_connect :clicked do
84 @playlistView.signal_connect :row_activated do |view, path, column|
85 @server.playlist_set_next( path.to_str.to_i ).notifier do
86 @server.playback_tickle.notifier do
93 @server.broadcast_coll_changed do
95 @server.broadcast_config_value_changed do |*foo|
98 @server.broadcast_mediainfo_reader_status do
100 @server.broadcast_medialib_entry_added do
102 @server.broadcast_medialib_entry_changed do
104 @server.broadcast_playback_current_id.notifier do |id|
105 self.handle_current_song id
107 @server.broadcast_playback_status.notifier do |playing|
108 self.handle_playback_status playing
110 @server.broadcast_playback_volume_changed do
112 @server.broadcast_playlist_changed do
114 @server.broadcast_playlist_current_pos.notifier do |pos|
115 self.handle_current_pos pos
117 @server.broadcast_playlist_loaded do
119 @server.broadcast_quit do
126 if @playbackState == 1
127 @server.playback_pause.notifier do |res|
128 @statusBar.push( @statusBar.get_context_id( "playback" ), "Paused playback" )
131 elsif @playbackState == 0 || 2
132 @server.playback_start.notifier do |res|
133 @statusBar.push( @statusBar.get_context_id( "playback" ), "Started playback" )
137 warn "Playbackstate unknown"
138 @server.playback_start.notifier do |res|
139 @statusBar.push( @statusBar.get_context_id( "playback" ), "Started playback" )
146 @server.playback_stop.notifier do |res|
147 @statusBar.push( @statusBar.get_context_id( "playback" ), "Stopped playback" )
152 def step_in_playlist( offset = 1 )
153 @server.playlist_set_next_rel( offset ).notifier do
154 @server.playback_tickle.notifier do |res|
155 @statusBar.push( @statusBar.get_context_id( "playback" ), "Skipped playback by #{offset} song#{offset.abs >= 1 ? "s" : ''}" )
162 def handle_playback_status( status )
163 @playbackState = status
164 @stateLbl.text = case status
165 when 0 then "stopped"
166 when 1 then "playing"
173 def handle_current_song( id )
174 @server.medialib_get_info( id ).notifier do |songinfo|
175 @playbackLbl.text = ""
176 songinfo.each_key do |key|
177 songinfo[key].each_pair do |src,value|
178 # info.each_pair do |src, value|
179 @playbackLbl.text += "[#{src}] #{key} = #{value}\n"
187 def handle_current_pos( pos )
188 # @server.playlist.entries.notifier do |playlist|
189 # @server.medialib_get_info( playlist[pos[:position]] ).notifier do |songinfo|
190 # @nextSongLbl.text = ""
191 # songinfo.each_pair do |key, info|
192 # info.each_pair do |src, value|
193 # @nextSongLbl.text += "[#{src}] #{key} = #{value}\n"
203 def handle_playlist( playlist )
204 playlist.each_with_index do |id, index|
205 current_row = @playlistList.append
206 @server.medialib_get_info( id ).notifier do |songinfo|
207 current_row[0] = songinfo[:artist] ? songinfo[:artist].first[1] : "NONE"
208 current_row[1] = songinfo[:title] ? songinfo[:title].first[1] : "NONE"
212 @playlistView.model = @playlistList
217 if @currentconfig[:"playlist.repeat_all"] == "1"
218 if @currentconfig[:"playlist.repeat_one"] == "1"
219 @repeatLbl.text = "none"
220 @server.config_set_value( "playlist.repeat_all", "0" ).notifier do |res|
221 @server.config_get_value( "playlist.repeat_all" ).notifier do |value|
222 @currentconfig[:"playlist.repeat_all"] = value
227 @server.config_set_value( "playlist.repeat_one", "0" ).notifier do |res|
228 @server.config_get_value( "playlist.repeat_one" ).notifier do |value|
229 @currentconfig[:"playlist.repeat_one"] = value
234 elsif @currentconfig[:"playlist.repeat_one"] == "0"
235 @repeatLbl.text = "one"
236 @server.config_set_value( "playlist.repeat_one", "1" ).notifier do |res|
237 @server.config_get_value( "playlist.repeat_one" ).notifier do |value|
238 @currentconfig[:"playlist.repeat_one"] = value
246 elsif @currentconfig[:"playlist.repeat_all"] == "0"
247 @repeatLbl.text = "all"
248 @server.config_set_value( "playlist.repeat_one", "0" ).notifier do |res|
249 @server.config_get_value( "playlist.repeat_one" ).notifier do |value|
250 @currentconfig[:"playlist.repeat_one"] = value
255 @server.config_set_value( "playlist.repeat_all", "1" ).notifier do |res|
256 @server.config_get_value( "playlist.repeat_all" ).notifier do |value|
257 @currentconfig[:"playlist.repeat_all"] = value
269 @server.config_list_values.notifier do |res|
271 res.each_pair do |key, value|
272 @currentconfig[key] = value
275 @repeatLbl.text = if( @currentconfig[:"playlist.repeat_one"] == "1" )
277 elsif @currentconfig[:"playlist.repeat_all"] == "1"
286 @server.playlist.entries.notifier do |playlist|
287 self.handle_playlist playlist
293 class Grux::MainWin < Gtk::Window
297 @mainCont = Gtk::VBox.new
298 @btnCont = Gtk::HBox.new
299 @clntCont = Gtk::Notebook.new
301 @cnnctBtn = Gtk::Button.new "_Connect"
302 @quitBtn = Gtk::Button.new "_Quit"
306 @winDstryHndlr = self.signal_connect :destroy do
310 @cnnctBtnHndlr = @cnnctBtn.signal_connect :clicked do
311 @clntCont.append_page( Grux::ClientWin.new, Gtk::Label.new( "Client" ) )
313 @quitBtnHndlr = @quitBtn.signal_connect :clicked do
317 @btnCont.pack_start @cnnctBtn
318 @btnCont.pack_end @quitBtn
320 @mainCont.pack_start @btnCont, false
321 @mainCont.pack_end @clntCont
328 gruxWin = Grux::MainWin.new