white_gold 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) 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/interface/interface.rb +3 -7
  6. data/lib/white_gold/convention/bang_def.rb +14 -0
  7. data/lib/white_gold/convention/bang_nest.rb +1 -1
  8. data/lib/white_gold/convention/bang_nested_caller.rb +55 -22
  9. data/lib/white_gold/convention/container_widgets.rb +46 -86
  10. data/lib/white_gold/convention/page.rb +10 -4
  11. data/lib/white_gold/convention/theme/boolean_attribute.rb +11 -9
  12. data/lib/white_gold/convention/theme/color_attribute.rb +11 -9
  13. data/lib/white_gold/convention/theme/float_attribute.rb +11 -9
  14. data/lib/white_gold/convention/theme/outline_attribute.rb +11 -9
  15. data/lib/white_gold/convention/theme/text_styles_attribute.rb +14 -12
  16. data/lib/white_gold/convention/theme/texture_attribute.rb +14 -12
  17. data/lib/white_gold/convention/theme/theme_attributed.rb +1 -1
  18. data/lib/white_gold/convention/theme/theme_component.rb +1 -1
  19. data/lib/white_gold/convention/theme_attributes.rb +6 -2
  20. data/lib/white_gold/convention/widget/keyboard_control.rb +30 -0
  21. data/lib/white_gold/convention/widget_class_aliases.rb +24 -0
  22. data/lib/white_gold/dsl/canvas.rb +5 -5
  23. data/lib/white_gold/dsl/chat_box.rb +1 -1
  24. data/lib/white_gold/dsl/child_window.rb +1 -1
  25. data/lib/white_gold/dsl/color.rb +4 -2
  26. data/lib/white_gold/dsl/combo_box.rb +2 -2
  27. data/lib/white_gold/dsl/container.rb +1 -1
  28. data/lib/white_gold/dsl/custom_widget.rb +28 -0
  29. data/lib/white_gold/dsl/grid.rb +34 -10
  30. data/lib/white_gold/dsl/gui.rb +10 -1
  31. data/lib/white_gold/dsl/label.rb +3 -0
  32. data/lib/white_gold/dsl/list_box.rb +2 -2
  33. data/lib/white_gold/dsl/list_view.rb +6 -6
  34. data/lib/white_gold/dsl/menu_bar.rb +4 -4
  35. data/lib/white_gold/dsl/message_box.rb +3 -3
  36. data/lib/white_gold/dsl/panel.rb +8 -0
  37. data/lib/white_gold/dsl/panel_list_box.rb +12 -3
  38. data/lib/white_gold/dsl/radio_button.rb +15 -2
  39. data/lib/white_gold/dsl/scrollable_panel.rb +7 -0
  40. data/lib/white_gold/dsl/sfml/circle_shape.rb +4 -0
  41. data/lib/white_gold/dsl/sfml/convex_shape.rb +4 -0
  42. data/lib/white_gold/dsl/sfml/rectangle_shape.rb +4 -0
  43. data/lib/white_gold/dsl/sfml/text.rb +4 -0
  44. data/lib/white_gold/dsl/signal/global_signal.rb +1 -1
  45. data/lib/white_gold/dsl/signal/signal.rb +1 -1
  46. data/lib/white_gold/dsl/signal/signal_animation_type.rb +1 -1
  47. data/lib/white_gold/dsl/signal/signal_bool.rb +1 -1
  48. data/lib/white_gold/dsl/signal/signal_color.rb +1 -1
  49. data/lib/white_gold/dsl/signal/signal_float.rb +1 -1
  50. data/lib/white_gold/dsl/signal/signal_int.rb +1 -1
  51. data/lib/white_gold/dsl/signal/signal_pointer.rb +1 -1
  52. data/lib/white_gold/dsl/signal/signal_range.rb +1 -1
  53. data/lib/white_gold/dsl/signal/signal_show_effect.rb +1 -1
  54. data/lib/white_gold/dsl/signal/signal_string.rb +1 -1
  55. data/lib/white_gold/dsl/signal/signal_u_int.rb +1 -1
  56. data/lib/white_gold/dsl/signal/signal_vector2f.rb +1 -1
  57. data/lib/white_gold/dsl/tab_container.rb +2 -2
  58. data/lib/white_gold/dsl/tabs.rb +2 -2
  59. data/lib/white_gold/dsl/theme.rb +2 -2
  60. data/lib/white_gold/dsl/toggle_button.rb +3 -0
  61. data/lib/white_gold/dsl/tree_view.rb +2 -2
  62. data/lib/white_gold/dsl/widget.rb +53 -23
  63. data/lib/white_gold/dsl/window.rb +7 -0
  64. data/lib/white_gold/generated/tgui-abi-loader.gf.rb +76 -1
  65. data/lib/white_gold/library/theme/light.rb +8 -1
  66. data/lib/white_gold/master.rb +30 -10
  67. data/lib/white_gold/path/array.path.rb +16 -0
  68. data/lib/white_gold/tgui-abi.rb +32 -22
  69. data/lib/white_gold/version.rb +1 -1
  70. data/lib/white_gold.rb +3 -1
  71. metadata +6 -3
  72. data/lib/white_gold/abi/reducer.rb +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6727469d73967f049141a5c7b128bfb88b5c18cb128ce7b00417e7f889648138
4
- data.tar.gz: f30fed9fdbfc915eb0fb70fded0aabe9593991037af91253427d59b22f053913
3
+ metadata.gz: 2ef8367abb4fbdbbcab9b6fb824a8660bbe43e60ff818dfb4838205a1ff4c97c
4
+ data.tar.gz: ffda1d2acecfd09228b7650cf08142d7c5bdb8efc5113e33dd66b2a111be887a
5
5
  SHA512:
6
- metadata.gz: c9373c37d6ccbbb45b973b55c92dd924ec9bc9511ee4a5b1e244859f956f9133d767b30874255535b3fd715d396fb5b96787076014fcfdd5354005973631ac7e
7
- data.tar.gz: 240acb40c4ef8d00788e704c40eff66c93535b20d57c3973c9a04e50c18e7dae3c3fc808a1f63308700eb11efe4458dcc970033b385f922e38d72ea53e9c88f0
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
@@ -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
@@ -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
@@ -14,7 +14,7 @@ module BangNest
14
14
  end
15
15
  end
16
16
 
17
- def send! *a, **na, &b
17
+ def host! *a, **na, &b
18
18
  a.each do |k|
19
19
  send("#{k}=", true)
20
20
  end
@@ -1,19 +1,51 @@
1
1
  module BangNestedCaller
2
+ API_BANG_PREFIX = "api_bang_".freeze
2
3
 
3
4
  @@bang_stack = []
5
+ @@bang_roots = []
6
+
7
+ class << self
8
+ def stack
9
+ @@bang_stack
10
+ end
11
+
12
+ def roots
13
+ @@bang_roots
14
+ end
15
+
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
35
+ end
4
36
 
5
37
  def self!
6
- @@bang_stack.last
38
+ BangNestedCaller.current self
7
39
  end
8
40
 
9
41
  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}")
42
+ top = BangNestedCaller.current self
43
+ top.respond_to?("#{name}=") || top.respond_to?("#{API_BANG_PREFIX}#{name}")
12
44
  end
13
45
 
14
- def bang_send name, *a, **na, &b
15
- top = @@bang_stack.last
16
- api_bang_name = "api_bang_#{name}".to_sym
46
+ def bang_method_missing name, *a, **na, &b
47
+ top = BangNestedCaller.current self
48
+ api_bang_name = "#{API_BANG_PREFIX}#{name}".to_sym
17
49
  return top.send(api_bang_name, *a, **na, &b) if top.respond_to? api_bang_name
18
50
  setter = "#{name}=".to_sym
19
51
  if top.respond_to? setter
@@ -26,23 +58,24 @@ module BangNestedCaller
26
58
  raise no_method_error
27
59
  end
28
60
 
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
37
- end
61
+ def send! method, *a, **na, &b
62
+ send "api_bang_#{method}", *a, **na, &b
38
63
  end
39
64
 
40
- def send! &b
41
- if b
42
- @@bang_stack.push self
43
- b.call self
44
- @@bang_stack.pop
45
- end
46
- self
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
@@ -6,45 +6,46 @@ module Tgui
6
6
  bitmap_button: Tgui::BitmapButton,
7
7
  button: Tgui::Button,
8
8
  canvas: Tgui::Canvas,
9
- chatbox: Tgui::ChatBox,
10
- checkbox: Tgui::CheckBox,
9
+ chatbox: Tgui::Chatbox,
10
+ checkbox: Tgui::Checkbox,
11
11
  child_window: Tgui::ChildWindow,
12
12
  color_picker: Tgui::ColorPicker,
13
- combobox: Tgui::ComboBox,
14
- editbox: Tgui::EditBox,
13
+ combobox: Tgui::Combobox,
14
+ editbox: Tgui::Editbox,
15
15
  file_dialog: Tgui::FileDialog,
16
16
  grid: Tgui::Grid,
17
17
  group: Tgui::Group,
18
- hola: Tgui::HorizontalLayout,
19
- howr: Tgui::HorizontalWrap,
18
+ hlayout: Tgui::Hlayout,
19
+ hwrap: Tgui::Hwrap,
20
20
  knob: Tgui::Knob,
21
21
  label: Tgui::Label,
22
- listbox: Tgui::ListBox,
23
- listview: Tgui::ListView,
24
- menu: Tgui::MenuBar,
25
- messagebox: Tgui::MessageBox,
22
+ listbox: Tgui::Listbox,
23
+ listview: Tgui::Listview,
24
+ menu: Tgui::Menu,
26
25
  panel: Tgui::Panel,
27
- panel_listbox: Tgui::PanelListBox,
28
- panel_tabs: Tgui::TabContainer,
29
- progressbar: Tgui::ProgressBar,
30
- radio_button: Tgui::RadioButton,
31
- 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,
32
31
  range_slider: Tgui::RangeSlider,
33
- fancy_label: Tgui::RichTextLabel,
32
+ fancy_label: Tgui::FancyLabel,
34
33
  scrollbar: Tgui::Scrollbar,
35
- separator: Tgui::SeparatorLine,
34
+ separator: Tgui::Separator,
36
35
  slider: Tgui::Slider,
37
- spin_button: Tgui::SpinButton,
38
- spin_control: Tgui::SpinControl,
36
+ spinner: Tgui::Spinner,
37
+ spinbox: Tgui::Spinbox,
39
38
  tabs: Tgui::Tabs,
40
- textarea: Tgui::TextArea,
39
+ textarea: Tgui::Textarea,
41
40
  toggle_button: Tgui::ToggleButton,
42
- treeview: Tgui::TreeView,
43
- vela: Tgui::VerticalLayout,
41
+ treeview: Tgui::Treeview,
42
+ vlayout: Tgui::Vlayout,
44
43
  }.freeze
45
44
 
46
45
  UNORDINARY_WIDGETS = {
47
- picture: Tgui::Picture
46
+ messagebox: Tgui::Messagebox,
47
+ picture: Tgui::Picture,
48
+ keyboard_control: Tgui::KeyboardControl
48
49
  }
49
50
 
50
51
  def self.widget_set
@@ -54,40 +55,12 @@ module Tgui
54
55
  module WidgetOwner
55
56
  extend BangDef
56
57
 
57
- def self_common_widget_nest widget, *keys, id: nil, **na, &b
58
- club_params = {}
59
- Enumerator.new do |e|
60
- cl = widget.class
61
- while cl != Object
62
- e << cl
63
- cl = cl.superclass
64
- end
65
- e << Object
66
- end.to_a.reverse!.each do |key|
67
- if key == widget.class
68
- club = page.club key
69
- club.join id if id
70
- else
71
- club = page.club key, create_on_missing: false
72
- end
73
- club_params.merge! club.params if club
74
- end
75
-
76
- keys.each do |key|
77
- club = page.club key
78
- club.join id if id
79
- club_params.merge! club.params
80
- end
81
-
82
- widget.send! **club_params, **na, &b
83
- end
84
-
85
58
  def self_child_methods
86
59
  ## TO OPTIMIZE
87
60
  methods.filter{ _1.start_with? ApiChild::API_CHILD_PREFIX }
88
61
  end
89
62
 
90
- def self_equip_child_widget widget
63
+ def self_equip_widget widget
91
64
  widget.page = page
92
65
  parent = self
93
66
  self_child_methods.each do |method|
@@ -99,10 +72,10 @@ module Tgui
99
72
  end
100
73
 
101
74
  ORDINARY_WIDGETS.each do |m, c|
102
- if c
103
- def! m do |*a, **na, &b|
104
- self_common_widget_equip self_equip_child_widget(c.new), *a, **na, &b
105
- end
75
+ def! m do |*a, **na, &b|
76
+ widget = c.new
77
+ add! widget
78
+ scope! widget, *a, **na, &b
106
79
  end
107
80
  end
108
81
 
@@ -117,35 +90,23 @@ module Tgui
117
90
  )
118
91
  transparent = na[:transparent] || false
119
92
  pic = Tgui::Picture.new texture, transparent
120
- self_equip_child_widget pic
121
- self_common_widget_equip 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
122
95
  end
123
96
 
124
- def! :radio do |object, *a, **na, &b|
125
- radio = RadioButton.new
126
- self_equip_child_widget radio
127
- radio.object = object
128
- na[:text] ||= object.to_s
129
- self_common_widget_equip radio, *a, **na, &b
130
- end
131
-
132
- def! :msg do |text, **buttons|
133
- buttons["OK"] = nil if buttons.empty?
134
- api_bang_message_box text:, position: :center, label_alignment: :center, buttons: (buttons.map do |k, v|
135
- procedure = proc do |o, b, w|
136
- v&.call
137
- w.close true
138
- end
139
- [k, procedure]
140
- end)
141
- end
142
-
143
- @@auto_button_name = "Button0"
97
+ @@auto_btn_name = "Button0"
144
98
 
145
99
  def! :btn do |text = nil, **na, &on_press|
146
- text = @@auto_button_name = @@auto_button_name.next if !text
100
+ text = @@auto_btn_name = @@auto_btn_name.next if !text
147
101
  api_bang_button text:, on_press:, **na
148
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
149
110
  end
150
111
 
151
112
  class Container
@@ -153,17 +114,16 @@ module Tgui
153
114
 
154
115
  @@auto_widget_id = "@/"
155
116
 
156
- def self_common_widget_equip widget, *keys, **na, &b
117
+ def! :add do |widget|
118
+ self_equip_widget widget
157
119
  @@auto_widget_id = id = @@auto_widget_id.next
158
- add widget, id
159
- self_common_widget_nest widget, *keys, id:, **na, &b
120
+ self_add widget, id
160
121
  end
161
-
162
122
  end
163
123
 
164
124
  class TabContainer
165
125
 
166
- def add widget, name
126
+ def self_add widget, name
167
127
  raise NoMethodError.new("Widget can't be added to TabContainer directly. Add it to TabContainer panel instead.")
168
128
  end
169
129
 
@@ -174,9 +134,9 @@ module Tgui
174
134
 
175
135
  attr :widget
176
136
 
177
- def self_common_widget_equip widget, *keys, **na, &b
137
+ def! :add do |widget, *keys, **na, &b|
178
138
  @widget = widget
179
- self_common_widget_nest widget, *keys, **na, &b
139
+ scope! widget, *keys, **na, &b
180
140
  end
181
141
  end
182
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()
@@ -97,11 +97,11 @@ class Page < Tgui::Group
97
97
  theme = self.theme
98
98
  if seed
99
99
  theme.reset_attributes
100
- theme.send! do
101
- load Tgui::Theme.loadpath(seed)
100
+ scope! theme do
101
+ eval File.read(Tgui::Theme.loadpath(seed))
102
102
  end
103
103
  end
104
- theme.send! **na, &b
104
+ scope! theme, **na, &b
105
105
  theme.self_commit @custom_renderers
106
106
  end
107
107
 
@@ -111,4 +111,10 @@ class Page < Tgui::Group
111
111
  theme.source = path
112
112
  theme.self_commit @custom_renderers
113
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
114
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
@@ -1,18 +1,20 @@
1
1
  require_relative '../../abi/extern_object'
2
2
 
3
- class TextStylesAttribute
4
- def initialize name, value
5
- @name = name
6
- @value = Array(value).map do |style|
7
- raise "Invalid style #{style}" if !ExternObject::TextStyles[style]
8
- style.to_s.upcase
9
- end.join("|")
10
- end
3
+ module Tgui
4
+ class TextStylesAttribute
5
+ def initialize name, value
6
+ @name = name
7
+ @value = Array(value).map do |style|
8
+ raise "Invalid style #{style}" if !ExternObject::TextStyles[style]
9
+ style.to_s.upcase
10
+ end.join("|")
11
+ end
11
12
 
12
- attr :name
13
- attr :value
13
+ attr :name
14
+ attr :value
14
15
 
15
- def to_theme
16
- "#{name} = #{value};"
16
+ def to_theme
17
+ "#{name} = #{value};"
18
+ end
17
19
  end
18
20
  end
@@ -1,19 +1,21 @@
1
1
  require_relative '../../dsl/texture'
2
2
 
3
- class TextureAttribute
4
- def initialize name, value
5
- @name = name
6
- @value = Texture.from *value
7
- end
3
+ module Tgui
4
+ class TextureAttribute
5
+ def initialize name, value
6
+ @name = name
7
+ @value = Texture.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_theme};"
14
- end
13
+ def to_theme
14
+ "#{name} = #{value.to_theme};"
15
+ end
15
16
 
16
- def self.base_class
17
- Texture
17
+ def self.base_class
18
+ Texture
19
+ end
18
20
  end
19
21
  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
- attribute.send! **na, &b
33
+ attribute.host! **na, &b
34
34
  end
35
35
  end
36
36
  end
@@ -26,7 +26,7 @@ module Tgui
26
26
  end
27
27
 
28
28
  def to_theme
29
- return "" if @attributes.empty? && !@custom_name
29
+ # return "" if @attributes.empty? && !@custom_name
30
30
  header = @custom_name ? "#{@custom_name} : #{base_name}" : name
31
31
  "#{header} {\n#{@attributes.values.map(&:to_theme).join("\n")}\n}"
32
32
  end
@@ -22,6 +22,7 @@ module Tgui
22
22
 
23
23
  theme_comp :button, ButtonBase::Theme
24
24
  theme_comp :chatbox, ChatBox::Theme
25
+ theme_comp :checkbox, RadioButton::Theme
25
26
  theme_comp :child_window, ChildWindow::Theme
26
27
  theme_comp :color_picker, ColorPicker::Theme
27
28
  theme_comp :combobox, ComboBox::Theme
@@ -34,6 +35,8 @@ module Tgui
34
35
  theme_comp :listview, ListView::Theme
35
36
  theme_comp :menu, MenuBar::Theme
36
37
  theme_comp :messagebox, MessageBox::Theme
38
+ theme_comp :panel, Panel::Theme
39
+ theme_comp :panel_listbox, PanelListBox::Theme
37
40
  theme_comp :progressbar, ProgressBar::Theme
38
41
  theme_comp :radio_button, RadioButton::Theme
39
42
  theme_comp :range_slider, RangeSlider::Theme
@@ -42,8 +45,9 @@ module Tgui
42
45
  theme_comp :slider, Slider::Theme
43
46
  theme_comp :spin_button, SpinButton::Theme
44
47
  theme_comp :tabs, Tabs::Theme
45
- theme_comp :text_area, TextArea::Theme
46
- theme_comp :tree_view, TreeView::Theme
48
+ theme_comp :textarea, TextArea::Theme
49
+ theme_comp :toggle_button, ToggleButton::Theme
50
+ theme_comp :treeview, TreeView::Theme
47
51
  theme_comp :widget, Widget::Theme
48
52
  end
49
53
  end
@@ -0,0 +1,30 @@
1
+ require_relative '../../dsl/custom_widget'
2
+
3
+ module Tgui
4
+ class KeyboardControl < CustomWidget
5
+
6
+ api_attr :key_press_listeners do
7
+ {}
8
+ end
9
+
10
+ def initialized
11
+ self.self_can_gain_focus = proc do
12
+ 1
13
+ end
14
+
15
+ self.self_key_press = proc do |key, alt, control, shift, system|
16
+ key_symbol = KeyCode[key]
17
+ self.key_press_listeners[key_symbol]&.each do |listener|
18
+ listener.call(key_symbol, alt, control, shift, system)
19
+ end
20
+ end
21
+ end
22
+
23
+ def! :on_key do |*keys, &b|
24
+ keys.each do |k|
25
+ (self.key_press_listeners[k] ||= []) << b
26
+ end
27
+ end
28
+
29
+ end
30
+ end