zik 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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/edit.rb ADDED
@@ -0,0 +1,413 @@
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 EditSongWindow < Gtk::Window
24
+
25
+ def initialize(song, wmain, name_format, editListWindow=nil)
26
+ @song=song
27
+ @elw=editListWindow
28
+ @old={:title=> @song.title, :artist=>@song.artist, :album=>@song.album, :genre=>@song.genre, :track=>@song.track}
29
+
30
+ #*********************Tag zone*******************************
31
+ @title_entry=Gtk::Entry.new
32
+ @title_entry.text=@song.title
33
+ @title_frame=Gtk::Frame.new(_('Title'))
34
+ @title_frame.add(@title_entry)
35
+
36
+ @artist_entry=Gtk::Entry.new
37
+ @artist_entry.text=@song.artist
38
+ @artist_frame=Gtk::Frame.new(_('Artist'))
39
+ @artist_frame.add(@artist_entry)
40
+
41
+ @album_entry=Gtk::Entry.new
42
+ @album_entry.text=@song.album
43
+ @album_frame=Gtk::Frame.new(_('Album'))
44
+ @album_frame.add(@album_entry)
45
+
46
+ @genre_entry=Gtk::Entry.new
47
+ @genre_entry.text=@song.genre
48
+ @genre_frame=Gtk::Frame.new(_('Genre'))
49
+ @genre_frame.add(@genre_entry)
50
+
51
+ @track_entry=Gtk::Entry.new
52
+ @track_entry.text=@song.track.to_s
53
+ @track_frame=Gtk::Frame.new(_('Track'))
54
+ @track_frame.add(@track_entry)
55
+
56
+ @path_frame=Gtk::Frame.new(_('Path'))
57
+ @path_frame.add(Gtk::Label.new(@song.path))
58
+
59
+ if @song.duration==-1
60
+ str=_('Unknown')
61
+ else
62
+ if @song.duration<3600
63
+ str=Time.at(@song.duration).strftime("%M min %S s")
64
+ else
65
+ str=(@song.duration.to_i/3600).to_s+" h "+Time.at(@song.duration).strftime("%M min %S s")
66
+ end
67
+ end
68
+ @duration_frame=Gtk::Frame.new(_('Duration'))
69
+ @duration_frame.add(Gtk::Label.new(str))
70
+
71
+ @song.bitrate==-1 ? str=_('Unknown') : str=@song.bitrate.to_s
72
+ @bitrate_frame=Gtk::Frame.new(_('Bitrate'))
73
+ @bitrate_frame.add(Gtk::Label.new(str))
74
+
75
+ @song.samplerate==-1 ? str=_('Unknown') : str=@song.samplerate.to_s
76
+ @samplerate_frame=Gtk::Frame.new(_('Samplerate'))
77
+ @samplerate_frame.add(Gtk::Label.new(str))
78
+
79
+ @song.channels==-1 ? str=_('Unknown') : str=@song.channels.to_s
80
+ @channels_frame=Gtk::Frame.new(_('Channels'))
81
+ @channels_frame.add(Gtk::Label.new(str))
82
+
83
+ @song_box=Gtk::VBox.new
84
+ [@title_frame, @artist_frame, @album_frame, @genre_frame, @track_frame, @path_frame, @duration_frame,
85
+ @bitrate_frame, @samplerate_frame, @channels_frame].each{|widget|
86
+ @song_box.pack_start(widget, true, true, 5)
87
+ }
88
+ @song_frame=Gtk::Frame.new
89
+ @song_frame.label_widget=Gtk::Label.new.set_markup("<b>#{song.name}</b>")
90
+ @song_frame.add(@song_box)
91
+
92
+ #*********************Main window*******************************
93
+ @warning_label=Gtk::Label.new.set_markup(_("<b>Song\'s tag will be overwrite by clicking Ok.</b>"))
94
+
95
+ @bcancel=Gtk::Button.new(Gtk::Stock::CANCEL)
96
+ @bcancel.signal_connect('clicked'){quit}
97
+ @bok=Gtk::Button.new(Gtk::Stock::OK)
98
+ @bok.signal_connect('clicked'){
99
+ title=@title_entry.text; artist=@artist_entry.text; album=@album_entry.text; genre=@genre_entry.text
100
+ begin
101
+ track=@track_entry.text.to_i
102
+ rescue
103
+ track=@old[:track]
104
+ ErrorError.new("Track must be a integer. Use old value.", true)
105
+ end
106
+ unless @old=={:title=> title, :artist=> artist, :album=>album, :genre=>genre, :track=>track}
107
+ song.title=title; song.artist=artist; song.album=album; song.genre=genre; song.track=track
108
+ song.refresh_name(name_format)
109
+ song.write_tag(@song.path)
110
+ if @elw.nil?
111
+ wmain.refresh_liststore
112
+ else
113
+ @elw.refresh_liststore
114
+ @elw.force_refresh_parent=true
115
+ end
116
+ end
117
+ quit
118
+ }
119
+ @hbox=Gtk::HBox.new
120
+ [@bcancel, @bok].reverse.each{|button| @hbox.pack_end(button,false)}
121
+
122
+ @vbox=Gtk::VBox.new
123
+ @vbox.pack_start(@song_frame, true, true, 5)
124
+ @vbox.pack_start(@warning_label)
125
+ @vbox.pack_start(@hbox,false)
126
+
127
+ super(Gtk::Window::TOPLEVEL)
128
+ self.transient_for=wmain
129
+ self.modal=true
130
+ self.skip_taskbar_hint=true
131
+ self.skip_pager_hint=true
132
+ self.title=_('Edit tag')
133
+ self.icon=Gdk::Pixbuf.new(File.join(Pix_dir,'ZiK.svg'))
134
+ #s=wmain.size; self.set_default_size((0.8*s[0]).to_i,(0.8*s[1]).to_i)
135
+ self.add(@vbox)
136
+ self.signal_connect("delete_event") {quit;true}
137
+
138
+ self.show_all
139
+ end
140
+
141
+ def quit
142
+ self.destroy
143
+ end
144
+
145
+ end
146
+
147
+ class EditListWrapper
148
+ #Code herited from old EditListWindow class.
149
+ #I should rewrite it.
150
+ attr_reader :table, :list, :badd, :bsave
151
+ attr_accessor :force_refresh_parent
152
+
153
+ def initialize(wmain, list, config)
154
+ @wmain=wmain
155
+ @list=list
156
+ @extension=config['extension']
157
+ @name_format=config['name_format']
158
+ @force_refresh_parent=false
159
+
160
+ #*********************Playlist zone****************************
161
+ @list_store=Gtk::ListStore.new(String, Song)
162
+ refresh_liststore
163
+
164
+ @renderer=Gtk::CellRendererText.new
165
+ @col=Gtk::TreeViewColumn.new(_('Song name'), @renderer, :text => 0)
166
+ @list_view=Gtk::TreeView.new(@list_store)
167
+ @list_view.headers_visible=false
168
+ @list_view.reorderable=true
169
+ @list_view.append_column(@col)
170
+ @list_view.signal_connect("row-activated"){|view, path, column|
171
+ i=path.to_s.to_i
172
+ EditSongWindow.new(@list.songs[i], @wmain, @name_format, self)
173
+ }
174
+
175
+ @list_selection=@list_view.selection
176
+ @list_selection.mode=Gtk::SELECTION_MULTIPLE
177
+
178
+ @wlist=Gtk::ScrolledWindow.new
179
+ @wlist.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC)
180
+ @wlist.add(@list_view)
181
+
182
+ #*********************Right buttons zone************************
183
+ @btop=Gtk::Button.new
184
+ @btop.image=Gtk::Image.new(Gtk::Stock::GOTO_TOP,Gtk::IconSize::BUTTON)
185
+ @btop.tooltip_text=_('Move to the top')
186
+ @btop.signal_connect('clicked'){top}
187
+
188
+ @bup=Gtk::Button.new
189
+ @bup.image=Gtk::Image.new(Gtk::Stock::GO_UP,Gtk::IconSize::BUTTON)
190
+ @bup.tooltip_text=_('Move up')
191
+ @bup.signal_connect('clicked'){up}
192
+
193
+ @bedit=Gtk::Button.new
194
+ @bedit.image=Gtk::Image.new(Gtk::Stock::EDIT,Gtk::IconSize::BUTTON)
195
+ @bedit.tooltip_text=_('Edit tag')
196
+ @bedit.signal_connect('clicked'){
197
+ s=@list_selection.selected_rows
198
+ unless s.empty?
199
+ i=s[-1].to_s.to_i
200
+ EditSongWindow.new(@list.songs[i], @wmain, @name_format, self)
201
+ end
202
+ }
203
+
204
+ @bdown=Gtk::Button.new
205
+ @bdown.image=Gtk::Image.new(Gtk::Stock::GO_DOWN,Gtk::IconSize::BUTTON)
206
+ @bdown.tooltip_text=_('Move down')
207
+ @bdown.signal_connect('clicked'){down}
208
+
209
+ @bbottom=Gtk::Button.new
210
+ @bbottom.image=Gtk::Image.new(Gtk::Stock::GOTO_BOTTOM,Gtk::IconSize::BUTTON)
211
+ @bbottom.tooltip_text=_('Move to the bottom')
212
+ @bbottom.signal_connect('clicked'){bottom}
213
+
214
+ #*********************Bottom buttons zone***********************
215
+ @badd=Gtk::Button.new
216
+ @badd.image=Gtk::Image.new(Gtk::Stock::ADD,Gtk::IconSize::BUTTON)
217
+ @badd.tooltip_text=_('Add a file')
218
+ @badd.signal_connect('clicked'){add_file}
219
+
220
+ @bsave=Gtk::Button.new
221
+ @bsave.image=Gtk::Image.new(Gtk::Stock::SAVE,Gtk::IconSize::BUTTON)
222
+ @bsave.tooltip_text=_('Save playlist')
223
+ @bsave.signal_connect('clicked'){save}
224
+
225
+ #*********************Main window*******************************
226
+ @table=Gtk::Table.new(7, 2)
227
+ @table.row_spacings=$border
228
+ @table.column_spacings=$border
229
+ @table.attach(@wlist, 0, 1, 0, 7)
230
+ @table.attach(@btop, 1, 2, 1, 2, Gtk::SHRINK, Gtk::SHRINK)
231
+ @table.attach(@bup, 1, 2, 2, 3, Gtk::SHRINK, Gtk::SHRINK)
232
+ @table.attach(@bedit, 1, 2, 3, 4, Gtk::SHRINK, Gtk::SHRINK)
233
+ @table.attach(@bdown, 1, 2, 4, 5, Gtk::SHRINK, Gtk::SHRINK)
234
+ @table.attach(@bbottom, 1, 2, 5, 6, Gtk::SHRINK, Gtk::SHRINK)
235
+
236
+ @table.show_all
237
+ @badd.show
238
+ @bsave.show
239
+ end
240
+
241
+ def destroy
242
+ #to be sure that another EditListWrapper#table can attach to the Gui#table
243
+ #Others objects are destroyed by GC. (?)
244
+ @table.destroy
245
+ @badd.destroy
246
+ @bsave.destroy
247
+ end
248
+
249
+ def has_focus?
250
+ @list_view.destroyed? ? false : @list_view.has_focus?
251
+ end
252
+
253
+ def refresh_liststore
254
+ @list_store.clear
255
+ @list.songs.each{|song|
256
+ child=@list_store.append
257
+ child[0]=song.name
258
+ child[1]=song
259
+ }
260
+ end
261
+
262
+ def refresh_list
263
+ @list.songs.clear
264
+ iter=@list_store.iter_first
265
+ if iter
266
+ @list.songs.push(iter[1])
267
+ while iter.next!
268
+ @list.songs.push(iter[1])
269
+ end
270
+ end
271
+ end
272
+
273
+ def add_song(path)
274
+ refresh_list
275
+ @list.add(path, @extension)
276
+ refresh_liststore
277
+ end
278
+
279
+ def add_songs(selection)
280
+ refresh_list
281
+ selection.selected_each{|model, path, iter| @list.add(iter[1], @extension)}
282
+ refresh_liststore
283
+ end
284
+
285
+ def rm_song
286
+ refresh_list
287
+ s=@list_selection.selected_rows
288
+ unless s.empty?
289
+ s.reverse! #Treepath must be in order
290
+ s.each{|p| @list.songs.delete_at(p.to_s.to_i)}
291
+ refresh_liststore
292
+ end
293
+ end
294
+
295
+ def clear
296
+ @list.clear
297
+ @list_store.clear
298
+ end
299
+
300
+ def search
301
+ refresh_list
302
+ @wmain.search(@list.songs, @list_selection, @list_view)
303
+ end
304
+
305
+ private
306
+
307
+ def add_file
308
+ #TODO : merge with Gui#import_list
309
+ dialog=Gtk::FileChooserDialog.new(_("Add a File"), @wmain,
310
+ Gtk::FileChooser::ACTION_OPEN, nil,
311
+ [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL], [Gtk::Stock::OPEN, Gtk::Dialog::RESPONSE_ACCEPT])
312
+ dialog.select_multiple=true
313
+ #dialog.filter=Gtk::FileFilter.new.add_pattern('*.{'+@extension+'}')#Do not work!
314
+ dialog.show_hidden=false
315
+ if dialog.run==Gtk::Dialog::RESPONSE_ACCEPT
316
+ refresh_list
317
+ dialog.filenames.each{|file| @list.add(file, @extension)}
318
+ refresh_liststore
319
+ end
320
+ dialog.destroy
321
+ end
322
+
323
+ def save
324
+ #TODO : merge with Gui#list_save
325
+ dialog=Gtk::FileChooserDialog.new(_("Save list"), @wmain,
326
+ Gtk::FileChooser::ACTION_SAVE, nil,
327
+ [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL], [Gtk::Stock::OPEN, Gtk::Dialog::RESPONSE_ACCEPT])
328
+ dialog.do_overwrite_confirmation=true
329
+ dialog.filter=Gtk::FileFilter.new.add_pattern('*.m3u')
330
+ dialog.show_hidden=false
331
+ if dialog.run==Gtk::Dialog::RESPONSE_ACCEPT
332
+ f=dialog.filename
333
+ f=f+'.m3u' unless f=~/.*\.m3u$/i
334
+ refresh_list
335
+ @list.save_m3u(f)
336
+ end
337
+ dialog.destroy
338
+ end
339
+
340
+ def top
341
+ refresh_list
342
+ s=@list_selection.selected_rows
343
+ unless s.empty?
344
+ index=[]
345
+ s.each{|p| index.push(p.to_s.to_i)}
346
+ index.reverse! #Treepath must be in order
347
+ tmp=[]
348
+ index.each{|i| tmp.push(@list.songs.delete_at(i))}#Dirty to manipulate @list.songs! Write a method to reorder songs within EditList class.
349
+ @list.songs.unshift(tmp.reverse!).flatten!
350
+ refresh_liststore
351
+ @list_selection.select_range(Gtk::TreePath.new('0'), Gtk::TreePath.new((tmp.length-1).to_s))
352
+ end
353
+ end
354
+
355
+ def up
356
+ refresh_list
357
+ s=@list_selection.selected_rows
358
+ unless s.empty?
359
+ index=[]
360
+ s.each{|p| index.push(p.to_s.to_i)}
361
+ n=0#Is it not more easy to delete the firsts rows if they are selected?
362
+ index.each{|i|
363
+ @list.songs[i-1], @list.songs[i]= @list.songs[i], @list.songs[i-1] unless i==n
364
+ n+=1
365
+ }
366
+ refresh_liststore
367
+ n=0
368
+ index.each{|i|
369
+ i==n ? p=i.to_s : p=(i-1).to_s
370
+ @list_selection.select_path(Gtk::TreePath.new(p))
371
+ n+=1
372
+ }
373
+ end
374
+ end
375
+
376
+ def down
377
+ refresh_list
378
+ s=@list_selection.selected_rows
379
+ unless s.empty?
380
+ index=[]
381
+ s.each{|p| index.push(p.to_s.to_i)}
382
+ n=@list.songs.length-1
383
+ index.reverse!.each{|i|
384
+ @list.songs[i+1], @list.songs[i]= @list.songs[i], @list.songs[i+1] unless i==n
385
+ n-=1
386
+ }
387
+ refresh_liststore
388
+ n=@list.songs.length-1
389
+ index.each{|i|
390
+ i==n ? p=i.to_s : p=(i+1).to_s
391
+ @list_selection.select_path(Gtk::TreePath.new(p))
392
+ n-=1
393
+ }
394
+ end
395
+ end
396
+
397
+ def bottom
398
+ refresh_list
399
+ s=@list_selection.selected_rows
400
+ unless s.empty?
401
+ index=[]
402
+ s.each{|p| index.push(p.to_s.to_i)}
403
+ index.reverse! #Treepath must be in order
404
+ tmp=[]
405
+ index.each{|i| tmp.push(@list.songs.delete_at(i))}
406
+ b=@list.songs.length.to_s
407
+ @list.songs.concat(tmp.reverse!)
408
+ refresh_liststore
409
+ e=(@list.songs.length-1).to_s
410
+ @list_selection.select_range(Gtk::TreePath.new(b), Gtk::TreePath.new(e))
411
+ end
412
+ end
413
+ end
data/gui/error.rb ADDED
@@ -0,0 +1,124 @@
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
+
23
+ ErrorINFO=0
24
+ ErrorWARNING=10
25
+ ErrorERROR=20
26
+ ModErrorINFO=1
27
+ ModErrorWARNING=11
28
+ ModErrorERROR=21
29
+ ModErrorLOAD_ERROR=22
30
+
31
+ class Error
32
+ #Error superclass not to be directly used.
33
+ def Error.gui=(gui)
34
+ @@zik=gui
35
+ end
36
+
37
+ attr_reader :message, :type, :long_message
38
+
39
+ def initialize(type, message, user, description)
40
+ @type=type; @message=message; @long_message=description||message
41
+ case type
42
+ when ErrorINFO, ModErrorINFO
43
+ puts message
44
+ if $show_errors&&user
45
+ dialog=Gtk::MessageDialog.new(@@zik, Gtk::Dialog::MODAL|Gtk::Dialog::DESTROY_WITH_PARENT,
46
+ Gtk::MessageDialog::INFO, Gtk::MessageDialog::BUTTONS_CLOSE, @long_message)
47
+ dialog.run; dialog.destroy
48
+ end
49
+ when ErrorWARNING, ModErrorWARNING
50
+ $stderr.puts "WARNING. "+message
51
+ if $show_errors&&user
52
+ dialog=Gtk::MessageDialog.new(@@zik, Gtk::Dialog::MODAL|Gtk::Dialog::DESTROY_WITH_PARENT,
53
+ Gtk::MessageDialog::WARNING, Gtk::MessageDialog::BUTTONS_CLOSE, @long_message)
54
+ dialog.run; dialog.destroy
55
+ end
56
+ when ErrorERROR, ModErrorERROR
57
+ $stderr.puts "ERROR. "+message
58
+ if $show_errors&&user
59
+ dialog=Gtk::MessageDialog.new(@@zik, Gtk::Dialog::MODAL|Gtk::Dialog::DESTROY_WITH_PARENT,
60
+ Gtk::MessageDialog::ERROR, Gtk::MessageDialog::BUTTONS_CLOSE, @long_message)
61
+ dialog.run; dialog.destroy
62
+ end
63
+ when ModErrorLOAD_ERROR
64
+ puts "LoAD ERROR. "+message
65
+ else
66
+ $stderr.puts "ERROR. Unknown Error type."
67
+ end
68
+ end
69
+ end
70
+
71
+ class ErrorInfo < Error
72
+ def initialize(message, user=false, description=nil)
73
+ super(ErrorINFO, message, user, description)
74
+ end
75
+ end
76
+
77
+ class ErrorWarning < Error
78
+ def initialize(message, user=false, description=nil)
79
+ super(ErrorWARNING, message, user, description)
80
+ end
81
+ end
82
+
83
+ class ErrorError < Error
84
+ def initialize(message, user=false, description=nil)
85
+ super(ErrorERROR, message, user, description)
86
+ end
87
+ end
88
+
89
+ class ErrorsStock
90
+ #Class to display many errors at once
91
+ def ErrorsStock.gui=(gui)
92
+ @@zik=gui
93
+ end
94
+
95
+ def initialize
96
+ @stock=[]
97
+ end
98
+
99
+ def nb
100
+ @stock.length
101
+ end
102
+
103
+ def add(type, message, description=nil)
104
+ @stock.push(Error.new(type, message, false, description))
105
+ self
106
+ end
107
+
108
+ def show_all(message="")
109
+ if $show_errors
110
+ unless @stock.empty?
111
+ tmp=[]
112
+ @stock.each{|error| message+="\n#{error.long_message}"; tmp.push(error.type)}
113
+ case tmp.max
114
+ when ErrorINFO; type=Gtk::MessageDialog::INFO
115
+ when ErrorWARNING; type=Gtk::MessageDialog::WARNING
116
+ else; type=Gtk::MessageDialog::ERROR
117
+ end
118
+ dialog=Gtk::MessageDialog.new(@@zik, Gtk::Dialog::MODAL|Gtk::Dialog::DESTROY_WITH_PARENT,
119
+ type, Gtk::MessageDialog::BUTTONS_CLOSE, message)
120
+ dialog.run; dialog.destroy
121
+ end
122
+ end
123
+ end
124
+ end