white_gold 0.0.2 → 0.0.4

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