]> git.netwichtig.de Git - user/henk/code/ruby/grux.git/commitdiff
On branch master master
authorHendrik Jaeger <henk@frustcomp>
Wed, 4 Jan 2012 22:30:52 +0000 (23:30 +0100)
committerHendrik Jaeger <henk@frustcomp>
Wed, 4 Jan 2012 22:30:52 +0000 (23:30 +0100)
Changes to be committed:

      modified:   bin/grux.rb

* CHANGED: interpreter is now /usr/bin/ruby because of the -w argument
* ADDED: debug output function
* ADDED: debug output in several places
* CHANGED: server_address is now an instance variable
* CHANGED: searching now switches to the results
* ADDED: proper handler for playback state changes
* ADDED: proper handler for playlist changes
* ADDED: check if songinfo is set before using it
* CHANGED: resync_complete is now resync_completely and has been split
* up in several more specific functions

bin/grux.rb

index 954ea5ffcbe0ebc2e39e17aed0797762f6bff3c7..308a6453ec1420718905efe97ea4eefe6031f981 100755 (executable)
@@ -1,8 +1,5 @@
-#!/usr/bin/env ruby -w
+#!/usr/bin/ruby -w
 
-#$: << File.expand_path(File.dirname(FILE) + “/../lib”))
-
-#require 'libgruxclient'
 require 'gtk2'
 require 'xmmsclient'
 require 'xmmsclient_glib'
@@ -13,15 +10,22 @@ end
 class Grux::ClientWin < Gtk::VBox
   attr_reader :status
 
-  def initialize( server_address )
+  def initialize( address )
+    @server_address = address
+    grux_debug "Initializing window..."
     super()
+    grux_debug "Done"
 
-
+    grux_debug "Creating connection handle..."
     @server                 = Xmms::Client.new( 'Grux' )
+    grux_debug "Done"
 
+    grux_debug "Connecting to server..."
     @status                 = Hash.new
-    @status[:connected]     = self.connect( server_address )
+    @status[:connected]     = self.connect( @server_address )
+    grux_debug "Done"
 
+    grux_debug "Creating and placing child widgets..."
     @statusBox              = Gtk::HBox.new
     @mainBox                = Gtk::VPaned.new
     @statusBar              = Gtk::Statusbar.new
@@ -122,6 +126,7 @@ class Grux::ClientWin < Gtk::VBox
 
 
     self.show_all
+    grux_debug "Done"
 
 
     @playBtnClkdHndlr = @playBtn.signal_connect :clicked do
@@ -164,6 +169,7 @@ class Grux::ClientWin < Gtk::VBox
       end
       searchResultIds, searchResult = self.xmmspls_to_lststor( results.uniq!, @searchResultStore )
       @searchResultView.model = searchResult
+      @medialistsWin.page = 2
     end
 
 
@@ -200,19 +206,24 @@ class Grux::ClientWin < Gtk::VBox
 
 
     if @status[:connected]
-      p "connected"
-      self.resync_complete
+      grux_debug "Connected to server."
+      self.resync_completely
     end
   end
 
 
+  def grux_debug( message )
+    exit 1 unless @server_address
+    STDERR.puts "#{@server_address}: #{message}"
+  end
+
   def connect( address )
     begin
       @server.connect( address )
       @server.add_to_glib_mainloop
     rescue Xmms::Client::ClientError => ex
-      warn "Connection failed. Error Code:"
-      warn ex
+      grux_debug "Connection failed. Error Code:"
+      grux_debug ex
       return false
     end
 
@@ -270,29 +281,29 @@ class Grux::ClientWin < Gtk::VBox
 
 
   def handle_coll_changed( *foo )
-    p "Collection changed: #{foo}"
+    grux_debug "Collection changed: #{foo}"
     true
   end
   def handle_config_value_changed( *foo )
-    p "Config changed: #{foo}"
+    grux_debug "Config changed: #{foo}"
     true
   end
   def handle_mediainfo_reader_status( *foo )
-    p "Mediainfo reader status changed: #{foo}"
+    grux_debug "Mediainfo reader status changed: #{foo}"
     true
   end
   def handle_medialib_entry_added( *foo )
-    p "Medialib entry added: #{foo}"
+    grux_debug "Medialib entry added: #{foo}"
     true
   end
   def handle_medialib_entry_changed( *foo )
-    p "Medialib entry changed: #{foo}"
+    grux_debug "Medialib entry changed: #{foo}"
     true
   end
 
 
   def handle_playback_current_id( id )
-    p "Current playback ID changed: #{id}"
+    grux_debug "Current playback ID changed: #{id}"
     songpath = Gtk::TreePath.new( @status[:playlistids].index id )
 
     @playlistView.scroll_to_cell( songpath, nil, true, 0.5, 0.5 )
@@ -330,24 +341,61 @@ class Grux::ClientWin < Gtk::VBox
 
 
   def handle_playback_status( status )
-    p "Current playback status changed: #{status}"
+    grux_debug "Current playback status changed: #{status}"
     @playbackState = status
+    if status == 2
+      @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" ), "Playback paused" )
+    elsif status == 1
+      @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" ), "Playback started" )
+    elsif status == 0
+      @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" ), "Playback stopped" )
+    else
+      grux_debug "Unknown status #{status}"
+    end
     true
   end
 
 
   def handle_playback_volume_changed( *foo )
-    p "Playback volume changed: #{foo}"
+    grux_debug "Playback volume changed: #{foo}"
     true
   end
   def handle_playlist_changed( *foo )
-    p "Playlist changed: #{foo}"
+    grux_debug "Playlist changed: #{foo}"
+    self.get_playlist
     true
   end
 
 
   def handle_playlist_current_pos( pos )
-    p "Current pos changed: #{pos}"
+    grux_debug "Current pos changed: #{pos}"
     #@server.playlist.entries.notifier do |playlist|
     #  @server.medialib_get_info( playlist[pos[:position]] ).notifier do |songinfo|
     #    @nextSongLbl.text = ""
@@ -365,25 +413,28 @@ class Grux::ClientWin < Gtk::VBox
 
 
   def handle_playlist_loaded( *foo )
-    p "Playlist loaded: #{foo}"
+    grux_debug "Playlist loaded: #{foo}"
     true
   end
   def handle_quit( *foo )
-    p "Server quit: #{foo}"
+    grux_debug "Server quit: #{foo}"
     true
   end
 
 
   def xmmspls_to_lststor( songids, store )
+    grux_debug "Processing songids: #{songids.join(' ')}."
     songinfos = []
     store.clear
     songids.each do |id|
       current_row = store.append
       @server.medialib_get_info( id ).notifier do |songinfo|
-        songinfos[id] = songinfo
         current_row[0] = id.to_s
-        current_row[1] = songinfo[:artist] ? songinfo[:artist].first[1] : ""
-        current_row[2] = songinfo[:title] ? songinfo[:title].first[1] : ""
+        if songinfo
+          songinfos[id] = songinfo
+          current_row[1] = songinfo[:artist] ? songinfo[:artist].first[1] : ""
+          current_row[2] = songinfo[:title] ? songinfo[:title].first[1] : ""
+        end
         true
       end
     end
@@ -391,7 +442,6 @@ class Grux::ClientWin < Gtk::VBox
   end
 
 
-
   def start_playback
     @server.playback_start.notifier do |res|
       @playBtn.signal_handler_block( @playBtnClkdHndlr ) do
@@ -455,7 +505,7 @@ class Grux::ClientWin < Gtk::VBox
         true
       end
     else
-      warn "Playbackstate unknown"
+      grux_debug "Playbackstate unknown"
       @server.playback_start.notifier do |res|
         @statusBar.push( @statusBar.get_context_id( "playback" ), "Started playback" )
         true
@@ -509,7 +559,7 @@ class Grux::ClientWin < Gtk::VBox
         true
       end
     else
-      warn "Unknown state: #{@currentconfig[:"playlist.repeat_all"]}"
+      grux_debug "Unknown state: #{@currentconfig[:"playlist.repeat_all"]}"
     end
     true
   end
@@ -533,30 +583,49 @@ class Grux::ClientWin < Gtk::VBox
         true
       end
     else
-      warn "Unknown state: #{@currentconfig[:"playlist.repeat_one"]}"
+      grux_debug "Unknown state: #{@currentconfig[:"playlist.repeat_one"]}"
     end
     true
   end
 
 
-  def resync_complete
+  def get_playlist
+    grux_debug "Retrieving playlist..."
     @server.playlist.entries.notifier do |playlistids|
+      grux_debug "Playlist-IDs: #{playlistids.join(' ')}"
       @status[:playlistids] = playlistids
       @status[:playlist], @playlistView.model = self.xmmspls_to_lststor( playlistids, @playlistStore )
       true
     end
+    grux_debug "Done"
+  end
 
+  def get_medialib
+    grux_debug "Retrieving medialib..."
     @server.coll_query_ids( Xmms::Collection.universe ).notifier do |medialibids|
+      grux_debug "Medialib-IDs: #{medialibids.join(' ')}"
       @status[:medialibids] = medialibids
       @status[:medialib], @medialibView.model = self.xmmspls_to_lststor( medialibids, @medialibStore )
       true
     end
+    grux_debug "Done"
+  end
 
+  def get_current_song
+    grux_debug "Retrieving currently playing song..."
     @server.playback_current_id.notifier do |id|
-      self.handle_playback_current_id id
+      if id == 0
+        grux_debug "XXX-UNCLEAR: Songid is 0, playlist may be empty?"
+      else
+        self.handle_playback_current_id id
+      end
       true
     end
+    grux_debug "Done"
+  end
 
+  def get_config
+    grux_debug "Retrieving configuration..."
     @server.config_list_values.notifier do |res|
       @currentconfig = {}
       res.each_pair do |key, value|
@@ -579,13 +648,17 @@ class Grux::ClientWin < Gtk::VBox
       end
       true
     end
+    grux_debug "Done"
+  end
 
+  def get_collections
+    grux_debug "Retrieving collections..."
     @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( "', '" )
+            grux_debug collname
+            grux_debug ids.join(' ')
             true
           end
           true
@@ -593,16 +666,28 @@ class Grux::ClientWin < Gtk::VBox
       end
       true
     end
+    grux_debug "Done"
+  end
 
-    true
+  def resync_completely
+    grux_debug "Doing a complete resync:"
+    self.get_playlist
+    self.get_medialib
+    self.get_current_song
+    self.get_config
+    self.get_collections
+    grux_debug "Complete resync done."
   end
 end
 
 
 class Grux::MainWin < Gtk::Window
   def initialize
+    STDERR.puts "Main: Initializing window..."
     super
+    STDERR.puts "Main: Done"
 
+    STDERR.puts "Main: Populating window..."
     @mainCont       = Gtk::VBox.new
     @btnCont        = Gtk::HBox.new
     @clntCont       = Gtk::Notebook.new
@@ -612,26 +697,32 @@ class Grux::MainWin < Gtk::Window
     @quitBtn        = Gtk::Button.new "_Quit"
 
     self.title      = "Grux"
+    STDERR.puts "Main: Done"
 
-    @winDstryHndlr  = self.signal_connect :destroy do
-      Gtk.main_quit
-    end
-
+    STDERR.puts "Main: XXX-FEATURE: load (and save) previously used entries for: "
+    STDERR.puts "Main: Populating server list..."
     @cnnctInput.append_text 'tcp://127.0.0.1:9667'
+    STDERR.puts "Main: Done"
 
+    STDERR.puts "Main: Trying to connect..."
     @cnnctBtnHndlr  = @cnnctBtn.signal_connect :clicked do
       if not @cnnctInput.active_text.empty?
         server_address = @cnnctInput.active_text
       else
         server_address = ENV['XMMS_PATH']
       end
-
       @clntCont.append_page( Grux::ClientWin.new( server_address ), Gtk::Label.new( server_address ) )
     end
+    STDERR.puts "Main: Done"
+
+    @winDstryHndlr  = self.signal_connect :destroy do
+      Gtk.main_quit
+    end
     @quitBtnHndlr   = @quitBtn.signal_connect :clicked do
       Gtk.main_quit
     end
 
+    STDERR.puts "Main: Packing and showing window content..."
     @btnCont.pack_start @cnnctInput
     @btnCont.pack_start @cnnctBtn
     @btnCont.pack_end @quitBtn
@@ -641,11 +732,14 @@ class Grux::MainWin < Gtk::Window
 
     self.add @mainCont
     self.show_all
+    STDERR.puts "Main: Done"
   end
 end
 
 
+STDERR.puts "Creating main client window:"
 gruxWin = Grux::MainWin.new
+STDERR.puts "Starting GTK main loop."
 Gtk.main