white_gold 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) 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/enum.rb +1 -1
  5. data/lib/white_gold/abi/extern_object.rb +6 -1
  6. data/lib/white_gold/abi/interface/interface.rb +3 -7
  7. data/lib/white_gold/abi/unpacker.rb +4 -2
  8. data/lib/white_gold/convention/bang_def.rb +14 -0
  9. data/lib/white_gold/convention/bang_nest.rb +12 -2
  10. data/lib/white_gold/convention/bang_nested_caller.rb +65 -32
  11. data/lib/white_gold/convention/container_widgets.rb +61 -96
  12. data/lib/white_gold/convention/page.rb +28 -4
  13. data/lib/white_gold/convention/theme/boolean_attribute.rb +11 -9
  14. data/lib/white_gold/convention/theme/color_attribute.rb +11 -9
  15. data/lib/white_gold/convention/theme/float_attribute.rb +11 -9
  16. data/lib/white_gold/convention/theme/outline_attribute.rb +11 -9
  17. data/lib/white_gold/convention/theme/text_styles_attribute.rb +16 -9
  18. data/lib/white_gold/convention/theme/texture_attribute.rb +14 -12
  19. data/lib/white_gold/convention/theme/theme_attributed.rb +1 -1
  20. data/lib/white_gold/convention/theme/theme_component.rb +1 -1
  21. data/lib/white_gold/convention/theme_attributes.rb +6 -2
  22. data/lib/white_gold/convention/tree_node.rb +43 -0
  23. data/lib/white_gold/convention/widget/keyboard_control.rb +30 -0
  24. data/lib/white_gold/convention/widget_class_aliases.rb +24 -0
  25. data/lib/white_gold/convention/widget_like.rb +0 -6
  26. data/lib/white_gold/dsl/backend_gui.rb +1 -0
  27. data/lib/white_gold/dsl/canvas.rb +40 -0
  28. data/lib/white_gold/dsl/chat_box.rb +1 -1
  29. data/lib/white_gold/dsl/child_window.rb +1 -1
  30. data/lib/white_gold/dsl/color.rb +9 -4
  31. data/lib/white_gold/dsl/combo_box.rb +2 -2
  32. data/lib/white_gold/dsl/container.rb +18 -12
  33. data/lib/white_gold/dsl/custom_widget.rb +28 -0
  34. data/lib/white_gold/dsl/font.rb +5 -1
  35. data/lib/white_gold/dsl/grid.rb +37 -13
  36. data/lib/white_gold/dsl/gui.rb +10 -1
  37. data/lib/white_gold/dsl/label.rb +3 -0
  38. data/lib/white_gold/dsl/list_box.rb +7 -11
  39. data/lib/white_gold/dsl/list_view.rb +6 -6
  40. data/lib/white_gold/dsl/menu_bar.rb +5 -48
  41. data/lib/white_gold/dsl/message_box.rb +3 -3
  42. data/lib/white_gold/dsl/panel.rb +8 -0
  43. data/lib/white_gold/dsl/panel_list_box.rb +12 -3
  44. data/lib/white_gold/dsl/radio_button.rb +15 -2
  45. data/lib/white_gold/dsl/scrollable_panel.rb +7 -0
  46. data/lib/white_gold/dsl/sfml/circle_shape.rb +11 -0
  47. data/lib/white_gold/dsl/sfml/convex_shape.rb +19 -0
  48. data/lib/white_gold/dsl/sfml/rectangle_shape.rb +11 -0
  49. data/lib/white_gold/dsl/sfml/shape.rb +19 -0
  50. data/lib/white_gold/dsl/sfml/text.rb +26 -0
  51. data/lib/white_gold/dsl/signal/global_signal.rb +1 -1
  52. data/lib/white_gold/dsl/signal/signal.rb +1 -1
  53. data/lib/white_gold/dsl/signal/signal_animation_type.rb +1 -1
  54. data/lib/white_gold/dsl/signal/signal_bool.rb +1 -1
  55. data/lib/white_gold/dsl/signal/signal_color.rb +1 -1
  56. data/lib/white_gold/dsl/signal/signal_float.rb +1 -1
  57. data/lib/white_gold/dsl/signal/signal_int.rb +1 -1
  58. data/lib/white_gold/dsl/signal/signal_pointer.rb +1 -1
  59. data/lib/white_gold/dsl/signal/signal_range.rb +1 -1
  60. data/lib/white_gold/dsl/signal/signal_show_effect.rb +1 -1
  61. data/lib/white_gold/dsl/signal/signal_string.rb +1 -1
  62. data/lib/white_gold/dsl/signal/signal_u_int.rb +1 -1
  63. data/lib/white_gold/dsl/signal/signal_vector2f.rb +1 -1
  64. data/lib/white_gold/dsl/tab_container.rb +2 -2
  65. data/lib/white_gold/dsl/tabs.rb +2 -2
  66. data/lib/white_gold/dsl/theme.rb +2 -2
  67. data/lib/white_gold/dsl/toggle_button.rb +3 -0
  68. data/lib/white_gold/dsl/tree_view.rb +21 -33
  69. data/lib/white_gold/dsl/widget.rb +112 -49
  70. data/lib/white_gold/dsl/window.rb +7 -0
  71. data/lib/white_gold/generated/tgui-abi-loader.gf.rb +273 -48
  72. data/lib/white_gold/library/theme/light.rb +8 -1
  73. data/lib/white_gold/master.rb +43 -42
  74. data/lib/white_gold/path/array.path.rb +16 -0
  75. data/lib/white_gold/tgui-abi.rb +48 -38
  76. data/lib/white_gold/version.rb +3 -0
  77. data/lib/white_gold.rb +31 -28
  78. metadata +20 -6
  79. data/lib/white_gold/abi/reducer.rb +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a41be86fed471b6d1a5df24594b8e4eea51175c94227abedc23254fe604242af
4
- data.tar.gz: 1c28e36a0ec7a9b71beecc5003dcac4004656d41bec972c458ad637f85b39d68
3
+ metadata.gz: 2ef8367abb4fbdbbcab9b6fb824a8660bbe43e60ff818dfb4838205a1ff4c97c
4
+ data.tar.gz: ffda1d2acecfd09228b7650cf08142d7c5bdb8efc5113e33dd66b2a111be887a
5
5
  SHA512:
6
- metadata.gz: 2d03d3ea86908238aab6fd22217530162f7f120bce1a3020be5255aa1f5dcb3d1a9cd635e327c71a8f5876b28261296e93c2a75fcb44a3cb4ba2e13e1feae9c3
7
- data.tar.gz: ef710195d005845169be0a51dedba2ea1fd390a8b2eb23a08c3f458c377b75088d47d2f8a0792e3b62b1dc795a9423bef57ad7ecf7cff6e982df8a4d7f885dea
6
+ metadata.gz: b201a718db038a62788d2e3a89e51adb692fee0667c79037ae331c97f18f4b4756a02048ae82b7fb33204ab423b02088406b7f4e62b76ee849ff5f59c0113182
7
+ data.tar.gz: af5a2ee75a76096a46bd4c6d0b8f28058ca45eb04d1e213c2d686822be1a109d4bded3eddcfca902d0a18d032ba0f4c3ec07c3bb111c40567dad63206e22482c
data/ext/dll/tgui.dll CHANGED
Binary file
data/ext/so/libtgui.so CHANGED
Binary file
@@ -22,7 +22,7 @@ class Enum
22
22
  end
23
23
 
24
24
  def pack *k
25
- k.map{ @symbol_to_int[_1] }.reduce(0, &:|)
25
+ k.map{ sym_to_i _1 }.reduce(0, &:|)
26
26
  end
27
27
 
28
28
  def unpack m
@@ -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
@@ -1,5 +1,3 @@
1
- require_relative '../reducer'
2
-
3
1
  module Interface
4
2
 
5
3
  def self.abi_const_string_method_suffix str
@@ -8,17 +6,15 @@ module Interface
8
6
 
9
7
  def self.parse_packer packer
10
8
  case packer
11
- when Proc, Reducer
9
+ when Proc
12
10
  packer
13
11
  when Array
14
12
  packers = packer.map{ parse_packer _1 }
15
13
  proc do |host, *a|
16
- ai = a.each
17
- packers.map do |packer|
14
+ packers.zip(a).map do |packer, arg|
18
15
  case packer
19
- when Proc then packer.call host, *ai.next
16
+ when Proc then packer.call host, *arg
20
17
  when nil then ai.next
21
- when Reducer then packer.call host, *(0..packer.reduction).map{ ai.next }
22
18
  else packer
23
19
  end
24
20
  end.flatten
@@ -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
@@ -1,5 +1,19 @@
1
+ require_relative 'bang_nested_caller'
2
+
1
3
  module BangDef
2
4
  def def! name, &b
3
5
  define_method "api_bang_#{name}", &b
4
6
  end
7
+
8
+ @@redef_index = 0
9
+
10
+ def redef! name, &b
11
+ @@redef_index = index = @@redef_index.next
12
+ old = "api_bang_#{index}_#{name}"
13
+ news = "api_bang_#{name}"
14
+ alias_method old, news
15
+ define_method news do |*a, **na, &bl|
16
+ b.call old, *a, **na, &bl
17
+ end
18
+ end
5
19
  end
@@ -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 host! *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,81 @@
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
2
+ API_BANG_PREFIX = "api_bang_".freeze
5
3
 
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)
4
+ @@bang_stack = []
5
+ @@bang_roots = []
8
6
 
9
- api_name = "api_bang_#{name[...-1]}".to_sym
10
- return send(api_name, *a, **na, &b) if respond_to? api_name
7
+ class << self
8
+ def stack
9
+ @@bang_stack
10
+ end
11
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)
12
+ def roots
13
+ @@bang_roots
18
14
  end
19
15
 
20
- no_method_error = NoMethodError.new("undefined bang nested method `#{name}` for #{bang_object_stack.map(&:class).join("/")}")
21
- raise no_method_error
16
+ def current root
17
+ @@bang_roots.include?(root) ? @@bang_stack.last : root
18
+ end
19
+
20
+ def push object
21
+ @@bang_stack.push object
22
+ end
23
+
24
+ def pop
25
+ @@bang_stack.pop
26
+ end
27
+
28
+ def open_scope object
29
+ @@bang_roots << object
30
+ end
31
+
32
+ def close_scope object
33
+ @@bang_roots.delete_at @@bang_roots.index(object)
34
+ end
22
35
  end
23
36
 
24
37
  def self!
25
- @bang_target&.respond_to?(:self!) ? @bang_target.self! : self
38
+ BangNestedCaller.current self
26
39
  end
27
40
 
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
41
+ def bang_respond_to? name
42
+ top = BangNestedCaller.current self
43
+ top.respond_to?("#{name}=") || top.respond_to?("#{API_BANG_PREFIX}#{name}")
34
44
  end
35
45
 
36
-
37
- def upon! item, **na, &b
38
- na.each do |k, v|
39
- item.send("#{k}=", v)
40
- end
41
- if b
42
- @bang_target, original_bang_target = item, @bang_target
43
- b.call item
44
- @bang_target = original_bang_target
46
+ def bang_method_missing name, *a, **na, &b
47
+ top = BangNestedCaller.current self
48
+ api_bang_name = "#{API_BANG_PREFIX}#{name}".to_sym
49
+ return top.send(api_bang_name, *a, **na, &b) if top.respond_to? api_bang_name
50
+ setter = "#{name}=".to_sym
51
+ if top.respond_to? setter
52
+ return top.send(setter, a) if !a.empty?
53
+ return top.send(setter, na) if !na.empty?
54
+ return top.send(setter, b) if block_given?
55
+ return top.send(setter)
45
56
  end
46
- item
57
+ no_method_error = NoMethodError.new("bang method missing `#{name}!` for #{top.class}")
58
+ raise no_method_error
59
+ end
60
+
61
+ def send! method, *a, **na, &b
62
+ send "api_bang_#{method}", *a, **na, &b
63
+ end
64
+
65
+ def host! &b
66
+ return self if !b
67
+ BangNestedCaller.push self
68
+ result = b.call self
69
+ BangNestedCaller.pop
70
+ result
71
+ end
72
+
73
+ def scope! scoped = nil, *a, **na, &b
74
+ scoped ||= self
75
+ BangNestedCaller.open_scope self
76
+ scoped.host! *a, **na, &b
77
+ BangNestedCaller.close_scope self
78
+ scoped
47
79
  end
80
+
48
81
  end
@@ -2,88 +2,68 @@ 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
- chatbox: Tgui::ChatBox,
9
- checkbox: Tgui::CheckBox,
8
+ canvas: Tgui::Canvas,
9
+ chatbox: Tgui::Chatbox,
10
+ checkbox: Tgui::Checkbox,
10
11
  child_window: Tgui::ChildWindow,
11
12
  color_picker: Tgui::ColorPicker,
12
- combobox: Tgui::ComboBox,
13
- editbox: Tgui::EditBox,
13
+ combobox: Tgui::Combobox,
14
+ editbox: Tgui::Editbox,
14
15
  file_dialog: Tgui::FileDialog,
15
16
  grid: Tgui::Grid,
16
17
  group: Tgui::Group,
17
- hola: Tgui::HorizontalLayout,
18
- howr: Tgui::HorizontalWrap,
18
+ hlayout: Tgui::Hlayout,
19
+ hwrap: Tgui::Hwrap,
19
20
  knob: Tgui::Knob,
20
21
  label: Tgui::Label,
21
- listbox: Tgui::ListBox,
22
- listview: Tgui::ListView,
23
- menu: Tgui::MenuBar,
24
- messagebox: Tgui::MessageBox,
22
+ listbox: Tgui::Listbox,
23
+ listview: Tgui::Listview,
24
+ menu: Tgui::Menu,
25
25
  panel: Tgui::Panel,
26
- panel_listbox: Tgui::PanelListBox,
27
- panel_tabs: Tgui::TabContainer,
28
- picture: false,
29
- progressbar: Tgui::ProgressBar,
30
- radio: false,
31
- radio_button: Tgui::RadioButton,
32
- radio_button_group: Tgui::RadioButtonGroup,
26
+ panel_listbox: Tgui::PanelListbox,
27
+ panel_tabs: Tgui::PanelTabs,
28
+ progressbar: Tgui::Progressbar,
29
+ radio: Tgui::RadioButton,
30
+ radio_group: Tgui::RadioGroup,
33
31
  range_slider: Tgui::RangeSlider,
34
- fancy_label: Tgui::RichTextLabel,
32
+ fancy_label: Tgui::FancyLabel,
35
33
  scrollbar: Tgui::Scrollbar,
36
- separator: Tgui::SeparatorLine,
34
+ separator: Tgui::Separator,
37
35
  slider: Tgui::Slider,
38
- spin_button: Tgui::SpinButton,
39
- spin_control: Tgui::SpinControl,
36
+ spinner: Tgui::Spinner,
37
+ spinbox: Tgui::Spinbox,
40
38
  tabs: Tgui::Tabs,
41
- textarea: Tgui::TextArea,
39
+ textarea: Tgui::Textarea,
42
40
  toggle_button: Tgui::ToggleButton,
43
- treeview: Tgui::TreeView,
44
- vela: Tgui::VerticalLayout,
41
+ treeview: Tgui::Treeview,
42
+ vlayout: Tgui::Vlayout,
45
43
  }.freeze
46
44
 
45
+ UNORDINARY_WIDGETS = {
46
+ messagebox: Tgui::Messagebox,
47
+ picture: Tgui::Picture,
48
+ keyboard_control: Tgui::KeyboardControl
49
+ }
50
+
51
+ def self.widget_set
52
+ {}.merge ORDINARY_WIDGETS, UNORDINARY_WIDGETS
53
+ end
54
+
47
55
  module WidgetOwner
48
56
  extend BangDef
49
57
 
50
- def common_widget_nest widget, *keys, id: nil, **na, &b
51
- club_params = {}
52
- Enumerator.new do |e|
53
- cl = widget.class
54
- while cl != Object
55
- e << cl
56
- cl = cl.superclass
57
- end
58
- e << Object
59
- end.to_a.reverse!.each do |key|
60
- if key == widget.class
61
- club = page.club key
62
- club.join id if id
63
- else
64
- club = page.club key, create_on_missing: false
65
- end
66
- club_params.merge! club.params if club
67
- end
68
-
69
- keys.each do |key|
70
- club = page.club key
71
- club.join id if id
72
- club_params.merge! club.params
73
- end
74
-
75
- upon! widget, **club_params, **na, &b
76
- end
77
-
78
- def child_methods
58
+ def self_child_methods
79
59
  ## TO OPTIMIZE
80
60
  methods.filter{ _1.start_with? ApiChild::API_CHILD_PREFIX }
81
61
  end
82
62
 
83
- def equip_child_widget widget
63
+ def self_equip_widget widget
84
64
  widget.page = page
85
65
  parent = self
86
- child_methods.each do |method|
66
+ self_child_methods.each do |method|
87
67
  widget.define_singleton_method method[ApiChild::API_CHILD_PREFIX.length..] do |*a|
88
68
  parent.send(method, self, *a)
89
69
  end
@@ -91,11 +71,11 @@ module Tgui
91
71
  widget
92
72
  end
93
73
 
94
- WIDGETS_COLLECTION.each do |m, c|
95
- if c
96
- def! m do |*a, **na, &b|
97
- common_widget_post_initialize equip_child_widget(c.new), *a, **na, &b
98
- end
74
+ ORDINARY_WIDGETS.each do |m, c|
75
+ def! m do |*a, **na, &b|
76
+ widget = c.new
77
+ add! widget
78
+ scope! widget, *a, **na, &b
99
79
  end
100
80
  end
101
81
 
@@ -110,35 +90,23 @@ module Tgui
110
90
  )
111
91
  transparent = na[:transparent] || false
112
92
  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
93
+ add! pic
94
+ scope! pic, *a, **na.except(:url, :part_rect, :smooth, :transparent), &b
115
95
  end
116
96
 
117
- def! :radio do |object, *a, **na, &b|
118
- radio = RadioButton.new
119
- equip_child_widget radio
120
- radio.object = object
121
- na[:text] ||= object.to_s
122
- common_widget_post_initialize radio, *a, **na, &b
123
- end
124
-
125
- def! :msg do |text, **buttons|
126
- buttons["OK"] = nil if buttons.empty?
127
- api_bang_message_box text:, position: :center, label_alignment: :center, buttons: (buttons.map do |k, v|
128
- procedure = proc do |o, b, w|
129
- v&.call
130
- w.close true
131
- end
132
- [k, procedure]
133
- end)
134
- end
135
-
136
- @@auto_button_name = "Button0"
97
+ @@auto_btn_name = "Button0"
137
98
 
138
99
  def! :btn do |text = nil, **na, &on_press|
139
- text = @@auto_button_name = @@auto_button_name.next if !text
100
+ text = @@auto_btn_name = @@auto_btn_name.next if !text
140
101
  api_bang_button text:, on_press:, **na
141
102
  end
103
+
104
+ def! :keyboard_control do |*a, focus: true, **na, &b|
105
+ keyboard_control = KeyboardControl.new
106
+ add! keyboard_control
107
+ keyboard_control.focus! if focus
108
+ scope! keyboard_control, *a, **na, &b
109
+ end
142
110
  end
143
111
 
144
112
  class Container
@@ -146,22 +114,19 @@ module Tgui
146
114
 
147
115
  @@auto_widget_id = "@/"
148
116
 
149
- def common_widget_post_initialize widget, *keys, **na, &b
117
+ def! :add do |widget|
118
+ self_equip_widget widget
150
119
  @@auto_widget_id = id = @@auto_widget_id.next
151
- add widget, id
152
- common_widget_nest widget, *keys, id:, **na, &b
120
+ self_add widget, id
153
121
  end
154
-
155
122
  end
156
123
 
157
124
  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
125
+
126
+ def self_add widget, name
127
+ raise NoMethodError.new("Widget can't be added to TabContainer directly. Add it to TabContainer panel instead.")
164
128
  end
129
+
165
130
  end
166
131
 
167
132
  class ToolTip
@@ -169,9 +134,9 @@ module Tgui
169
134
 
170
135
  attr :widget
171
136
 
172
- def common_widget_post_initialize widget, *keys, **na, &b
137
+ def! :add do |widget, *keys, **na, &b|
173
138
  @widget = widget
174
- common_widget_nest widget, *keys, **na, &b
139
+ scope! widget, *keys, **na, &b
175
140
  end
176
141
  end
177
142
 
@@ -1,6 +1,6 @@
1
1
  require_relative "club"
2
2
 
3
- class Page < Tgui::Group
3
+ class Page < Tgui::Panel
4
4
 
5
5
  def initialize tgui
6
6
  super()
@@ -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
83
- load Tgui::Theme.loadpath(seed)
100
+ scope! theme do
101
+ eval File.read(Tgui::Theme.loadpath(seed))
84
102
  end
85
103
  end
86
- upon! theme, **na, &b
104
+ scope! theme, **na, &b
87
105
  theme.self_commit @custom_renderers
88
106
  end
89
107
 
@@ -93,4 +111,10 @@ class Page < Tgui::Group
93
111
  theme.source = path
94
112
  theme.self_commit @custom_renderers
95
113
  end
114
+
115
+ def! :messagebox do |*a, **na, &b|
116
+ messagebox = MessageBox.new
117
+ add! messagebox
118
+ scope! messagebox, *a, **na, &b
119
+ end
96
120
  end
@@ -1,13 +1,15 @@
1
- class BooleanAttribute
2
- def initialize name, value
3
- @name = name
4
- @value = value[0]
5
- end
1
+ module Tgui
2
+ class BooleanAttribute
3
+ def initialize name, value
4
+ @name = name
5
+ @value = value[0]
6
+ end
6
7
 
7
- attr :name
8
- attr :value
8
+ attr :name
9
+ attr :value
9
10
 
10
- def to_theme
11
- "#{name} = #{value};"
11
+ def to_theme
12
+ "#{name} = #{value};"
13
+ end
12
14
  end
13
15
  end
@@ -1,15 +1,17 @@
1
1
  require_relative '../../dsl/color'
2
2
 
3
- class ColorAttribute
4
- def initialize name, value
5
- @name = name
6
- @value = Color.from *value
7
- end
3
+ module Tgui
4
+ class ColorAttribute
5
+ def initialize name, value
6
+ @name = name
7
+ @value = Color.from *value
8
+ end
8
9
 
9
- attr :name
10
- attr :value
10
+ attr :name
11
+ attr :value
11
12
 
12
- def to_theme
13
- "#{name} = #{value.to_s};"
13
+ def to_theme
14
+ "#{name} = #{value.to_s};"
15
+ end
14
16
  end
15
17
  end
@@ -1,13 +1,15 @@
1
- class FloatAttribute
2
- def initialize name, value
3
- @name = name
4
- @value = value[0]
5
- end
1
+ module Tgui
2
+ class FloatAttribute
3
+ def initialize name, value
4
+ @name = name
5
+ @value = value[0]
6
+ end
6
7
 
7
- attr :name
8
- attr :value
8
+ attr :name
9
+ attr :value
9
10
 
10
- def to_theme
11
- "#{name} = #{value};"
11
+ def to_theme
12
+ "#{name} = #{value};"
13
+ end
12
14
  end
13
15
  end
@@ -1,15 +1,17 @@
1
1
  require_relative '../../dsl/outline'
2
2
 
3
- class OutlineAttribute
4
- def initialize name, value
5
- @name = name
6
- @value = Outline.from *value
7
- end
3
+ module Tgui
4
+ class OutlineAttribute
5
+ def initialize name, value
6
+ @name = name
7
+ @value = Outline.from *value
8
+ end
8
9
 
9
- attr :name
10
- attr :value
10
+ attr :name
11
+ attr :value
11
12
 
12
- def to_theme
13
- "#{name} = #{value.to_s};"
13
+ def to_theme
14
+ "#{name} = #{value.to_s};"
15
+ end
14
16
  end
15
17
  end