white_gold 0.0.3 → 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 (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