white_gold 0.0.2 → 0.0.3

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 (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