zik 0.16.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data.tar.gz.sig +0 -0
  2. data/ChangeLog +222 -0
  3. data/INSTALL +34 -0
  4. data/Makefile.in +199 -0
  5. data/README +53 -0
  6. data/ZiK.desktop +11 -0
  7. data/ZiK.rb +377 -0
  8. data/configure +269 -0
  9. data/dependencies +142 -0
  10. data/doc/COPYING +340 -0
  11. data/doc/ChangeLog +222 -0
  12. data/doc/html/fr/index.html +128 -0
  13. data/doc/html/index.html +126 -0
  14. data/doc/html/pix/ZiK3.png +0 -0
  15. data/doc/html/pix/capture.png +0 -0
  16. data/doc/html/pix/capture_cd.png +0 -0
  17. data/doc/html/pix/capture_compact.png +0 -0
  18. data/doc/html/pix/capture_radio.png +0 -0
  19. data/doc/html/pix/icon.png +0 -0
  20. data/doc/html/pix/logo.png +0 -0
  21. data/doc/html/styles/main.css +47 -0
  22. data/doc/man/manpage.1 +43 -0
  23. data/gui/assistant.rb +133 -0
  24. data/gui/cdgui.rb +54 -0
  25. data/gui/common.rb +56 -0
  26. data/gui/config.rb +120 -0
  27. data/gui/edit.rb +413 -0
  28. data/gui/error.rb +124 -0
  29. data/gui/gui.rb +1383 -0
  30. data/gui/mod.rb +239 -0
  31. data/gui/preference.rb +496 -0
  32. data/gui/progress.rb +50 -0
  33. data/gui/radiogui.rb +404 -0
  34. data/gui/search.rb +249 -0
  35. data/gui/socket.rb +107 -0
  36. data/mod/brainz.rb +76 -0
  37. data/mod/brainz/dialogs.rb +132 -0
  38. data/mod/brainz/functions.rb +55 -0
  39. data/mod/brainz/ofa.rb +76 -0
  40. data/mod/brainz/song.rb +139 -0
  41. data/mod/brainz/widget.rb +34 -0
  42. data/mod/cover.rb +90 -0
  43. data/mod/cover/application-x-cd-image.svg +666 -0
  44. data/mod/cover/config.rb +79 -0
  45. data/mod/cover/configwidget.rb +35 -0
  46. data/mod/cover/widget.rb +147 -0
  47. data/mod/hotkeys.rb +137 -0
  48. data/mod/hotkeys/config.rb +84 -0
  49. data/mod/hotkeys/configwidget.rb +93 -0
  50. data/mod/interact.rb +131 -0
  51. data/mod/interact/configwidget.rb +107 -0
  52. data/mod/interact/interaction.rb +79 -0
  53. data/mod/notify.rb +128 -0
  54. data/mod/notify/config.rb +96 -0
  55. data/mod/notify/configwidget.rb +76 -0
  56. data/mod/notify/window.rb +56 -0
  57. data/mod/trayicon.rb +83 -0
  58. data/mod/trayicon/config.rb +79 -0
  59. data/mod/trayicon/configwidget.rb +35 -0
  60. data/mod/trayicon/icon.rb +99 -0
  61. data/pix/ZiK.svg +78 -0
  62. data/pix/ZiK3.png +0 -0
  63. data/pix/assistant/capture.png +0 -0
  64. data/pix/gtk-directory.svg +287 -0
  65. data/pix/media-cdrom.svg +292 -0
  66. data/pix/network-wireless.svg +429 -0
  67. data/pix/player_play.svg +286 -0
  68. data/pix/sound.svg +244 -0
  69. data/pix/sound_directory.svg +464 -0
  70. data/player/cdplayer.rb +108 -0
  71. data/player/player.rb +132 -0
  72. data/player/radioplayer.rb +124 -0
  73. data/playlist/cdlist.rb +140 -0
  74. data/playlist/common.rb +343 -0
  75. data/playlist/editlist.rb +50 -0
  76. data/playlist/export.rb +108 -0
  77. data/playlist/playlist.rb +143 -0
  78. data/playlist/radiolist.rb +148 -0
  79. data/playlist/song.rb +122 -0
  80. data/po/ZiK.pot +622 -0
  81. data/po/fr/ZiK.po +658 -0
  82. data/zik +2 -0
  83. metadata +265 -0
  84. metadata.gz.sig +0 -0
data/gui/search.rb ADDED
@@ -0,0 +1,249 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright 2007-2011 Vincent Carmona
4
+ vinc4mai@gmail.com
5
+
6
+ This file is part of ZiK.
7
+
8
+ ZiK is free software; you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation; either version 2 of the License, or
11
+ (at your option) any later version.
12
+
13
+ ZiK is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with ZiK; if not, write to the Free Software
20
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ =end
22
+
23
+ class ListSearchWidget < Gtk::HBox
24
+ #Code herited from old ListSearchWindow class
25
+ #I should rewrite it.
26
+ def initialize(songs, selection, view)
27
+ @songs=songs
28
+ @selection=selection
29
+ @view=view
30
+ @result=[]; @pos=0
31
+ refresh_names
32
+
33
+ #**************************Find zone*****************************************
34
+ @entry=Gtk::Entry.new
35
+ @entry.signal_connect("activate"){
36
+ begin
37
+ i=0; @result=[]
38
+ pattern=Regexp.new(@entry.text,true)#equivalent to: /text/i
39
+ @names.each{|name|
40
+ @result.push(i) unless (name=~ pattern).nil?
41
+ i+=1
42
+ }
43
+ @selection.unselect_all
44
+ unless @result.empty?
45
+ path=Gtk::TreePath.new(@result[@pos].to_s)
46
+ @selection.select_path(path)
47
+ @view.scroll_to_cell(path, nil, true, 0.5, 0)
48
+ end
49
+ rescue
50
+ ErrorError.new(_("Searching (ListSearchWidget)."), true)
51
+ end
52
+ }
53
+
54
+ @bprev=Gtk::Button.new
55
+ @bprev.image=Gtk::Image.new(Gtk::Stock::GO_UP, Gtk::IconSize::BUTTON)
56
+ @bprev.signal_connect('clicked'){
57
+ @pos-=1
58
+ @pos=@result.length-1 if @pos<0
59
+ @selection.unselect_all
60
+ unless @result.empty?
61
+ path=Gtk::TreePath.new(@result[@pos].to_s)
62
+ @selection.select_path(path)
63
+ @view.scroll_to_cell(path, nil, true, 0.5, 0)
64
+ end
65
+ }
66
+ @bnext=Gtk::Button.new
67
+ @bnext.image=Gtk::Image.new(Gtk::Stock::GO_DOWN, Gtk::IconSize::BUTTON)
68
+ @bnext.signal_connect('clicked'){
69
+ @pos+=1
70
+ @pos=0 if @pos>=@result.length
71
+ @selection.unselect_all
72
+ unless @result.empty?
73
+ path=Gtk::TreePath.new(@result[@pos].to_s)
74
+ @selection.select_path(path)
75
+ @view.scroll_to_cell(path, nil, true, 0.5, 0)
76
+ end
77
+ }
78
+ @bclose=Gtk::Button.new
79
+ @bclose.image=Gtk::Image.new(Gtk::Stock::CLOSE, Gtk::IconSize::BUTTON)
80
+ @bclose.signal_connect('clicked'){self.destroy}
81
+
82
+ super()
83
+ self.pack_start(@entry)
84
+ self.pack_start(@bprev, false)
85
+ self.pack_start(@bnext, false)
86
+ self.pack_start(@bclose, false)
87
+ self.show_all
88
+ end
89
+
90
+ def focus
91
+ @entry.grab_focus
92
+ end
93
+
94
+ def refresh_names
95
+ @names=[]
96
+ @songs.each{|song| @names.push(song.name)}
97
+ end
98
+ end
99
+
100
+ class BrowseSearchWindow < Gtk::Window
101
+ @@exist=false
102
+ @@refresh=false
103
+
104
+ def BrowseSearchWindow.refresh
105
+ @@refresh=true
106
+ end
107
+
108
+ def BrowseSearchWindow.show(parent,config)
109
+ if @@exist
110
+ @@window.refresh_data if @@refresh
111
+ @@window.hide;@@window.show
112
+ else
113
+ @@window=BrowseSearchWindow.new(parent,config)
114
+ end
115
+ end
116
+
117
+ def initialize(parent,config)
118
+ @config=config
119
+ refresh_data
120
+
121
+ #**************************Entry zone******************************************
122
+ @entry=Gtk::Entry.new
123
+ @entry.signal_connect("activate"){
124
+ begin
125
+ @results=[]
126
+ pattern=Regexp.new(@entry.text,true)#equivalent to: /text/i
127
+
128
+ if @config['search_in_title'] || @config['search_in_artist'] || @config['search_in_album'] || @config['search_in_genre']
129
+ refresh_data if @titles.empty?
130
+ [@paths, @titles, @artists, @albums, @genres].transpose.each{|path, title, artist, album, genre|
131
+ temp=''
132
+ temp+=path if @config['search_in_path'];temp+=';;;;'
133
+ temp+=title if @config['search_in_title'];temp+=';;;;'
134
+ temp+=artist if @config['search_in_artist'];temp+=';;;;'
135
+ temp+=album if @config['search_in_album'];temp+=';;;;'
136
+ temp+=genre if @config['search_in_genre']
137
+ @results.push(path) unless (temp=~ pattern).nil?
138
+ }
139
+ else
140
+ if @config['search_in_path']
141
+ @paths.each{|path|
142
+ @results.push(path) unless (path=~ pattern).nil?
143
+ }
144
+ end
145
+ end
146
+
147
+ refresh_store
148
+ rescue
149
+ ErrorError.new(_("Searching (BrowseSearchWindow)"), true)
150
+ end
151
+ }
152
+
153
+ #**************************Results zone****************************************
154
+ @result_store=Gtk::ListStore.new(String,String)
155
+
156
+ @renderer=Gtk::CellRendererText.new
157
+ @col=Gtk::TreeViewColumn.new(_("Results"), @renderer, :text => 0)
158
+ @result_view=Gtk::TreeView.new(@result_store)
159
+ @result_view.append_column(@col)
160
+
161
+ @result_selection=@result_view.selection
162
+ @result_selection.mode=Gtk::SELECTION_MULTIPLE
163
+
164
+ @wresult=Gtk::ScrolledWindow.new
165
+ @wresult.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC)
166
+ @wresult.add(@result_view)
167
+
168
+ #**************************Button zone*****************************************
169
+ @badd=Gtk::Button.new
170
+ @badd.image=Gtk::Image.new(Gtk::Stock::ADD,Gtk::IconSize::BUTTON)
171
+ @badd.signal_connect('clicked') {parent.list_add(@result_selection,@config['extension'])}
172
+
173
+ @hbox=Gtk::HBox.new
174
+ @hbox.pack_end(@badd,false)
175
+
176
+ #**************************Main window*****************************************
177
+ @vbox=Gtk::VBox.new
178
+ @vbox.pack_start(@entry,false)
179
+ @vbox.pack_start(@wresult)
180
+ @vbox.pack_start(@hbox, false)
181
+
182
+ super(Gtk::Window::TOPLEVEL)
183
+ self.transient_for=parent
184
+ self.skip_taskbar_hint=true
185
+ self.skip_pager_hint=true
186
+ self.title=_('Search')
187
+ self.icon=Gdk::Pixbuf.new(File.join(Pix_dir,'ZiK.svg'))
188
+ s=parent.size; self.set_default_size((0.8*s[0]).to_i,(0.8*s[1]).to_i)
189
+ self.add(@vbox)
190
+
191
+ self.show_all
192
+
193
+ self.signal_connect("delete_event"){self.hide}
194
+
195
+ @@exist=true
196
+ end
197
+
198
+ private
199
+
200
+ def refresh_data
201
+ @paths=[]
202
+ @titles=[]
203
+ @artists=[]
204
+ @albums=[]
205
+ @genres=[]
206
+ rexp=Regexp.new('.*\.('+@config['extension'].gsub(',','|')+')$', Regexp::IGNORECASE)
207
+
208
+ @config['directory'].split(',').each{|directory| Find.find(directory){|f| @paths.push(f) if f=~rexp}}
209
+ @paths.sort!
210
+
211
+ if @config['search_in_title'] || @config['search_in_artist'] || @config['search_in_album'] || @config['search_in_genre']
212
+ @paths.each{|path|
213
+ begin
214
+ tag=TagLib::File.new(path)
215
+ @titles.push(tag.title)
216
+ @artists.push(tag.artist)
217
+ @albums.push(tag.album)
218
+ @genres.push(tag.genre)
219
+ rescue TagLib::BadFile
220
+ ErrorError.new("Cannot read #{path}\'s tag.")
221
+ @titles.push('')
222
+ @artists.push('')
223
+ @albums.push('')
224
+ @genres.push('')
225
+ rescue TagLib::BadTag
226
+ ErrorError.new("Cannot read #{path}\'s tag.")
227
+ @titles.push('')
228
+ @artists.push('')
229
+ @albums.push('')
230
+ @genres.push('')
231
+ ensure
232
+ tag.close unless tag.nil?
233
+ end
234
+ }
235
+ end
236
+
237
+ @@refresh=false
238
+ end
239
+
240
+ def refresh_store
241
+ @result_store.clear
242
+ @results.each{|path|
243
+ child=@result_store.append
244
+ child[0]=path#Show the full path or just a relative one.
245
+ child[1]=path
246
+ }
247
+ end
248
+
249
+ end
data/gui/socket.rb ADDED
@@ -0,0 +1,107 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright 2007-2011 Vincent Carmona
4
+
5
+ This file is part of ZiK.
6
+
7
+ ZiK is free software; you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation; either version 2 of the License, or
10
+ (at your option) any later version.
11
+
12
+ ZiK is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with ZiK; if not, write to the Free Software
19
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
+ =end
21
+
22
+ module ZiKSocket
23
+ #Address and clean function are defined in ZiK.rb
24
+ Welcome_message="Hi! This is #{$name} through unix socket."
25
+
26
+ module Error
27
+ class NoServer < Exception; end
28
+ class ServerExists < Exception; end
29
+ end
30
+ module Event
31
+ class CloseClient < Exception; end
32
+ class CloseServer < Exception; end
33
+ end
34
+
35
+ def ZiKSocket.start_server(gui, config, playlist)
36
+ Thread.new{ZiKSocket::Server.new(gui, config, playlist)}
37
+ end
38
+
39
+ class Server
40
+ def initialize(gui, config, playlist)
41
+ raise Error::ServerExists.new if File.exists?(ZiKSocket::Address)
42
+ UNIXServer.open(ZiKSocket::Address){|server|
43
+ begin
44
+ client=server.accept
45
+ client.puts Welcome_message
46
+ loop{
47
+ case command=client.gets.chomp
48
+ #when /^list_commands/i
49
+ when /^version$/i
50
+ client.puts Version
51
+ when /^show$/i
52
+ gui.hide if gui.visible?
53
+ gui.show
54
+ client.puts "Shown."
55
+ when /^add\ /
56
+ arg=command.split(' ', 2)[1]
57
+ playlist.add(arg, config['extension'])
58
+ gui.refresh_liststore
59
+ client.puts "#{arg} added."
60
+ when /^bye$/i, /^quit$/i, /^close$/i
61
+ client.puts "Bye."
62
+ raise Event::CloseClient.new
63
+ when /^close_server$/i
64
+ client.puts "Shuting down server."
65
+ raise Event::CloseServer
66
+ else
67
+ client.puts "ERROR: Unknown command."
68
+ end
69
+ }
70
+ rescue Event::CloseClient, Errno::EPIPE
71
+ client.close
72
+ retry
73
+ rescue Event::CloseServer
74
+ client.close
75
+ end
76
+ }
77
+ end
78
+ end
79
+
80
+ class Client
81
+ def initialize
82
+ raise Error::NoServer.new unless File.socket?(ZiKSocket::Address)
83
+ @socket=UNIXSocket.new(ZiKSocket::Address)
84
+ unless @socket.gets.chomp==Welcome_message
85
+ @socket.close
86
+ raise Error::NoServer.new
87
+ end
88
+ end
89
+
90
+ def command(str)
91
+ @socket.puts str
92
+ @socket.gets.chomp
93
+ end
94
+
95
+ #list_commads
96
+
97
+ def close
98
+ command("close")
99
+ @socket.close
100
+ end
101
+
102
+ def close_server
103
+ command("close_serveur")
104
+ @socket.close
105
+ end
106
+ end
107
+ end
data/mod/brainz.rb ADDED
@@ -0,0 +1,76 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright 2007-2011 Vincent Carmona
4
+ vinc4mai@gmail.com
5
+
6
+ This file is part of ZiK.
7
+
8
+ ZiK is free software; you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation; either version 2 of the License, or
11
+ (at your option) any later version.
12
+
13
+ ZiK is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with ZiK; if not, write to the Free Software
20
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ =end
22
+
23
+ module Brainz
24
+ def Brainz.mod
25
+ @m||=Mod.new('brainz', "Brainz", _("Retrieve track infos from the web."),
26
+ 'Vincent Carmona <vinc4mai@gmail.com>', 'GPL-2')
27
+ end
28
+
29
+ Brainz.mod
30
+ def @m.init(input)
31
+ @dir=input[:mod_dir]
32
+ end
33
+
34
+ def @m.load
35
+ unless loaded?
36
+ require 'net/http'
37
+ begin
38
+ require File.join(@dir, 'brainz', 'functions')
39
+ require File.join(@dir, 'brainz', 'ofa')
40
+ require File.join(@dir, 'brainz', 'song')
41
+ require File.join(@dir, 'brainz', 'dialogs')
42
+ require File.join(@dir, 'brainz', 'widget')
43
+ @widget=Widget.new(zik)
44
+ pack(@widget, true, false)
45
+ it=Gtk::MenuItem.new("Brainz")
46
+ it.signal_connect('activate'){
47
+ s=zik.list_selection.selected_rows
48
+ unless s.empty?
49
+ i=s[-1].to_s.to_i
50
+ Brainz.tag(zik, zik.playlist.songs[i])
51
+ end
52
+ }
53
+ list_cmenu_add(it); it.show
54
+ ModErrorInfo.new(self, "module loaded.")
55
+ @loaded=true
56
+ rescue OfaNotFound
57
+ ModErrorLoadError.new(self,
58
+ _("Cannot find ofa element. Please install ofa Gstreamer plugins."))
59
+ @loaded=false
60
+ end
61
+ else
62
+ false
63
+ end
64
+ end
65
+
66
+ def @m.unload
67
+ if loaded?
68
+ @widget.destroy
69
+ ModErrorInfo.new(self, "module unloaded.")
70
+ @loaded=false
71
+ true
72
+ else
73
+ false
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,132 @@
1
+ =begin
2
+ Copyright 2007-2011 Vincent Carmona
3
+ vinc4mai@gmail.com
4
+
5
+ This file is part of ZiK.
6
+
7
+ ZiK is free software; you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation; either version 2 of the License, or
10
+ (at your option) any later version.
11
+
12
+ ZiK is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with ZiK; if not, write to the Free Software
19
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
+ =end
21
+
22
+ module Brainz
23
+ class TagDialog < Gtk::Window
24
+ def initialize(parent, song)
25
+ @id=nil; @song=song
26
+ #*********************Select**************************
27
+ @bprev=Gtk::Button.new(Gtk::Stock::GO_BACK)
28
+ @bprev.signal_connect('clicked'){refresh_tag(@id-1)}
29
+ @lid=Gtk::Label.new
30
+ @bnext=Gtk::Button.new(Gtk::Stock::GO_FORWARD)
31
+ @bnext.signal_connect('clicked'){refresh_tag(@id+1)}
32
+
33
+ @bselect=Gtk::HBox.new
34
+ @bselect.pack_start(@bprev, false)
35
+ @bselect.pack_start(@lid)
36
+ @bselect.pack_start(@bnext, false)
37
+
38
+ #*********************Tag*****************************
39
+ @ftitle=Gtk::Frame.new(_("Title"))
40
+ @ftitle.border_width=$border
41
+ @ctitle=Gtk::ComboBoxEntry.new
42
+ @ftitle.add(@ctitle)
43
+ @fartist=Gtk::Frame.new(_("Artist"))
44
+ @fartist.border_width=$border
45
+ @cartist=Gtk::ComboBoxEntry.new
46
+ @fartist.add(@cartist)
47
+ @falbum=Gtk::Frame.new(_("Album"))
48
+ @falbum.border_width=$border
49
+ @calbum=Gtk::ComboBoxEntry.new
50
+ @falbum.add(@calbum)
51
+ @ftrack=Gtk::Frame.new(_("Track"))
52
+ @ftrack.border_width=$border
53
+ @ctrack=Gtk::ComboBoxEntry.new
54
+ @ftrack.add(@ctrack)
55
+
56
+ refresh_tag(1)
57
+ #*********************Buttons*************************
58
+ @blabel=Gtk::Label.new(_("Click Ok to save tags in #{song.file} file."))
59
+ @bok=Gtk::Button.new(Gtk::Stock::OK)
60
+ @bok.signal_connect('clicked'){
61
+ begin
62
+ track=@ctrack.active_text.to_i
63
+ song.update_zik(parent.config['name_format'], @ctitle.active_text, @cartist.active_text,
64
+ @calbum.active_text, track)
65
+ rescue
66
+ ModErrorError.new(Brainz.mod, "Track is not an integer.")
67
+ song.update_zik(parent.config['name_format'], @ctitle.active_text, @cartist.active_text,
68
+ @calbum.active_text)
69
+ end
70
+ parent.refresh_liststore
71
+ quit
72
+ }
73
+ @bcancel=Gtk::Button.new(Gtk::Stock::CANCEL)
74
+ @bcancel.signal_connect('clicked'){quit}
75
+ @bbox=Gtk::HBox.new
76
+ [@bcancel, @bok].reverse!.each{|button| @bbox.pack_end(button,false)}
77
+
78
+ #*********************Main window***********************
79
+ @vbox=Gtk::VBox.new
80
+ @vbox.pack_start(@bselect,false)
81
+ [@ftitle, @fartist, @falbum, @ftrack].each{|w| @vbox.pack_start(w)}
82
+ @vbox.pack_start(@blabel)
83
+ @vbox.pack_start(@bbox,false)
84
+
85
+ super(Gtk::Window::TOPLEVEL)
86
+ self.transient_for=parent
87
+ self.skip_taskbar_hint=true
88
+ self.skip_pager_hint=true
89
+ self.title='Brainz'
90
+ self.icon=Gdk::Pixbuf.new(File.join(Pix_dir,'ZiK.svg'))
91
+ self.signal_connect("delete_event") {quit;true}
92
+ self.add(@vbox)
93
+ self.show_all
94
+ end
95
+
96
+ private
97
+ def quit
98
+ self.destroy
99
+ end
100
+
101
+ def refresh_tag(id)
102
+ unless @id.nil?
103
+ @n_titles.times{@ctitle.remove_text(0)}
104
+ @n_artists.times{@cartist.remove_text(0)}
105
+ @n_albums.times{@calbum.remove_text(0)}
106
+ @n_tracks.times{@ctrack.remove_text(0)}
107
+ end
108
+
109
+ @id=id
110
+ if @id==0
111
+ @lid.text=(_("Id (Original tags)"))
112
+ @bprev.sensitive=false
113
+ else
114
+ @lid.text=(_("Id (#{@id}/#{@song.puids.length})"))
115
+ @bprev.sensitive=true
116
+ end
117
+ if @id>=@song.tags.length-1
118
+ @bnext.sensitive=false
119
+ else
120
+ @bnext.sensitive=true
121
+ end
122
+ @n_titles=@song.tags[@id][:titles].each{|title| @ctitle.append_text(title)}.length
123
+ @ctitle.active=0
124
+ @n_artists=@song.tags[@id][:artists].each{|artist| @cartist.append_text(artist)}.length
125
+ @cartist.active=0
126
+ @n_albums=@song.tags[@id][:albums].each{|album| @calbum.append_text(album)}.length
127
+ @calbum.active=0
128
+ @n_tracks=@song.tags[@id][:tracks].each{|track| @ctrack.append_text(track.to_s)}.length
129
+ @ctrack.active=0
130
+ end
131
+ end
132
+ end