white_gold 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/ext/dll/tgui.dll +0 -0
  3. data/ext/so/libtgui.so +0 -0
  4. data/lib/white_gold/abi/extern_object.rb +6 -1
  5. data/lib/white_gold/abi/unpacker.rb +4 -2
  6. data/lib/white_gold/convention/bang_nest.rb +12 -2
  7. data/lib/white_gold/convention/bang_nested_caller.rb +34 -34
  8. data/lib/white_gold/convention/container_widgets.rb +29 -24
  9. data/lib/white_gold/convention/page.rb +20 -2
  10. data/lib/white_gold/convention/theme/text_styles_attribute.rb +7 -2
  11. data/lib/white_gold/convention/theme/theme_attributed.rb +1 -1
  12. data/lib/white_gold/convention/tree_node.rb +43 -0
  13. data/lib/white_gold/convention/widget_like.rb +0 -6
  14. data/lib/white_gold/dsl/backend_gui.rb +1 -0
  15. data/lib/white_gold/dsl/canvas.rb +40 -0
  16. data/lib/white_gold/dsl/chat_box.rb +1 -1
  17. data/lib/white_gold/dsl/child_window.rb +1 -1
  18. data/lib/white_gold/dsl/color.rb +5 -2
  19. data/lib/white_gold/dsl/combo_box.rb +2 -2
  20. data/lib/white_gold/dsl/container.rb +17 -11
  21. data/lib/white_gold/dsl/font.rb +5 -1
  22. data/lib/white_gold/dsl/grid.rb +3 -3
  23. data/lib/white_gold/dsl/list_box.rb +7 -11
  24. data/lib/white_gold/dsl/list_view.rb +6 -6
  25. data/lib/white_gold/dsl/menu_bar.rb +5 -48
  26. data/lib/white_gold/dsl/message_box.rb +2 -2
  27. data/lib/white_gold/dsl/panel_list_box.rb +3 -3
  28. data/lib/white_gold/dsl/sfml/circle_shape.rb +7 -0
  29. data/lib/white_gold/dsl/sfml/convex_shape.rb +15 -0
  30. data/lib/white_gold/dsl/sfml/rectangle_shape.rb +7 -0
  31. data/lib/white_gold/dsl/sfml/shape.rb +19 -0
  32. data/lib/white_gold/dsl/sfml/text.rb +22 -0
  33. data/lib/white_gold/dsl/signal/global_signal.rb +1 -1
  34. data/lib/white_gold/dsl/signal/signal.rb +1 -1
  35. data/lib/white_gold/dsl/signal/signal_animation_type.rb +1 -1
  36. data/lib/white_gold/dsl/signal/signal_bool.rb +1 -1
  37. data/lib/white_gold/dsl/signal/signal_color.rb +1 -1
  38. data/lib/white_gold/dsl/signal/signal_float.rb +1 -1
  39. data/lib/white_gold/dsl/signal/signal_int.rb +1 -1
  40. data/lib/white_gold/dsl/signal/signal_pointer.rb +1 -1
  41. data/lib/white_gold/dsl/signal/signal_range.rb +1 -1
  42. data/lib/white_gold/dsl/signal/signal_show_effect.rb +1 -1
  43. data/lib/white_gold/dsl/signal/signal_string.rb +1 -1
  44. data/lib/white_gold/dsl/signal/signal_u_int.rb +1 -1
  45. data/lib/white_gold/dsl/signal/signal_vector2f.rb +1 -1
  46. data/lib/white_gold/dsl/tab_container.rb +2 -2
  47. data/lib/white_gold/dsl/tabs.rb +2 -2
  48. data/lib/white_gold/dsl/theme.rb +1 -1
  49. data/lib/white_gold/dsl/tree_view.rb +21 -33
  50. data/lib/white_gold/dsl/widget.rb +71 -38
  51. data/lib/white_gold/generated/tgui-abi-loader.gf.rb +197 -47
  52. data/lib/white_gold/master.rb +21 -40
  53. data/lib/white_gold/tgui-abi.rb +16 -16
  54. data/lib/white_gold/version.rb +3 -0
  55. data/lib/white_gold.rb +29 -28
  56. metadata +16 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a41be86fed471b6d1a5df24594b8e4eea51175c94227abedc23254fe604242af
4
- data.tar.gz: 1c28e36a0ec7a9b71beecc5003dcac4004656d41bec972c458ad637f85b39d68
3
+ metadata.gz: 6727469d73967f049141a5c7b128bfb88b5c18cb128ce7b00417e7f889648138
4
+ data.tar.gz: f30fed9fdbfc915eb0fb70fded0aabe9593991037af91253427d59b22f053913
5
5
  SHA512:
6
- metadata.gz: 2d03d3ea86908238aab6fd22217530162f7f120bce1a3020be5255aa1f5dcb3d1a9cd635e327c71a8f5876b28261296e93c2a75fcb44a3cb4ba2e13e1feae9c3
7
- data.tar.gz: ef710195d005845169be0a51dedba2ea1fd390a8b2eb23a08c3f458c377b75088d47d2f8a0792e3b62b1dc795a9423bef57ad7ecf7cff6e982df8a4d7f885dea
6
+ metadata.gz: c9373c37d6ccbbb45b973b55c92dd924ec9bc9511ee4a5b1e244859f956f9133d767b30874255535b3fd715d396fb5b96787076014fcfdd5354005973631ac7e
7
+ data.tar.gz: 240acb40c4ef8d00788e704c40eff66c93535b20d57c3973c9a04e50c18e7dae3c3fc808a1f63308700eb11efe4458dcc970033b385f922e38d72ea53e9c88f0
data/ext/dll/tgui.dll CHANGED
Binary file
data/ext/so/libtgui.so CHANGED
Binary file
@@ -17,6 +17,7 @@ class ExternObject
17
17
  end
18
18
  ObjectSpace.define_finalizer(self, cl.proc.finalizer(pointer))
19
19
  end
20
+ initialized
20
21
  end
21
22
 
22
23
  def initialized
@@ -102,7 +103,11 @@ class ExternObject
102
103
  getter = "#{original_name}#{name}".delete_suffix("?").to_sym
103
104
  setter = "set_#{name}".delete_suffix("?").to_sym
104
105
  else
105
- getter = "get_#{original_name}".to_sym
106
+ if name.end_with? "?"
107
+ getter = "is_#{original_name}".to_sym
108
+ else
109
+ getter = "get_#{original_name}".to_sym
110
+ end
106
111
  setter = "set_#{original_name}".to_sym
107
112
  end
108
113
  else
@@ -2,15 +2,17 @@ require_relative 'interface/interface'
2
2
 
3
3
  module Unpacker
4
4
  def abi_unpacker base, &body
5
+ method_name = abi_unpacker_method_name(base)
5
6
  if block_given?
6
- define_method abi_unpacker_method_name(base), &body
7
+ define_method method_name, &body
7
8
  elsif base.is_a? Module
8
- define_method abi_unpacker_method_name(base) do |o|
9
+ define_method method_name do |o|
9
10
  base.new pointer: o
10
11
  end
11
12
  else
12
13
  raise "..."
13
14
  end
15
+ method_name
14
16
  end
15
17
 
16
18
  def abi_unpacker_method_name base
@@ -4,13 +4,23 @@ module BangNest
4
4
  include BangNestedCaller
5
5
 
6
6
  def respond_to? name
7
- super || bang_respond_to?(name)
7
+ super || (name.end_with?("!") && bang_respond_to?(name[...-1]))
8
8
  end
9
9
 
10
10
  def method_missing name, *a, **na, &b
11
11
  if name.end_with? "!"
12
- bang_method_missing name, *a, **na, &b
12
+ bang_method_missing name[...-1], *a, **na, &b
13
13
  else super
14
14
  end
15
15
  end
16
+
17
+ def send! *a, **na, &b
18
+ a.each do |k|
19
+ send("#{k}=", true)
20
+ end
21
+ na.each do |k, v|
22
+ send("#{k}=", v)
23
+ end
24
+ super(&b)
25
+ end
16
26
  end
@@ -1,48 +1,48 @@
1
1
  module BangNestedCaller
2
- def bang_respond_to? name
3
- name.end_with?("!") && (respond_to?("#{name[...-1]}=") || respond_to?("api_bang_#{name[...-1]}") || (@bang_target && @bang_target.respond_to?(name)))
4
- end
5
-
6
- def bang_method_missing name, *a, **na, &b
7
- return @bang_target.send(name, *a, **na, &b) if @bang_target && @bang_target.respond_to?(name)
8
2
 
9
- api_name = "api_bang_#{name[...-1]}".to_sym
10
- return send(api_name, *a, **na, &b) if respond_to? api_name
11
-
12
- setter = "#{name[...-1]}=".to_sym
13
- if respond_to? setter
14
- return send(setter, a) if !a.empty?
15
- return send(setter, na) if !na.empty?
16
- return send(setter, b) if block_given?
17
- return send(setter)
18
- end
19
-
20
- no_method_error = NoMethodError.new("undefined bang nested method `#{name}` for #{bang_object_stack.map(&:class).join("/")}")
21
- raise no_method_error
22
- end
3
+ @@bang_stack = []
23
4
 
24
5
  def self!
25
- @bang_target&.respond_to?(:self!) ? @bang_target.self! : self
6
+ @@bang_stack.last
26
7
  end
27
8
 
28
- def bang_object_stack root = true
29
- stack = []
30
- stack << self if root
31
- stack << @bang_target if @bang_target
32
- stack += @bang_target.bang_object_stack(false) if @bang_target&.respond_to? :bang_object_stack
33
- return stack
9
+ def bang_respond_to? name
10
+ top = @@bang_stack.include?(self) ? @@bang_stack.last : self
11
+ top.respond_to?("#{name}=") || top.respond_to?("api_bang_#{name}")
34
12
  end
35
13
 
14
+ def bang_send name, *a, **na, &b
15
+ top = @@bang_stack.last
16
+ api_bang_name = "api_bang_#{name}".to_sym
17
+ return top.send(api_bang_name, *a, **na, &b) if top.respond_to? api_bang_name
18
+ setter = "#{name}=".to_sym
19
+ if top.respond_to? setter
20
+ return top.send(setter, a) if !a.empty?
21
+ return top.send(setter, na) if !na.empty?
22
+ return top.send(setter, b) if block_given?
23
+ return top.send(setter)
24
+ end
25
+ no_method_error = NoMethodError.new("bang method missing `#{name}!` for #{top.class}")
26
+ raise no_method_error
27
+ end
36
28
 
37
- def upon! item, **na, &b
38
- na.each do |k, v|
39
- item.send("#{k}=", v)
29
+ def bang_method_missing name, *a, **na, &b
30
+ if @@bang_stack.include?(self)
31
+ bang_send name, *a, **na, &b
32
+ else
33
+ @@bang_stack.push self
34
+ result = bang_send name, *a, **na, &b
35
+ @@bang_stack.pop
36
+ result
40
37
  end
38
+ end
39
+
40
+ def send! &b
41
41
  if b
42
- @bang_target, original_bang_target = item, @bang_target
43
- b.call item
44
- @bang_target = original_bang_target
42
+ @@bang_stack.push self
43
+ b.call self
44
+ @@bang_stack.pop
45
45
  end
46
- item
46
+ self
47
47
  end
48
48
  end
@@ -2,9 +2,10 @@ require_relative '../convention/api_child'
2
2
 
3
3
  module Tgui
4
4
 
5
- WIDGETS_COLLECTION = {
5
+ ORDINARY_WIDGETS = {
6
6
  bitmap_button: Tgui::BitmapButton,
7
7
  button: Tgui::Button,
8
+ canvas: Tgui::Canvas,
8
9
  chatbox: Tgui::ChatBox,
9
10
  checkbox: Tgui::CheckBox,
10
11
  child_window: Tgui::ChildWindow,
@@ -25,9 +26,7 @@ module Tgui
25
26
  panel: Tgui::Panel,
26
27
  panel_listbox: Tgui::PanelListBox,
27
28
  panel_tabs: Tgui::TabContainer,
28
- picture: false,
29
29
  progressbar: Tgui::ProgressBar,
30
- radio: false,
31
30
  radio_button: Tgui::RadioButton,
32
31
  radio_button_group: Tgui::RadioButtonGroup,
33
32
  range_slider: Tgui::RangeSlider,
@@ -44,10 +43,18 @@ module Tgui
44
43
  vela: Tgui::VerticalLayout,
45
44
  }.freeze
46
45
 
46
+ UNORDINARY_WIDGETS = {
47
+ picture: Tgui::Picture
48
+ }
49
+
50
+ def self.widget_set
51
+ {}.merge ORDINARY_WIDGETS, UNORDINARY_WIDGETS
52
+ end
53
+
47
54
  module WidgetOwner
48
55
  extend BangDef
49
56
 
50
- def common_widget_nest widget, *keys, id: nil, **na, &b
57
+ def self_common_widget_nest widget, *keys, id: nil, **na, &b
51
58
  club_params = {}
52
59
  Enumerator.new do |e|
53
60
  cl = widget.class
@@ -72,18 +79,18 @@ module Tgui
72
79
  club_params.merge! club.params
73
80
  end
74
81
 
75
- upon! widget, **club_params, **na, &b
82
+ widget.send! **club_params, **na, &b
76
83
  end
77
84
 
78
- def child_methods
85
+ def self_child_methods
79
86
  ## TO OPTIMIZE
80
87
  methods.filter{ _1.start_with? ApiChild::API_CHILD_PREFIX }
81
88
  end
82
89
 
83
- def equip_child_widget widget
90
+ def self_equip_child_widget widget
84
91
  widget.page = page
85
92
  parent = self
86
- child_methods.each do |method|
93
+ self_child_methods.each do |method|
87
94
  widget.define_singleton_method method[ApiChild::API_CHILD_PREFIX.length..] do |*a|
88
95
  parent.send(method, self, *a)
89
96
  end
@@ -91,10 +98,10 @@ module Tgui
91
98
  widget
92
99
  end
93
100
 
94
- WIDGETS_COLLECTION.each do |m, c|
101
+ ORDINARY_WIDGETS.each do |m, c|
95
102
  if c
96
103
  def! m do |*a, **na, &b|
97
- common_widget_post_initialize equip_child_widget(c.new), *a, **na, &b
104
+ self_common_widget_equip self_equip_child_widget(c.new), *a, **na, &b
98
105
  end
99
106
  end
100
107
  end
@@ -110,16 +117,16 @@ module Tgui
110
117
  )
111
118
  transparent = na[:transparent] || false
112
119
  pic = Tgui::Picture.new texture, transparent
113
- equip_child_widget pic
114
- common_widget_post_initialize pic, *a, **na.except(:url, :part_rect, :smooth, :transparent), &b
120
+ self_equip_child_widget pic
121
+ self_common_widget_equip pic, *a, **na.except(:url, :part_rect, :smooth, :transparent), &b
115
122
  end
116
123
 
117
124
  def! :radio do |object, *a, **na, &b|
118
125
  radio = RadioButton.new
119
- equip_child_widget radio
126
+ self_equip_child_widget radio
120
127
  radio.object = object
121
128
  na[:text] ||= object.to_s
122
- common_widget_post_initialize radio, *a, **na, &b
129
+ self_common_widget_equip radio, *a, **na, &b
123
130
  end
124
131
 
125
132
  def! :msg do |text, **buttons|
@@ -146,22 +153,20 @@ module Tgui
146
153
 
147
154
  @@auto_widget_id = "@/"
148
155
 
149
- def common_widget_post_initialize widget, *keys, **na, &b
156
+ def self_common_widget_equip widget, *keys, **na, &b
150
157
  @@auto_widget_id = id = @@auto_widget_id.next
151
158
  add widget, id
152
- common_widget_nest widget, *keys, id:, **na, &b
159
+ self_common_widget_nest widget, *keys, id:, **na, &b
153
160
  end
154
161
 
155
162
  end
156
163
 
157
164
  class TabContainer
158
- WIDGETS_COLLECTION.each do |m, c|
159
- if !method_defined? m
160
- def! m do |name = nil, **na, &b|
161
- raise NoMethodError.new("Method `#{m}` should be called on Panel from TabContainer, not TabContainer itself")
162
- end
163
- end
165
+
166
+ def add widget, name
167
+ raise NoMethodError.new("Widget can't be added to TabContainer directly. Add it to TabContainer panel instead.")
164
168
  end
169
+
165
170
  end
166
171
 
167
172
  class ToolTip
@@ -169,9 +174,9 @@ module Tgui
169
174
 
170
175
  attr :widget
171
176
 
172
- def common_widget_post_initialize widget, *keys, **na, &b
177
+ def self_common_widget_equip widget, *keys, **na, &b
173
178
  @widget = widget
174
- common_widget_nest widget, *keys, **na, &b
179
+ self_common_widget_nest widget, *keys, **na, &b
175
180
  end
176
181
  end
177
182
 
@@ -22,6 +22,24 @@ class Page < Tgui::Group
22
22
  def build
23
23
  end
24
24
 
25
+ def respond_to? name
26
+ super ||
27
+ (name.end_with?("!") && bang_respond_to?(name[...-1])) ||
28
+ @tgui.gui.respond_to?(name) ||
29
+ @tgui.window.respond_to?(name)
30
+ end
31
+
32
+ def method_missing name, *a, **na, &b
33
+ if name.end_with? "!"
34
+ bang_method_missing name[...-1], *a, **na, &b
35
+ elsif @tgui.gui.respond_to? name
36
+ @tgui.gui.send name, *a, **na, &b
37
+ elsif @tgui.window.respond_to? name
38
+ @tgui.window.send name, *a, **na, &b
39
+ else super
40
+ end
41
+ end
42
+
25
43
  def disconnect
26
44
  @global_callbacks.each do |id, signal|
27
45
  signal.disconnect id
@@ -79,11 +97,11 @@ class Page < Tgui::Group
79
97
  theme = self.theme
80
98
  if seed
81
99
  theme.reset_attributes
82
- upon! theme do
100
+ theme.send! do
83
101
  load Tgui::Theme.loadpath(seed)
84
102
  end
85
103
  end
86
- upon! theme, **na, &b
104
+ theme.send! **na, &b
87
105
  theme.self_commit @custom_renderers
88
106
  end
89
107
 
@@ -1,13 +1,18 @@
1
+ require_relative '../../abi/extern_object'
2
+
1
3
  class TextStylesAttribute
2
4
  def initialize name, value
3
5
  @name = name
4
- @value = value
6
+ @value = Array(value).map do |style|
7
+ raise "Invalid style #{style}" if !ExternObject::TextStyles[style]
8
+ style.to_s.upcase
9
+ end.join("|")
5
10
  end
6
11
 
7
12
  attr :name
8
13
  attr :value
9
14
 
10
15
  def to_theme
11
- "#{name} = #{value.to_s};"
16
+ "#{name} = #{value};"
12
17
  end
13
18
  end
@@ -30,7 +30,7 @@ module Tgui
30
30
  def! name do |custom_name = nil, base_name = nil, **na, &b|
31
31
  attribute = type.new(base_name, custom_name)
32
32
  attribute = attributes[attribute.name] ||= attribute
33
- upon! attribute, **na, &b
33
+ attribute.send! **na, &b
34
34
  end
35
35
  end
36
36
  end
@@ -0,0 +1,43 @@
1
+ class TreeNode
2
+ def initialize text
3
+ @text = text
4
+ @nodes = {}
5
+ end
6
+
7
+ attr_accessor :text
8
+ attr :nodes
9
+
10
+ def [](*path, grow: false)
11
+ if grow
12
+ path.reduce(self){|node, o| node.nodes[o] ||= TreeNode.new(nil) }
13
+ else
14
+ path.reduce(self){|node, o| node&.nodes[o] }
15
+ end
16
+ end
17
+
18
+ def cut *path, last
19
+ self[*path].nodes.delete last
20
+ end
21
+
22
+ def cut_branches *path
23
+ self[*path].nodes = {}
24
+ end
25
+
26
+ def path_str_to_object *path
27
+ object_path = []
28
+ path.reduce self do |node, str|
29
+ o, node = *node.nodes.find{|k, v| v.text == str }
30
+ object_path << o
31
+ node
32
+ end
33
+ object_path
34
+ end
35
+
36
+ def path_object_to_str *path
37
+ str_path = []
38
+ path.reduce self do |node, o|
39
+ node[o].tap{ str_path << _1.text }
40
+ end
41
+ str_path
42
+ end
43
+ end
@@ -137,10 +137,4 @@ class WidgetLike
137
137
 
138
138
  attr :host
139
139
  attr :id
140
-
141
- def flags=(flags)
142
- flags.each do |f|
143
- send("#{f}=", true)
144
- end
145
- end
146
140
  end
@@ -31,6 +31,7 @@ module Tgui
31
31
  abi_def :pop_mouse_cursor, :restore_override_mouse_cursor
32
32
  abi_def :px_to_crd, :map_pixel_to_coords, [Integer, Integer] => [Float, Float]
33
33
  abi_def :crd_to_px, :map_coords_to_pixel, [Float, Float] => [Float, Float]
34
+ abi_attr :keyboard_navigation?, Boolean, :keyboard_navigation_enabled
34
35
  abi_signal :on_view_change, ViewSignal
35
36
 
36
37
  end
@@ -0,0 +1,40 @@
1
+ require_relative 'clickable_widget'
2
+
3
+ module Tgui
4
+ class Canvas < ClickableWidget
5
+
6
+ class Draw < WidgetLike
7
+
8
+ def! :fill do |*color|
9
+ host._abi_clear host.abi_pack(Color, *color)
10
+ end
11
+
12
+ def! :rectangle do |**na, &b|
13
+ shape = RectangleShape.new.send! **na, &b
14
+ host._abi_draw shape
15
+ end
16
+
17
+ def! :circle do |**na, &b|
18
+ shape = CircleShape.new.send! **na, &b
19
+ host._abi_draw shape
20
+ end
21
+
22
+ def! :convex do |**na, &b|
23
+ shape = ConvexShape.new.send! **na, &b
24
+ host._abi_draw shape
25
+ end
26
+
27
+ def! :text do |**na, &b|
28
+ text = Text.new.send! **na, &b
29
+ host._abi_draw text
30
+ end
31
+
32
+ end
33
+
34
+ def! :draw do |&b|
35
+ Draw.new(self, nil).send! &b
36
+ _abi_display
37
+ end
38
+
39
+ end
40
+ end
@@ -44,7 +44,7 @@ module Tgui
44
44
  _abi_add_line abi_pack_string(text), abi_pack(Color, color), abi_pack(TextStyles, *style)
45
45
  line = Line.new self, objects.size
46
46
  objects << object
47
- upon! line, **na, &b
47
+ line.send! **na, &b
48
48
  end
49
49
 
50
50
  def [](index)
@@ -28,7 +28,7 @@ module Tgui
28
28
  class SignalClosing < Tgui::Signal
29
29
  def block_caller &b
30
30
  Fiddle::Closure::BlockCaller.new(0, [Fiddle::TYPE_VOIDP]) do |ptr|
31
- @widget.page.upon! @widget do
31
+ @widget.send! do
32
32
  b.(ptr, @widget)
33
33
  end
34
34
  end
@@ -21,6 +21,9 @@ module Tgui
21
21
  return arg
22
22
  when String
23
23
  r, g, b, a = *tones_from_string(arg)
24
+ when :random
25
+ r, g, b = 5.times.map{ rand 255 }
26
+ a = 255
24
27
  when Symbol
25
28
  r, g, b, a = *PREDEFINED_COLORS[arg]
26
29
  when Numeric
@@ -61,12 +64,12 @@ module Tgui
61
64
  Color.new *Color.hsv_to_rgb(h, s, (v - shadow).clamp(0, 255)), alpha
62
65
  end
63
66
 
64
- def to_a
67
+ def to_arr
65
68
  [red, green, blue, alpha]
66
69
  end
67
70
 
68
71
  def to_s
69
- "##{to_a.map{ _1.to_s(16).ljust(2, '0') }.join}"
72
+ "##{to_arr.map{ _1.to_s(16).ljust(2, '0') }.join}"
70
73
  end
71
74
 
72
75
  def inspect
@@ -37,7 +37,7 @@ module Tgui
37
37
  def block_caller &b
38
38
  Fiddle::Closure::BlockCaller.new(0, [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP]) do |str1, str2|
39
39
  id = @widget.abi_unpack_string(str2)
40
- @widget.page.upon! @widget do
40
+ @widget.send! do
41
41
  b.(@widget.self_get_object_by_id(id), @widget)
42
42
  end
43
43
  end
@@ -99,7 +99,7 @@ module Tgui
99
99
  _abi_add_item abi_pack_string(text), abi_pack_string(id)
100
100
  item = Item.new self, id
101
101
  self_objects[id] = object
102
- upon! item, **na, &b
102
+ item.send! **na, &b
103
103
  end
104
104
 
105
105
  def selected
@@ -19,7 +19,7 @@ module Tgui
19
19
  abi_def :remove, Widget => nil
20
20
 
21
21
  def move_front widget, ceil = false
22
- widget = abi_pack_widget widget
22
+ widget = abi_pack(Widget, widget)
23
23
  if ceil
24
24
  _abi_move_widget_to_front widget
25
25
  else
@@ -28,7 +28,7 @@ module Tgui
28
28
  end
29
29
 
30
30
  def move_back widget, floor = false
31
- widget = abi_pack_widget widget
31
+ widget = abi_pack(Widget, widget)
32
32
  if floor
33
33
  _abi_move_widget_to_back widget
34
34
  else
@@ -37,13 +37,21 @@ module Tgui
37
37
  end
38
38
 
39
39
  def move_at index, widget
40
- _abi_set_widget_index abi_pack_widget(widget), abi_pack_integer(index)
40
+ _abi_set_widget_index abi_pack(Widget, widget), abi_pack_integer(index)
41
41
  end
42
42
 
43
43
  abi_def :index, :get_widget_, Widget => Integer
44
44
  abi_def :focused_child, :get_, nil => Widget
45
45
  abi_def :focused_leaf, :get_, nil => Widget
46
- abi_def :leaf_at_position, :get_widget_at_position, [Float, Float] => Widget
46
+
47
+ def leaf_at_position x, y
48
+ abi_unpack(Widget, _abi_get_widget_at_pos(api_pack_float(x), abi_pack_float(y), abi_pack_boolean(true)))
49
+ end
50
+
51
+ def child_at_position x, y
52
+ abi_unpack(Widget, _abi_get_widget_at_pos(api_pack_float(x), abi_pack_float(y), abi_pack_boolean(false)))
53
+ end
54
+
47
55
  abi_def :focus_next, :focus_next_widget
48
56
  abi_def :focus_previous, :focus_previous_widget
49
57
 
@@ -66,21 +74,19 @@ module Tgui
66
74
 
67
75
  # internal
68
76
 
69
- def abi_pack_widget o
77
+
78
+ abi_packer Widget do |o|
79
+ o = o.first if o.is_a? Array
70
80
  case o
71
81
  when Symbol
72
82
  self[o]
73
83
  when Widget
74
84
  o
75
85
  else
76
- raise "Unable to make Widget from #{o}"
86
+ raise "Unable to make Widget from #{o}(#{o.class})"
77
87
  end
78
88
  end
79
-
80
- def abi_unpack_widget o
81
- self_cast_up o
82
- end
83
-
89
+
84
90
  def self_get_widget_name a
85
91
  case a
86
92
  when Widget
@@ -18,6 +18,10 @@ module Tgui
18
18
  end
19
19
  Font.new id
20
20
  end
21
-
21
+
22
+ def self.default
23
+ Font.new pointer: _abi_get_global_font
24
+ end
25
+
22
26
  end
23
27
  end
@@ -84,9 +84,9 @@ module Tgui
84
84
 
85
85
  def add widget, id
86
86
  super
87
- _abi_set_widget_cell abi_pack_widget(widget), *cell
88
- _abi_set_widget_alignment abi_pack_widget(widget), abi_pack(Alignment, alignment) if alignment
89
- _abi_set_widget_padding abi_pack_widget(widget), abi_pack(Outline, *padding) if padding
87
+ _abi_set_widget_cell abi_pack(Widget, widget), *cell
88
+ _abi_set_widget_alignment abi_pack(Widget, widget), abi_pack(Alignment, alignment) if alignment
89
+ _abi_set_widget_padding abi_pack(Widget, widget), abi_pack(Outline, *padding) if padding
90
90
  if direction == :column
91
91
  next_column false
92
92
  else