libui_paradise 0.1.49
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.
Potentially problematic release.
This version of libui_paradise might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/README.md +1505 -0
- data/doc/README.gen +1252 -0
- data/doc/SNIPPETS.md +221 -0
- data/doc/TODO.md +14 -0
- data/lib/libui_paradise/autoinclude.rb +9 -0
- data/lib/libui_paradise/domain_specific_language/README.md +5 -0
- data/lib/libui_paradise/domain_specific_language/button.yml +7 -0
- data/lib/libui_paradise/examples/001_basic_button_example.rb +17 -0
- data/lib/libui_paradise/examples/002_basic_table_image.rb +92 -0
- data/lib/libui_paradise/examples/003_font_button.rb +34 -0
- data/lib/libui_paradise/examples/004_date_time_picker.rb +31 -0
- data/lib/libui_paradise/examples/005_msg_box_error.rb +25 -0
- data/lib/libui_paradise/examples/006_histogram.rb +193 -0
- data/lib/libui_paradise/examples/007_combo_box_example.rb +41 -0
- data/lib/libui_paradise/examples/008_simple_notepad_example.rb +23 -0
- data/lib/libui_paradise/examples/009_checkbox_example.rb +82 -0
- data/lib/libui_paradise/examples/010_grid_example.rb +26 -0
- data/lib/libui_paradise/examples/011_fancy_text_example.rb +21 -0
- data/lib/libui_paradise/examples/012_control_gallery.rb +180 -0
- data/lib/libui_paradise/examples/013_midi_player.rb +91 -0
- data/lib/libui_paradise/examples/014_basic_draw_text.rb +134 -0
- data/lib/libui_paradise/examples/015_font_example.rb +91 -0
- data/lib/libui_paradise/examples/016_search_entry_example.rb +16 -0
- data/lib/libui_paradise/examples/017_tabs_example.rb +22 -0
- data/lib/libui_paradise/examples/018_image_example.rb +82 -0
- data/lib/libui_paradise/examples/019_open_file_button_example.rb +24 -0
- data/lib/libui_paradise/examples/020_unicode_text_example.rb +28 -0
- data/lib/libui_paradise/examples/021_spinbutton_example.rb +25 -0
- data/lib/libui_paradise/examples/022_text_example.rb +16 -0
- data/lib/libui_paradise/examples/023_parse_config_file_example.config +6 -0
- data/lib/libui_paradise/examples/023_parse_config_file_example.rb +13 -0
- data/lib/libui_paradise/examples/024_text_view_example.rb +14 -0
- data/lib/libui_paradise/examples/025_scrolling_area.rb +16 -0
- data/lib/libui_paradise/examples/026_colour_button.rb +51 -0
- data/lib/libui_paradise/examples/027_form_example.rb +37 -0
- data/lib/libui_paradise/examples/028_password_entry_example.rb +17 -0
- data/lib/libui_paradise/examples/029_two_buttons_showing_how_to_enable_and_disable_them.rb +32 -0
- data/lib/libui_paradise/examples/030_table_example.rb +51 -0
- data/lib/libui_paradise/experimental/dsl.rb +17 -0
- data/lib/libui_paradise/extensions/extensions.rb +25 -0
- data/lib/libui_paradise/extensions/hash_fiddle_pointer_widgets.rb +129 -0
- data/lib/libui_paradise/extensions/misc.rb +309 -0
- data/lib/libui_paradise/fiddle/pointer.rb +841 -0
- data/lib/libui_paradise/images/LIBUI_PARADISE_LOGO.png +0 -0
- data/lib/libui_paradise/images/README.md +2 -0
- data/lib/libui_paradise/images/form_example.png +0 -0
- data/lib/libui_paradise/libui_classes/area_handler.rb +52 -0
- data/lib/libui_paradise/libui_classes/button.rb +82 -0
- data/lib/libui_paradise/libui_classes/checkbox.rb +37 -0
- data/lib/libui_paradise/libui_classes/color_button.rb +44 -0
- data/lib/libui_paradise/libui_classes/combobox.rb +55 -0
- data/lib/libui_paradise/libui_classes/editable_combobox.rb +51 -0
- data/lib/libui_paradise/libui_classes/entry.rb +80 -0
- data/lib/libui_paradise/libui_classes/font.rb +78 -0
- data/lib/libui_paradise/libui_classes/font_button.rb +40 -0
- data/lib/libui_paradise/libui_classes/grid.rb +55 -0
- data/lib/libui_paradise/libui_classes/hbox.rb +98 -0
- data/lib/libui_paradise/libui_classes/horizontal_separator.rb +41 -0
- data/lib/libui_paradise/libui_classes/image.rb +82 -0
- data/lib/libui_paradise/libui_classes/label.rb +83 -0
- data/lib/libui_paradise/libui_classes/menu.rb +36 -0
- data/lib/libui_paradise/libui_classes/msg_box.rb +97 -0
- data/lib/libui_paradise/libui_classes/msg_box_error.rb +49 -0
- data/lib/libui_paradise/libui_classes/multiline_entry.rb +59 -0
- data/lib/libui_paradise/libui_classes/non_wrapping_multiline_entry.rb +41 -0
- data/lib/libui_paradise/libui_classes/open_file.rb +42 -0
- data/lib/libui_paradise/libui_classes/password_entry.rb +49 -0
- data/lib/libui_paradise/libui_classes/progressbar.rb +41 -0
- data/lib/libui_paradise/libui_classes/radio_buttons.rb +36 -0
- data/lib/libui_paradise/libui_classes/scrolling_area.rb +85 -0
- data/lib/libui_paradise/libui_classes/search_entry.rb +36 -0
- data/lib/libui_paradise/libui_classes/spinbox.rb +55 -0
- data/lib/libui_paradise/libui_classes/tab.rb +39 -0
- data/lib/libui_paradise/libui_classes/table.rb +45 -0
- data/lib/libui_paradise/libui_classes/text_layout.rb +42 -0
- data/lib/libui_paradise/libui_classes/vbox.rb +51 -0
- data/lib/libui_paradise/libui_classes/window.rb +167 -0
- data/lib/libui_paradise/project/project.rb +26 -0
- data/lib/libui_paradise/prototype/README.md +3 -0
- data/lib/libui_paradise/prototype/prototype.rb +101 -0
- data/lib/libui_paradise/requires/require_the_libui_classes.rb +26 -0
- data/lib/libui_paradise/requires/require_the_libui_paradise_project.rb +11 -0
- data/lib/libui_paradise/version/version.rb +17 -0
- data/lib/libui_paradise.rb +1 -0
- data/libui_paradise.gemspec +49 -0
- metadata +164 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# This example display a single image. This is hardcoded to a local
|
|
6
|
+
# path, so change that constant if you want another image.
|
|
7
|
+
# =========================================================================== #
|
|
8
|
+
require 'libui_paradise/autoinclude'
|
|
9
|
+
require 'chunky_png'
|
|
10
|
+
|
|
11
|
+
# =========================================================================== #
|
|
12
|
+
# === THIS_FILE
|
|
13
|
+
# =========================================================================== #
|
|
14
|
+
THIS_FILE = '/home/x/data/images/NJOY/MEDITERRANEAN.png'
|
|
15
|
+
main_window = ui_main_window('The Red Turtle', 310, 350, 0)
|
|
16
|
+
|
|
17
|
+
hbox = ui_padded_hbox
|
|
18
|
+
main_window.child = hbox
|
|
19
|
+
main_window.intelligent_exit
|
|
20
|
+
|
|
21
|
+
# =========================================================================== #
|
|
22
|
+
# === IMAGES
|
|
23
|
+
#
|
|
24
|
+
# Must store it here to free it up lateron again.
|
|
25
|
+
# =========================================================================== #
|
|
26
|
+
IMAGES = []
|
|
27
|
+
|
|
28
|
+
canvas = ChunkyPNG::Canvas.from_file(THIS_FILE)
|
|
29
|
+
data = canvas.to_rgba_stream
|
|
30
|
+
width = canvas.width
|
|
31
|
+
height = canvas.height
|
|
32
|
+
# ========================================================================= #
|
|
33
|
+
# Add a new image here:
|
|
34
|
+
# ========================================================================= #
|
|
35
|
+
image = UI.new_image(width, height)
|
|
36
|
+
UI.image_append(image, data, width, height, width*4)
|
|
37
|
+
IMAGES << image # Store all images in the following area.
|
|
38
|
+
|
|
39
|
+
# =========================================================================== #
|
|
40
|
+
# Protects BlockCaller objects from garbage collection.
|
|
41
|
+
# =========================================================================== #
|
|
42
|
+
@blockcaller = []
|
|
43
|
+
# =========================================================================== #
|
|
44
|
+
# === rbcallback
|
|
45
|
+
# =========================================================================== #
|
|
46
|
+
def rbcallback(*args, &block)
|
|
47
|
+
args << [0] if args.size == 1 # Argument types are ommited
|
|
48
|
+
blockcaller = Fiddle::Closure::BlockCaller.new(*args, &block)
|
|
49
|
+
@blockcaller << blockcaller
|
|
50
|
+
blockcaller
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
model_handler = UI::FFI::TableModelHandler.malloc
|
|
54
|
+
model_handler.NumColumns = rbcallback(4) { 1 }
|
|
55
|
+
model_handler.ColumnType = rbcallback(4) { 1 } # Image
|
|
56
|
+
model_handler.NumRows = rbcallback(4) { 1 }
|
|
57
|
+
model_handler.CellValue = rbcallback(1, [1, 1, 1, 1]) do |_, _, row, _column|
|
|
58
|
+
UI.new_table_value_image(IMAGES[row])
|
|
59
|
+
end
|
|
60
|
+
model_handler.SetCellValue = rbcallback(0, [0]) {}
|
|
61
|
+
|
|
62
|
+
model = UI.new_table_model(model_handler)
|
|
63
|
+
|
|
64
|
+
table_params = UI::FFI::TableParams.malloc
|
|
65
|
+
table_params.Model = model
|
|
66
|
+
table_params.RowBackgroundColorModelColumn = -1
|
|
67
|
+
|
|
68
|
+
table = UI.new_table(table_params)
|
|
69
|
+
UI.table_append_image_column(table, 'www.ghibli.jp/works/red-turtle', -1)
|
|
70
|
+
hbox.add(table)
|
|
71
|
+
|
|
72
|
+
main_window.show_the_controls
|
|
73
|
+
|
|
74
|
+
UI.window_on_closing(main_window) {
|
|
75
|
+
UI.control_destroy(main_window)
|
|
76
|
+
UI.free_table_model(model)
|
|
77
|
+
IMAGES.each { |i| UI.free_image(i) }
|
|
78
|
+
UI.quit
|
|
79
|
+
0
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
UI.main_then_quit
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# This example shows how to use the grid-related aspects of ruby-libui.
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
require 'libui_paradise/autoinclude'
|
|
8
|
+
|
|
9
|
+
window = ui_padded_main_window('An open-file button-example', 1200, 200, 15)
|
|
10
|
+
|
|
11
|
+
outer_vbox = ui_padded_vbox
|
|
12
|
+
button_open_file = ui_button('Open file')
|
|
13
|
+
button_open_file.on_clicked {
|
|
14
|
+
begin
|
|
15
|
+
filename = ui_open_file(window).to_s
|
|
16
|
+
e "The filename was: #{filename}"
|
|
17
|
+
rescue ArgumentError => error # Rescue from "NULL pointer given"
|
|
18
|
+
pp error
|
|
19
|
+
end
|
|
20
|
+
}
|
|
21
|
+
outer_vbox << button_open_file
|
|
22
|
+
|
|
23
|
+
window.child = outer_vbox
|
|
24
|
+
window.intelligent_quit
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# This example just shows that unicode text works.
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
require 'libui_paradise/autoinclude'
|
|
8
|
+
|
|
9
|
+
window = ui_margined_main_window('Unicode Text Example', 1200, 200, 15)
|
|
10
|
+
|
|
11
|
+
outer_vbox = ui_padded_vbox
|
|
12
|
+
text = ui_text(
|
|
13
|
+
"This is some text. You do not even have to wrap it - the newlines will
|
|
14
|
+
appear in the text as-is.
|
|
15
|
+
|
|
16
|
+
If something is supported then unicode should be able to show that.
|
|
17
|
+
|
|
18
|
+
Let's test this next with some unicode:
|
|
19
|
+
|
|
20
|
+
🎉 用户界面 사용자 인터페이스
|
|
21
|
+
₀₁₂₃₄₅₆₇₈₉
|
|
22
|
+
|
|
23
|
+
")
|
|
24
|
+
|
|
25
|
+
outer_vbox << text
|
|
26
|
+
|
|
27
|
+
window.child = outer_vbox
|
|
28
|
+
window.intelligent_quit
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# This example just shows a spinbutton example.
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
require 'libui_paradise/autoinclude'
|
|
8
|
+
|
|
9
|
+
window = ui_main_window('Spinbutton Example', 200, 100, 1)
|
|
10
|
+
|
|
11
|
+
outer_vbox = ui_padded_vbox
|
|
12
|
+
spinbutton = ui_spinbutton(0, 100)
|
|
13
|
+
spinbutton.set_value(42)
|
|
14
|
+
|
|
15
|
+
spinbox_changed_callback = proc { |ptr|
|
|
16
|
+
puts "Changed value to: #{UI.spinbox_value(ptr)}"
|
|
17
|
+
0
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
UI.spinbox_on_changed(spinbutton, spinbox_changed_callback, nil)
|
|
21
|
+
|
|
22
|
+
outer_vbox << spinbutton
|
|
23
|
+
|
|
24
|
+
window.child = outer_vbox
|
|
25
|
+
window.intelligent_quit
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
require 'libui_paradise/autoinclude'
|
|
6
|
+
|
|
7
|
+
window = ui_main_window('Text Example', 200, 100, 1)
|
|
8
|
+
|
|
9
|
+
outer_vbox = ui_padded_vbox
|
|
10
|
+
text = ui_text
|
|
11
|
+
|
|
12
|
+
outer_vbox << text
|
|
13
|
+
|
|
14
|
+
text.set_text('Hello world!')
|
|
15
|
+
window.child = outer_vbox
|
|
16
|
+
window.intelligent_quit
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
require 'libui_paradise/autoinclude'
|
|
6
|
+
|
|
7
|
+
use_this_config_file = '023_parse_config_file_example.config'
|
|
8
|
+
window = LibuiParadise.parse_this_config_file(use_this_config_file)
|
|
9
|
+
outer_vbox = padded_vbox
|
|
10
|
+
text = text('The config file was '+use_this_config_file)
|
|
11
|
+
outer_vbox << text
|
|
12
|
+
window.child = outer_vbox
|
|
13
|
+
window.intelligent_quit
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
require 'libui_paradise/autoinclude'
|
|
6
|
+
|
|
7
|
+
window = ui_main_window('Text View Example', 500, 300, 0)
|
|
8
|
+
|
|
9
|
+
outer_vbox = ui_padded_vbox
|
|
10
|
+
text = multiline_entry
|
|
11
|
+
text.set_text('Hello world!')
|
|
12
|
+
outer_vbox << text
|
|
13
|
+
window.child = outer_vbox
|
|
14
|
+
window.intelligent_quit
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# This example currently does not work.
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
require 'libui_paradise/autoinclude'
|
|
8
|
+
|
|
9
|
+
window = padded_window('Scrolling Area', 500, 300, 0)
|
|
10
|
+
|
|
11
|
+
outer_vbox = padded_vbox
|
|
12
|
+
text = ui_text('OK!')
|
|
13
|
+
scrolling_area = LibuiParadise.scrolling_area(text)
|
|
14
|
+
outer_vbox << scrolling_area
|
|
15
|
+
window.child = outer_vbox
|
|
16
|
+
window.intelligent_quit
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# This button doesn't work properly right now. :(
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
require 'libui_paradise/autoinclude'
|
|
8
|
+
|
|
9
|
+
window = main_window('Colour Button', 500, 300, 0)
|
|
10
|
+
outer_vbox = padded_vbox
|
|
11
|
+
our_colour_button = ui_colour_button
|
|
12
|
+
|
|
13
|
+
# colour_button.on_changed {|callback|
|
|
14
|
+
# pp callback.class
|
|
15
|
+
# rgba = callback.color
|
|
16
|
+
# pp rgba
|
|
17
|
+
# }
|
|
18
|
+
|
|
19
|
+
# on_changed_proc = proc {|callback|
|
|
20
|
+
# rgba = callback.color
|
|
21
|
+
# pp rgba
|
|
22
|
+
# }
|
|
23
|
+
|
|
24
|
+
xyz = proc {|pointer|
|
|
25
|
+
# rgba = pointer.color
|
|
26
|
+
#pp rgba
|
|
27
|
+
pp pointer.to_s
|
|
28
|
+
nil
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
LibUI.color_button_on_changed(our_colour_button, xyz, nil)
|
|
32
|
+
# # rgba = pointer.color
|
|
33
|
+
# # pp rgba
|
|
34
|
+
# pp pointer
|
|
35
|
+
# pp pointer.to_s
|
|
36
|
+
# }
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# UI.color_button_on_changed(color_button) do
|
|
40
|
+
# UI.area_queue_redraw_all(histogram)
|
|
41
|
+
# end
|
|
42
|
+
|
|
43
|
+
#, on_changed_proc.call, nil)
|
|
44
|
+
|
|
45
|
+
#UI.spinbox_on_changed(spinbox) do |ptr|
|
|
46
|
+
# puts "New Spinbox value: #{UI.spinbox_value(ptr)}"
|
|
47
|
+
#end
|
|
48
|
+
|
|
49
|
+
outer_vbox.minimal(our_colour_button, 1)
|
|
50
|
+
window.child = outer_vbox
|
|
51
|
+
window.intelligent_quit
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# require '027_form_example.rb'
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
require 'libui_paradise/autoinclude'
|
|
8
|
+
|
|
9
|
+
window = margined_window('Form Example', 250, 150, 0)
|
|
10
|
+
|
|
11
|
+
outer_vbox = padded_vbox
|
|
12
|
+
|
|
13
|
+
hbox1 = padded_hbox
|
|
14
|
+
hbox1.minimal(ui_text('First Name'), 0)
|
|
15
|
+
@first_name_entry = ui_entry
|
|
16
|
+
hbox1.minimal(@first_name_entry, 0)
|
|
17
|
+
outer_vbox.minimal(hbox1, 0)
|
|
18
|
+
|
|
19
|
+
hbox2 = padded_hbox
|
|
20
|
+
hbox2.minimal(ui_text('Last Name'), 0)
|
|
21
|
+
@last_name_entry = ui_entry
|
|
22
|
+
hbox2.minimal(@last_name_entry, 0)
|
|
23
|
+
outer_vbox.minimal(hbox2, 0)
|
|
24
|
+
|
|
25
|
+
button_display_name = button('Display Name')
|
|
26
|
+
button_display_name.on_clicked {
|
|
27
|
+
ui_msg_box(
|
|
28
|
+
:default,
|
|
29
|
+
'Name',
|
|
30
|
+
"#{@first_name_entry.text?} #{@last_name_entry.text?}"
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
outer_vbox.minimal(button_display_name, 1)
|
|
35
|
+
|
|
36
|
+
window.child = outer_vbox
|
|
37
|
+
window.intelligent_quit
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# require '028_password_entry_example.rb'
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
require 'libui_paradise/autoinclude'
|
|
8
|
+
|
|
9
|
+
window = margined_window('Password Entry Example', 280, 80, 0)
|
|
10
|
+
|
|
11
|
+
outer_vbox = padded_vbox
|
|
12
|
+
entry = ui_password_entry
|
|
13
|
+
outer_vbox.minimal(ui_text('Password: '), 0)
|
|
14
|
+
outer_vbox.minimal(entry, 0)
|
|
15
|
+
|
|
16
|
+
window.child = outer_vbox
|
|
17
|
+
window.intelligent_quit
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# require '029_two_buttons_showing_how_to_enable_and_disable_them.rb'
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
require 'libui_paradise/autoinclude'
|
|
8
|
+
|
|
9
|
+
main_window = padded_main_window(
|
|
10
|
+
'Two buttons showing how to enable and disable them', 300, 60, 0
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
outer_hbox = padded_hbox
|
|
14
|
+
|
|
15
|
+
button1 = button('Button #1')
|
|
16
|
+
button2 = button('Button #2')
|
|
17
|
+
button2.disable # Start-state for this button.
|
|
18
|
+
|
|
19
|
+
outer_hbox.minimal(button1, 1)
|
|
20
|
+
outer_hbox.minimal(button2, 1)
|
|
21
|
+
|
|
22
|
+
button1.on_clicked {|widget|
|
|
23
|
+
button2.enable
|
|
24
|
+
button1.disable
|
|
25
|
+
}
|
|
26
|
+
button2.on_clicked {|widget|
|
|
27
|
+
button1.enable
|
|
28
|
+
button2.disable
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
main_window.child = outer_hbox
|
|
32
|
+
main_window.intelligent_exit
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# Todo:
|
|
6
|
+
# - Add editable entry to the table
|
|
7
|
+
# =========================================================================== #
|
|
8
|
+
require 'libui_paradise/autoinclude'
|
|
9
|
+
|
|
10
|
+
main_window = padded_window('30) Table example', 300, 200, 1)
|
|
11
|
+
hbox = padded_hbox
|
|
12
|
+
data = [
|
|
13
|
+
%w( cat calm meow ),
|
|
14
|
+
%w( dog loyal woof ),
|
|
15
|
+
%w( chicken bird cock-a-doodle-doo ),
|
|
16
|
+
%w( horse fast neigh ),
|
|
17
|
+
%w( cow slow moo )
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
# Protect BlockCaller objects from garbage collection.
|
|
21
|
+
@block_callers = []
|
|
22
|
+
def rbcallback(*args, &block)
|
|
23
|
+
args << [0] if args.size == 1 # Argument types are ommited
|
|
24
|
+
block_caller = Fiddle::Closure::BlockCaller.new(*args, &block)
|
|
25
|
+
@block_callers << block_caller
|
|
26
|
+
block_caller
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
model_handler = LibUI::FFI::TableModelHandler.malloc
|
|
30
|
+
model_handler.to_ptr.free = Fiddle::RUBY_FREE
|
|
31
|
+
|
|
32
|
+
model_handler.NumColumns = rbcallback(4) { 2 }
|
|
33
|
+
model_handler.ColumnType = rbcallback(4) { 0 }
|
|
34
|
+
model_handler.NumRows = rbcallback(4) { 5 }
|
|
35
|
+
model_handler.CellValue = rbcallback(1, [1, 1, 4, 4]) do |_, _, row, column|
|
|
36
|
+
UI.new_table_value_string(data[row][column])
|
|
37
|
+
end
|
|
38
|
+
model_handler.SetCellValue = rbcallback(0, [0]) {}
|
|
39
|
+
|
|
40
|
+
model = LibUI.new_table_model(model_handler)
|
|
41
|
+
|
|
42
|
+
table_params = ui_table_params_malloc(model)
|
|
43
|
+
|
|
44
|
+
table = ui_table(table_params)
|
|
45
|
+
table.append_text_column('Animal', 0, -1)
|
|
46
|
+
table.append_text_column('Description', 1, -1)
|
|
47
|
+
table.append_text_column('Fancy Stuff', 2, -1)
|
|
48
|
+
|
|
49
|
+
hbox.add(table, 1)
|
|
50
|
+
main_window.child = hbox
|
|
51
|
+
main_window.intelligent_quit
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
require 'libui_paradise/autoinclude'
|
|
6
|
+
|
|
7
|
+
def do_call_this_method
|
|
8
|
+
e 'Hello World!'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
window {
|
|
12
|
+
|
|
13
|
+
button {
|
|
14
|
+
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# === LibuiParadise::Extensions
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
# require 'libui_paradise/extensions/extensions.rb
|
|
8
|
+
# include Libuiparadise::Extensions
|
|
9
|
+
# =========================================================================== #
|
|
10
|
+
require 'libui' # Mandatory require-call.
|
|
11
|
+
|
|
12
|
+
module LibuiParadise
|
|
13
|
+
|
|
14
|
+
module Extensions # === LibuiParadise::Extensions
|
|
15
|
+
|
|
16
|
+
require 'libui_paradise/extensions/hash_fiddle_pointer_widgets.rb'
|
|
17
|
+
require 'libui_paradise/fiddle/pointer.rb'
|
|
18
|
+
require 'libui_paradise/libui_classes/window.rb'
|
|
19
|
+
require 'libui_paradise/extensions/misc.rb'
|
|
20
|
+
|
|
21
|
+
end; end
|
|
22
|
+
|
|
23
|
+
alias e puts
|
|
24
|
+
|
|
25
|
+
LibuiParadise::Extensions.initializer # Make UI known here.
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# require 'libui_paradise/extensions/hash_fiddle_pointer_widgets.rb'
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
module LibuiParadise
|
|
8
|
+
|
|
9
|
+
module Extensions # === LibuiParadise::Extensions
|
|
10
|
+
|
|
11
|
+
# ========================================================================= #
|
|
12
|
+
# === @hash_fiddle_pointer_widgets
|
|
13
|
+
# ========================================================================= #
|
|
14
|
+
@hash_fiddle_pointer_widgets = {}
|
|
15
|
+
|
|
16
|
+
# ========================================================================= #
|
|
17
|
+
# === LibuiParadise::Extensions.hash_fiddle_pointer_widgets?
|
|
18
|
+
# ========================================================================= #
|
|
19
|
+
def self.hash_fiddle_pointer_widgets?
|
|
20
|
+
@hash_fiddle_pointer_widgets
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# ========================================================================= #
|
|
24
|
+
# === main_hash?
|
|
25
|
+
# ========================================================================= #
|
|
26
|
+
def main_hash?
|
|
27
|
+
::LibuiParadise::Extensions.hash_fiddle_pointer_widgets?
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# ========================================================================= #
|
|
31
|
+
# === LibuiParadise::Extensions.register_this_fiddle_pointer_widget
|
|
32
|
+
#
|
|
33
|
+
# This method registers the particular widget in use.
|
|
34
|
+
#
|
|
35
|
+
# Every new_* method available on UI.new* - actually on LibUI.new* -
|
|
36
|
+
# that creates a new widget be registered via this method here. That
|
|
37
|
+
# way we have a Hash that contains lots of Fiddle::Pointers and we
|
|
38
|
+
# can, at a later time, modify these Fiddle::Pointer or call
|
|
39
|
+
# toplevel methods with these registered pointers. This will only work
|
|
40
|
+
# if we have registered these pointers though, which is why each
|
|
41
|
+
# method that creates a new libui-widget has to make use of this method
|
|
42
|
+
# here.
|
|
43
|
+
#
|
|
44
|
+
# The only exception to the above rule is the main window. The main
|
|
45
|
+
# window is always stored at @main_window instead. Perhaps it
|
|
46
|
+
# should also use the method here, but I found it simpler to
|
|
47
|
+
# just refer to it via @main_window.
|
|
48
|
+
#
|
|
49
|
+
# The mandatory entries must be:
|
|
50
|
+
#
|
|
51
|
+
# object_id -> [:the_fiddle_pointer_widget, :the_type]
|
|
52
|
+
#
|
|
53
|
+
# The object_id will be determined automatically, so it can be
|
|
54
|
+
# omitted.
|
|
55
|
+
#
|
|
56
|
+
# The very last argument of the two-member Array should be a symbol,
|
|
57
|
+
# such as :grid. This is automatically ensured via a call to
|
|
58
|
+
# __method__ which returns a Symbol.
|
|
59
|
+
# ========================================================================= #
|
|
60
|
+
def self.register_this_fiddle_pointer_widget(
|
|
61
|
+
the_fiddle_pointer_widget,
|
|
62
|
+
the_type_of_the_widget = nil
|
|
63
|
+
)
|
|
64
|
+
object_id_to_use = the_fiddle_pointer_widget.object_id
|
|
65
|
+
# ======================================================================= #
|
|
66
|
+
# Next, store it on the main Hash.
|
|
67
|
+
# ======================================================================= #
|
|
68
|
+
@hash_fiddle_pointer_widgets[object_id_to_use] =
|
|
69
|
+
[
|
|
70
|
+
the_fiddle_pointer_widget,
|
|
71
|
+
the_type_of_the_widget
|
|
72
|
+
]
|
|
73
|
+
end; self.instance_eval { alias add_to_the_registered_widgets register_this_fiddle_pointer_widget } # === LibuiParadise::Extensions.add_to_the_registered_widgets
|
|
74
|
+
|
|
75
|
+
# ========================================================================= #
|
|
76
|
+
# === last_pointer?
|
|
77
|
+
#
|
|
78
|
+
# This used to return the "current" widget pointer, but past September
|
|
79
|
+
# 2021 this is rarely in use anymore. Use current_widget_pointer?
|
|
80
|
+
# instead, based on the main Hash that keeps all widgets registered.
|
|
81
|
+
# ========================================================================= #
|
|
82
|
+
def last_pointer?
|
|
83
|
+
LibuiParadise::Extensions.current_widget_pointer?
|
|
84
|
+
end; alias current_pointer? last_pointer? # === current_pointer?
|
|
85
|
+
alias current_widget_pointer? last_pointer? # === current_widget_pointer?
|
|
86
|
+
|
|
87
|
+
# ========================================================================= #
|
|
88
|
+
# === LibuiParadise::Extensions.current_widget_pointer?
|
|
89
|
+
# ========================================================================= #
|
|
90
|
+
def self.current_widget_pointer?
|
|
91
|
+
LibuiParadise::Extensions.hash_fiddle_pointer_widgets?.values.last.first
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# ========================================================================= #
|
|
95
|
+
# === current_widget_pointer_type?
|
|
96
|
+
# ========================================================================= #
|
|
97
|
+
def current_widget_pointer_type?
|
|
98
|
+
LibuiParadise::Extensions.hash_fiddle_pointer_widgets?.values.last.last
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# ========================================================================= #
|
|
102
|
+
# === register_this_fiddle_pointer_widget
|
|
103
|
+
# ========================================================================= #
|
|
104
|
+
def register_this_fiddle_pointer_widget(
|
|
105
|
+
the_fiddle_pointer_widget,
|
|
106
|
+
the_type_of_the_widget = nil
|
|
107
|
+
)
|
|
108
|
+
::LibuiParadise::Extensions.register_this_fiddle_pointer_widget(
|
|
109
|
+
the_fiddle_pointer_widget,
|
|
110
|
+
the_type_of_the_widget
|
|
111
|
+
)
|
|
112
|
+
end; alias add_to_the_registered_widgets register_this_fiddle_pointer_widget # === add_to_the_registered_widgets
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# ========================================================================= #
|
|
117
|
+
# === LibuiParadise.register_this_fiddle_pointer_widget
|
|
118
|
+
# ========================================================================= #
|
|
119
|
+
def self.register_this_fiddle_pointer_widget(
|
|
120
|
+
the_fiddle_pointer_widget,
|
|
121
|
+
the_type_of_the_widget = nil
|
|
122
|
+
)
|
|
123
|
+
::LibuiParadise::Extensions.register_this_fiddle_pointer_widget(
|
|
124
|
+
the_fiddle_pointer_widget,
|
|
125
|
+
the_type_of_the_widget
|
|
126
|
+
)
|
|
127
|
+
end; self.instance_eval { alias add_to_the_registered_widgets register_this_fiddle_pointer_widget } # === LibuiParadise.add_to_the_registered_widgets
|
|
128
|
+
|
|
129
|
+
end
|