X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=bin%2Fgrux.rb;h=3583f3d66d6edf46c1a5b87094e90aa7c21ee4f1;hb=848818d0b8b0d240b9cd86d077e0f5e0ddff5797;hp=e4006908f9e7595d855bb86b9ea56676385dd7a2;hpb=d39015899d9a692f72e13c91d87863ff17b0b1fa;p=user%2Fhenk%2Fcode%2Fruby%2Fgrux.git diff --git a/bin/grux.rb b/bin/grux.rb index e400690..3583f3d 100755 --- a/bin/grux.rb +++ b/bin/grux.rb @@ -11,64 +11,155 @@ class Grux end class Grux::ClientWin < Gtk::VBox + attr_reader :status + def initialize super - @server = Xmms::Client.new( 'Grux' ) - - @cntrlBtnBox = Gtk::HButtonBox.new - @statusLblBox = Gtk::VBox.new - @playlistViewWin = Gtk::ScrolledWindow.new + @status = Hash.new - @playlistTextRenderer = Gtk::CellRendererText.new - @playlistView = Gtk::TreeView.new - @playlistList = Gtk::ListStore.new( String, String ) - @playlistColumns = [ 'artist', 'title' ] - @playlistColumns.each_with_index do |tag, index| - @playlistView.append_column Gtk::TreeViewColumn.new( tag, @playlistTextRenderer, :text => index ) + @server = Xmms::Client.new( 'Grux' ) + begin + @server.connect( ENV['XMMS_PATH'] ) + @server.add_to_glib_mainloop + rescue Xmms::Client::ClientError => ex + warn "Connection failed. Error Code:" + warn ex + raise end - @playlistViewWin << @playlistView - @statusBar = Gtk::Statusbar.new - @cntrlbtns = [ - @playBtn = Gtk::Button.new('_Play/Pause'), - @stopBtn = Gtk::Button.new('_Stop'), - @nextBtn = Gtk::Button.new('_Next'), - @prevBtn = Gtk::Button.new('Pre_vious'), - @rndmBtn = Gtk::Button.new('_Random'), - @rptBtn = Gtk::Button.new('Re_peat') + + @statusBox = Gtk::HBox.new + @mainBox = Gtk::VPaned.new + @statusBar = Gtk::Statusbar.new + + self.pack_start @statusBox, false + self.pack_start @mainBox + self.pack_end @statusBar, false + + + @statusWdgts = [ + @currentartistFrame = Gtk::Frame.new( "Artist" ).add( @currentartistLabel = Gtk::Label.new ), + @currenttitleFrame = Gtk::Frame.new( "Title" ).add( @currenttitleLabel = Gtk::Label.new ), + @currentalbumFrame = Gtk::Frame.new( "Album" ).add( @currentalbumLabel = Gtk::Label.new ) + ] + @statusWdgts.each { |frame| @statusBox.pack_start frame } + + + @mainWdgts = [ + @cntrlBox = Gtk::HBox.new, + @medialistsWin = Gtk::Notebook.new ] - @statusLbls = [ - @stateLbl = Gtk::Label.new, - @repeatLbl = Gtk::Label.new, - @playbackLbl = Gtk::Label.new, - @nextSongLbl = Gtk::Label.new + @mainBox.pack1 @cntrlBox, true, false + @mainBox.pack2 @medialistsWin, true, false + + + @toolWdgts = [ + @cntrlBtnBox = Gtk::VButtonBox.new.set_layout_style( Gtk::ButtonBox::CENTER ), + @toolChsr = Gtk::Notebook.new ] + @cntrlBox.pack_start @cntrlBtnBox, false + @cntrlBox.pack_start @toolChsr + + @cntrlbtns = [ + @playBtn = Gtk::ToggleButton.new('_Play', true), + @pauseBtn = Gtk::ToggleButton.new('Pa_use', true), + @stopBtn = Gtk::ToggleButton.new('_Stop', true), + @nextBtn = Gtk::Button.new('_Next'), + @prevBtn = Gtk::Button.new('P_revious'), + @rndmBtn = Gtk::Button.new('Randomi_ze'), + @rptBtn = Gtk::ToggleButton.new('Repeat _All', true), + @rpt1Btn = Gtk::ToggleButton.new('Repeat _One', true) + ] @cntrlbtns.each do |button| @cntrlBtnBox.pack_start button end - @statusLbls.each do |label| - @statusLblBox.pack_start label, false + + + @toolTabs = [ + [ @extinfoTab = Gtk::VBox.new, + @extinfoTabLbl = Gtk::Label.new( "Status" ) ], + [ @tageditorTab = Gtk::VBox.new, + @tageditorTabLbl = Gtk::Label.new( "Tag Editor" ) ] + ] + @toolTabs.each do |content, label| + @toolChsr.append_page( Gtk::ScrolledWindow.new.add_with_viewport( content ), label ) end - self.pack_start @cntrlBtnBox, false - self.pack_start @statusLblBox - self.pack_start @playlistViewWin - self.pack_end @statusBar, false + + @medialistTextRenderer = Gtk::CellRendererText.new + @medialistColumns = [ 'id', 'artist', 'title' ] + + @medialists = [ + [ @plalistViewLbl = Gtk::Label.new( "Current Playlist" ), + @playlistViewWin = Gtk::ScrolledWindow.new, + @playlistView = Gtk::TreeView.new, + @playlistStore = Gtk::ListStore.new( String, String, String ) + ], + [ @medialibViewLbl = Gtk::Label.new( "Medialib" ), + @medialibViewWin = Gtk::ScrolledWindow.new, + @medialibView = Gtk::TreeView.new, + @medialibList = Gtk::ListStore.new( String, String, String ) + ] + ] + + @medialists.each do |label, window, view, store| + @medialistColumns.each_with_index do |tag, index| + view.append_column Gtk::TreeViewColumn.new( tag, @medialistTextRenderer, :text => index ) + end + @medialistsWin.append_page( window.add( view ), label ) + end + + self.show_all - begin - @server.connect( ENV['XMMS_PATH'] ) - @server.add_to_glib_mainloop - rescue - @statusBar.push( @statusBar.get_context_id( "connection" ), "Failed to connect to #{ENV['XMMS_PATH']}" ) + + @server.broadcast_coll_changed do |*foo| + p foo + end + @server.broadcast_config_value_changed do |*foo| + p foo + end + @server.broadcast_mediainfo_reader_status do |*foo| + p foo + end + @server.broadcast_medialib_entry_added do |*foo| + p foo + end + @server.broadcast_medialib_entry_changed do |*foo| + p foo + end + @server.broadcast_playback_current_id.notifier do |id| + self.handle_current_id id + end + @server.broadcast_playback_status.notifier do |playing| + self.handle_playback_status playing + end + @server.broadcast_playback_volume_changed do |*foo| + p foo + end + @server.broadcast_playlist_changed do |*foo| + p foo + end + @server.broadcast_playlist_current_pos.notifier do |pos| + self.handle_current_pos pos + end + @server.broadcast_playlist_loaded do |*foo| + p foo + end + @server.broadcast_quit do |*foo| + p foo end - @playBtn.signal_connect :clicked do - self.toggle_playback + + @playBtnClkdHndlr = @playBtn.signal_connect :clicked do + self.start_playback + end + @pauseBtnClkdHndlr = @pauseBtn.signal_connect :clicked do + self.pause_playback end - @stopBtn.signal_connect :clicked do + @stopBtnClkdHndlr = @stopBtn.signal_connect :clicked do self.stop_playback end @nextBtn.signal_connect :clicked do @@ -77,51 +168,149 @@ class Grux::ClientWin < Gtk::VBox @prevBtn.signal_connect :clicked do self.step_in_playlist -1 end - @rptBtn.signal_connect :clicked do - self.toggle_repeat + @rndmBtn.signal_connect :clicked do + self.randomize_playlist + end + @rptBtnClkdHndlr = @rptBtn.signal_connect :clicked do + self.toggle_repeat_all + end + @rpt1BtnClkdHndlr = @rpt1Btn.signal_connect :clicked do + self.toggle_repeat_one end + @playlistView.signal_connect :row_activated do |view, path, column| @server.playlist_set_next( path.to_str.to_i ).notifier do @server.playback_tickle.notifier do + self.start_playback true end true end end - @server.broadcast_coll_changed do - end - @server.broadcast_config_value_changed do |*foo| - p foo - end - @server.broadcast_mediainfo_reader_status do - end - @server.broadcast_medialib_entry_added do - end - @server.broadcast_medialib_entry_changed do - end - @server.broadcast_playback_current_id.notifier do |id| - self.handle_current_song id - end - @server.broadcast_playback_status.notifier do |playing| - self.handle_playback_status playing - end - @server.broadcast_playback_volume_changed do + + @medialibView.signal_connect :row_activated do |view, path, column| + @server.playlist.add_entry( path.to_str.to_i ).notifier do + @server.playlist_set_next( path.to_str.to_i ).notifier do + @server.playback_tickle.notifier do + self.start_playback + true + end + true + end + end end - @server.broadcast_playlist_changed do + + + self.resync_complete + + end + + + def xmmspls_to_lststor( playlist, store ) + @status[:playlist] = playlist + playlist.each_with_index do |id, index| + current_row = store.append + @server.medialib_get_info( id ).notifier do |songinfo| + current_row[0] = index.to_s + current_row[1] = songinfo[:artist] ? songinfo[:artist].first[1] : "" + current_row[2] = songinfo[:title] ? songinfo[:title].first[1] : "" + true + end end - @server.broadcast_playlist_current_pos.notifier do |pos| - self.handle_current_pos pos + store + end + + + def handle_current_id( id ) + songpath = Gtk::TreePath.new( @status[:playlist].index id ) + @playlistView.scroll_to_cell( songpath, nil, true, 0.5, 0.5 ) + @playlistView.set_cursor( songpath, nil, false ) + @server.medialib_get_info( id ).notifier do |songinfo| + @currentartistLabel.text = "" + @currenttitleLabel.text = "" + @currentalbumLabel.text = "" + + @extinfoTab.each do |child| @extinfoTab.remove child end + + songinfo[:artist] && songinfo[:artist].each_pair do |src, value| + @currentartistLabel.text += @currentartistLabel.text.empty? ? value : "\n#{value}" + end + songinfo[:title] && songinfo[:title].each_pair do |src, value| + @currenttitleLabel.text += @currenttitleLabel.text.empty? ? value : "\n#{value}" + end + songinfo[:album] && songinfo[:album].each_pair do |src, value| + @currentalbumLabel.text += @currentalbumLabel.text.empty? ? value : "\n#{value}" + end + songinfo.each_key do |key| + infos = String.new + songinfo[key].each_pair do |src,value| + p key, value if src == :server + infos.empty? || infos += "\n" + infos += "#{value} (#{src})" + end + @extinfoTab.pack_end( Gtk::Frame.new( key.to_s ).add( Gtk::Label.new( infos ) ) ) + end + @extinfoTab.show_all + true end - @server.broadcast_playlist_loaded do + true + end + + + + def start_playback + @server.playback_start.notifier do |res| + @playBtn.signal_handler_block( @playBtnClkdHndlr ) do + @playBtn.active = true + end + @pauseBtn.signal_handler_block( @pauseBtnClkdHndlr ) do + @pauseBtn.active = false + end + @stopBtn.signal_handler_block( @stopBtnClkdHndlr ) do + @stopBtn.active = false + end + @statusBar.push( @statusBar.get_context_id( "playback" ), "Started playback" ) + true end - @server.broadcast_quit do + end + + + def pause_playback + @server.playback_pause.notifier do |res| + @playBtn.signal_handler_block( @playBtnClkdHndlr ) do + @playBtn.active = false + end + @pauseBtn.signal_handler_block( @pauseBtnClkdHndlr ) do + @pauseBtn.active = true + end + @stopBtn.signal_handler_block( @stopBtnClkdHndlr ) do + @stopBtn.active = false + end + @statusBar.push( @statusBar.get_context_id( "playback" ), "Paused playback" ) + true end + end - self.resync_state + + def stop_playback + @server.playback_stop.notifier do |res| + @playBtn.signal_handler_block( @playBtnClkdHndlr ) do + @playBtn.active = false + end + @pauseBtn.signal_handler_block( @pauseBtnClkdHndlr ) do + @pauseBtn.active = false + end + @stopBtn.signal_handler_block( @stopBtnClkdHndlr ) do + @stopBtn.active = true + end + @statusBar.push( @statusBar.get_context_id( "playback" ), "Stopped playback" ) + true + end end + def toggle_playback if @playbackState == 1 @server.playback_pause.notifier do |res| @@ -142,12 +331,6 @@ class Grux::ClientWin < Gtk::VBox end end - def stop_playback - @server.playback_stop.notifier do |res| - @statusBar.push( @statusBar.get_context_id( "playback" ), "Stopped playback" ) - true - end - end def step_in_playlist( offset = 1 ) @server.playlist_set_next_rel( offset ).notifier do @@ -155,141 +338,154 @@ class Grux::ClientWin < Gtk::VBox @statusBar.push( @statusBar.get_context_id( "playback" ), "Skipped playback by #{offset} song#{offset.abs >= 1 ? "s" : ''}" ) true end - true + true end end + def handle_playback_status( status ) @playbackState = status - @stateLbl.text = case status - when 0 then "stopped" - when 1 then "playing" - when 2 then "paused" - else "unknown" - end true end - def handle_current_song( id ) - @server.medialib_get_info( id ).notifier do |songinfo| - @playbackLbl.text = "" - songinfo.each_key do |key| - songinfo[key].each_pair do |src,value| -# info.each_pair do |src, value| - @playbackLbl.text += "[#{src}] #{key} = #{value}\n" - end - end - true - end - true - end def handle_current_pos( pos ) -# @server.playlist.entries.notifier do |playlist| -# @server.medialib_get_info( playlist[pos[:position]] ).notifier do |songinfo| -# @nextSongLbl.text = "" -# songinfo.each_pair do |key, info| -# info.each_pair do |src, value| -# @nextSongLbl.text += "[#{src}] #{key} = #{value}\n" -# end -# end -# true -# end -# true -# end + #@server.playlist.entries.notifier do |playlist| + # @server.medialib_get_info( playlist[pos[:position]] ).notifier do |songinfo| + # @nextSongLbl.text = "" + # songinfo.each_pair do |key, info| + # info.each_pair do |src, value| + # @nextSongLbl.text += "[#{src}] #{key} = #{value}\n" + # end + # end + # true + # end + # true + #end true end - def handle_playlist( playlist ) - playlist.each_with_index do |id, index| - current_row = @playlistList.append - @server.medialib_get_info( id ).notifier do |songinfo| - current_row[0] = songinfo[:artist] ? songinfo[:artist].first[1] : "NONE" - current_row[1] = songinfo[:title] ? songinfo[:title].first[1] : "NONE" - true - end + + def handle_repeat_all_state( state ) + @currentconfig[:"playlist.repeat_all"] = ( state ? "1" : "0" ) + @rptBtn.signal_handler_block( @rptBtnClkdHndlr ) do + @rptBtn.active = state end - @playlistView.model = @playlistList - true end - def toggle_repeat + + def handle_repeat_one_state( state ) + @currentconfig[:"playlist.repeat_one"] = ( state ? "1" : "0" ) + @rpt1Btn.signal_handler_block( @rpt1BtnClkdHndlr ) do + @rpt1Btn.active = state + end + end + + + def toggle_repeat_all if @currentconfig[:"playlist.repeat_all"] == "1" - if @currentconfig[:"playlist.repeat_one"] == "1" - @repeatLbl.text = "none" - @server.config_set_value( "playlist.repeat_all", "0" ).notifier do |res| - @server.config_get_value( "playlist.repeat_all" ).notifier do |value| - @currentconfig[:"playlist.repeat_all"] = value - true - end - true - end - @server.config_set_value( "playlist.repeat_one", "0" ).notifier do |res| - @server.config_get_value( "playlist.repeat_one" ).notifier do |value| - @currentconfig[:"playlist.repeat_one"] = value - true - end + @server.config_set_value( "playlist.repeat_all", "0" ).notifier do |res| + @server.config_get_value( "playlist.repeat_all" ).notifier do |value| + self.handle_repeat_all_state( value == "1" ? true : false ) true end - elsif @currentconfig[:"playlist.repeat_one"] == "0" - @repeatLbl.text = "one" - @server.config_set_value( "playlist.repeat_one", "1" ).notifier do |res| - @server.config_get_value( "playlist.repeat_one" ).notifier do |value| - @currentconfig[:"playlist.repeat_one"] = value - true - end + true + end + elsif @currentconfig[:"playlist.repeat_all"] == "0" + @server.config_set_value( "playlist.repeat_all", "1" ).notifier do |res| + @server.config_get_value( "playlist.repeat_all" ).notifier do |value| + self.handle_repeat_all_state( value == "1" ? true : false ) true end - else - warn "Unknown state" + true end - elsif @currentconfig[:"playlist.repeat_all"] == "0" - @repeatLbl.text = "all" + else + warn "Unknown state: #{@currentconfig[:"playlist.repeat_all"]}" + end + true + end + + + def toggle_repeat_one + if @currentconfig[:"playlist.repeat_one"] == "1" @server.config_set_value( "playlist.repeat_one", "0" ).notifier do |res| - @server.config_get_value( "playlist.repeat_one" ).notifier do |value| - @currentconfig[:"playlist.repeat_one"] = value - true - end + @server.config_get_value( "playlist.repeat_one" ).notifier do |value| + self.handle_repeat_one_state( value == "1" ? true : false ) + true + end true end - @server.config_set_value( "playlist.repeat_all", "1" ).notifier do |res| - @server.config_get_value( "playlist.repeat_all" ).notifier do |value| - @currentconfig[:"playlist.repeat_all"] = value - true - end + elsif @currentconfig[:"playlist.repeat_one"] == "0" + @server.config_set_value( "playlist.repeat_one", "1" ).notifier do |res| + @server.config_get_value( "playlist.repeat_one" ).notifier do |value| + self.handle_repeat_one_state( value == "1" ? true : false ) + true + end true end else - warn "Unknown state" + warn "Unknown state: #{@currentconfig[:"playlist.repeat_one"]}" end true end - def resync_state + + def resync_complete + @server.playlist.entries.notifier do |playlist| + @playlistView.model = self.xmmspls_to_lststor( playlist, @playlistStore ) + true + end + + @server.playback_current_id.notifier do |id| + self.handle_current_id id + end + @server.config_list_values.notifier do |res| @currentconfig = {} res.each_pair do |key, value| @currentconfig[key] = value end - @repeatLbl.text = if( @currentconfig[:"playlist.repeat_one"] == "1" ) - "one" - elsif @currentconfig[:"playlist.repeat_all"] == "1" - "all" - else - "none" + @rpt1Btn.signal_handler_block( @rpt1BtnClkdHndlr ) do + @rpt1Btn.active = if( @currentconfig[:"playlist.repeat_one"] == "1" ) + true + else + false + end + end + @rptBtn.signal_handler_block( @rptBtnClkdHndlr ) do + @rptBtn.active = if @currentconfig[:"playlist.repeat_all"] == "1" + true + else + false + end end true end - true - @server.playlist.entries.notifier do |playlist| - self.handle_playlist playlist + @server.coll_list.notifier do |colls| + colls.each do |collname| + @server.coll_get( collname ).notifier do |coll| + @server.coll_query_ids( coll ).notifier do |ids| + p collname + p ids.join( "', '" ) + true + end + true + end + end + true + end + + @server.coll_query_ids( Xmms::Collection.universe ).notifier do |medialibids| + p medialibids.join( ", " ) true end + true end end + class Grux::MainWin < Gtk::Window def initialize super @@ -308,7 +504,11 @@ class Grux::MainWin < Gtk::Window end @cnnctBtnHndlr = @cnnctBtn.signal_connect :clicked do - @clntCont.append_page( Grux::ClientWin.new, Gtk::Label.new( "Client" ) ) + begin + @clntCont.append_page( Grux::ClientWin.new, Gtk::Label.new( "Client" ) ) + rescue Xmms::Client::ClientError => ex + warn ex + end end @quitBtnHndlr = @quitBtn.signal_connect :clicked do Gtk.main_quit @@ -325,6 +525,16 @@ class Grux::MainWin < Gtk::Window end end + gruxWin = Grux::MainWin.new Gtk.main + +#:added +#:chain +#:id +#:laststarted +#:status +#:timesplayed +#:url +