gtk3 3.0.5-x86-mingw32 → 3.0.6-x86-mingw32

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/ext/gtk3/rb-gtk3-cell-layout.c +42 -0
  3. data/ext/gtk3/rb-gtk3-private.h +3 -0
  4. data/ext/gtk3/rb-gtk3-tree-model.c +77 -0
  5. data/ext/gtk3/rb-gtk3-tree-view.c +42 -0
  6. data/ext/gtk3/rb-gtk3.c +33 -0
  7. data/lib/2.0/gtk3.so +0 -0
  8. data/lib/2.1/gtk3.so +0 -0
  9. data/lib/2.2/gtk3.so +0 -0
  10. data/lib/gtk3/builder.rb +54 -11
  11. data/lib/gtk3/container.rb +13 -0
  12. data/lib/gtk3/deprecated.rb +4 -4
  13. data/lib/gtk3/loader.rb +2 -0
  14. data/lib/gtk3/show-uri.rb +34 -0
  15. data/lib/gtk3/stock-item.rb +36 -0
  16. data/lib/gtk3/tree-iter.rb +3 -1
  17. data/sample/gtk-demo/TODO +1 -1
  18. data/sample/gtk-demo/alias_cursor.png +0 -0
  19. data/sample/gtk-demo/all_scroll_cursor.png +0 -0
  20. data/sample/gtk-demo/application.ui +11 -18
  21. data/sample/gtk-demo/brick.png +0 -0
  22. data/sample/gtk-demo/brick2.png +0 -0
  23. data/sample/gtk-demo/cell_cursor.png +0 -0
  24. data/sample/gtk-demo/col_resize_cursor.png +0 -0
  25. data/sample/gtk-demo/copy_cursor.png +0 -0
  26. data/sample/gtk-demo/crosshair_cursor.png +0 -0
  27. data/sample/gtk-demo/css_accordion.css +1 -2
  28. data/sample/gtk-demo/css_basics.css +1 -1
  29. data/sample/gtk-demo/css_multiplebgs.css +136 -0
  30. data/sample/gtk-demo/css_pixbufs.css +76 -0
  31. data/sample/gtk-demo/css_shadows.css +44 -0
  32. data/sample/gtk-demo/cssview.css +41 -0
  33. data/sample/gtk-demo/decor1.png +0 -0
  34. data/sample/gtk-demo/decor2.png +0 -0
  35. data/sample/gtk-demo/default_cursor.png +0 -0
  36. data/sample/gtk-demo/demo.gresource.xml +216 -0
  37. data/sample/gtk-demo/demo.ui +285 -241
  38. data/sample/gtk-demo/e_resize_cursor.png +0 -0
  39. data/sample/gtk-demo/ew_resize_cursor.png +0 -0
  40. data/sample/gtk-demo/filtermodel.ui +195 -0
  41. data/sample/gtk-demo/font-features.ui +966 -0
  42. data/sample/gtk-demo/glarea-fragment.glsl +9 -0
  43. data/sample/gtk-demo/glarea-vertex.glsl +8 -0
  44. data/sample/gtk-demo/grab_cursor.png +0 -0
  45. data/sample/gtk-demo/grabbing_cursor.png +0 -0
  46. data/sample/gtk-demo/hand_cursor.png +0 -0
  47. data/sample/gtk-demo/help_cursor.png +0 -0
  48. data/sample/gtk-demo/listbox.ui +332 -0
  49. data/sample/gtk-demo/main.rb +132 -313
  50. data/sample/gtk-demo/main.ui +190 -0
  51. data/sample/gtk-demo/markup.txt +16 -0
  52. data/sample/gtk-demo/menus.ui +1 -1
  53. data/sample/gtk-demo/messages.txt +388 -0
  54. data/sample/gtk-demo/modelbutton.ui +162 -0
  55. data/sample/gtk-demo/move_cursor.png +0 -0
  56. data/sample/gtk-demo/n_resize_cursor.png +0 -0
  57. data/sample/gtk-demo/ne_resize_cursor.png +0 -0
  58. data/sample/gtk-demo/nesw_resize_cursor.png +0 -0
  59. data/sample/gtk-demo/no_drop_cursor.png +0 -0
  60. data/sample/gtk-demo/none_cursor.png +0 -0
  61. data/sample/gtk-demo/not_allowed_cursor.png +0 -0
  62. data/sample/gtk-demo/ns_resize_cursor.png +0 -0
  63. data/sample/gtk-demo/nw_resize_cursor.png +0 -0
  64. data/sample/gtk-demo/nwse_resize_cursor.png +0 -0
  65. data/sample/gtk-demo/org.gtk.Demo.gschema.xml +17 -0
  66. data/sample/gtk-demo/pointer_cursor.png +0 -0
  67. data/sample/gtk-demo/popover.ui +94 -0
  68. data/sample/gtk-demo/progress_cursor.png +0 -0
  69. data/sample/gtk-demo/reset.css +0 -1
  70. data/sample/gtk-demo/revealer.ui +177 -0
  71. data/sample/gtk-demo/row_resize_cursor.png +0 -0
  72. data/sample/gtk-demo/s_resize_cursor.png +0 -0
  73. data/sample/gtk-demo/scale.ui +117 -0
  74. data/sample/gtk-demo/se_resize_cursor.png +0 -0
  75. data/sample/gtk-demo/spinbutton.ui +194 -0
  76. data/sample/gtk-demo/stack.ui +72 -0
  77. data/sample/gtk-demo/sw_resize_cursor.png +0 -0
  78. data/sample/gtk-demo/text_cursor.png +0 -0
  79. data/sample/gtk-demo/theming.ui +102 -147
  80. data/sample/gtk-demo/vertical_text_cursor.png +0 -0
  81. data/sample/gtk-demo/w_resize_cursor.png +0 -0
  82. data/sample/gtk-demo/wait_cursor.png +0 -0
  83. data/sample/gtk-demo/zoom_in_cursor.png +0 -0
  84. data/sample/gtk-demo/zoom_out_cursor.png +0 -0
  85. data/sample/tutorial/README.md +415 -0
  86. data/test/run-test.rb +1 -1
  87. data/test/test-gtk-builder.rb +108 -30
  88. data/test/test-gtk-cell-layout.rb +6 -0
  89. metadata +82 -18
@@ -0,0 +1,9 @@
1
+ #version 330
2
+
3
+ out vec4 outputColor;
4
+
5
+ void main() {
6
+ float lerpVal = gl_FragCoord.y / 500.0f;
7
+
8
+ outputColor = mix(vec4(1.0f, 0.85f, 0.35f, 1.0f), vec4(0.2f, 0.2f, 0.2f, 1.0f), lerpVal);
9
+ }
@@ -0,0 +1,8 @@
1
+ #version 330
2
+
3
+ layout(location = 0) in vec4 position;
4
+ uniform mat4 mvp;
5
+
6
+ void main() {
7
+ gl_Position = mvp * position;
8
+ }
@@ -0,0 +1,332 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <interface domain="gtk30">
3
+ <!-- interface-requires gtk+ 3.10 -->
4
+ <!-- interface-requires gtkdemo 3.10 -->
5
+ <object class="GtkMenu" id="menu1">
6
+ <property name="visible">1</property>
7
+ <child>
8
+ <object class="GtkMenuItem" id="menuitem1">
9
+ <property name="visible">1</property>
10
+ <property name="label" translatable="yes">Email message</property>
11
+ <property name="use_underline">1</property>
12
+ </object>
13
+ </child>
14
+ <child>
15
+ <object class="GtkMenuItem" id="menuitem2">
16
+ <property name="visible">1</property>
17
+ <property name="label" translatable="yes">Embed message</property>
18
+ <property name="use_underline">1</property>
19
+ </object>
20
+ </child>
21
+ </object>
22
+ <template class="GtkMessageRow" parent="GtkListBoxRow">
23
+ <child>
24
+ <object class="GtkGrid" id="grid1">
25
+ <property name="visible">1</property>
26
+ <property name="hexpand">1</property>
27
+ <child>
28
+ <object class="GtkImage" id="avatar_image">
29
+ <property name="width_request">32</property>
30
+ <property name="height_request">32</property>
31
+ <property name="visible">1</property>
32
+ <property name="halign">center</property>
33
+ <property name="valign">start</property>
34
+ <property name="margin_top">8</property>
35
+ <property name="margin_bottom">8</property>
36
+ <property name="margin_start">8</property>
37
+ <property name="margin_end">8</property>
38
+ <property name="icon-name">image-missing</property>
39
+ </object>
40
+ <packing>
41
+ <property name="left_attach">0</property>
42
+ <property name="top_attach">0</property>
43
+ <property name="height">5</property>
44
+ </packing>
45
+ </child>
46
+ <child>
47
+ <object class="GtkBox" id="box1">
48
+ <property name="visible">1</property>
49
+ <property name="hexpand">1</property>
50
+ <property name="baseline_position">top</property>
51
+ <child>
52
+ <object class="GtkButton" id="button2">
53
+ <property name="visible">1</property>
54
+ <property name="can_focus">1</property>
55
+ <property name="receives_default">1</property>
56
+ <property name="valign">baseline</property>
57
+ <property name="relief">none</property>
58
+ <child>
59
+ <object class="GtkLabel" id="source_name">
60
+ <property name="visible">1</property>
61
+ <property name="valign">baseline</property>
62
+ <property name="label" translatable="0">Username</property>
63
+ <attributes>
64
+ <attribute name="weight" value="bold"/>
65
+ </attributes>
66
+ </object>
67
+ </child>
68
+ </object>
69
+ </child>
70
+ <child>
71
+ <object class="GtkLabel" id="source_nick">
72
+ <property name="visible">1</property>
73
+ <property name="valign">baseline</property>
74
+ <property name="label" translatable="0">@nick</property>
75
+ <style>
76
+ <class name="dim-label"/>
77
+ </style>
78
+ </object>
79
+ <packing>
80
+ <property name="position">1</property>
81
+ </packing>
82
+ </child>
83
+ <child>
84
+ <object class="GtkLabel" id="short_time_label">
85
+ <property name="visible">1</property>
86
+ <property name="valign">baseline</property>
87
+ <property name="label" translatable="yes">38m</property>
88
+ <style>
89
+ <class name="dim-label"/>
90
+ </style>
91
+ </object>
92
+ <packing>
93
+ <property name="fill">0</property>
94
+ <property name="pack_type">end</property>
95
+ <property name="position">2</property>
96
+ </packing>
97
+ </child>
98
+ </object>
99
+ <packing>
100
+ <property name="left_attach">1</property>
101
+ <property name="top_attach">0</property>
102
+ </packing>
103
+ </child>
104
+ <child>
105
+ <object class="GtkLabel" id="content_label">
106
+ <property name="visible">1</property>
107
+ <property name="halign">start</property>
108
+ <property name="valign">start</property>
109
+ <property name="xalign">0</property>
110
+ <property name="yalign">0</property>
111
+ <property name="label" translatable="0">Message</property>
112
+ <property name="wrap">1</property>
113
+ </object>
114
+ <packing>
115
+ <property name="left_attach">1</property>
116
+ <property name="top_attach">1</property>
117
+ </packing>
118
+ </child>
119
+ <child>
120
+ <object class="GtkBox" id="resent_box">
121
+ <child>
122
+ <object class="GtkImage" id="image2">
123
+ <property name="visible">1</property>
124
+ <property name="icon_name">media-playlist-repeat</property>
125
+ </object>
126
+ </child>
127
+ <child>
128
+ <object class="GtkLabel" id="label4">
129
+ <property name="visible">1</property>
130
+ <property name="label" translatable="yes">Resent by</property>
131
+ </object>
132
+ <packing>
133
+ <property name="position">1</property>
134
+ </packing>
135
+ </child>
136
+ <child>
137
+ <object class="GtkLinkButton" id="resent_by_button">
138
+ <property name="label" translatable="0">reshareer</property>
139
+ <property name="visible">1</property>
140
+ <property name="can_focus">1</property>
141
+ <property name="receives_default">1</property>
142
+ <property name="relief">none</property>
143
+ <property name="uri">http://www.gtk.org</property>
144
+ </object>
145
+ <packing>
146
+ <property name="position">2</property>
147
+ </packing>
148
+ </child>
149
+ </object>
150
+ <packing>
151
+ <property name="left_attach">1</property>
152
+ <property name="top_attach">2</property>
153
+ </packing>
154
+ </child>
155
+ <child>
156
+ <object class="GtkBox" id="box3">
157
+ <property name="visible">1</property>
158
+ <property name="spacing">6</property>
159
+ <child>
160
+ <object class="GtkButton" id="expand_button">
161
+ <property name="label" translatable="yes">Expand</property>
162
+ <property name="visible">1</property>
163
+ <property name="can_focus">1</property>
164
+ <property name="receives_default">1</property>
165
+ <property name="relief">none</property>
166
+ <signal name="clicked" handler="expand_clicked" swapped="yes"/>
167
+ </object>
168
+ </child>
169
+ <child>
170
+ <object class="GtkBox" id="extra_buttons_box">
171
+ <property name="spacing">6</property>
172
+ <child>
173
+ <object class="GtkButton" id="reply-button">
174
+ <property name="label" translatable="yes">Reply</property>
175
+ <property name="visible">1</property>
176
+ <property name="can_focus">1</property>
177
+ <property name="receives_default">1</property>
178
+ <property name="relief">none</property>
179
+ </object>
180
+ </child>
181
+ <child>
182
+ <object class="GtkButton" id="reshare-button">
183
+ <property name="label" translatable="yes">Reshare</property>
184
+ <property name="visible">1</property>
185
+ <property name="can_focus">1</property>
186
+ <property name="receives_default">1</property>
187
+ <property name="relief">none</property>
188
+ <signal name="clicked" handler="reshare_clicked" swapped="yes"/>
189
+ </object>
190
+ <packing>
191
+ <property name="position">1</property>
192
+ </packing>
193
+ </child>
194
+ <child>
195
+ <object class="GtkButton" id="favorite-buttton">
196
+ <property name="label" translatable="yes">Favorite</property>
197
+ <property name="visible">1</property>
198
+ <property name="can_focus">1</property>
199
+ <property name="receives_default">1</property>
200
+ <property name="relief">none</property>
201
+ <signal name="clicked" handler="favorite_clicked" swapped="yes"/>
202
+ </object>
203
+ <packing>
204
+ <property name="position">2</property>
205
+ </packing>
206
+ </child>
207
+ <child>
208
+ <object class="GtkMenuButton" id="more-button">
209
+ <property name="visible">1</property>
210
+ <property name="can_focus">1</property>
211
+ <property name="receives_default">1</property>
212
+ <property name="relief">none</property>
213
+ <property name="popup">menu1</property>
214
+ <child>
215
+ <object class="GtkLabel" id="label7">
216
+ <property name="visible">1</property>
217
+ <property name="label" translatable="yes">More...</property>
218
+ </object>
219
+ </child>
220
+ </object>
221
+ <packing>
222
+ <property name="position">3</property>
223
+ </packing>
224
+ </child>
225
+ </object>
226
+ <packing>
227
+ <property name="position">1</property>
228
+ </packing>
229
+ </child>
230
+ </object>
231
+ <packing>
232
+ <property name="left_attach">1</property>
233
+ <property name="top_attach">3</property>
234
+ </packing>
235
+ </child>
236
+ <child>
237
+ <object class="GtkRevealer" id="details_revealer">
238
+ <property name="visible">1</property>
239
+ <child>
240
+ <object class="GtkBox" id="box5">
241
+ <property name="visible">1</property>
242
+ <property name="orientation">vertical</property>
243
+ <child>
244
+ <object class="GtkBox" id="box7">
245
+ <property name="visible">1</property>
246
+ <property name="margin_top">2</property>
247
+ <property name="margin_bottom">2</property>
248
+ <property name="spacing">8</property>
249
+ <child>
250
+ <object class="GtkFrame" id="frame1">
251
+ <property name="visible">1</property>
252
+ <property name="shadow_type">none</property>
253
+ <child>
254
+ <object class="GtkLabel" id="n_reshares_label">
255
+ <property name="visible">1</property>
256
+ <property name="label" translatable="0">&lt;b&gt;2&lt;/b&gt;
257
+ Reshares</property>
258
+ <property name="use_markup">1</property>
259
+ </object>
260
+ </child>
261
+ <child type="label_item">
262
+ </child>
263
+ </object>
264
+ </child>
265
+ <child>
266
+ <object class="GtkFrame" id="frame2">
267
+ <property name="visible">1</property>
268
+ <property name="shadow_type">none</property>
269
+ <child>
270
+ <object class="GtkLabel" id="n_favorites_label">
271
+ <property name="visible">1</property>
272
+ <property name="label" translatable="0">&lt;b&gt;2&lt;/b&gt;
273
+ FAVORITES</property>
274
+ <property name="use_markup">1</property>
275
+ </object>
276
+ </child>
277
+ <child type="label_item">
278
+ </child>
279
+ </object>
280
+ <packing>
281
+ <property name="position">1</property>
282
+ </packing>
283
+ </child>
284
+ </object>
285
+ <packing>
286
+ <property name="position">1</property>
287
+ </packing>
288
+ </child>
289
+ <child>
290
+ <object class="GtkBox" id="box6">
291
+ <property name="visible">1</property>
292
+ <child>
293
+ <object class="GtkLabel" id="detailed_time_label">
294
+ <property name="visible">1</property>
295
+ <property name="label" translatable="0">4:25 AM - 14 Jun 13 </property>
296
+ <style>
297
+ <class name="dim-label"/>
298
+ </style>
299
+ </object>
300
+ </child>
301
+ <child>
302
+ <object class="GtkButton" id="button5">
303
+ <property name="label" translatable="yes">Details</property>
304
+ <property name="visible">1</property>
305
+ <property name="can_focus">1</property>
306
+ <property name="receives_default">1</property>
307
+ <property name="relief">none</property>
308
+ <style>
309
+ <class name="dim-label"/>
310
+ </style>
311
+ </object>
312
+ <packing>
313
+ <property name="position">1</property>
314
+ </packing>
315
+ </child>
316
+ </object>
317
+ <packing>
318
+ <property name="position">2</property>
319
+ </packing>
320
+ </child>
321
+ </object>
322
+ </child>
323
+ </object>
324
+ <packing>
325
+ <property name="left_attach">1</property>
326
+ <property name="top_attach">4</property>
327
+ </packing>
328
+ </child>
329
+ </object>
330
+ </child>
331
+ </template>
332
+ </interface>
@@ -1,358 +1,177 @@
1
- #! /usr/bin/env ruby
2
- =begin
3
- main.rb - Main class of gtk-demo.
4
-
5
- Copyright (c) 2003-2015 Ruby-GNOME2 Project Team
6
- This program is licenced under the same licence as Ruby-GNOME2.
7
- =end
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Copyright (C) 2006-2015 Ruby-GNOME2 Project Team
4
+ #
5
+ # This library is free software; you can redistribute it and/or
6
+ # modify it under the terms of the GNU Lesser General Public
7
+ # License as published by the Free Software Foundation; either
8
+ # version 2.1 of the License, or (at your option) any later version.
9
+ #
10
+ # This library is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # Lesser General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Lesser General Public
16
+ # License along with this library; if not, write to the Free Software
17
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
8
18
 
9
19
  require "gtk3"
20
+ require "optparse"
21
+ require "fileutils"
10
22
 
11
- $LOAD_PATH.unshift(File.dirname(__FILE__))
12
-
13
- module Demo
14
- class Main < Gtk::Window
15
- TITLE_COLUMN, FILENAME_COLUMN, CLASS_COLUMN, ITALIC_COLUMN = 0, 1, 2, 3
16
-
17
- def initialize
18
- super()
19
-
20
- @current_file = nil
23
+ current_path = File.expand_path(File.dirname(__FILE__))
24
+ gresource_bin = "#{current_path}/demo.gresource"
25
+ gresource_xml = "#{current_path}/demo.gresource.xml"
21
26
 
22
- @info_buffer = Gtk::TextBuffer.new
23
- @source_buffer = Gtk::TextBuffer.new
24
-
25
- set_title("Ruby/GTK+ Code Demos")
26
- signal_connect("destroy") { Gtk.main_quit }
27
-
28
- signal_connect("key_press_event") do |_widget, event|
29
- if event.state.control_mask? && event.keyval == Gdk::Keyval::KEY_q
30
- destroy
31
- true
32
- else
33
- false
34
- end
35
- end
27
+ system("glib-compile-resources",
28
+ "--target", gresource_bin,
29
+ "--sourcedir", current_path,
30
+ gresource_xml)
36
31
 
37
- hbox = Gtk::Box.new(:horizontal)
38
- add(hbox)
39
-
40
- tree = create_tree
41
- scrolled_window = Gtk::ScrolledWindow.new
42
- scrolled_window.set_policy :never, :automatic
43
- scrolled_window.add(tree)
44
- hbox.pack_start(scrolled_window, :expand => false, :fill => false, :padding => 0)
45
-
46
- notebook = Gtk::Notebook.new
47
- hbox.pack_start(notebook, :expand => true, :fill => true, :padding => 0)
48
-
49
- notebook.append_page(create_text(@info_buffer, false),
50
- Gtk::Label.new("_Info", :use_underline => true))
51
-
52
- notebook.append_page(create_text(@source_buffer, true),
53
- Gtk::Label.new("_Source", :use_underline => true))
54
-
55
- @info_buffer.create_tag("title",
56
- "font" => "Sans 18")
57
-
58
- @source_buffer.create_tag("comment",
59
- "foreground" => "red")
60
- @source_buffer.create_tag("const",
61
- "foreground" => "ForestGreen")
62
- @source_buffer.create_tag("string",
63
- "foreground" => "RosyBrown",
64
- "weight" => Pango::FontDescription::WEIGHT_BOLD
65
- )
66
- @source_buffer.create_tag("reserved",
67
- "foreground" => "purple")
68
- end
69
-
70
- def script_info(path)
71
- title = nil
72
- klass = nil
73
- depend = nil
74
-
75
- file = File.open(path)
76
- file.each do |ln|
77
- if !title && ln =~ /^=\s+(.*)$/
78
- title = Regexp.last_match(1)
79
- if title =~ /^(.*)\((.+?)\)$/
80
- title = Regexp.last_match(1)
81
- depend = Regexp.last_match(2)
82
- end
83
- elsif !klass && ln =~ /\s*class\s+([A-Z][A-Za-z0-9_]*)/
84
- klass = Regexp.last_match(1)
85
- end
86
-
87
- break if title && klass
88
- end
89
-
90
- raise "File not found: #{path}." unless klass
91
-
92
- return title, klass.intern, depend
93
- end
32
+ gschema_bin = "#{current_path}/gschemas.compiled"
94
33
 
95
- def generate_index
96
- # Target scripts
97
- scripts = Dir.glob(File.join(File.dirname(__FILE__), "*.rb"))
34
+ system("glib-compile-schemas", current_path)
98
35
 
99
- # Generate index tree
100
- children = {}
101
- index = []
36
+ at_exit do
37
+ FileUtils.rm_f([gresource_bin, gschema_bin])
38
+ end
102
39
 
103
- scripts.each do |script|
104
- next if ["common.rb", "main.rb"].include?(File.basename(script))
105
- title, klass, depend = script_info(script)
40
+ resource = Gio::Resource.load(gresource_bin)
41
+ Gio::Resources.register(resource)
106
42
 
107
- next if depend && !Gtk.const_defined?(depend)
43
+ ENV["GSETTINGS_SCHEMA_DIR"] = current_path
108
44
 
109
- if title =~ %r{^(.+?)/(.+)$}
110
- parent = Regexp.last_match(1)
111
- child = Regexp.last_match(2)
112
45
 
113
- unless children[parent]
114
- children[parent] = []
115
- index += [[parent, nil, nil, []]]
116
- end
117
46
 
118
- children[parent] += [[child, script, klass]]
119
- else
120
- index += [[title, script, klass]]
121
- end
122
- end
47
+ class Demo < Gtk::Application
48
+ def initialize
49
+ super("org.gtk.Demo", [:non_unique, :handles_command_line])
123
50
 
124
- # Sort children
125
- children.each_key do |parent|
126
- children[parent].sort! do |a, b|
127
- a[0] <=> b[0]
128
- end
129
- end
51
+ @options = {}
52
+ @exit_status = 0
130
53
 
131
- # Expand children
132
- index.collect! do |row|
133
- row[3] = children[row[0]] if row[3]
134
- row
135
- end
54
+ signal_connect "startup" do |application|
55
+ puts "startup"
56
+ @builder = Gtk::Builder.new(:resource => "/ui/main.ui")
57
+ appmenu = @builder["appmenu"]
58
+ application.set_app_menu(appmenu)
59
+ end
136
60
 
137
- index.sort! do |a, b|
138
- a[0] <=> b[0]
61
+ signal_connect "activate" do |application|
62
+ puts "activate"
63
+ begin
64
+ run_application
65
+ rescue => error
66
+ report_error(error)
67
+ @exit_status = 1
139
68
  end
140
-
141
- index
142
69
  end
143
70
 
144
- def create_tree
145
- model = Gtk::TreeStore.new(String, String, String, TrueClass)
146
-
147
- tree_view = Gtk::TreeView.new
148
- tree_view.set_model(model)
149
- selection = tree_view.selection
150
-
151
- selection.set_mode(:browse)
152
- tree_view.set_size_request(200, -1)
153
-
154
- append_children(model, generate_index)
155
-
156
- cell = Gtk::CellRendererText.new
157
- cell.style = Pango::FontDescription::STYLE_ITALIC
158
- column = Gtk::TreeViewColumn.new("Widget (double click for demo)", cell,
159
- "text" => TITLE_COLUMN,
160
- "style_set" => ITALIC_COLUMN
161
- )
162
-
163
- tree_view.append_column(column)
164
-
165
- selection.signal_connect("changed") do |changed_selection|
166
- iter = changed_selection.selected
167
- load_file(iter.get_value(FILENAME_COLUMN)) if iter
168
- end
169
- tree_view.signal_connect("row_activated") do |_tree_view, path, _column|
170
- row_activated_cb(_tree_view.model, path)
71
+ signal_connect "command-line" do |application, command_line|
72
+ puts "cmd"
73
+ begin
74
+ parse_command_line(command_line.arguments)
75
+ rescue SystemExit => error
76
+ error.status
77
+ rescue OptionParser::InvalidOption => error
78
+ puts error.message
79
+ 1
80
+ rescue => error
81
+ report_error(error)
82
+ 1
83
+ else
84
+ activate
85
+ @exit_status
171
86
  end
87
+ end
88
+ end
172
89
 
173
- tree_view.expand_all
174
- tree_view
90
+ private
91
+ def parse_command_line(arguments)
92
+ parser = OptionParser.new
93
+ parser.on("-r", "--run EXAMPLE", "Run an example") do |example|
94
+ @options[:name] = example
95
+ end
96
+ parser.on("-a", "--autoquit", "Quit after a delay") do
97
+ @options[:autoquit] = true
98
+ end
99
+ parser.on("-l", "--list", "List examples") do
100
+ @options[:list] = true
175
101
  end
102
+ parser.parse(arguments)
103
+ end
176
104
 
177
- def append_children(model, source, parent = nil)
178
- source.each do |title, filename, klass, children|
179
- iter = model.append(parent)
105
+ def report_error(error)
106
+ puts "#{error.class}: #{error.message}"
107
+ puts error.backtrace
108
+ end
180
109
 
181
- [title, filename, klass].each_with_index do |value, i|
182
- iter.set_value(i, value) if value
183
- end
184
- iter.set_value(ITALIC_COLUMN, false)
110
+ def run_application
111
+ if @options[:list]
112
+ puts "list"
113
+ # list_demos
114
+ quit
115
+ end
185
116
 
186
- append_children(model, children, iter) if children
187
- end
117
+ if @options[:name]
118
+ puts "name"
119
+ # lookup_for_corresponding_demo
120
+ # load_demo
188
121
  end
189
122
 
190
- def row_activated_cb(model, path)
191
- iter = model.get_iter(path)
192
- iter.set_value(ITALIC_COLUMN, true)
193
-
194
- lib = iter.get_value(FILENAME_COLUMN)
195
- if lib
196
- require_relative(File.basename(lib))
197
-
198
- klass = Demo.const_get(iter.get_value(CLASS_COLUMN))
199
- window = klass.new
200
- window.signal_connect("destroy") do
201
- iter.set_value(ITALIC_COLUMN, false)
202
- end
203
- window.show_all
204
- @window = window
123
+ if @options[:autoquit]
124
+ puts "autoquit"
125
+ GLib::Timeout.add(1) do
126
+ #implement auto_quit
205
127
  end
206
128
  end
207
129
 
208
- def create_text(buffer, is_source)
209
- scrolled_window = Gtk::ScrolledWindow.new
210
- scrolled_window.set_policy(:automatic,
211
- :automatic)
212
- scrolled_window.set_shadow_type(:in)
213
-
214
- text_view = Gtk::TextView.new
130
+ window = @builder["window"]
131
+ add_window(window)
215
132
 
216
- text_view.set_buffer(buffer)
217
- text_view.set_editable(false)
218
- text_view.set_cursor_visible(false)
133
+ action = Gio::SimpleAction.new("run")
134
+ action.signal_connect "activate" do |_action, _parameter|
135
+ # activate_run
136
+ end
137
+ add_action(action)
219
138
 
220
- scrolled_window.add(text_view)
139
+ notebook = @builder["notebook"]
140
+ info_textwiew = @builder["info-textview"]
141
+ source_textview = @builder["source-textview"]
142
+ headerbar = @builder["headerbar"]
143
+ treeview = @builder["treeview"]
144
+ model = treeview.model
221
145
 
222
- if is_source
223
- font_desc = Pango::FontDescription.new("Monospace 12")
224
- text_view.override_font(font_desc)
146
+ sw = @builder["source-scrolledwindow"]
147
+ scrollbar = sw.vscrollbar
225
148
 
226
- text_view.set_wrap_mode(:none)
227
- else
228
- text_view.set_wrap_mode(:word)
229
- text_view.set_pixels_above_lines(2)
230
- text_view.set_pixels_below_lines(2)
231
- end
149
+ menu = Gtk::Menu.new
232
150
 
233
- scrolled_window
151
+ item = Gtk::MenuItem.new("Start")
152
+ menu.append(item)
153
+ item.signal_connect "activate" do
154
+ adj = scrollbar.adjustement
155
+ adj.value = adj.get_lower
234
156
  end
235
157
 
236
- def fontify(start_iter = @source_buffer.start_iter,
237
- end_iter = @source_buffer.end_iter)
238
- str = @source_buffer.get_text(start_iter, end_iter, true)
239
-
240
- tokenizer = RubyTokonizer.new
241
- tokenizer.tokenize(str, start_iter.offset) do |tag, start, last|
242
- @source_buffer.apply_tag(tag.to_s,
243
- @source_buffer.get_iter_at(:offset => start),
244
- @source_buffer.get_iter_at(:offset => last))
245
- end
158
+ item = Gtk::MenuItem.new("End")
159
+ menu.append(item)
160
+ item.signal_connect "activate" do
161
+ adj = scrollbar.adjustement
162
+ adj.value = adj.get_upper - adj.get_page_size
246
163
  end
247
164
 
248
- def load_file(filename)
249
- return if filename == @current_file
250
-
251
- @info_buffer.delete(*@info_buffer.bounds)
252
-
253
- @source_buffer.delete(*@source_buffer.bounds)
254
-
255
- file = begin
256
- File.open(filename)
257
- rescue
258
- $stderr.puts "Cannot open: #{$ERROR_INFO}" if $DEBUG
259
- return
260
- end
261
- start = @info_buffer.get_iter_at(:offset => 0)
262
- state = :before_header
263
-
264
- file.each do |line|
265
- case state
266
- when :before_header
267
- state = :in_header if line =~ /^=begin$/
268
- when :in_header
269
- if line =~ /^=end$/
270
- state = :body
271
- start = @source_buffer.get_iter_at(:offset => 0)
272
- elsif line =~ /^=\s+(.*)$/
273
- title = Regexp.last_match(1)
274
- title.gsub!(/\s*\(.*\)$/, "") # Delete depend field
275
-
276
- last = start
277
-
278
- @info_buffer.insert(last, title)
279
- start = last.clone
280
-
281
- start.backward_chars(title.length)
282
- @info_buffer.apply_tag("title", start, last)
283
-
284
- start = last
285
- else
286
- @info_buffer.insert(start, line)
287
- end
288
- when :body # Reading program body
289
- @source_buffer.insert(start, line)
290
- end
291
- end
292
-
293
- fontify
165
+ menu.show_all
294
166
 
295
- @current_file = filename
167
+ scrollbar.signal_connect "popup-menu" do
168
+ menu.popup(nil, nil, Gtk.current_event_time)
296
169
  end
297
- end
298
170
 
299
- class RubyTokonizer
300
- RESERVED_WORDS = %w(begin end module class def if then else while unless do case when require yield)
301
- RESERVED_WORDS_PATTERN = Regexp.compile(/(^|\s+)(#{RESERVED_WORDS.collect { |pat| Regexp.quote(pat) }.join("|")})(\s+|$)/)
302
-
303
- def tokenize(str, index = 0)
304
- until str.empty?
305
- tag = nil
306
-
307
- case str
308
- when /".+?"/, /".+?"/
309
- tag = :string
310
- when /#.*$/
311
- tag = :comment
312
- when RESERVED_WORDS_PATTERN
313
- tag = :reserved
314
- when /[A-Z][A-Za-z0-9_]+/
315
- tag = :const
316
- end
317
-
318
- if tag
319
- tokenize($LAST_MATCH_INFO.pre_match, index) do |*args|
320
- yield(*args)
321
- end
322
- yield(tag, index + $LAST_MATCH_INFO.begin(0), index + $LAST_MATCH_INFO.end(0))
323
- index += (str.length - $LAST_MATCH_INFO.post_match.length)
324
- str = $LAST_MATCH_INFO.post_match
325
- else
326
- index += str.length
327
- str = ""
328
- end
329
- end
330
- end
171
+ window.show_all
331
172
  end
332
173
  end
333
174
 
334
- target = ARGV.shift
335
- if target
336
- Demo::INDEX.each do |_title, filename, klass_symbol, _children|
337
- if target == filename || target == klass_symbol.id2name
338
- require filename
339
-
340
- window = Demo.const_get(klass_symbol).new
341
- window.show_all
342
-
343
- class << window
344
- def quit
345
- Gtk.main_quit
346
- end
347
- end
348
-
349
- break
350
- end
351
- end
352
- else
353
- main = Demo::Main.new
354
- main.set_default_size(600, 400)
355
- main.show_all
356
- end
175
+ demo = Demo.new
357
176
 
358
- Gtk.main
177
+ exit(demo.run([$PROGRAM_NAME] + ARGV))