white_gold 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ext/dll/openal32.dll +0 -0
- data/ext/dll/sfml-audio-2.dll +0 -0
- data/ext/dll/sfml-graphics-2.dll +0 -0
- data/ext/dll/sfml-network-2.dll +0 -0
- data/ext/dll/sfml-system-2.dll +0 -0
- data/ext/dll/sfml-window-2.dll +0 -0
- data/ext/dll/tgui.dll +0 -0
- data/ext/so/libsfml-audio.so +0 -0
- data/ext/so/libsfml-graphics.so +0 -0
- data/ext/so/libsfml-network.so +0 -0
- data/ext/so/libsfml-system.so +0 -0
- data/ext/so/libsfml-window.so +0 -0
- data/ext/so/libtgui.so +0 -0
- data/lib/white_gold/abi/alias.rb +50 -0
- data/lib/white_gold/abi/enum.rb +43 -0
- data/lib/white_gold/abi/extern_object.rb +180 -0
- data/lib/white_gold/abi/interface/interface.rb +114 -0
- data/lib/white_gold/abi/interface/interface_collection_out.rb +29 -0
- data/lib/white_gold/abi/interface/interface_composed_out.rb +28 -0
- data/lib/white_gold/abi/interface/interface_single_out.rb +19 -0
- data/lib/white_gold/abi/packer.rb +28 -0
- data/lib/white_gold/abi/reducer.rb +12 -0
- data/lib/white_gold/abi/unpacker.rb +27 -0
- data/lib/white_gold/convention/api_child.rb +30 -0
- data/lib/white_gold/convention/bang_def.rb +5 -0
- data/lib/white_gold/convention/bang_nest.rb +16 -0
- data/lib/white_gold/convention/bang_nested_caller.rb +48 -0
- data/lib/white_gold/convention/bool_property.rb +13 -0
- data/lib/white_gold/convention/boolean.rb +2 -0
- data/lib/white_gold/convention/club.rb +26 -0
- data/lib/white_gold/convention/container_widgets.rb +181 -0
- data/lib/white_gold/convention/page.rb +96 -0
- data/lib/white_gold/convention/proc_method_factory.rb +22 -0
- data/lib/white_gold/convention/unit.rb +22 -0
- data/lib/white_gold/convention/widget_like.rb +146 -0
- data/lib/white_gold/dsl/backend_gui.rb +37 -0
- data/lib/white_gold/dsl/bitmap_button.rb +11 -0
- data/lib/white_gold/dsl/box_layout.rb +47 -0
- data/lib/white_gold/dsl/box_layout_ratios.rb +13 -0
- data/lib/white_gold/dsl/button.rb +10 -0
- data/lib/white_gold/dsl/button_base.rb +18 -0
- data/lib/white_gold/dsl/chat_box.rb +65 -0
- data/lib/white_gold/dsl/checkbox.rb +6 -0
- data/lib/white_gold/dsl/child_window.rb +47 -0
- data/lib/white_gold/dsl/clickable_widget.rb +15 -0
- data/lib/white_gold/dsl/color.rb +124 -0
- data/lib/white_gold/dsl/color_picker.rb +12 -0
- data/lib/white_gold/dsl/combo_box.rb +135 -0
- data/lib/white_gold/dsl/container.rb +95 -0
- data/lib/white_gold/dsl/edit_box.rb +38 -0
- data/lib/white_gold/dsl/file_dialog.rb +86 -0
- data/lib/white_gold/dsl/font.rb +23 -0
- data/lib/white_gold/dsl/grid.rb +131 -0
- data/lib/white_gold/dsl/group.rb +6 -0
- data/lib/white_gold/dsl/gui.rb +16 -0
- data/lib/white_gold/dsl/horizontal_layout.rb +6 -0
- data/lib/white_gold/dsl/horizontal_wrap.rb +6 -0
- data/lib/white_gold/dsl/knob.rb +16 -0
- data/lib/white_gold/dsl/label.rb +21 -0
- data/lib/white_gold/dsl/list_box.rb +125 -0
- data/lib/white_gold/dsl/list_view.rb +239 -0
- data/lib/white_gold/dsl/menu_bar.rb +252 -0
- data/lib/white_gold/dsl/message_box.rb +90 -0
- data/lib/white_gold/dsl/outline.rb +52 -0
- data/lib/white_gold/dsl/panel.rb +16 -0
- data/lib/white_gold/dsl/panel_list_box.rb +83 -0
- data/lib/white_gold/dsl/picture.rb +12 -0
- data/lib/white_gold/dsl/progress_bar.rb +19 -0
- data/lib/white_gold/dsl/radio_button.rb +18 -0
- data/lib/white_gold/dsl/radio_button_group.rb +14 -0
- data/lib/white_gold/dsl/range_slider.rb +15 -0
- data/lib/white_gold/dsl/rich_text_label.rb +6 -0
- data/lib/white_gold/dsl/scrollable_panel.rb +53 -0
- data/lib/white_gold/dsl/scrollbar.rb +28 -0
- data/lib/white_gold/dsl/separator_line.rb +6 -0
- data/lib/white_gold/dsl/signal/global_signal.rb +33 -0
- data/lib/white_gold/dsl/signal/signal.rb +44 -0
- data/lib/white_gold/dsl/signal/signal_animation_type.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_bool.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_color.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_float.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_int.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_item.rb +6 -0
- data/lib/white_gold/dsl/signal/signal_item_hierarchy.rb +9 -0
- data/lib/white_gold/dsl/signal/signal_panel_list_box_item.rb +7 -0
- data/lib/white_gold/dsl/signal/signal_pointer.rb +15 -0
- data/lib/white_gold/dsl/signal/signal_range.rb +15 -0
- data/lib/white_gold/dsl/signal/signal_show_effect.rb +17 -0
- data/lib/white_gold/dsl/signal/signal_string.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_typed_int_bool_ptr.rb +15 -0
- data/lib/white_gold/dsl/signal/signal_typed_size_t.rb +6 -0
- data/lib/white_gold/dsl/signal/signal_u_int.rb +16 -0
- data/lib/white_gold/dsl/signal/signal_vector2f.rb +14 -0
- data/lib/white_gold/dsl/slider.rb +26 -0
- data/lib/white_gold/dsl/spin_button.rb +24 -0
- data/lib/white_gold/dsl/spin_control.rb +15 -0
- data/lib/white_gold/dsl/subwidget_container.rb +9 -0
- data/lib/white_gold/dsl/tab_container.rb +121 -0
- data/lib/white_gold/dsl/tabs.rb +91 -0
- data/lib/white_gold/dsl/text_area.rb +34 -0
- data/lib/white_gold/dsl/texture.rb +53 -0
- data/lib/white_gold/dsl/theme/boolean_attribute.rb +13 -0
- data/lib/white_gold/dsl/theme/button_theme.rb +19 -0
- data/lib/white_gold/dsl/theme/chat_box_theme.rb +16 -0
- data/lib/white_gold/dsl/theme/child_window_theme.rb +25 -0
- data/lib/white_gold/dsl/theme/color_attribute.rb +13 -0
- data/lib/white_gold/dsl/theme/color_picker_theme.rb +14 -0
- data/lib/white_gold/dsl/theme/combo_box_theme.rb +33 -0
- data/lib/white_gold/dsl/theme/common_renderer.rb +7 -0
- data/lib/white_gold/dsl/theme/edit_box_theme.rb +34 -0
- data/lib/white_gold/dsl/theme/file_dialog_theme.rb +22 -0
- data/lib/white_gold/dsl/theme/float_attribute.rb +13 -0
- data/lib/white_gold/dsl/theme/group_theme.rb +9 -0
- data/lib/white_gold/dsl/theme/knob_theme.rb +15 -0
- data/lib/white_gold/dsl/theme/label_theme.rb +20 -0
- data/lib/white_gold/dsl/theme/list_box_theme.rb +25 -0
- data/lib/white_gold/dsl/theme/list_view_theme.rb +27 -0
- data/lib/white_gold/dsl/theme/menu_bar_theme.rb +21 -0
- data/lib/white_gold/dsl/theme/message_box_theme.rb +11 -0
- data/lib/white_gold/dsl/theme/outline_attribute.rb +13 -0
- data/lib/white_gold/dsl/theme/progress_bar_theme.rb +19 -0
- data/lib/white_gold/dsl/theme/radio_button_theme.rb +30 -0
- data/lib/white_gold/dsl/theme/scrollbar_theme.rb +24 -0
- data/lib/white_gold/dsl/theme/separator_line_theme.rb +9 -0
- data/lib/white_gold/dsl/theme/slider_theme.rb +20 -0
- data/lib/white_gold/dsl/theme/spin_button_theme.rb +19 -0
- data/lib/white_gold/dsl/theme/tabs_theme.rb +29 -0
- data/lib/white_gold/dsl/theme/text_area_theme.rb +22 -0
- data/lib/white_gold/dsl/theme/text_styles_attribute.rb +13 -0
- data/lib/white_gold/dsl/theme/texture_attribute.rb +17 -0
- data/lib/white_gold/dsl/theme/theme_attributed.rb +51 -0
- data/lib/white_gold/dsl/theme/theme_component.rb +23 -0
- data/lib/white_gold/dsl/theme/tree_view_theme.rb +26 -0
- data/lib/white_gold/dsl/theme/widget_theme.rb +12 -0
- data/lib/white_gold/dsl/theme.rb +144 -0
- data/lib/white_gold/dsl/toggle_button.rb +10 -0
- data/lib/white_gold/dsl/tool_tip.rb +21 -0
- data/lib/white_gold/dsl/tree_view.rb +186 -0
- data/lib/white_gold/dsl/util.rb +17 -0
- data/lib/white_gold/dsl/vertical_layout.rb +6 -0
- data/lib/white_gold/dsl/widget.rb +279 -0
- data/lib/white_gold/dsl/window.rb +16 -0
- data/lib/white_gold/generated/tgui-abi-loader.gf.rb +1813 -0
- data/lib/white_gold/library/theme/light.rb +111 -0
- data/lib/white_gold/master.rb +170 -0
- data/lib/white_gold/path/kernel.path.rb +3 -0
- data/lib/white_gold/path/numeric.path.rb +9 -0
- data/lib/white_gold/path/object.path.rb +22 -0
- data/lib/white_gold/path/string.path.rb +5 -0
- data/lib/white_gold/tgui-abi.rb +255 -0
- data/lib/white_gold/tgui-config.rb +20 -0
- data/lib/white_gold.rb +47 -0
- metadata +209 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
class Club
|
2
|
+
def initialize
|
3
|
+
@params = {}
|
4
|
+
@members = []
|
5
|
+
end
|
6
|
+
|
7
|
+
def join id
|
8
|
+
@members << id
|
9
|
+
end
|
10
|
+
|
11
|
+
def params
|
12
|
+
@params
|
13
|
+
end
|
14
|
+
|
15
|
+
def members
|
16
|
+
@members
|
17
|
+
end
|
18
|
+
|
19
|
+
def []=(param, value)
|
20
|
+
@params[param] = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def [](param)
|
24
|
+
@params[param]
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
require_relative '../convention/api_child'
|
2
|
+
|
3
|
+
module Tgui
|
4
|
+
|
5
|
+
WIDGETS_COLLECTION = {
|
6
|
+
label: Tgui::Label,
|
7
|
+
button: Tgui::Button,
|
8
|
+
radio: false,
|
9
|
+
radio_button: Tgui::RadioButton,
|
10
|
+
checkbox: Tgui::CheckBox,
|
11
|
+
child_window: Tgui::ChildWindow,
|
12
|
+
editbox: Tgui::EditBox,
|
13
|
+
combobox: Tgui::ComboBox,
|
14
|
+
color_picker: Tgui::ColorPicker,
|
15
|
+
hola: Tgui::HorizontalLayout,
|
16
|
+
vela: Tgui::VerticalLayout,
|
17
|
+
howr: Tgui::HorizontalWrap,
|
18
|
+
group: Tgui::Group,
|
19
|
+
radio_button_group: Tgui::RadioButtonGroup,
|
20
|
+
grid: Tgui::Grid,
|
21
|
+
list_view: Tgui::ListView,
|
22
|
+
picture: false,
|
23
|
+
bitmap_button: Tgui::BitmapButton,
|
24
|
+
knob: Tgui::Knob,
|
25
|
+
message_box: Tgui::MessageBox,
|
26
|
+
file_dialog: Tgui::FileDialog,
|
27
|
+
listbox: Tgui::ListBox,
|
28
|
+
menu: Tgui::MenuBar,
|
29
|
+
panel_list_box: Tgui::PanelListBox,
|
30
|
+
progress_bar: Tgui::ProgressBar,
|
31
|
+
range_slider: Tgui::RangeSlider,
|
32
|
+
rich_text_label: Tgui::RichTextLabel,
|
33
|
+
separator_line: Tgui::SeparatorLine,
|
34
|
+
slider: Tgui::Slider,
|
35
|
+
spin_button: Tgui::SpinButton,
|
36
|
+
spin_control: Tgui::SpinControl,
|
37
|
+
tabs: Tgui::Tabs,
|
38
|
+
tab_container: Tgui::TabContainer,
|
39
|
+
text_area: Tgui::TextArea,
|
40
|
+
toggle_button: Tgui::ToggleButton,
|
41
|
+
tree_view: Tgui::TreeView,
|
42
|
+
scrollbar: Tgui::Scrollbar,
|
43
|
+
panel: Tgui::Panel,
|
44
|
+
chat_box: Tgui::ChatBox
|
45
|
+
}.freeze
|
46
|
+
|
47
|
+
module WidgetOwner
|
48
|
+
extend BangDef
|
49
|
+
|
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
|
79
|
+
## TO OPTIMIZE
|
80
|
+
methods.filter{ _1.start_with? ApiChild::API_CHILD_PREFIX }
|
81
|
+
end
|
82
|
+
|
83
|
+
def equip_child_widget widget
|
84
|
+
widget.page = page
|
85
|
+
parent = self
|
86
|
+
child_methods.each do |method|
|
87
|
+
widget.define_singleton_method method[ApiChild::API_CHILD_PREFIX.length..] do |*a|
|
88
|
+
parent.send(method, self, *a)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
widget
|
92
|
+
end
|
93
|
+
|
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
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def! :picture do |*a, **na, &b|
|
103
|
+
texture = na[:texture] || Tgui::Texture.from(
|
104
|
+
na[:url],
|
105
|
+
na.dig(:part_rect, 0),
|
106
|
+
na.dig(:part_rect, 1),
|
107
|
+
na.dig(:part_rect, 2),
|
108
|
+
na.dig(:part_rect, 3),
|
109
|
+
na[:smooth]
|
110
|
+
)
|
111
|
+
transparent = na[:transparent] || false
|
112
|
+
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
|
115
|
+
end
|
116
|
+
|
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 = "Button1"
|
137
|
+
|
138
|
+
def! :btn do |text = nil, **na, &on_press|
|
139
|
+
if !text
|
140
|
+
text = @@auto_button_name
|
141
|
+
@@auto_button_name = @@auto_button_name.next
|
142
|
+
end
|
143
|
+
api_bang_button text:, on_press:, **na
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
class Container
|
148
|
+
include WidgetOwner
|
149
|
+
|
150
|
+
@@auto_widget_id = "@/"
|
151
|
+
|
152
|
+
def common_widget_post_initialize widget, *keys, **na, &b
|
153
|
+
@@auto_widget_id = id = @@auto_widget_id.next
|
154
|
+
add widget, id
|
155
|
+
common_widget_nest widget, *keys, id:, **na, &b
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
class TabContainer
|
161
|
+
WIDGETS_COLLECTION.each do |m, c|
|
162
|
+
if !method_defined? m
|
163
|
+
def! m do |name = nil, **na, &b|
|
164
|
+
raise NoMethodError.new("Method `#{m}` should be called on Panel from TabContainer, not TabContainer itself")
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
class ToolTip
|
171
|
+
include WidgetOwner
|
172
|
+
|
173
|
+
attr :widget
|
174
|
+
|
175
|
+
def common_widget_post_initialize widget, *keys, **na, &b
|
176
|
+
@widget = widget
|
177
|
+
common_widget_nest widget, *keys, **na, &b
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require_relative "club"
|
2
|
+
|
3
|
+
class Page < Tgui::Group
|
4
|
+
|
5
|
+
def initialize tgui
|
6
|
+
super()
|
7
|
+
@tgui = tgui
|
8
|
+
@widget_callbacks = {}
|
9
|
+
@global_callbacks = {}
|
10
|
+
@custom_data = Hash.new do |h, name|
|
11
|
+
h[name] = {}
|
12
|
+
end
|
13
|
+
@clubs = {}
|
14
|
+
@custom_renderers = {}
|
15
|
+
self.size = [100.pc, 100.pc]
|
16
|
+
end
|
17
|
+
|
18
|
+
def inspect
|
19
|
+
return "#{object_id}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def build
|
23
|
+
end
|
24
|
+
|
25
|
+
def disconnect
|
26
|
+
@global_callbacks.each do |id, signal|
|
27
|
+
signal.disconnect id
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
attr :widget_callbacks, :global_callbacks, :custom_data, :clubs, :custom_renderers
|
32
|
+
|
33
|
+
def go page
|
34
|
+
@tgui.next_page_id = page
|
35
|
+
end
|
36
|
+
|
37
|
+
def job **na, &b
|
38
|
+
@tgui.job **na, &b
|
39
|
+
end
|
40
|
+
|
41
|
+
def timer *a, **na, &b
|
42
|
+
@tgui.timer *a, **na, &b
|
43
|
+
end
|
44
|
+
|
45
|
+
def gui
|
46
|
+
@tgui.gui
|
47
|
+
end
|
48
|
+
|
49
|
+
def window
|
50
|
+
@tgui.window
|
51
|
+
end
|
52
|
+
|
53
|
+
def page
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
def controller type
|
58
|
+
type.new self
|
59
|
+
end
|
60
|
+
|
61
|
+
def club key, params = nil, create_on_missing: true
|
62
|
+
club = @clubs[key]
|
63
|
+
if !club && create_on_missing
|
64
|
+
club = @clubs[key] = Club.new
|
65
|
+
end
|
66
|
+
if club && params
|
67
|
+
params.each do |k, v|
|
68
|
+
club[k] = v
|
69
|
+
end
|
70
|
+
end
|
71
|
+
club
|
72
|
+
end
|
73
|
+
|
74
|
+
def theme
|
75
|
+
Theme.default
|
76
|
+
end
|
77
|
+
|
78
|
+
def! :theme do |seed = nil, **na, &b|
|
79
|
+
theme = self.theme
|
80
|
+
if seed
|
81
|
+
theme.reset_attributes
|
82
|
+
upon! theme do
|
83
|
+
load Theme.loadpath(seed)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
upon! theme, **na, &b
|
87
|
+
theme.self_commit @custom_renderers
|
88
|
+
end
|
89
|
+
|
90
|
+
def! :tgui_theme do |path|
|
91
|
+
theme = self.theme
|
92
|
+
theme.reset_attributes
|
93
|
+
theme.source = path
|
94
|
+
theme.self_commit @custom_renderers
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class ProcMethodFactory
|
2
|
+
def initialize source
|
3
|
+
@source = source
|
4
|
+
end
|
5
|
+
|
6
|
+
def method_missing name, *curry
|
7
|
+
proc do |*a, **na, &b|
|
8
|
+
method = @source.method name
|
9
|
+
arity = method.arity
|
10
|
+
a = [*curry, *a]
|
11
|
+
if arity >= 0
|
12
|
+
@source.send(name, *a[...arity], **na, &b)
|
13
|
+
else
|
14
|
+
@source.send(name, *a, **na, &b)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def respond_to? name
|
20
|
+
@source.respond_to? name
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Unit
|
2
|
+
@@default = :px
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def default=(unit)
|
7
|
+
@@default = unit
|
8
|
+
end
|
9
|
+
|
10
|
+
def default
|
11
|
+
@@default
|
12
|
+
end
|
13
|
+
|
14
|
+
def nominate numeric, unit = @@default
|
15
|
+
case unit
|
16
|
+
when :pixel, :px then numeric.px
|
17
|
+
when :percent, :pc then numeric.pc
|
18
|
+
else raise "Ivalid unit `#{unit}` (:px/:pixel/:pc/:percent allowed)"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require_relative 'bang_def'
|
2
|
+
require_relative 'bang_nest'
|
3
|
+
|
4
|
+
class WidgetLike
|
5
|
+
extend BangDef
|
6
|
+
include BangNest
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def abi_def name, original_name = nil, id: false, **na
|
10
|
+
if original_name
|
11
|
+
if original_name.end_with? "_"
|
12
|
+
abi_name = "_abi_#{original_name}#{name}".delete_suffix("=").delete_suffix("?").to_sym
|
13
|
+
else
|
14
|
+
abi_name = "_abi_#{original_name}".to_sym
|
15
|
+
end
|
16
|
+
else
|
17
|
+
if name.end_with? "?"
|
18
|
+
abi_name = "_abi_is_#{name}".delete_suffix("?").to_sym
|
19
|
+
elsif name.end_with? "="
|
20
|
+
abi_name = "_abi_set_#{name}".delete_suffix("=").to_sym
|
21
|
+
else
|
22
|
+
abi_name = "_abi_#{name}".to_sym
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
na = {nil => nil} if na.empty?
|
27
|
+
if id
|
28
|
+
interface = na.map do |k, v|
|
29
|
+
k = self_packers_id_extend id, *k
|
30
|
+
Interface.from k, v
|
31
|
+
end.first
|
32
|
+
if name.to_s.end_with? "="
|
33
|
+
self_abi_def_setter_with_id name, abi_name, interface, id
|
34
|
+
else
|
35
|
+
self_abi_def_with_id name, abi_name, interface, id
|
36
|
+
end
|
37
|
+
else
|
38
|
+
interface = na.map do |k, v|
|
39
|
+
Interface.from k, v
|
40
|
+
end.first
|
41
|
+
if name.to_s.end_with? "="
|
42
|
+
self_abi_def_setter name, abi_name, interface
|
43
|
+
else
|
44
|
+
self_abi_def name, abi_name, interface
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self_packers_id_extend id_position, *packers
|
50
|
+
[*packers[0...id_position], Object, *packers[id_position..]]
|
51
|
+
end
|
52
|
+
|
53
|
+
def self_abi_def name, abi_name, abi_interface
|
54
|
+
define_method name do |*a|
|
55
|
+
abi_interface.call host, abi_name, *a
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def self_abi_def_with_id name, abi_name, abi_interface, id_position
|
60
|
+
define_method name do |*a|
|
61
|
+
abi_interface.call host, abi_name, *a[0...id_position], id, *a[id_position..]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def self_abi_def_setter name, abi_name, abi_interface
|
66
|
+
define_method name do |a = VOID|
|
67
|
+
abi_interface.call host, abi_name, *a
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def self_abi_def_setter_with_id name, abi_name, abi_interface, id_position
|
72
|
+
define_method name do |a = VOID|
|
73
|
+
a = [a] if !a.is_a? Array
|
74
|
+
abi_interface.call host, abi_name, *a[0...id_position], id, *a[id_position..]
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def abi_attr name, type = nil, original_name = nil, id: false
|
79
|
+
if original_name
|
80
|
+
if original_name.end_with? "_"
|
81
|
+
getter = "get_#{original_name}#{name}".delete_suffix("?").to_sym
|
82
|
+
setter = "set_#{original_name}#{name}".delete_suffix("?").to_sym
|
83
|
+
else
|
84
|
+
getter = "get_#{original_name}".to_sym
|
85
|
+
setter = "set_#{original_name}".to_sym
|
86
|
+
end
|
87
|
+
else
|
88
|
+
if name.end_with? "?"
|
89
|
+
getter = "is_#{name}".delete_suffix("?").to_sym
|
90
|
+
else
|
91
|
+
getter = "get_#{name}".to_sym
|
92
|
+
end
|
93
|
+
setter = "set_#{name}".delete_suffix("?").to_sym
|
94
|
+
end
|
95
|
+
type ||= Boolean if name.end_with? "?"
|
96
|
+
abi_def "#{name.to_s.delete_suffix("?")}=".to_sym, setter, id: id, type => nil
|
97
|
+
abi_def name, getter, id: id, nil => type
|
98
|
+
end
|
99
|
+
|
100
|
+
def abi_enum base, *keys, **indexed_keywords
|
101
|
+
if base.is_a? Enum
|
102
|
+
enum = base
|
103
|
+
else
|
104
|
+
enum = Enum.new *keywords, **indexed_keywords
|
105
|
+
const_set base, enum
|
106
|
+
enum.name = base
|
107
|
+
end
|
108
|
+
abi_packer enum do |o|
|
109
|
+
enum.sym_to_i(o)
|
110
|
+
end
|
111
|
+
abi_unpacker enum do |o|
|
112
|
+
enum.i_to_sym(o)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def abi_bit_enum name, zero, *keywords, **indexed_keywords
|
117
|
+
if base.is_a? Enum
|
118
|
+
enum = base
|
119
|
+
else
|
120
|
+
enum = Enum.new zero, **(keywords.each_with_index.map{[_1, 1 << _2]}.to_h), **indexed_keywords
|
121
|
+
const_set base, enum
|
122
|
+
enum.name = base
|
123
|
+
end
|
124
|
+
abi_packer enum do |o|
|
125
|
+
enum.pack(o)
|
126
|
+
end
|
127
|
+
abi_unpacker enum do |o|
|
128
|
+
enum.unpack(o)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def initialize host, id
|
134
|
+
@host = host
|
135
|
+
@id = id
|
136
|
+
end
|
137
|
+
|
138
|
+
attr :host
|
139
|
+
attr :id
|
140
|
+
|
141
|
+
def flags=(flags)
|
142
|
+
flags.each do |f|
|
143
|
+
send("#{f}=", true)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative '../abi/extern_object'
|
2
|
+
require_relative '../convention/bang_nest'
|
3
|
+
require_relative 'signal/global_signal'
|
4
|
+
require_relative 'font'
|
5
|
+
|
6
|
+
module Tgui
|
7
|
+
class BackendGui < ExternObject
|
8
|
+
include BangNest
|
9
|
+
|
10
|
+
class ViewSignal < GlobalSignal
|
11
|
+
def block_caller &b
|
12
|
+
Fiddle::Closure::BlockCaller.new(0, [0]) do
|
13
|
+
b.(@widget.view, @widget)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
abi_def :view=, :set_absolute_, [Integer] * 4 => nil
|
19
|
+
abi_def :relative_view=, [Float] * 4 => nil
|
20
|
+
abi_def :view, :get_, nil => [Float] * 4
|
21
|
+
abi_def :viewport=, :set_absolute_, [Integer] * 4 => nil
|
22
|
+
abi_def :viewport, :get_, nil => [Float] * 4
|
23
|
+
abi_def :relative_viewport=, [Float] * 4 => nil
|
24
|
+
abi_def :tab_focus_pass?, :is_tab_key_usage_enabled, nil => Boolean
|
25
|
+
abi_def :tab_focus_pass=, :tab_key_usage_enabled, Boolean => nil
|
26
|
+
abi_attr :font, Font
|
27
|
+
abi_def :unfocus, :unfocus_all_widgets
|
28
|
+
abi_attr :opacity, Float
|
29
|
+
abi_attr :text_size, Integer
|
30
|
+
abi_def :push_mouse_cursor, :set_override_mouse_cursor, CursorType => nil
|
31
|
+
abi_def :pop_mouse_cursor, :restore_override_mouse_cursor
|
32
|
+
abi_def :px_to_crd, :map_pixel_to_coords, [Integer, Integer] => [Float, Float]
|
33
|
+
abi_def :crd_to_px, :map_coords_to_pixel, [Float, Float] => [Float, Float]
|
34
|
+
abi_signal :on_view_change, ViewSignal
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require_relative 'group'
|
2
|
+
|
3
|
+
module Tgui
|
4
|
+
class BoxLayout < Group
|
5
|
+
|
6
|
+
def remove widget
|
7
|
+
if widget.is_a? Integer
|
8
|
+
return _abi_remove_by_index abi_pack_integer(widget)
|
9
|
+
end
|
10
|
+
super
|
11
|
+
end
|
12
|
+
|
13
|
+
def get(*keys)
|
14
|
+
case keys
|
15
|
+
in [Symbol]
|
16
|
+
id = page.clubs[keys.first]&.members&.first
|
17
|
+
id && self_cast_up(_abi_get(abi_pack_string(id)))
|
18
|
+
in [Integer]
|
19
|
+
self_cast_up(_abi_get_by_index abi_pack_integer(keys.first))
|
20
|
+
else
|
21
|
+
Enumerator.new do |e|
|
22
|
+
Array(self_get_widget_name keys).flatten.compact.uniq.each do |id|
|
23
|
+
w = _abi_get(abi_pack_string(id))
|
24
|
+
e << self_cast_up(w) if w && !w.null?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# internal
|
31
|
+
|
32
|
+
def self_get_widget_name a
|
33
|
+
case a
|
34
|
+
when Widget
|
35
|
+
a.name
|
36
|
+
when Integer
|
37
|
+
w = _abi_get_by_index abi_pack_integer(a)
|
38
|
+
return nil if w.null?
|
39
|
+
self_cast_up(w, equip: false).name
|
40
|
+
when Enumerable
|
41
|
+
a.map{ self_get_widget_name _1 }.flatten
|
42
|
+
else
|
43
|
+
page.clubs[a]&.members
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require_relative 'clickable_widget'
|
2
|
+
|
3
|
+
module Tgui
|
4
|
+
class ButtonBase < ClickableWidget
|
5
|
+
|
6
|
+
def theme_comp
|
7
|
+
:button
|
8
|
+
end
|
9
|
+
|
10
|
+
def abi_pack_text_position_vector o
|
11
|
+
"(#{abi_pack_float o[0]},#{abi_pack_float o[1]})"
|
12
|
+
end
|
13
|
+
|
14
|
+
abi_attr :text, String
|
15
|
+
abi_def :text_position=, [:abi_pack_text_position_vector, :abi_pack_text_position_vector] => nil
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|