white_gold 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +7 -0
  2. data/ext/dll/openal32.dll +0 -0
  3. data/ext/dll/sfml-audio-2.dll +0 -0
  4. data/ext/dll/sfml-graphics-2.dll +0 -0
  5. data/ext/dll/sfml-network-2.dll +0 -0
  6. data/ext/dll/sfml-system-2.dll +0 -0
  7. data/ext/dll/sfml-window-2.dll +0 -0
  8. data/ext/dll/tgui.dll +0 -0
  9. data/ext/so/libsfml-audio.so +0 -0
  10. data/ext/so/libsfml-graphics.so +0 -0
  11. data/ext/so/libsfml-network.so +0 -0
  12. data/ext/so/libsfml-system.so +0 -0
  13. data/ext/so/libsfml-window.so +0 -0
  14. data/ext/so/libtgui.so +0 -0
  15. data/lib/white_gold/abi/alias.rb +50 -0
  16. data/lib/white_gold/abi/enum.rb +43 -0
  17. data/lib/white_gold/abi/extern_object.rb +180 -0
  18. data/lib/white_gold/abi/interface/interface.rb +114 -0
  19. data/lib/white_gold/abi/interface/interface_collection_out.rb +29 -0
  20. data/lib/white_gold/abi/interface/interface_composed_out.rb +28 -0
  21. data/lib/white_gold/abi/interface/interface_single_out.rb +19 -0
  22. data/lib/white_gold/abi/packer.rb +28 -0
  23. data/lib/white_gold/abi/reducer.rb +12 -0
  24. data/lib/white_gold/abi/unpacker.rb +27 -0
  25. data/lib/white_gold/convention/api_child.rb +30 -0
  26. data/lib/white_gold/convention/bang_def.rb +5 -0
  27. data/lib/white_gold/convention/bang_nest.rb +16 -0
  28. data/lib/white_gold/convention/bang_nested_caller.rb +48 -0
  29. data/lib/white_gold/convention/bool_property.rb +13 -0
  30. data/lib/white_gold/convention/boolean.rb +2 -0
  31. data/lib/white_gold/convention/club.rb +26 -0
  32. data/lib/white_gold/convention/container_widgets.rb +181 -0
  33. data/lib/white_gold/convention/page.rb +96 -0
  34. data/lib/white_gold/convention/proc_method_factory.rb +22 -0
  35. data/lib/white_gold/convention/unit.rb +22 -0
  36. data/lib/white_gold/convention/widget_like.rb +146 -0
  37. data/lib/white_gold/dsl/backend_gui.rb +37 -0
  38. data/lib/white_gold/dsl/bitmap_button.rb +11 -0
  39. data/lib/white_gold/dsl/box_layout.rb +47 -0
  40. data/lib/white_gold/dsl/box_layout_ratios.rb +13 -0
  41. data/lib/white_gold/dsl/button.rb +10 -0
  42. data/lib/white_gold/dsl/button_base.rb +18 -0
  43. data/lib/white_gold/dsl/chat_box.rb +65 -0
  44. data/lib/white_gold/dsl/checkbox.rb +6 -0
  45. data/lib/white_gold/dsl/child_window.rb +47 -0
  46. data/lib/white_gold/dsl/clickable_widget.rb +15 -0
  47. data/lib/white_gold/dsl/color.rb +124 -0
  48. data/lib/white_gold/dsl/color_picker.rb +12 -0
  49. data/lib/white_gold/dsl/combo_box.rb +135 -0
  50. data/lib/white_gold/dsl/container.rb +95 -0
  51. data/lib/white_gold/dsl/edit_box.rb +38 -0
  52. data/lib/white_gold/dsl/file_dialog.rb +86 -0
  53. data/lib/white_gold/dsl/font.rb +23 -0
  54. data/lib/white_gold/dsl/grid.rb +131 -0
  55. data/lib/white_gold/dsl/group.rb +6 -0
  56. data/lib/white_gold/dsl/gui.rb +16 -0
  57. data/lib/white_gold/dsl/horizontal_layout.rb +6 -0
  58. data/lib/white_gold/dsl/horizontal_wrap.rb +6 -0
  59. data/lib/white_gold/dsl/knob.rb +16 -0
  60. data/lib/white_gold/dsl/label.rb +21 -0
  61. data/lib/white_gold/dsl/list_box.rb +125 -0
  62. data/lib/white_gold/dsl/list_view.rb +239 -0
  63. data/lib/white_gold/dsl/menu_bar.rb +252 -0
  64. data/lib/white_gold/dsl/message_box.rb +90 -0
  65. data/lib/white_gold/dsl/outline.rb +52 -0
  66. data/lib/white_gold/dsl/panel.rb +16 -0
  67. data/lib/white_gold/dsl/panel_list_box.rb +83 -0
  68. data/lib/white_gold/dsl/picture.rb +12 -0
  69. data/lib/white_gold/dsl/progress_bar.rb +19 -0
  70. data/lib/white_gold/dsl/radio_button.rb +18 -0
  71. data/lib/white_gold/dsl/radio_button_group.rb +14 -0
  72. data/lib/white_gold/dsl/range_slider.rb +15 -0
  73. data/lib/white_gold/dsl/rich_text_label.rb +6 -0
  74. data/lib/white_gold/dsl/scrollable_panel.rb +53 -0
  75. data/lib/white_gold/dsl/scrollbar.rb +28 -0
  76. data/lib/white_gold/dsl/separator_line.rb +6 -0
  77. data/lib/white_gold/dsl/signal/global_signal.rb +33 -0
  78. data/lib/white_gold/dsl/signal/signal.rb +44 -0
  79. data/lib/white_gold/dsl/signal/signal_animation_type.rb +16 -0
  80. data/lib/white_gold/dsl/signal/signal_bool.rb +16 -0
  81. data/lib/white_gold/dsl/signal/signal_color.rb +16 -0
  82. data/lib/white_gold/dsl/signal/signal_float.rb +16 -0
  83. data/lib/white_gold/dsl/signal/signal_int.rb +16 -0
  84. data/lib/white_gold/dsl/signal/signal_item.rb +6 -0
  85. data/lib/white_gold/dsl/signal/signal_item_hierarchy.rb +9 -0
  86. data/lib/white_gold/dsl/signal/signal_panel_list_box_item.rb +7 -0
  87. data/lib/white_gold/dsl/signal/signal_pointer.rb +15 -0
  88. data/lib/white_gold/dsl/signal/signal_range.rb +15 -0
  89. data/lib/white_gold/dsl/signal/signal_show_effect.rb +17 -0
  90. data/lib/white_gold/dsl/signal/signal_string.rb +16 -0
  91. data/lib/white_gold/dsl/signal/signal_typed_int_bool_ptr.rb +15 -0
  92. data/lib/white_gold/dsl/signal/signal_typed_size_t.rb +6 -0
  93. data/lib/white_gold/dsl/signal/signal_u_int.rb +16 -0
  94. data/lib/white_gold/dsl/signal/signal_vector2f.rb +14 -0
  95. data/lib/white_gold/dsl/slider.rb +26 -0
  96. data/lib/white_gold/dsl/spin_button.rb +24 -0
  97. data/lib/white_gold/dsl/spin_control.rb +15 -0
  98. data/lib/white_gold/dsl/subwidget_container.rb +9 -0
  99. data/lib/white_gold/dsl/tab_container.rb +121 -0
  100. data/lib/white_gold/dsl/tabs.rb +91 -0
  101. data/lib/white_gold/dsl/text_area.rb +34 -0
  102. data/lib/white_gold/dsl/texture.rb +53 -0
  103. data/lib/white_gold/dsl/theme/boolean_attribute.rb +13 -0
  104. data/lib/white_gold/dsl/theme/button_theme.rb +19 -0
  105. data/lib/white_gold/dsl/theme/chat_box_theme.rb +16 -0
  106. data/lib/white_gold/dsl/theme/child_window_theme.rb +25 -0
  107. data/lib/white_gold/dsl/theme/color_attribute.rb +13 -0
  108. data/lib/white_gold/dsl/theme/color_picker_theme.rb +14 -0
  109. data/lib/white_gold/dsl/theme/combo_box_theme.rb +33 -0
  110. data/lib/white_gold/dsl/theme/common_renderer.rb +7 -0
  111. data/lib/white_gold/dsl/theme/edit_box_theme.rb +34 -0
  112. data/lib/white_gold/dsl/theme/file_dialog_theme.rb +22 -0
  113. data/lib/white_gold/dsl/theme/float_attribute.rb +13 -0
  114. data/lib/white_gold/dsl/theme/group_theme.rb +9 -0
  115. data/lib/white_gold/dsl/theme/knob_theme.rb +15 -0
  116. data/lib/white_gold/dsl/theme/label_theme.rb +20 -0
  117. data/lib/white_gold/dsl/theme/list_box_theme.rb +25 -0
  118. data/lib/white_gold/dsl/theme/list_view_theme.rb +27 -0
  119. data/lib/white_gold/dsl/theme/menu_bar_theme.rb +21 -0
  120. data/lib/white_gold/dsl/theme/message_box_theme.rb +11 -0
  121. data/lib/white_gold/dsl/theme/outline_attribute.rb +13 -0
  122. data/lib/white_gold/dsl/theme/progress_bar_theme.rb +19 -0
  123. data/lib/white_gold/dsl/theme/radio_button_theme.rb +30 -0
  124. data/lib/white_gold/dsl/theme/scrollbar_theme.rb +24 -0
  125. data/lib/white_gold/dsl/theme/separator_line_theme.rb +9 -0
  126. data/lib/white_gold/dsl/theme/slider_theme.rb +20 -0
  127. data/lib/white_gold/dsl/theme/spin_button_theme.rb +19 -0
  128. data/lib/white_gold/dsl/theme/tabs_theme.rb +29 -0
  129. data/lib/white_gold/dsl/theme/text_area_theme.rb +22 -0
  130. data/lib/white_gold/dsl/theme/text_styles_attribute.rb +13 -0
  131. data/lib/white_gold/dsl/theme/texture_attribute.rb +17 -0
  132. data/lib/white_gold/dsl/theme/theme_attributed.rb +51 -0
  133. data/lib/white_gold/dsl/theme/theme_component.rb +23 -0
  134. data/lib/white_gold/dsl/theme/tree_view_theme.rb +26 -0
  135. data/lib/white_gold/dsl/theme/widget_theme.rb +12 -0
  136. data/lib/white_gold/dsl/theme.rb +144 -0
  137. data/lib/white_gold/dsl/toggle_button.rb +10 -0
  138. data/lib/white_gold/dsl/tool_tip.rb +21 -0
  139. data/lib/white_gold/dsl/tree_view.rb +186 -0
  140. data/lib/white_gold/dsl/util.rb +17 -0
  141. data/lib/white_gold/dsl/vertical_layout.rb +6 -0
  142. data/lib/white_gold/dsl/widget.rb +279 -0
  143. data/lib/white_gold/dsl/window.rb +16 -0
  144. data/lib/white_gold/generated/tgui-abi-loader.gf.rb +1813 -0
  145. data/lib/white_gold/library/theme/light.rb +111 -0
  146. data/lib/white_gold/master.rb +170 -0
  147. data/lib/white_gold/path/kernel.path.rb +3 -0
  148. data/lib/white_gold/path/numeric.path.rb +9 -0
  149. data/lib/white_gold/path/object.path.rb +22 -0
  150. data/lib/white_gold/path/string.path.rb +5 -0
  151. data/lib/white_gold/tgui-abi.rb +255 -0
  152. data/lib/white_gold/tgui-config.rb +20 -0
  153. data/lib/white_gold.rb +47 -0
  154. metadata +209 -0
@@ -0,0 +1,131 @@
1
+ require_relative 'container'
2
+
3
+ module Tgui
4
+ class Grid < Container
5
+
6
+ api_attr :cell do
7
+ [0, 0]
8
+ end
9
+
10
+ api_attr :alignment do
11
+ nil
12
+ end
13
+
14
+ api_attr :direction do
15
+ :column
16
+ end
17
+
18
+ api_attr :padding do
19
+ nil
20
+ end
21
+
22
+ api_child :padding= do |w, padding|
23
+ _abi_set_widget_padding w, abi_pack(Outline, *padding)
24
+ end
25
+
26
+ api_child :padding do |w|
27
+ abi_unpack(Outline, _abi_get_widget_padding(w))
28
+ end
29
+
30
+ abi_enum "Alignment", :center, :upper_left, :up, :upper_right, :right, :bottom_right, :bottom, :bottom_left, :left,
31
+ top_left: :upper_left, left_top: :upper_left,
32
+ top_right: :upper_right, right_top: :upper_right,
33
+ right_bottom: :bottom_right, left_bottom: :bottom_left
34
+
35
+ api_child :alignment= do |w, alignment|
36
+ _abi_set_widget_alignment w, abi_pack(Alignment, alignment)
37
+ end
38
+
39
+ api_child :alignment do |w|
40
+ abi_unpack(Alignment, _abi_get_widget_alignment(w))
41
+ end
42
+
43
+ api_child :alignment do |w|
44
+ Alignment[_abi_get_widget_alignment]
45
+ end
46
+
47
+ api_child :cell= do |w, cell|
48
+ _abi_set_widget_cell w, abi_pack_integer(cell[0]), abi_pack_integer(cell[1])
49
+ end
50
+
51
+ abi_attr :auto_size?
52
+
53
+ def next_row reset_column = true
54
+ c = cell
55
+ self.cell = [c[0] + 1, reset_column ? 0 : c[1]]
56
+ end
57
+
58
+ def! :next_row do
59
+ next_row
60
+ end
61
+
62
+ def next_column reset_row = true
63
+ c = cell
64
+ self.cell = [reset_row ? 0 : c[0], c[1] + 1]
65
+ end
66
+
67
+ def! :next_column do
68
+ next_column
69
+ end
70
+
71
+ def! :next do
72
+ direction == :column ? next_row : next_column
73
+ end
74
+
75
+ def widgets
76
+ widgets = {}
77
+ block_caller = Fiddle::Closure::BlockCaller.new(0,
78
+ [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP, Fiddle::TYPE_INT, Fiddle::TYPE_INT]) do |pointer, type, row, column|
79
+ widgets[[row, column]] = self_cast_up(pointer, abi_unpack_string(type))
80
+ end
81
+ _abi_get_widget_locations block_caller
82
+ return widgets
83
+ end
84
+
85
+ def add widget, id
86
+ super
87
+ _abi_set_widget_cell abi_pack_widget(widget), *cell
88
+ _abi_set_widget_alignment abi_pack_widget(widget), abi_pack(Alignment, alignment) if alignment
89
+ _abi_set_widget_padding abi_pack_widget(widget), abi_pack(Outline, *padding) if padding
90
+ if direction == :column
91
+ next_column false
92
+ else
93
+ next_row false
94
+ end
95
+ end
96
+
97
+ def get(*keys)
98
+ case keys
99
+ in [Symbol]
100
+ id = page.clubs[keys.first]&.members&.first
101
+ id && self_cast_up(_abi_get(abi_pack_string id))
102
+ in [Integer, Integer]
103
+ self_cast_up(_abi_get_widget *keys)
104
+ else
105
+ Enumerator.new do |e|
106
+ Array(self_get_widget_name keys).flatten.compact.uniq.each do |id|
107
+ w = _abi_get(abi_pack_string id)
108
+ e << self_cast_up(w) if w && !w.null?
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ # internal
115
+
116
+ def self_get_widget_name a
117
+ case a
118
+ in Widget
119
+ a.name
120
+ in [Integer, Integer]
121
+ w = _abi_get_widget *a
122
+ return nil if w.null?
123
+ self_cast_up(w, equip: false).name
124
+ in Enumerable
125
+ a.map{ self_get_widget_name _1 }.flatten
126
+ else
127
+ page.clubs[a]&.members
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'container'
2
+
3
+ module Tgui
4
+ class Group < Container
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'backend_gui'
2
+ require_relative 'signal/signal'
3
+
4
+ module Tgui
5
+ class Gui < BackendGui
6
+
7
+ abi_def :self_add, :add, [Object, String] => nil
8
+ abi_def :self_remove, :remove, [Object] => nil
9
+ abi_def :self_active?, :is_active, nil => Boolean
10
+ abi_def :self_poll_events, :poll_events
11
+ abi_def :self_draw, :draw
12
+ abi_def :clear_color=, Color => nil
13
+ abi_attr :clipboard, String
14
+
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'box_layout_ratios'
2
+
3
+ module Tgui
4
+ class HorizontalLayout < BoxLayoutRatios
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'box_layout'
2
+
3
+ module Tgui
4
+ class HorizontalWrap < BoxLayout
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'widget'
2
+ require_relative 'signal/signal_float'
3
+
4
+ module Tgui
5
+ class Knob < Widget
6
+
7
+ abi_attr :start, Float, :start_rotation
8
+ abi_attr :end, Float, :end_rotation
9
+ abi_attr :min, Float, :minimum
10
+ abi_attr :max, Float, :maximum
11
+ abi_attr :value, Float
12
+ abi_attr :clockwise?, :clockwise_turning
13
+ abi_signal :on_change, SignalFloat, :on_value_change
14
+
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ require_relative 'clickable_widget'
2
+ require_relative 'scrollbar'
3
+
4
+ module Tgui
5
+ class Label < ClickableWidget
6
+
7
+ abi_attr :text, String
8
+ abi_attr :scrollbar_value, Integer
9
+ abi_attr :auto_size?, Boolean, :get_
10
+ abi_attr :max_width, Integer, :maximum_text_width
11
+ abi_def :ignore_mouse_events, Boolean => nil
12
+ abi_def :ignore_mouse_events?, :ignoring_mouse_events, nil => Boolean
13
+ abi_enum "HorizontalAlignment", :left, :center, :right
14
+ abi_attr :horizontal_alignment, HorizontalAlignment
15
+ abi_enum "VerticalAlignment", :top, :center, :bottom
16
+ abi_attr :vertical_alignment, VerticalAlignment
17
+ abi_enum Scrollbar::Policy
18
+ abi_attr :scrollbar_policy, Scrollbar::Policy
19
+
20
+ end
21
+ end
@@ -0,0 +1,125 @@
1
+ require_relative 'widget'
2
+ require_relative 'signal/signal_item'
3
+ require_relative 'signal/signal_u_int'
4
+
5
+ module Tgui
6
+ class ListBox < Widget
7
+
8
+ class SignalItem < Tgui::SignalItem
9
+ def block_caller &b
10
+ Fiddle::Closure::BlockCaller.new(0, [Fiddle::TYPE_VOIDP, Fiddle::TYPE_VOIDP]) do |str1, str2|
11
+ id = @widget.abi_unpack_string(str2)
12
+ @widget.page.upon! @widget do
13
+ b.(@widget.self_get_object_by_id(id), @widget)
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ abi_enum "TextAlignment", :left, :center, :right
20
+
21
+ @@auto_item_id = "@/"
22
+
23
+ api_attr :format do
24
+ :to_s
25
+ end
26
+
27
+ abi_attr :item_height, Integer
28
+ abi_attr :max_items, Integer, :maximum_items
29
+ abi_attr :auto_scroll?
30
+ abi_attr :scrollbar_value, Integer
31
+ abi_signal :on_item_select, SignalItem
32
+ abi_signal :on_mouse_press, SignalItem
33
+ abi_signal :on_mouse_release, SignalItem
34
+ abi_signal :on_double_click, SignalItem
35
+ abi_signal :on_scroll, SignalUInt
36
+ abi_attr :text_alignment, TextAlignment
37
+
38
+ class Item
39
+ def initialize list_box, id
40
+ @list_box = list_box
41
+ @id = id
42
+ end
43
+
44
+ def object=(object)
45
+ @list_box.self_objects[@id] = object
46
+ end
47
+
48
+ def object
49
+ return @list_box.self_objects[@id]
50
+ end
51
+
52
+ def text=(text)
53
+ @list_box._abi_change_item_by_id @id, abi_pack_string(text)
54
+ end
55
+
56
+ def remove
57
+ @list_box._abi_remove_item_by_id @id
58
+ end
59
+ end
60
+
61
+ def! :item do |object = nil, **na, &b|
62
+ text = object.then(&format)
63
+ @@auto_item_id = id = @@auto_item_id.next
64
+ _abi_add_item abi_pack_string(text), abi_pack_string(id)
65
+ item = Item.new self, id
66
+ na[:object] ||= object
67
+ upon! item, **na, &b
68
+ end
69
+
70
+ def remove_all
71
+ self_objects.clear
72
+ _abi_remove_all_items
73
+ end
74
+
75
+ def selected
76
+ return self_objects[abi_unpack_string _abi_get_selected_item_id]
77
+ end
78
+
79
+ def selected=(object)
80
+ id = self_find_id_by_object object
81
+ raise "`#{object}` is out of the listbox" if !id
82
+ _abi_set_selected_item_by_id abi_pack_string(id)
83
+ end
84
+
85
+ abi_def :deselect, :deselect_item
86
+
87
+ def remove object
88
+ id = self_find_id_by_object object
89
+ if id
90
+ _abi_remove_item_by_id abi_pack_string(id)
91
+ self_objects.delete id
92
+ end
93
+ end
94
+
95
+ def items=(items)
96
+ remove_all
97
+ items.each do |item|
98
+ self.item item
99
+ end
100
+ end
101
+
102
+ def items
103
+ self_objects.values
104
+ end
105
+
106
+ def [](object)
107
+ id = self_find_id_by_object object
108
+ id ? Item.new(self, id) : nil
109
+ end
110
+
111
+ # internal
112
+
113
+ api_attr :self_objects do
114
+ Hash.new
115
+ end
116
+
117
+ def self_get_object_by_id id
118
+ return self_objects[id]
119
+ end
120
+
121
+ def self_find_id_by_object object
122
+ self_objects.find{ _2 == object }&.at(0)
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,239 @@
1
+ require_relative 'widget'
2
+ require_relative '../convention/widget_like'
3
+ require_relative 'signal/signal_int'
4
+
5
+ module Tgui
6
+ class ListView < Widget
7
+
8
+ class ListViewItemSignal < Tgui::SignalInt
9
+ def block_caller &b
10
+ Fiddle::Closure::BlockCaller.new(0, [Fiddle::TYPE_INT]) do |index|
11
+ @widget.page.upon! @widget do
12
+ b.(@widget.self_objects[index], @widget)
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ class ListViewColumnSignal < Tgui::SignalInt
19
+ def block_caller &b
20
+ Fiddle::Closure::BlockCaller.new(0, [Fiddle::TYPE_INT]) do |index|
21
+ @widget.page.upon! @widget do
22
+ b.(@widget.columns[index], @widget)
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ abi_enum "ColumnAlignment", :left, :center, :right
29
+
30
+ api_attr :columns do
31
+ []
32
+ end
33
+
34
+ class Column < WidgetLike
35
+ def initialize list_view, index
36
+ super
37
+ @format = :to_s
38
+ end
39
+
40
+ attr_accessor :format
41
+
42
+ abi_attr :text, String, :column_text, id: 0
43
+ abi_attr :width, Integer, :column_width, id: 0
44
+ abi_def :design_width, :get_column_, id: 0, nil => Integer
45
+ abi_attr :auto_resize?, Boolean, :column_auto_resize, id: 0
46
+ abi_attr :expanded?, Boolean, :column_expanded, id: 0
47
+ abi_attr :alignment, ColumnAlignment, :column_alignment, id: 0
48
+ end
49
+
50
+ class Item < WidgetLike
51
+ def initialize list_view, object
52
+ super
53
+ end
54
+
55
+ def id
56
+ host.self_object_index @id
57
+ end
58
+
59
+ def object=(object)
60
+ @list_view.self_change_object @id, object
61
+ self.id = object
62
+ end
63
+
64
+ alias_method :object, :id
65
+
66
+ abi_attr :icon, Texture, :item_icon, id: 0
67
+ end
68
+
69
+ def! :column do |**na, &b|
70
+ index = _abi_add_column
71
+ column = Column.new self, index
72
+ columns << column
73
+ upon! column, **na, &b
74
+ end
75
+
76
+ def! :item do |object, **na, &b|
77
+ self_add_object object, na[:index]
78
+ item = Item.new self, object
79
+ na.delete :index
80
+ upon! item, **na, &b
81
+ end
82
+
83
+ def items=(items)
84
+ remove_all_rows
85
+ items.each do |item|
86
+ self.item item
87
+ end
88
+ end
89
+
90
+ def items
91
+ self_objects.map(&:object)
92
+ end
93
+
94
+ def [](object)
95
+ key = self_objects.index object
96
+ key ? Item.new(self, object) : nil
97
+ end
98
+
99
+ def remove_columns
100
+ self.columns = []
101
+ _abi_remove_all_columns
102
+ end
103
+
104
+ def remove object
105
+ key = self_objects.index object
106
+ if key
107
+ _abi_remove_item key
108
+ self_objects.delete_at key
109
+ end
110
+ end
111
+
112
+ def remove_rows
113
+ self.self_objects = []
114
+ _abi_remove_all_items
115
+ end
116
+
117
+ def selected
118
+ if multi_select?
119
+ self_selected_item_indices.map{ self_objects[_1] }
120
+ else
121
+ self_selected_item_indices.first&.tap{ self_objects[_1] }
122
+ end
123
+ end
124
+
125
+ def selected=(selected)
126
+ index = self_objects.index selected
127
+ if index
128
+ self_set_selected_item_indices [index]
129
+ elsif selected.is_a? Enumerable
130
+ self_set_selected_item_indices selected.map{|s| self_objects.index s }.compact
131
+ end
132
+ end
133
+
134
+ abi_attr :separator_width, Integer
135
+ abi_attr :row_height, Integer, :item_height
136
+ abi_def :deselect, :deselect_items
137
+ abi_attr :multi_select?
138
+ abi_attr :auto_scroll?
139
+ abi_attr :resizable_columns?
140
+ abi_enum Scrollbar::Policy
141
+ abi_attr :vertical_scrollbar_policy, Scrollbar::Policy
142
+ abi_attr :horizontal_scrollbar_policy, Scrollbar::Policy
143
+ abi_attr :vertical_scrollbar_value, Integer
144
+ abi_attr :horizontal_scrollbar_value, Integer
145
+ abi_attr :fixed_icon_size, Vector2f
146
+ abi_signal :on_item_select, ListViewItemSignal
147
+ abi_signal :on_double_click, ListViewItemSignal
148
+ abi_signal :on_right_click, ListViewItemSignal
149
+ abi_signal :on_header_click, ListViewColumnSignal
150
+
151
+ def! :grid_lines do | **na, &b|
152
+ lines = GridLines.new self
153
+ upon! lines, **na, &b
154
+ end
155
+
156
+ def grid_lines=(grid_lines)
157
+ case grid_lines
158
+ when Numeric
159
+ api_bang_grid_lines width: grid_lines
160
+ when false
161
+ api_bang_grid_lines horizontal: false, vertical: false
162
+ when Hash
163
+ api_bang_grid_lines **grid_lines
164
+ end
165
+ end
166
+
167
+ class GridLines < WidgetLike
168
+ def initialize list_view
169
+ super(list_view, nil)
170
+ end
171
+
172
+ abi_attr :width, Integer, :grid_lines_width
173
+ abi_attr :horizontal?, Boolean, :show_horizontal_grid_lines
174
+ abi_attr :vertical?, Boolean, :show_vertical_grid_lines
175
+ end
176
+
177
+ def! :header do |**na, &b|
178
+ header = Header.new self
179
+ upon! header, **na, &b
180
+ end
181
+
182
+ def header=(header)
183
+ case header
184
+ when true, false
185
+ api_bang_header visible: header
186
+ when Hash
187
+ api_bang_header **header
188
+ when Proc
189
+ api_bang_header &header
190
+ end
191
+ end
192
+
193
+ class Header < WidgetLike
194
+ def initialize list_view
195
+ super(list_view, nil)
196
+ end
197
+
198
+ abi_attr :height, Integer, :header_height
199
+ abi_attr :text_size, Integer, :header_text_size
200
+ abi_attr :separator_height, Integer, :header_separator_height
201
+ abi_def :actual_height, :get_current_header_height, nil => Integer
202
+ abi_attr :visible, Boolean, :header_visible
203
+ end
204
+
205
+ # internal
206
+
207
+ api_attr :self_objects do
208
+ []
209
+ end
210
+
211
+ def self_add_object object, index = nil
212
+ index = self_add_item self_object_to_strings(object), index: index
213
+ self_objects.insert index, object
214
+ index
215
+ end
216
+
217
+ def self_change_object old, new
218
+ index = self_objects.index old
219
+ self_change_item index, self_object_to_strings(new)
220
+ self_objects[index] = new
221
+ end
222
+
223
+ def self_object_to_strings object
224
+ columns.map{|c| object.then(&c.format).to_s }
225
+ end
226
+
227
+ def self_add_item item, index: nil
228
+ if index
229
+ _abi_insert_item index, abi_pack(String..., item)
230
+ index
231
+ else
232
+ _abi_add_item abi_pack(String..., *item)
233
+ end
234
+ end
235
+
236
+ abi_def :self_change_item, :change_item, [Integer, String...] => nil
237
+ abi_attr :self_selected_item_indices, Integer.., :selected_item_indices
238
+ end
239
+ end