PhantomAnimationEditor 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,80 @@
1
+ require_relative '../phantom_animation_editor.rb'
2
+
3
+ # Animation frame.
4
+ class PhantomAnimationEditor::Frame < Gtk::Frame
5
+ THUMBNAIL_SIZE = 100
6
+ attr_accessor :filename, :pixbuf
7
+
8
+ def initialize(filename, parent)
9
+ super()
10
+ @filename = filename
11
+ @parent = parent
12
+
13
+ image = create_thumbnail
14
+ @pixbuf = image.pixbuf
15
+
16
+ create_image_button(image)
17
+ create_spinner
18
+ create_delete_button
19
+
20
+ add(create_box)
21
+ end
22
+
23
+ def create_thumbnail
24
+ image = Gtk::Image.new(file: @filename)
25
+ unless image.pixbuf.nil?
26
+ if image.pixbuf.width > THUMBNAIL_SIZE || image.pixbuf.height > THUMBNAIL_SIZE
27
+ image.pixbuf = resize(image.pixbuf, THUMBNAIL_SIZE)
28
+ end
29
+ end
30
+ image
31
+ end
32
+
33
+ def resize(pixbuf, size)
34
+ if pixbuf.width >= pixbuf.height
35
+ scale = pixbuf.height.to_f / pixbuf.width.to_f
36
+ pixbuf = pixbuf.scale(size, size * scale, GdkPixbuf::InterpType::BILINEAR)
37
+ else
38
+ scale = pixbuf.width.to_f / pixbuf.height.to_f
39
+ pixbuf = pixbuf.scale(size * scale, size, GdkPixbuf::InterpType::BILINEAR)
40
+ end
41
+ pixbuf
42
+ end
43
+
44
+ def create_image_button(image)
45
+ @image_button = Gtk::Button.new
46
+ @image_button.set_relief(Gtk::ReliefStyle::NONE)
47
+ @image_button.add(image)
48
+ @image_button.signal_connect('clicked') do
49
+ @parent.focus(self)
50
+ end
51
+ end
52
+
53
+ def create_spinner
54
+ adjustment = Gtk::Adjustment.new(100, 1, 999, 1, 1, 0)
55
+ @delay_spinner = Gtk::SpinButton.new(adjustment, 1, 0)
56
+ end
57
+
58
+ def create_delete_button
59
+ @delete_button = Gtk::Button.new(label: 'Delete')
60
+ @delete_button.signal_connect('clicked') do
61
+ @parent.delete(self)
62
+ end
63
+ end
64
+
65
+ def create_box
66
+ box = Gtk::Box.new(:vertical)
67
+ box.pack_start(@image_button, expand: true, fill: false, padding: 10)
68
+ box.pack_start(@delay_spinner, expand: false, fill: false)
69
+ box.pack_start(@delete_button, expand: false, fill: false)
70
+ box
71
+ end
72
+
73
+ def delay
74
+ @delay_spinner.value
75
+ end
76
+
77
+ def set_delay(value)
78
+ @delay_spinner.set_value(value)
79
+ end
80
+ end
@@ -0,0 +1,110 @@
1
+ require_relative '../phantom_animation_editor.rb'
2
+
3
+ require 'phantom_svg'
4
+
5
+ class PhantomAnimationEditor::FrameList
6
+ attr_accessor :frame_hbox, :cur, :list, :phantom_svg
7
+
8
+ def initialize(frame_hbox)
9
+ @frame_hbox = frame_hbox
10
+ @list = []
11
+ @phantom_svg = Phantom::SVG::Base.new
12
+ end
13
+
14
+ def <<(data)
15
+ @list << data
16
+ @cur = @list.size - 1
17
+ @phantom_svg.add_frame_from_file(data.filename) if File.exist?(data.filename)
18
+ end
19
+
20
+ def size
21
+ @list.size
22
+ end
23
+
24
+ def filename(position = nil)
25
+ return @list[@cur].filename if position.nil?
26
+ return nil if position > @list.size
27
+ return @list[position].filename
28
+ end
29
+
30
+ def pixbuf(position = nil)
31
+ return @list[@cur].pixbuf if position.nil?
32
+ return nil if position > @list.size
33
+ return @list[position].pixbuf
34
+ end
35
+
36
+ def delay(position = nil)
37
+ return @list[@cur].delay if position.nil?
38
+ return nil if position > @list.size
39
+ return @list[position].delay
40
+ end
41
+
42
+ def swap(old_position, new_position)
43
+ case new_position
44
+ when 0 then
45
+ insert_first(@list, old_position)
46
+ insert_first(@phantom_svg.frames, old_position)
47
+ when @list.size - 1 then
48
+ insert_last(@list, old_position)
49
+ insert_last(@phantom_svg.frames, old_position)
50
+ else
51
+ swap_pos(@list, old_position, new_position)
52
+ swap_pos(@phantom_svg.frames, old_position, new_position)
53
+ end
54
+ end
55
+
56
+ def insert_first(list, old_position)
57
+ list.insert(0, list[old_position])
58
+ list.delete_at(old_position + 1)
59
+ end
60
+
61
+ def insert_last(list, old_position)
62
+ list << list[old_position]
63
+ list.delete_at(old_position)
64
+ end
65
+
66
+ def swap_pos(list, old_position, new_position)
67
+ list[old_position], list[new_position] = list[new_position], list[old_position]
68
+ end
69
+
70
+ def delete(child)
71
+ @phantom_svg.frames.delete_at(@list.find_index(child))
72
+ @list.delete(child)
73
+ @frame_hbox.remove(child)
74
+
75
+ @cur -= 1 unless @cur == 0
76
+ if @list.size == 0
77
+ $preview.set_stock(Gtk::Stock::MISSING_IMAGE)
78
+ else
79
+ $preview.set_pixbuf(@list[@cur].pixbuf)
80
+ end
81
+ end
82
+
83
+ def delete_at(index)
84
+ child = @list[index]
85
+ delete(child)
86
+ end
87
+
88
+ def delete_all
89
+ @list.size.times do
90
+ child = @list[0]
91
+ @list.delete(child)
92
+ @frame_hbox.remove(child)
93
+ end
94
+ @phantom_svg.reset
95
+ @cur = 0
96
+ $preview.set_stock(Gtk::Stock::MISSING_IMAGE)
97
+ end
98
+
99
+ def focus(child)
100
+ @cur = @list.find_index(child)
101
+ $preview.set_pixbuf(@list[@cur].pixbuf)
102
+ end
103
+
104
+ def view_reload
105
+ @list.each { |frame| @frame_hbox.remove(frame) }
106
+ @list.each do |frame|
107
+ @frame_hbox.pack_start(frame, expand: false, fill: false, padding: 10)
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,567 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Generated with glade 3.18.3 -->
3
+ <interface>
4
+ <requires lib="gtk+" version="3.6"/>
5
+ <object class="GtkImage" id="export_button_image">
6
+ <property name="visible">True</property>
7
+ <property name="can_focus">False</property>
8
+ <property name="stock">gtk-save-as</property>
9
+ </object>
10
+ <object class="GtkWindow" id="editor_window">
11
+ <property name="can_focus">False</property>
12
+ <child>
13
+ <object class="GtkVBox" id="vbox_base">
14
+ <property name="visible">True</property>
15
+ <property name="can_focus">False</property>
16
+ <child>
17
+ <object class="GtkMenuBar" id="menubar">
18
+ <property name="visible">True</property>
19
+ <property name="can_focus">False</property>
20
+ <child>
21
+ <object class="GtkMenuItem" id="menuitem_file">
22
+ <property name="visible">True</property>
23
+ <property name="can_focus">False</property>
24
+ <property name="label" translatable="yes">_File</property>
25
+ <property name="use_underline">True</property>
26
+ <child type="submenu">
27
+ <object class="GtkMenu" id="menu_file">
28
+ <property name="visible">True</property>
29
+ <property name="can_focus">False</property>
30
+ <child>
31
+ <object class="GtkImageMenuItem" id="menu_file_new">
32
+ <property name="label">gtk-new</property>
33
+ <property name="visible">True</property>
34
+ <property name="can_focus">False</property>
35
+ <property name="use_underline">True</property>
36
+ <property name="use_stock">True</property>
37
+ </object>
38
+ </child>
39
+ <child>
40
+ <object class="GtkImageMenuItem" id="menu_file_import">
41
+ <property name="label">Import</property>
42
+ <property name="visible">True</property>
43
+ <property name="can_focus">False</property>
44
+ <property name="use_underline">True</property>
45
+ <property name="use_stock">True</property>
46
+ </object>
47
+ </child>
48
+ <child>
49
+ <object class="GtkImageMenuItem" id="menu_file_export">
50
+ <property name="label">Export</property>
51
+ <property name="visible">True</property>
52
+ <property name="can_focus">False</property>
53
+ <property name="use_underline">True</property>
54
+ <property name="use_stock">True</property>
55
+ </object>
56
+ </child>
57
+ <child>
58
+ <object class="GtkImageMenuItem" id="menu_file_export_frames">
59
+ <property name="label">Export with frames</property>
60
+ <property name="visible">True</property>
61
+ <property name="can_focus">False</property>
62
+ <property name="use_underline">True</property>
63
+ <property name="use_stock">True</property>
64
+ </object>
65
+ </child>
66
+ <child>
67
+ <object class="GtkSeparatorMenuItem" id="separatormenuitem1">
68
+ <property name="visible">True</property>
69
+ <property name="can_focus">False</property>
70
+ </object>
71
+ </child>
72
+ <child>
73
+ <object class="GtkImageMenuItem" id="menu_file_quit">
74
+ <property name="label">gtk-quit</property>
75
+ <property name="visible">True</property>
76
+ <property name="can_focus">False</property>
77
+ <property name="use_underline">True</property>
78
+ <property name="use_stock">True</property>
79
+ </object>
80
+ </child>
81
+ </object>
82
+ </child>
83
+ </object>
84
+ </child>
85
+ <child>
86
+ <object class="GtkMenuItem" id="menuitem_frame">
87
+ <property name="visible">True</property>
88
+ <property name="can_focus">False</property>
89
+ <property name="label" translatable="yes">_Frame</property>
90
+ <property name="use_underline">True</property>
91
+ <child type="submenu">
92
+ <object class="GtkMenu" id="menu_frame">
93
+ <property name="visible">True</property>
94
+ <property name="can_focus">False</property>
95
+ <child>
96
+ <object class="GtkImageMenuItem" id="menu_frame_add">
97
+ <property name="label">Add frame</property>
98
+ <property name="visible">True</property>
99
+ <property name="can_focus">False</property>
100
+ <property name="use_underline">True</property>
101
+ <property name="use_stock">True</property>
102
+ </object>
103
+ </child>
104
+ <child>
105
+ <object class="GtkImageMenuItem" id="menu_frame_next">
106
+ <property name="label">Move to next</property>
107
+ <property name="visible">True</property>
108
+ <property name="can_focus">False</property>
109
+ <property name="use_underline">True</property>
110
+ <property name="use_stock">True</property>
111
+ </object>
112
+ </child>
113
+ <child>
114
+ <object class="GtkImageMenuItem" id="menu_frame_prev">
115
+ <property name="label">Move to prev</property>
116
+ <property name="visible">True</property>
117
+ <property name="can_focus">False</property>
118
+ <property name="use_underline">True</property>
119
+ <property name="use_stock">True</property>
120
+ </object>
121
+ </child>
122
+ <child>
123
+ <object class="GtkImageMenuItem" id="menu_frame_last">
124
+ <property name="label">Move to last</property>
125
+ <property name="visible">True</property>
126
+ <property name="can_focus">False</property>
127
+ <property name="use_underline">True</property>
128
+ <property name="use_stock">True</property>
129
+ </object>
130
+ </child>
131
+ <child>
132
+ <object class="GtkImageMenuItem" id="menu_frame_first">
133
+ <property name="label">Move to first</property>
134
+ <property name="visible">True</property>
135
+ <property name="can_focus">False</property>
136
+ <property name="use_underline">True</property>
137
+ <property name="use_stock">True</property>
138
+ </object>
139
+ </child>
140
+ <child>
141
+ <object class="GtkImageMenuItem" id="menu_frame_delete">
142
+ <property name="label">Delete frame</property>
143
+ <property name="visible">True</property>
144
+ <property name="can_focus">False</property>
145
+ <property name="use_underline">True</property>
146
+ <property name="use_stock">True</property>
147
+ </object>
148
+ </child>
149
+ </object>
150
+ </child>
151
+ </object>
152
+ </child>
153
+ <child>
154
+ <object class="GtkMenuItem" id="menuitem_play">
155
+ <property name="visible">True</property>
156
+ <property name="can_focus">False</property>
157
+ <property name="label" translatable="yes">_Play</property>
158
+ <property name="use_underline">True</property>
159
+ <child type="submenu">
160
+ <object class="GtkMenu" id="menu_play">
161
+ <property name="visible">True</property>
162
+ <property name="can_focus">False</property>
163
+ <child>
164
+ <object class="GtkImageMenuItem" id="menu_play_play">
165
+ <property name="label">Play</property>
166
+ <property name="visible">True</property>
167
+ <property name="can_focus">False</property>
168
+ <property name="use_underline">True</property>
169
+ <property name="use_stock">True</property>
170
+ </object>
171
+ </child>
172
+ <child>
173
+ <object class="GtkImageMenuItem" id="menu_play_stop">
174
+ <property name="label">Stop</property>
175
+ <property name="visible">True</property>
176
+ <property name="can_focus">False</property>
177
+ <property name="use_underline">True</property>
178
+ <property name="use_stock">True</property>
179
+ </object>
180
+ </child>
181
+ <child>
182
+ <object class="GtkCheckMenuItem" id="menu_play_loop">
183
+ <property name="visible">True</property>
184
+ <property name="can_focus">True</property>
185
+ <property name="label">Loop</property>
186
+ <property name="use_underline">True</property>
187
+ </object>
188
+ </child>
189
+ </object>
190
+ </child>
191
+ </object>
192
+ </child>
193
+ <child>
194
+ <object class="GtkMenuItem" id="menuitem_help">
195
+ <property name="visible">True</property>
196
+ <property name="can_focus">False</property>
197
+ <property name="label" translatable="yes">_Help</property>
198
+ <property name="use_underline">True</property>
199
+ <child type="submenu">
200
+ <object class="GtkMenu" id="menu_help">
201
+ <property name="visible">True</property>
202
+ <property name="can_focus">False</property>
203
+ <child>
204
+ <object class="GtkImageMenuItem" id="menu_help_about">
205
+ <property name="label">gtk-about</property>
206
+ <property name="visible">True</property>
207
+ <property name="can_focus">False</property>
208
+ <property name="use_underline">True</property>
209
+ <property name="use_stock">True</property>
210
+ </object>
211
+ </child>
212
+ </object>
213
+ </child>
214
+ </object>
215
+ </child>
216
+ </object>
217
+ <packing>
218
+ <property name="expand">False</property>
219
+ <property name="fill">True</property>
220
+ <property name="position">0</property>
221
+ </packing>
222
+ </child>
223
+ <child>
224
+ <object class="GtkHBox" id="hbox_top">
225
+ <property name="visible">True</property>
226
+ <property name="can_focus">False</property>
227
+ <property name="spacing">10</property>
228
+ <child>
229
+ <object class="GtkVBox" id="view_vbox">
230
+ <property name="visible">True</property>
231
+ <property name="can_focus">False</property>
232
+ <property name="spacing">10</property>
233
+ <child>
234
+ <object class="GtkScrolledWindow" id="viewport_scrolledwindow">
235
+ <property name="visible">True</property>
236
+ <property name="can_focus">False</property>
237
+ <child>
238
+ <object class="GtkViewport" id="viewport_preview">
239
+ <property name="visible">True</property>
240
+ <property name="can_focus">False</property>
241
+ <property name="resize_mode">queue</property>
242
+ <child>
243
+ <object class="GtkImage" id="preview_image">
244
+ <property name="visible">True</property>
245
+ <property name="can_focus">False</property>
246
+ <property name="xpad">10</property>
247
+ <property name="ypad">10</property>
248
+ <property name="stock">gtk-missing-image</property>
249
+ </object>
250
+ </child>
251
+ </object>
252
+ </child>
253
+ </object>
254
+ <packing>
255
+ <property name="expand">True</property>
256
+ <property name="fill">True</property>
257
+ <property name="position">0</property>
258
+ </packing>
259
+ </child>
260
+ <child>
261
+ <object class="GtkHBox" id="play_hbox">
262
+ <property name="visible">True</property>
263
+ <property name="can_focus">False</property>
264
+ <child>
265
+ <object class="GtkButton" id="first_button">
266
+ <property name="label">gtk-goto-first</property>
267
+ <property name="visible">True</property>
268
+ <property name="can_focus">True</property>
269
+ <property name="receives_default">True</property>
270
+ <property name="relief">half</property>
271
+ <property name="use_stock">True</property>
272
+ <property name="always_show_image">True</property>
273
+ </object>
274
+ <packing>
275
+ <property name="expand">True</property>
276
+ <property name="fill">True</property>
277
+ <property name="position">0</property>
278
+ </packing>
279
+ </child>
280
+ <child>
281
+ <object class="GtkButton" id="back_button">
282
+ <property name="label">gtk-go-back</property>
283
+ <property name="visible">True</property>
284
+ <property name="can_focus">True</property>
285
+ <property name="receives_default">True</property>
286
+ <property name="use_stock">True</property>
287
+ <property name="always_show_image">True</property>
288
+ </object>
289
+ <packing>
290
+ <property name="expand">True</property>
291
+ <property name="fill">True</property>
292
+ <property name="position">1</property>
293
+ </packing>
294
+ </child>
295
+ <child>
296
+ <object class="GtkButton" id="play_button">
297
+ <property name="label">gtk-media-play</property>
298
+ <property name="visible">True</property>
299
+ <property name="can_focus">True</property>
300
+ <property name="receives_default">True</property>
301
+ <property name="use_stock">True</property>
302
+ <property name="always_show_image">True</property>
303
+ </object>
304
+ <packing>
305
+ <property name="expand">True</property>
306
+ <property name="fill">True</property>
307
+ <property name="position">2</property>
308
+ </packing>
309
+ </child>
310
+ <child>
311
+ <object class="GtkButton" id="forward_button">
312
+ <property name="label">gtk-go-forward</property>
313
+ <property name="visible">True</property>
314
+ <property name="can_focus">True</property>
315
+ <property name="receives_default">True</property>
316
+ <property name="use_stock">True</property>
317
+ <property name="always_show_image">True</property>
318
+ </object>
319
+ <packing>
320
+ <property name="expand">True</property>
321
+ <property name="fill">True</property>
322
+ <property name="position">3</property>
323
+ </packing>
324
+ </child>
325
+ <child>
326
+ <object class="GtkButton" id="last_button">
327
+ <property name="label">gtk-goto-last</property>
328
+ <property name="visible">True</property>
329
+ <property name="can_focus">True</property>
330
+ <property name="receives_default">True</property>
331
+ <property name="use_stock">True</property>
332
+ <property name="always_show_image">True</property>
333
+ </object>
334
+ <packing>
335
+ <property name="expand">True</property>
336
+ <property name="fill">True</property>
337
+ <property name="position">4</property>
338
+ </packing>
339
+ </child>
340
+ <child>
341
+ <object class="GtkButton" id="add_frame_button">
342
+ <property name="label">gtk-add</property>
343
+ <property name="visible">True</property>
344
+ <property name="can_focus">False</property>
345
+ <property name="receives_default">True</property>
346
+ <property name="use_stock">True</property>
347
+ <property name="always_show_image">True</property>
348
+ </object>
349
+ <packing>
350
+ <property name="expand">True</property>
351
+ <property name="fill">True</property>
352
+ <property name="position">5</property>
353
+ </packing>
354
+ </child>
355
+ </object>
356
+ <packing>
357
+ <property name="expand">False</property>
358
+ <property name="fill">False</property>
359
+ <property name="position">1</property>
360
+ </packing>
361
+ </child>
362
+ </object>
363
+ <packing>
364
+ <property name="expand">True</property>
365
+ <property name="fill">True</property>
366
+ <property name="padding">10</property>
367
+ <property name="position">0</property>
368
+ </packing>
369
+ </child>
370
+ </object>
371
+ <packing>
372
+ <property name="expand">True</property>
373
+ <property name="fill">True</property>
374
+ <property name="padding">10</property>
375
+ <property name="position">1</property>
376
+ </packing>
377
+ </child>
378
+ <child>
379
+ <object class="GtkScrolledWindow" id="frame_list_scrolled_window">
380
+ <property name="visible">True</property>
381
+ <property name="can_focus">False</property>
382
+ <property name="min_content_height">200</property>
383
+ <child>
384
+ <placeholder/>
385
+ </child>
386
+ </object>
387
+ <packing>
388
+ <property name="expand">False</property>
389
+ <property name="fill">True</property>
390
+ <property name="position">2</property>
391
+ </packing>
392
+ </child>
393
+ <child>
394
+ <object class="GtkHBox" id="export_box">
395
+ <property name="can_focus">False</property>
396
+ <child>
397
+ <object class="GtkFileChooserButton" id="file_chooser">
398
+ <property name="can_focus">False</property>
399
+ </object>
400
+ <packing>
401
+ <property name="expand">True</property>
402
+ <property name="fill">True</property>
403
+ <property name="position">1</property>
404
+ </packing>
405
+ </child>
406
+ <child>
407
+ <object class="GtkButton" id="export_button">
408
+ <property name="can_focus">False</property>
409
+ <property name="receives_default">True</property>
410
+ <property name="image">export_button_image</property>
411
+ </object>
412
+ <packing>
413
+ <property name="expand">False</property>
414
+ <property name="fill">True</property>
415
+ <property name="position">3</property>
416
+ </packing>
417
+ </child>
418
+ <child>
419
+ <object class="GtkCheckButton" id="loop_checkbutton">
420
+ <property name="label" translatable="yes">Loop</property>
421
+ <property name="visible">True</property>
422
+ <property name="can_focus">True</property>
423
+ <property name="receives_default">False</property>
424
+ <property name="xalign">0</property>
425
+ <property name="draw_indicator">True</property>
426
+ </object>
427
+ <packing>
428
+ <property name="expand">False</property>
429
+ <property name="fill">False</property>
430
+ <property name="padding">10</property>
431
+ <property name="position">4</property>
432
+ </packing>
433
+ </child>
434
+ <child>
435
+ <object class="GtkCheckButton" id="frames_checkbutton">
436
+ <property name="label" translatable="yes">Frames</property>
437
+ <property name="visible">True</property>
438
+ <property name="can_focus">False</property>
439
+ <property name="receives_default">False</property>
440
+ <property name="xalign">0</property>
441
+ <property name="draw_indicator">True</property>
442
+ </object>
443
+ <packing>
444
+ <property name="expand">False</property>
445
+ <property name="fill">True</property>
446
+ <property name="position">5</property>
447
+ </packing>
448
+ </child>
449
+ </object>
450
+ <packing>
451
+ <property name="expand">False</property>
452
+ <property name="fill">True</property>
453
+ <property name="position">3</property>
454
+ </packing>
455
+ </child>
456
+ </object>
457
+ </child>
458
+ </object>
459
+ <object class="GtkImage" id="first_img">
460
+ <property name="visible">True</property>
461
+ <property name="can_focus">False</property>
462
+ <property name="stock">gtk-goto-first</property>
463
+ </object>
464
+ <object class="GtkWindow" id="frame_window">
465
+ <property name="can_focus">False</property>
466
+ <child>
467
+ <object class="GtkBox" id="box1">
468
+ <property name="visible">True</property>
469
+ <property name="can_focus">False</property>
470
+ <property name="orientation">vertical</property>
471
+ <child>
472
+ <object class="GtkImage" id="frame_image">
473
+ <property name="visible">True</property>
474
+ <property name="can_focus">False</property>
475
+ <property name="stock">gtk-missing-image</property>
476
+ </object>
477
+ <packing>
478
+ <property name="expand">True</property>
479
+ <property name="fill">True</property>
480
+ <property name="position">0</property>
481
+ </packing>
482
+ </child>
483
+ <child>
484
+ <object class="GtkBox" id="box2">
485
+ <property name="visible">True</property>
486
+ <property name="can_focus">False</property>
487
+ <child>
488
+ <object class="GtkLabel" id="label1">
489
+ <property name="visible">True</property>
490
+ <property name="can_focus">False</property>
491
+ <property name="label" translatable="yes">Delay</property>
492
+ </object>
493
+ <packing>
494
+ <property name="expand">False</property>
495
+ <property name="fill">True</property>
496
+ <property name="position">0</property>
497
+ </packing>
498
+ </child>
499
+ <child>
500
+ <object class="GtkSpinButton" id="spinbutton1">
501
+ <property name="visible">True</property>
502
+ <property name="can_focus">False</property>
503
+ <property name="invisible_char">•</property>
504
+ </object>
505
+ <packing>
506
+ <property name="expand">True</property>
507
+ <property name="fill">True</property>
508
+ <property name="position">1</property>
509
+ </packing>
510
+ </child>
511
+ <child>
512
+ <object class="GtkLabel" id="label2">
513
+ <property name="visible">True</property>
514
+ <property name="can_focus">False</property>
515
+ <property name="label" translatable="yes">ms</property>
516
+ </object>
517
+ <packing>
518
+ <property name="expand">False</property>
519
+ <property name="fill">True</property>
520
+ <property name="position">2</property>
521
+ </packing>
522
+ </child>
523
+ <child>
524
+ <object class="GtkButton" id="button1">
525
+ <property name="label">gtk-delete</property>
526
+ <property name="visible">True</property>
527
+ <property name="can_focus">False</property>
528
+ <property name="receives_default">True</property>
529
+ <property name="use_stock">True</property>
530
+ </object>
531
+ <packing>
532
+ <property name="expand">False</property>
533
+ <property name="fill">True</property>
534
+ <property name="position">3</property>
535
+ </packing>
536
+ </child>
537
+ </object>
538
+ <packing>
539
+ <property name="expand">False</property>
540
+ <property name="fill">True</property>
541
+ <property name="position">1</property>
542
+ </packing>
543
+ </child>
544
+ </object>
545
+ </child>
546
+ </object>
547
+ <object class="GtkImage" id="last_img">
548
+ <property name="visible">True</property>
549
+ <property name="can_focus">False</property>
550
+ <property name="stock">gtk-goto-last</property>
551
+ </object>
552
+ <object class="GtkImage" id="next_img">
553
+ <property name="visible">True</property>
554
+ <property name="can_focus">False</property>
555
+ <property name="stock">gtk-go-forward</property>
556
+ </object>
557
+ <object class="GtkImage" id="play_img">
558
+ <property name="visible">True</property>
559
+ <property name="can_focus">False</property>
560
+ <property name="stock">gtk-media-play</property>
561
+ </object>
562
+ <object class="GtkImage" id="previous_img">
563
+ <property name="visible">True</property>
564
+ <property name="can_focus">False</property>
565
+ <property name="stock">gtk-go-back</property>
566
+ </object>
567
+ </interface>