]> git.netwichtig.de Git - user/henk/code/ruby/grux.git/blob - bin/grux.rb
On branch master
[user/henk/code/ruby/grux.git] / bin / grux.rb
1 #!/usr/bin/env ruby
2
3 #$: << File.expand_path(File.dirname(FILE) + “/../lib”))
4
5 #require 'libgruxclient'
6 require 'gtk2'
7 require 'xmmsclient'
8 require 'xmmsclient_glib'
9
10 class Grux
11 end
12
13 class Grux::ClientWin < Gtk::VBox
14   def initialize
15     super
16
17     @server         = Xmms::Client.new( 'Grux' )
18
19     @cntrlBtnBox    = Gtk::HButtonBox.new
20     @statusLblBox   = Gtk::VBox.new
21     @playlistViewWin  = Gtk::ScrolledWindow.new
22
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 )
29     end
30     @playlistViewWin << @playlistView
31     @statusBar      = Gtk::Statusbar.new
32
33     @cntrlbtns      = [
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')
40     ]
41     @statusLbls     = [
42       @stateLbl       = Gtk::Label.new,
43       @repeatLbl      = Gtk::Label.new,
44       @playbackLbl    = Gtk::Label.new,
45       @nextSongLbl    = Gtk::Label.new
46     ]
47
48     @cntrlbtns.each do |button|
49       @cntrlBtnBox.pack_start button
50     end
51     @statusLbls.each do |label|
52       @statusLblBox.pack_start label, false
53     end
54
55     self.pack_start @cntrlBtnBox, false
56     self.pack_start @statusLblBox
57     self.pack_start @playlistViewWin
58     self.pack_end @statusBar, false
59     self.show_all
60
61     begin
62       @server.connect( ENV['XMMS_PATH'] )
63       @server.add_to_glib_mainloop
64     rescue
65       @statusBar.push( @statusBar.get_context_id( "connection" ), "Failed to connect to #{ENV['XMMS_PATH']}" )
66     end
67
68     @playBtn.signal_connect :clicked do
69       self.toggle_playback
70     end
71     @stopBtn.signal_connect :clicked do
72       self.stop_playback
73     end
74     @nextBtn.signal_connect :clicked do
75       self.step_in_playlist 1
76     end
77     @prevBtn.signal_connect :clicked do
78       self.step_in_playlist -1
79     end
80     @rptBtn.signal_connect :clicked do
81       self.toggle_repeat
82     end
83
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
87           true
88         end
89         true
90       end
91     end
92
93     @server.broadcast_coll_changed do
94     end
95     @server.broadcast_config_value_changed do |*foo|
96       p foo
97     end
98     @server.broadcast_mediainfo_reader_status do
99     end
100     @server.broadcast_medialib_entry_added do
101     end
102     @server.broadcast_medialib_entry_changed do
103     end
104     @server.broadcast_playback_current_id.notifier do |id|
105       self.handle_current_song id
106     end
107     @server.broadcast_playback_status.notifier do |playing|
108       self.handle_playback_status playing
109     end
110     @server.broadcast_playback_volume_changed do
111     end
112     @server.broadcast_playlist_changed do
113     end
114     @server.broadcast_playlist_current_pos.notifier do |pos|
115       self.handle_current_pos pos
116     end
117     @server.broadcast_playlist_loaded do
118     end
119     @server.broadcast_quit do
120     end
121
122     self.resync_state
123   end
124
125   def toggle_playback
126     if @playbackState == 1
127       @server.playback_pause.notifier do |res|
128         @statusBar.push( @statusBar.get_context_id( "playback" ), "Paused playback" )
129         true
130       end
131     elsif @playbackState == 0 || 2
132       @server.playback_start.notifier do |res|
133         @statusBar.push( @statusBar.get_context_id( "playback" ), "Started playback" )
134         true
135       end
136     else
137       warn "Playbackstate unknown"
138       @server.playback_start.notifier do |res|
139         @statusBar.push( @statusBar.get_context_id( "playback" ), "Started playback" )
140         true
141       end
142     end
143   end
144
145   def stop_playback
146     @server.playback_stop.notifier do |res|
147       @statusBar.push( @statusBar.get_context_id( "playback" ), "Stopped playback" )
148       true
149     end
150   end
151
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" : ''}" )
156         true
157       end
158     true
159     end
160   end
161
162   def handle_playback_status( status )
163     @playbackState = status
164     @stateLbl.text = case status
165       when 0 then "stopped"
166       when 1 then "playing"
167       when 2 then "paused"
168       else "unknown"
169     end
170     true
171   end
172
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"
180         end
181       end
182       true
183     end
184     true
185   end
186
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"
194 #          end
195 #        end
196 #        true
197 #      end
198 #      true
199 #    end
200     true
201   end
202
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"
209         true
210       end
211     end
212     @playlistView.model = @playlistList
213     true
214   end
215
216   def toggle_repeat
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
223             true
224           end
225           true
226         end
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
230             true
231           end
232           true
233         end
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
239             true
240           end
241           true
242         end
243       else
244         warn "Unknown state"
245       end
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
251             true
252           end
253         true
254       end
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
258             true
259           end
260         true
261       end
262     else
263       warn "Unknown state"
264     end
265     true
266   end
267
268   def resync_state
269     @server.config_list_values.notifier do |res|
270       @currentconfig = {}
271       res.each_pair do |key, value|
272         @currentconfig[key] = value
273       end
274
275       @repeatLbl.text = if( @currentconfig[:"playlist.repeat_one"] == "1" )
276         "one"
277       elsif @currentconfig[:"playlist.repeat_all"] == "1"
278         "all"
279       else
280         "none"
281       end
282       true
283     end
284     true
285
286     @server.playlist.entries.notifier do |playlist|
287       self.handle_playlist playlist
288       true
289     end
290   end
291 end
292
293 class Grux::MainWin < Gtk::Window
294   def initialize
295     super
296
297     @mainCont       = Gtk::VBox.new
298     @btnCont        = Gtk::HBox.new
299     @clntCont       = Gtk::Notebook.new
300
301     @cnnctBtn       = Gtk::Button.new "_Connect"
302     @quitBtn        = Gtk::Button.new "_Quit"
303
304     self.title      = "Grux"
305
306     @winDstryHndlr  = self.signal_connect :destroy do
307       Gtk.main_quit
308     end
309
310     @cnnctBtnHndlr  = @cnnctBtn.signal_connect :clicked do
311       @clntCont.append_page( Grux::ClientWin.new, Gtk::Label.new( "Client" ) )
312     end
313     @quitBtnHndlr   = @quitBtn.signal_connect :clicked do
314       Gtk.main_quit
315     end
316
317     @btnCont.pack_start @cnnctBtn
318     @btnCont.pack_end @quitBtn
319
320     @mainCont.pack_start @btnCont, false
321     @mainCont.pack_end @clntCont
322
323     self.add @mainCont
324     self.show_all
325   end
326 end
327
328 gruxWin = Grux::MainWin.new
329 Gtk.main
330