nuklear 0.1.0
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.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +29 -0
- data/LICENSE.txt +21 -0
- data/README.md +196 -0
- data/Rakefile +26 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/examples/arial.ttf +0 -0
- data/examples/calculator.rb +102 -0
- data/examples/hello_nuklear.rb +182 -0
- data/examples/lib/opengl_font.rb +32 -0
- data/examples/lib/opengl_init.rb +4 -0
- data/examples/lib/sdl2_init.rb +6 -0
- data/examples/lib/sdl2_input.rb +81 -0
- data/examples/lib/window.rb +47 -0
- data/ext/freetype/extconf.rb +26 -0
- data/ext/nuklear/extconf.rb +14 -0
- data/ext/nuklear/nkrb.c +79 -0
- data/ext/nuklear/nkrb.h +89 -0
- data/ext/nuklear/nkrb_buffer.c +80 -0
- data/ext/nuklear/nkrb_context.c +241 -0
- data/ext/nuklear/nkrb_font.c +80 -0
- data/ext/nuklear/nkrb_renderer.c +114 -0
- data/ext/nuklear/nkrb_style.c +61 -0
- data/ext/nuklear/nkrb_style_color.c +126 -0
- data/ext/nuklear/nkrb_style_image.c +32 -0
- data/ext/nuklear/nkrb_ui.c +32 -0
- data/ext/nuklear/nkrb_ui_builder.c +29 -0
- data/ext/nuklear/nkrb_ui_button.c +55 -0
- data/ext/nuklear/nkrb_ui_color_picker.c +20 -0
- data/ext/nuklear/nkrb_ui_combo.c +73 -0
- data/ext/nuklear/nkrb_ui_container.c +7 -0
- data/ext/nuklear/nkrb_ui_edit_string.c +38 -0
- data/ext/nuklear/nkrb_ui_group.c +27 -0
- data/ext/nuklear/nkrb_ui_label.c +30 -0
- data/ext/nuklear/nkrb_ui_layout.c +125 -0
- data/ext/nuklear/nkrb_ui_menu.c +49 -0
- data/ext/nuklear/nkrb_ui_menu_item.c +30 -0
- data/ext/nuklear/nkrb_ui_menubar.c +18 -0
- data/ext/nuklear/nkrb_ui_popup.c +24 -0
- data/ext/nuklear/nkrb_ui_progress.c +19 -0
- data/ext/nuklear/nkrb_ui_property.c +20 -0
- data/ext/nuklear/nkrb_ui_selectables.c +53 -0
- data/ext/nuklear/nkrb_ui_slider.c +19 -0
- data/ext/nuklear/nkrb_ui_tree.c +29 -0
- data/ext/nuklear/nkrb_ui_widget.c +7 -0
- data/ext/nuklear/nkrb_ui_window.c +43 -0
- data/ext/nuklear/nuklear.h +23378 -0
- data/ext/nuklear_renderer_opengl2/KHR/khrplatform.h +285 -0
- data/ext/nuklear_renderer_opengl2/extconf.rb +13 -0
- data/ext/nuklear_renderer_opengl2/glad.c +1432 -0
- data/ext/nuklear_renderer_opengl2/glad.h +2747 -0
- data/ext/nuklear_renderer_opengl2/nuklear_renderer_opengl2.c +197 -0
- data/ext/nuklear_renderer_opengl4/KHR/khrplatform.h +285 -0
- data/ext/nuklear_renderer_opengl4/extconf.rb +13 -0
- data/ext/nuklear_renderer_opengl4/glad.c +1782 -0
- data/ext/nuklear_renderer_opengl4/glad.h +3687 -0
- data/ext/nuklear_renderer_opengl4/nuklear_renderer_opengl4.c +255 -0
- data/lib/nuklear/context.rb +49 -0
- data/lib/nuklear/dsl.rb +46 -0
- data/lib/nuklear/event_buffer.rb +23 -0
- data/lib/nuklear/renderer/opengl24.rb +13 -0
- data/lib/nuklear/renderer.rb +108 -0
- data/lib/nuklear/style/color.rb +24 -0
- data/lib/nuklear/style/image.rb +9 -0
- data/lib/nuklear/style.rb +8 -0
- data/lib/nuklear/test_case.rb +30 -0
- data/lib/nuklear/ui/base.rb +34 -0
- data/lib/nuklear/ui/button.rb +77 -0
- data/lib/nuklear/ui/checkbox.rb +39 -0
- data/lib/nuklear/ui/col.rb +21 -0
- data/lib/nuklear/ui/color_picker.rb +31 -0
- data/lib/nuklear/ui/combo_box.rb +42 -0
- data/lib/nuklear/ui/container.rb +80 -0
- data/lib/nuklear/ui/edit_string.rb +48 -0
- data/lib/nuklear/ui/enableable.rb +29 -0
- data/lib/nuklear/ui/events.rb +23 -0
- data/lib/nuklear/ui/group.rb +31 -0
- data/lib/nuklear/ui/label.rb +21 -0
- data/lib/nuklear/ui/menu.rb +43 -0
- data/lib/nuklear/ui/menu_bar.rb +19 -0
- data/lib/nuklear/ui/menu_item.rb +34 -0
- data/lib/nuklear/ui/option.rb +17 -0
- data/lib/nuklear/ui/option_group.rb +22 -0
- data/lib/nuklear/ui/popup.rb +37 -0
- data/lib/nuklear/ui/progress.rb +33 -0
- data/lib/nuklear/ui/property.rb +28 -0
- data/lib/nuklear/ui/row.rb +28 -0
- data/lib/nuklear/ui/select_list.rb +31 -0
- data/lib/nuklear/ui/selectable.rb +21 -0
- data/lib/nuklear/ui/slider.rb +26 -0
- data/lib/nuklear/ui/text_align.rb +14 -0
- data/lib/nuklear/ui/tree.rb +62 -0
- data/lib/nuklear/ui/window.rb +175 -0
- data/lib/nuklear/ui.rb +33 -0
- data/lib/nuklear/version.rb +3 -0
- data/lib/nuklear.rb +26 -0
- data/nuklear.gemspec +41 -0
- metadata +233 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class Checkbox < Nuklear::UI::Base
|
|
4
|
+
attr_accessor :text
|
|
5
|
+
|
|
6
|
+
def initialize(text, checked: false, enabled: true, &block)
|
|
7
|
+
super enabled: enabled
|
|
8
|
+
@text = text
|
|
9
|
+
@checked = checked
|
|
10
|
+
on(true) { @checked = true }
|
|
11
|
+
on(false) { @checked = false }
|
|
12
|
+
if block_given?
|
|
13
|
+
on true, &block
|
|
14
|
+
on false, &block
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def checked?
|
|
19
|
+
@checked
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def checked=(checked)
|
|
23
|
+
@checked = checked
|
|
24
|
+
@last_event = checked
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
alias selected? checked?
|
|
28
|
+
alias selected= checked=
|
|
29
|
+
|
|
30
|
+
def to_command
|
|
31
|
+
[ :ui_checkbox, text, checked? ]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def result(event, context)
|
|
35
|
+
trigger event
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class Col < Base
|
|
4
|
+
include Nuklear::UI::Container
|
|
5
|
+
attr_accessor :width
|
|
6
|
+
|
|
7
|
+
def initialize(width:, **options)
|
|
8
|
+
super(**options)
|
|
9
|
+
self.width = width
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def to_command
|
|
13
|
+
[:ui_layout_row_push, width]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def result(_, context)
|
|
17
|
+
run_commands(context)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class ColorPicker < Base
|
|
4
|
+
attr_accessor :color
|
|
5
|
+
attr_reader :type
|
|
6
|
+
|
|
7
|
+
def initialize(color, type: :rgba, **options)
|
|
8
|
+
super(**options)
|
|
9
|
+
self.color = color
|
|
10
|
+
self.type = type
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def type=(t)
|
|
14
|
+
case t
|
|
15
|
+
when :rgb, :rgba then @type = t
|
|
16
|
+
else raise ArgumentError, "invalid color picker type, must be :rgb or :rgba"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_command
|
|
21
|
+
[:ui_color_picker, color, type]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def result(color, context)
|
|
25
|
+
@color = color
|
|
26
|
+
trigger :color_changed
|
|
27
|
+
@last_event = nil
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class ComboBox < Nuklear::UI::Base
|
|
4
|
+
include Nuklear::UI::Container
|
|
5
|
+
|
|
6
|
+
attr_accessor :text, :image, :color, :symbol, :width, :height
|
|
7
|
+
|
|
8
|
+
def initialize(text: nil, image: nil, color: nil, symbol: nil, width:, height:, **options)
|
|
9
|
+
super(**options)
|
|
10
|
+
self.text = text
|
|
11
|
+
self.image = image
|
|
12
|
+
self.color = color
|
|
13
|
+
self.symbol = symbol
|
|
14
|
+
self.width = width
|
|
15
|
+
self.height = height
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def red; color.red; end
|
|
19
|
+
def red=(a); color.red = a; end
|
|
20
|
+
def green; color.green; end
|
|
21
|
+
def green=(a); color.green = a; end
|
|
22
|
+
def blue; color.blue; end
|
|
23
|
+
def blue=(a); color.blue = a; end
|
|
24
|
+
def alpha; color.alpha; end
|
|
25
|
+
def alpha=(a); color.alpha = a; end
|
|
26
|
+
def hue; color.hue; end
|
|
27
|
+
def hue=(a); color.hue = a; end
|
|
28
|
+
def saturation; color.saturation; end
|
|
29
|
+
def saturation=(a); color.saturation = a; end
|
|
30
|
+
def value; color.value; end
|
|
31
|
+
def value=(a); color.value = a; end
|
|
32
|
+
|
|
33
|
+
def to_command
|
|
34
|
+
[ :ui_combobox, text, color, symbol, image, width, height ]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def result(expanded, context)
|
|
38
|
+
run_commands(context) if expanded
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
module Container
|
|
4
|
+
def commands
|
|
5
|
+
@commands ||= []
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def run_command(context, command)
|
|
9
|
+
if command.respond_to?(:to_command)
|
|
10
|
+
if !command.respond_to?(:enabled?) || command.enabled?
|
|
11
|
+
cmd = command.to_command
|
|
12
|
+
result = send(cmd[0], context, *cmd[1..-1]) do |ret|
|
|
13
|
+
command.result(ret, context) if command.respond_to?(:result)
|
|
14
|
+
end
|
|
15
|
+
command.result(result, context) if !result.nil? && command.respond_to?(:result)
|
|
16
|
+
end
|
|
17
|
+
elsif command.respond_to?(:[])
|
|
18
|
+
send(command[0], context, *command[1..-1])
|
|
19
|
+
else
|
|
20
|
+
raise "Unexpected command #{command.inspect}"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def run_commands(context)
|
|
25
|
+
commands.each do |command|
|
|
26
|
+
if command.respond_to?(:to_commands)
|
|
27
|
+
command.to_commands.each { |cmd| run_command(context, cmd) }
|
|
28
|
+
else
|
|
29
|
+
run_command(context, command)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def <<(other)
|
|
35
|
+
commands << other
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Iterates over every item in this container, and yields each item
|
|
39
|
+
# (starting with the container itself) to the block.
|
|
40
|
+
def traverse(&block)
|
|
41
|
+
yield self
|
|
42
|
+
commands.each do |item|
|
|
43
|
+
if item.respond_to?(:traverse)
|
|
44
|
+
item.traverse(&block)
|
|
45
|
+
else
|
|
46
|
+
yield item
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Traverses this container and any of its sub-containers, yielding each
|
|
52
|
+
# item to the block. Returns each item for which the block returned true.
|
|
53
|
+
def find(&block)
|
|
54
|
+
matches = []
|
|
55
|
+
traverse do |item|
|
|
56
|
+
matches << item if yield(item)
|
|
57
|
+
end
|
|
58
|
+
return matches
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
LayoutRowDynamic = Struct.new(:height, :ncols) do
|
|
62
|
+
def to_command
|
|
63
|
+
[ :ui_layout_row_dynamic, height, ncols ]
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def layout_row_dynamic(height, ncols)
|
|
68
|
+
LayoutRowDynamic.new(height, ncols).tap { |row| commands << row }
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def method_missing(name, *args)
|
|
72
|
+
if respond_to?(:"ui_#{name}")
|
|
73
|
+
commands << [:"ui_#{name}", *args]
|
|
74
|
+
else
|
|
75
|
+
super
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class EditString < Nuklear::UI::Base
|
|
4
|
+
attr_accessor :flags, :max_length, :filter, :text
|
|
5
|
+
|
|
6
|
+
def initialize(text: "", flags: 0, max_length: 255, filter: nil, enabled: true)
|
|
7
|
+
super enabled: enabled
|
|
8
|
+
@text = text
|
|
9
|
+
@flags = Nuklear.parse_flags :edit, flags
|
|
10
|
+
@max_length = max_length
|
|
11
|
+
@filter = filter
|
|
12
|
+
@demand_focus = false
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def demand_focus?
|
|
16
|
+
@demand_focus
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def focus
|
|
20
|
+
@demand_focus = true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def to_commands
|
|
24
|
+
if demand_focus?
|
|
25
|
+
@demand_focus = false
|
|
26
|
+
[
|
|
27
|
+
[:ui_edit_focus, flags],
|
|
28
|
+
self,
|
|
29
|
+
]
|
|
30
|
+
else
|
|
31
|
+
[self]
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def to_command
|
|
36
|
+
[:ui_edit_string, flags, text, max_length, filter]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def result(result, context)
|
|
40
|
+
trigger(:activated) if (result & Nuklear::NK_EDIT_ACTIVATED) > 0
|
|
41
|
+
trigger(:deactivated) if (result & Nuklear::NK_EDIT_DEACTIVATED) > 0
|
|
42
|
+
trigger(:committed) if (result & Nuklear::NK_EDIT_COMMITED) > 0
|
|
43
|
+
trigger(:active) if (result & Nuklear::NK_EDIT_ACTIVE) > 0
|
|
44
|
+
trigger(:inactive) if (result & Nuklear::NK_EDIT_INACTIVE) > 0
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
module Enableable
|
|
4
|
+
def enabled=(a)
|
|
5
|
+
@enabled = a
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def disabled=(a)
|
|
9
|
+
self.enabled = !a
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def enable
|
|
13
|
+
self.enabled = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def disable
|
|
17
|
+
self.enabled = false
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def enabled?
|
|
21
|
+
@enabled.nil? ? true : @enabled
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def disabled?
|
|
25
|
+
!enabled?
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
module Events
|
|
4
|
+
def on(*events, &block)
|
|
5
|
+
events.each do |event|
|
|
6
|
+
event_listeners_for(event) << block
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def event_listeners_for(event)
|
|
11
|
+
@event_listeners ||= {}
|
|
12
|
+
@event_listeners[event] ||= []
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def trigger(event)
|
|
16
|
+
if event != @last_event # prevent triggering every frame
|
|
17
|
+
event_listeners_for(event).each { |listener| listener.call event }
|
|
18
|
+
@last_event = event
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class Group < Nuklear::UI::Base
|
|
4
|
+
include Nuklear::UI::Container
|
|
5
|
+
|
|
6
|
+
attr_accessor :title, :scroll_x, :scroll_y
|
|
7
|
+
|
|
8
|
+
def initialize(title = object_id.to_s, **options)
|
|
9
|
+
super(**options)
|
|
10
|
+
@scroll_x = @scroll_y = 0
|
|
11
|
+
self.title = title
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def to_command
|
|
15
|
+
[ :ui_group, title, flags, scroll_x, scroll_y ]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def flags
|
|
19
|
+
0
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def result(new_state, context)
|
|
23
|
+
if new_state.kind_of?(Array)
|
|
24
|
+
@scroll_x, @scroll_y = new_state
|
|
25
|
+
else
|
|
26
|
+
run_commands(context)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class Label < Nuklear::UI::Base
|
|
4
|
+
include Nuklear::UI::TextAlign
|
|
5
|
+
|
|
6
|
+
attr_accessor :text, :color, :wrap, :align
|
|
7
|
+
|
|
8
|
+
def initialize(text, color: nil, wrap: false, align: :left, **options)
|
|
9
|
+
super(**options)
|
|
10
|
+
self.text = text
|
|
11
|
+
self.color = color
|
|
12
|
+
self.wrap = wrap
|
|
13
|
+
self.align = align
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to_command
|
|
17
|
+
[:ui_label, text, color, wrap, align_as_flags(align)]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class Menu < Nuklear::UI::Base
|
|
4
|
+
include Nuklear::UI::Container
|
|
5
|
+
include Nuklear::UI::TextAlign
|
|
6
|
+
|
|
7
|
+
attr_accessor :title, :image, :symbol, :align, :width, :height
|
|
8
|
+
|
|
9
|
+
def initialize(enabled: true, title: nil, image: nil, symbol: nil,
|
|
10
|
+
align: :left, width:, height:)
|
|
11
|
+
super enabled: enabled
|
|
12
|
+
@title = title
|
|
13
|
+
@image = image
|
|
14
|
+
@symbol = symbol
|
|
15
|
+
@align = align
|
|
16
|
+
@width = width
|
|
17
|
+
@height = height
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def to_command
|
|
21
|
+
[:ui_menu, {
|
|
22
|
+
id: object_id,
|
|
23
|
+
title: title,
|
|
24
|
+
image: image,
|
|
25
|
+
symbol: symbol,
|
|
26
|
+
align: align_as_flags(align),
|
|
27
|
+
width: width,
|
|
28
|
+
height: height
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def visible?
|
|
34
|
+
@visible
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def result(visible, context)
|
|
38
|
+
@visible = visible
|
|
39
|
+
run_commands(context) if visible
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class MenuBar < Nuklear::UI::Base
|
|
4
|
+
include Nuklear::UI::Container
|
|
5
|
+
|
|
6
|
+
def initialize(enabled: true)
|
|
7
|
+
super enabled: enabled
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def to_command
|
|
11
|
+
[:ui_menubar]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def result(visible, context)
|
|
15
|
+
run_commands(context) if visible
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class MenuItem < Nuklear::UI::Base
|
|
4
|
+
include Nuklear::UI::Container
|
|
5
|
+
include Nuklear::UI::TextAlign
|
|
6
|
+
|
|
7
|
+
attr_accessor :title, :image, :symbol, :align
|
|
8
|
+
|
|
9
|
+
def initialize(enabled: true, title: nil, image: nil, symbol: nil, align: :left, &block)
|
|
10
|
+
super enabled: enabled
|
|
11
|
+
@title = title
|
|
12
|
+
@image = image
|
|
13
|
+
@symbol = symbol
|
|
14
|
+
@align = align
|
|
15
|
+
on(:clicked, &block) if block_given?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def to_command
|
|
19
|
+
[:ui_menu_item, {
|
|
20
|
+
title: title,
|
|
21
|
+
image: image,
|
|
22
|
+
symbol: symbol,
|
|
23
|
+
align: align_as_flags(align)
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def result(clicked, context)
|
|
29
|
+
trigger(:clicked)
|
|
30
|
+
@last_event = nil # trigger event each time
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class Option < Nuklear::UI::Checkbox
|
|
4
|
+
def to_command
|
|
5
|
+
[ :ui_option, text, checked? ]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# Override #result to prevent user deselecting this option by clicking
|
|
9
|
+
# on it. Checkbox can be deselected, option cannot. Only choosing a
|
|
10
|
+
# competing option can cause it to be deselected, and doing that does
|
|
11
|
+
# not call #result. See Nuklear::UI::OptionGroup.
|
|
12
|
+
def result(event, context)
|
|
13
|
+
trigger event if event
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class OptionGroup < Base
|
|
4
|
+
include Nuklear::UI::Container
|
|
5
|
+
|
|
6
|
+
def initialize(**options)
|
|
7
|
+
super(**options)
|
|
8
|
+
@options = []
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def selection=(selected)
|
|
12
|
+
@options.each { |option| option.selected = (option == selected) }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def <<(other)
|
|
16
|
+
super other
|
|
17
|
+
@options << other
|
|
18
|
+
other.on(true) { self.selection = other }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'nuklear/ui/window'
|
|
2
|
+
|
|
3
|
+
module Nuklear
|
|
4
|
+
module UI
|
|
5
|
+
class Popup < Nuklear::UI::Window
|
|
6
|
+
attr_accessor :type
|
|
7
|
+
|
|
8
|
+
def initialize(title, type: :static, enabled: false, **options)
|
|
9
|
+
super title, enabled: enabled, **options
|
|
10
|
+
self.type = type
|
|
11
|
+
on(:visible) { self.enabled = true }
|
|
12
|
+
on(:hidden) { self.enabled = false }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def to_command
|
|
16
|
+
[:ui_popup,
|
|
17
|
+
type == :dynamic ? NK_POPUP_DYNAMIC : NK_POPUP_STATIC,
|
|
18
|
+
title,
|
|
19
|
+
flags,
|
|
20
|
+
left,
|
|
21
|
+
top,
|
|
22
|
+
width,
|
|
23
|
+
height
|
|
24
|
+
]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def visible?
|
|
28
|
+
@enabled
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def result(visibility, context)
|
|
32
|
+
trigger(visibility)
|
|
33
|
+
run_commands(context) if visible?
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class Progress < Base
|
|
4
|
+
attr_accessor :current, :min, :max
|
|
5
|
+
attr_writer :modifiable
|
|
6
|
+
|
|
7
|
+
def initialize(enabled: true, min: 1, max: 100, current: 1, modifiable: true)
|
|
8
|
+
super enabled: enabled
|
|
9
|
+
@min = min
|
|
10
|
+
@max = max
|
|
11
|
+
@current = current
|
|
12
|
+
@modifiable = modifiable
|
|
13
|
+
on(:changed) { yield @current } if block_given?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to_command
|
|
17
|
+
[:ui_progress, current, max, modifiable?]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def modifiable?
|
|
21
|
+
@modifiable
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def result(x, context)
|
|
25
|
+
x = min if x < min
|
|
26
|
+
return unless x != @current
|
|
27
|
+
@current = x
|
|
28
|
+
trigger :changed
|
|
29
|
+
@last_event = nil
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class Property < Base
|
|
4
|
+
attr_accessor :current, :min, :max, :step, :inc_per_pixel, :text
|
|
5
|
+
|
|
6
|
+
def initialize(enabled: true, text: '', min: 1, max: 100, current: 1, step: 1, inc_per_pixel: 1)
|
|
7
|
+
super enabled: enabled
|
|
8
|
+
@text = text
|
|
9
|
+
@min = min
|
|
10
|
+
@max = max
|
|
11
|
+
@current = current
|
|
12
|
+
@step = step
|
|
13
|
+
@inc_per_pixel = inc_per_pixel
|
|
14
|
+
on(:changed) { yield @current } if block_given?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_command
|
|
18
|
+
[:ui_property, text, min, current, max, step, inc_per_pixel]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def result(x, context)
|
|
22
|
+
@current = x
|
|
23
|
+
trigger :changed
|
|
24
|
+
@last_event = nil
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class Row < Base
|
|
4
|
+
include Nuklear::UI::Container
|
|
5
|
+
attr_accessor :height, :type, :width
|
|
6
|
+
|
|
7
|
+
def initialize(height:, width: nil, type: nil, **options)
|
|
8
|
+
super(**options)
|
|
9
|
+
self.type = type
|
|
10
|
+
self.height = height
|
|
11
|
+
self.width = width
|
|
12
|
+
raise ArgumentError, ":width is required if type is :static" if type == :static && width.nil?
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def to_command
|
|
16
|
+
case type
|
|
17
|
+
when :dynamic then [:ui_layout_row_dynamic, height, commands.size]
|
|
18
|
+
when :static then [:ui_layout_row_static, height, width, commands.size]
|
|
19
|
+
else [:ui_layout_row_begin, type || :static, height, commands.size]
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def result(_, context)
|
|
24
|
+
run_commands(context)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class SelectList < Nuklear::UI::Base
|
|
4
|
+
include Nuklear::UI::Container
|
|
5
|
+
|
|
6
|
+
attr_accessor :choices, :selection, :item_height, :width, :height
|
|
7
|
+
|
|
8
|
+
def initialize(choices, selection: choices[0], item_height:, width:, height:, **options)
|
|
9
|
+
super(**options)
|
|
10
|
+
self.choices = choices
|
|
11
|
+
self.selection = selection
|
|
12
|
+
self.item_height = item_height
|
|
13
|
+
self.width = width
|
|
14
|
+
self.height = height
|
|
15
|
+
on(:selection_changed) { yield self.selection } if block_given?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def to_command
|
|
19
|
+
[ :ui_combo, choices.index(selection) || 0, choices, item_height, width, height ]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def result(choice_index, context)
|
|
23
|
+
if @selection != choices[choice_index]
|
|
24
|
+
@selection = choices[choice_index]
|
|
25
|
+
trigger(:selection_changed)
|
|
26
|
+
@last_event = nil
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Nuklear
|
|
2
|
+
module UI
|
|
3
|
+
class Selectable < Nuklear::UI::Checkbox
|
|
4
|
+
include Nuklear::UI::TextAlign
|
|
5
|
+
|
|
6
|
+
attr_accessor :image, :text, :align
|
|
7
|
+
|
|
8
|
+
def initialize(text: nil, align: :left, image: nil, selected: false, **options, &block)
|
|
9
|
+
super(**options, &block)
|
|
10
|
+
self.selected = selected
|
|
11
|
+
@text = text
|
|
12
|
+
@image = image
|
|
13
|
+
@align = align
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to_command
|
|
17
|
+
[ :ui_selectable, image, text, selected?, align_as_flags(align) ]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|