PhantomAnimationEditor 0.1.0

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.
@@ -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>