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
data/doc/SNIPPETS.md
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# How to require libui:
|
|
2
|
+
|
|
3
|
+
require 'libui'
|
|
4
|
+
|
|
5
|
+
# How to instantiate libui:
|
|
6
|
+
|
|
7
|
+
UI = LibUI
|
|
8
|
+
init = UI.init
|
|
9
|
+
|
|
10
|
+
# How to add a new main window:
|
|
11
|
+
# width, height, hasMenubar
|
|
12
|
+
main_window = UI.new_window('hello world', 300, 200, 1)
|
|
13
|
+
|
|
14
|
+
Source code:
|
|
15
|
+
|
|
16
|
+
https://raw.githubusercontent.com/andlabs/libui/master/unix/window.c
|
|
17
|
+
|
|
18
|
+
# How to add a libui-widget to the main window / Designate a child widget:
|
|
19
|
+
|
|
20
|
+
UI.window_set_child(main_window, button)
|
|
21
|
+
|
|
22
|
+
# Act on closing-event (on quit tag):
|
|
23
|
+
|
|
24
|
+
UI.window_on_closing(main_window) {
|
|
25
|
+
puts 'Bye Bye'
|
|
26
|
+
UI.control_destroy(main_window)
|
|
27
|
+
UI.quit
|
|
28
|
+
0
|
|
29
|
+
}
|
|
30
|
+
# Or simpler:
|
|
31
|
+
close_properly(main_window)
|
|
32
|
+
|
|
33
|
+
# How to properly close via LibuiExtensions:
|
|
34
|
+
|
|
35
|
+
main_window = UI.window('Notepad', 500, 300, 1)
|
|
36
|
+
UI.close_properly(main_window)
|
|
37
|
+
# Or simpler:
|
|
38
|
+
close_properly(main_window)
|
|
39
|
+
|
|
40
|
+
# Add the window to the main UI:
|
|
41
|
+
|
|
42
|
+
UI.control_show(main_window)
|
|
43
|
+
main_window.show_the_controls # Or use this one here.
|
|
44
|
+
|
|
45
|
+
# Set the padding on a grid:
|
|
46
|
+
|
|
47
|
+
UI.grid_set_padded(grid, 25)
|
|
48
|
+
|
|
49
|
+
# Attach a new widget onto the grid:
|
|
50
|
+
|
|
51
|
+
UI.grid_append(grid, text('Yo2'), 1, 0, 1, 1, 0, 0, 1, 0)
|
|
52
|
+
|
|
53
|
+
# How to add a click-action to the button:
|
|
54
|
+
|
|
55
|
+
UI.button_on_clicked(button) {
|
|
56
|
+
UI.msg_box(main_window, 'Information', 'You clicked the button')
|
|
57
|
+
0
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# How to add a margin:
|
|
61
|
+
|
|
62
|
+
UI.window_set_margined(MAIN_WINDOW, 1)
|
|
63
|
+
|
|
64
|
+
# How to exit easily:
|
|
65
|
+
|
|
66
|
+
UI.window_on_closing(main_window) {
|
|
67
|
+
UI.exit_from(main_window)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# Create an attributed String:
|
|
71
|
+
|
|
72
|
+
string = UI.new_attributed_string
|
|
73
|
+
attributes = UI.new_family_attribute("Courier New 30")
|
|
74
|
+
attribute = UI.new_color_attribute(0.75, 0.25, 0.5, 0.75)
|
|
75
|
+
UI.append_with_attribute("text color", attribute, nil)
|
|
76
|
+
|
|
77
|
+
# How to set a padded box:
|
|
78
|
+
|
|
79
|
+
UI.box_set_padded(box, 1) # The value is either 0 or 1.
|
|
80
|
+
|
|
81
|
+
Alignment may be:
|
|
82
|
+
0: Fill
|
|
83
|
+
1: Start
|
|
84
|
+
2: Center
|
|
85
|
+
3: End
|
|
86
|
+
Positioning:
|
|
87
|
+
0: Left
|
|
88
|
+
1: Top
|
|
89
|
+
2: Right
|
|
90
|
+
|
|
91
|
+
# Create a message-box and an error message box:
|
|
92
|
+
|
|
93
|
+
UI.msg_box(main_window, 'Information', 'You clicked the button')
|
|
94
|
+
UI.msg_box_error(main_window, 'Information', 'You clicked the button')
|
|
95
|
+
|
|
96
|
+
# Add a checkbox (checkbox tag, checkbutton)
|
|
97
|
+
|
|
98
|
+
checkbox = UI.new_checkbox('Checkbox') # or ui_checkbox
|
|
99
|
+
checkbox_toggle_callback = proc { |pointer|
|
|
100
|
+
checked = UI.checkbox_checked(pointer) == 1
|
|
101
|
+
UI.window_set_title(MAIN_WINDOW, "Checkbox is #{checked}")
|
|
102
|
+
UI.checkbox_set_text(pointer, "I am the checkbox (#{checked})")
|
|
103
|
+
0
|
|
104
|
+
}
|
|
105
|
+
UI.checkbox_on_toggled(checkbox, checkbox_toggle_callback, nil)
|
|
106
|
+
UI.box_append(inner, checkbox, 0)
|
|
107
|
+
|
|
108
|
+
To set it checked:
|
|
109
|
+
|
|
110
|
+
checkbox.set_checked(1)
|
|
111
|
+
|
|
112
|
+
To query its state:
|
|
113
|
+
|
|
114
|
+
checked = UI.checkbox_checked(pointer) == 1
|
|
115
|
+
|
|
116
|
+
# And the control:
|
|
117
|
+
|
|
118
|
+
UI.control_show(main_window)
|
|
119
|
+
|
|
120
|
+
# Using a text-entry (ui entry tag):
|
|
121
|
+
|
|
122
|
+
text_entry = UI.new_entry
|
|
123
|
+
UI.entry_set_text(text_entry, 'Please enter your feelings')
|
|
124
|
+
UI.entry_on_changed(text_entry, text_changed_callback, nil)
|
|
125
|
+
|
|
126
|
+
# To set this on a "multiline entry", aka spanning several
|
|
127
|
+
# rows, do use:
|
|
128
|
+
UI.multiline_entry_set_text(entry1, 'Yo there')
|
|
129
|
+
ui_text_view # an alias used in libui_paradise
|
|
130
|
+
|
|
131
|
+
text1 = UI.entry_text(entry1) # Obtain text. You may have to call .to_s on it, to guarantee the String.
|
|
132
|
+
UI.multiline_entry_text # Obtain the text from a multiline entry.
|
|
133
|
+
|
|
134
|
+
# Create a textview:
|
|
135
|
+
|
|
136
|
+
UI.new_non_wrapping_multiline_entry
|
|
137
|
+
|
|
138
|
+
# Putting the text-entry into a hbox:
|
|
139
|
+
|
|
140
|
+
UI.box_append(hbox1, text_entry, 1)
|
|
141
|
+
|
|
142
|
+
# Create a combobox (combo tag, combobox tag):
|
|
143
|
+
|
|
144
|
+
combobox_selected_callback = proc { |ptr|
|
|
145
|
+
puts "New combobox selection: #{UI.combobox_selected(ptr)}"
|
|
146
|
+
}
|
|
147
|
+
cbox = UI.new_combobox
|
|
148
|
+
UI.combobox_append(cbox, 'combobox Item 1')
|
|
149
|
+
UI.combobox_append(cbox, 'combobox Item 2')
|
|
150
|
+
UI.combobox_append(cbox, 'combobox Item 3')
|
|
151
|
+
UI.box_append(inner, cbox, 0)
|
|
152
|
+
UI.combobox_on_selected(cbox, combobox_selected_callback, nil)
|
|
153
|
+
|
|
154
|
+
# Or more concise:
|
|
155
|
+
combo_box = UI.combobox {
|
|
156
|
+
['combobox Item 1', 'combobox Item 2', 'combobox Item 3']
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# Select the first entry:
|
|
160
|
+
|
|
161
|
+
UI.combobox_set_selected(combobox, 0) # The first one will be active too.
|
|
162
|
+
|
|
163
|
+
# Create a new tabbed notebook:
|
|
164
|
+
|
|
165
|
+
ui_tabs
|
|
166
|
+
ui_notebook
|
|
167
|
+
|
|
168
|
+
# Add content to an editable combox:
|
|
169
|
+
|
|
170
|
+
UI.append() # .append() adds the named item to the end of the EditableCombobox.
|
|
171
|
+
|
|
172
|
+
# How to run the main loop:
|
|
173
|
+
|
|
174
|
+
UI.main
|
|
175
|
+
|
|
176
|
+
# How to quit:
|
|
177
|
+
|
|
178
|
+
UI.quit
|
|
179
|
+
|
|
180
|
+
# How to build a menu-interface (menu tag):
|
|
181
|
+
|
|
182
|
+
help_menu = UI.new_menu('Help')
|
|
183
|
+
version_item = UI.menu_append_item(help_menu, 'Version')
|
|
184
|
+
|
|
185
|
+
# Create a new image:
|
|
186
|
+
|
|
187
|
+
image = UI.new_image(width, height)
|
|
188
|
+
|
|
189
|
+
# Fonts and LibUI:
|
|
190
|
+
|
|
191
|
+
font_descriptor = UI::FFI::FontDescriptor.malloc
|
|
192
|
+
p 'Font family: '+font_descriptor.Family.to_s+
|
|
193
|
+
'Font size: '+font_descriptor.Size+
|
|
194
|
+
'Font weight: '+font_descriptor.Weight+
|
|
195
|
+
'Font italic: '+font_descriptor.Italic+
|
|
196
|
+
'Font stretch: '+font_descriptor.Stretch
|
|
197
|
+
|
|
198
|
+
# Available widgets in libUI:
|
|
199
|
+
|
|
200
|
+
Button A button with a label
|
|
201
|
+
Checkbox A checkbox with a label
|
|
202
|
+
Combobox A simple combobox
|
|
203
|
+
ColorButton A button for selecting a color
|
|
204
|
+
EditableCombobox A combobox that can be edited.
|
|
205
|
+
Entry Text input, can be disabled.
|
|
206
|
+
FontButton A button for selecting a font (Incomplete: Cannot set programmatically)
|
|
207
|
+
Form A container that takes labels for its contents
|
|
208
|
+
Grid A container that aligns widgets for window design
|
|
209
|
+
Group A container that provides a title for a set of items
|
|
210
|
+
Label Displays a single line of text
|
|
211
|
+
Menu Creates a single column of an application menu
|
|
212
|
+
MultilineEntry An entry that allows multiple lines.
|
|
213
|
+
Time and Date Pickers Allows choosing of a date and/or time.
|
|
214
|
+
ProgressBar Displays a progress bar
|
|
215
|
+
RadioButton A set of radio buttons
|
|
216
|
+
Separator A simple vertical or horizontal separator
|
|
217
|
+
Slider A draggable slider for choosing a value in a range
|
|
218
|
+
Spinbox A numerical input with a minimum and maximum range
|
|
219
|
+
Tab A set named tabs for placing items in
|
|
220
|
+
Window Contains any other widget, cannot be embedded in a container
|
|
221
|
+
VBox, HBox A vertical or horizontal box for grouping items
|
data/doc/TODO.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
- Make sure that each component has a screenshot. It's ok to
|
|
2
|
+
re-use existing screenshots from other projects.
|
|
3
|
+
|
|
4
|
+
- Make sure the project is API compatible to glimmer-libui.
|
|
5
|
+
|
|
6
|
+
- Rewrite the project from the get-go. Also integrate
|
|
7
|
+
@main_window into the main hash, rather than have it
|
|
8
|
+
standalone.
|
|
9
|
+
|
|
10
|
+
- Re-organize the examples, perhaps starting with another
|
|
11
|
+
one.
|
|
12
|
+
|
|
13
|
+
- Check for image and font support again. Something isn't
|
|
14
|
+
working!
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# require 'libui_paradise/autoinclude.rb'
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
require 'libui_paradise/requires/require_the_libui_paradise_project.rb'
|
|
8
|
+
|
|
9
|
+
include LibuiParadise::Extensions
|
|
@@ -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
|
+
main_window = main_window('hello world', 300, 200, 0)
|
|
8
|
+
|
|
9
|
+
button = button('Button')
|
|
10
|
+
button.on_clicked {|widget| # is a <Fiddle::Pointer:0x00005590774f1ca0 ptr=0x0000559077484c90 size=0 free=0x0000000000000000>
|
|
11
|
+
e 'The main button was clicked.'
|
|
12
|
+
ui_msg_box(main_window, 'Information', 'You clicked the button')
|
|
13
|
+
0
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
main_window.child = button
|
|
17
|
+
main_window.intelligent_exit
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# This example displays images that can be freely downloaded from the
|
|
6
|
+
# Studio Ghibli website.
|
|
7
|
+
# =========================================================================== #
|
|
8
|
+
require 'libui_paradise/autoinclude'
|
|
9
|
+
require 'chunky_png'
|
|
10
|
+
require 'open-uri'
|
|
11
|
+
|
|
12
|
+
N_TIMES = 10
|
|
13
|
+
# =========================================================================== #
|
|
14
|
+
# === REMOTE_URL
|
|
15
|
+
# =========================================================================== #
|
|
16
|
+
REMOTE_URL = 'https://www.ghibli.jp/gallery/thumb-redturtle%03d.png'
|
|
17
|
+
|
|
18
|
+
main_window = ui_main_window('The Red Turtle', 310, 350, 0)
|
|
19
|
+
|
|
20
|
+
hbox = ui_padded_hbox
|
|
21
|
+
main_window.simple_exit
|
|
22
|
+
main_window.child = hbox
|
|
23
|
+
|
|
24
|
+
# =========================================================================== #
|
|
25
|
+
# === IMAGES
|
|
26
|
+
# =========================================================================== #
|
|
27
|
+
IMAGES = []
|
|
28
|
+
|
|
29
|
+
N_TIMES.times do |i|
|
|
30
|
+
url = format(REMOTE_URL, (i + 1))
|
|
31
|
+
this_file = URI.open(url)
|
|
32
|
+
# Use ChunkyPNG::Canvas to get information about the image at hand.
|
|
33
|
+
canvas = ChunkyPNG::Canvas.from_io(this_file)
|
|
34
|
+
this_file.close
|
|
35
|
+
data = canvas.to_rgba_stream
|
|
36
|
+
width = canvas.width
|
|
37
|
+
height = canvas.height
|
|
38
|
+
# ========================================================================= #
|
|
39
|
+
# Add a new image here:
|
|
40
|
+
# ========================================================================= #
|
|
41
|
+
image = UI.new_image(width, height)
|
|
42
|
+
UI.image_append(image, data, width, height, width * 4)
|
|
43
|
+
IMAGES << image # Store all images in the following area.
|
|
44
|
+
rescue StandardError => error
|
|
45
|
+
warn url, error.message
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# =========================================================================== #
|
|
49
|
+
# Protects BlockCaller objects from garbage collection.
|
|
50
|
+
# =========================================================================== #
|
|
51
|
+
@blockcaller = []
|
|
52
|
+
# =========================================================================== #
|
|
53
|
+
# === rbcallback
|
|
54
|
+
# =========================================================================== #
|
|
55
|
+
def rbcallback(*args, &block)
|
|
56
|
+
args << [0] if args.size == 1 # Argument types are ommited
|
|
57
|
+
blockcaller = Fiddle::Closure::BlockCaller.new(*args, &block)
|
|
58
|
+
@blockcaller << blockcaller
|
|
59
|
+
blockcaller
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
model_handler = UI::FFI::TableModelHandler.malloc
|
|
63
|
+
model_handler.NumColumns = rbcallback(4) { 1 }
|
|
64
|
+
model_handler.ColumnType = rbcallback(4) { 1 } # Image
|
|
65
|
+
model_handler.NumRows = rbcallback(4) { IMAGES.size }
|
|
66
|
+
model_handler.CellValue = rbcallback(1, [1, 1, 4, 4]) do |_, _, row, _column|
|
|
67
|
+
UI.new_table_value_image(IMAGES[row])
|
|
68
|
+
end
|
|
69
|
+
model_handler.SetCellValue = rbcallback(0, [0]) {}
|
|
70
|
+
|
|
71
|
+
model = UI.new_table_model(model_handler)
|
|
72
|
+
|
|
73
|
+
table_params = UI::FFI::TableParams.malloc
|
|
74
|
+
table_params.Model = model
|
|
75
|
+
table_params.RowBackgroundColorModelColumn = -1
|
|
76
|
+
|
|
77
|
+
table = ui_table(table_params)
|
|
78
|
+
UI.table_append_image_column(table, 'www.ghibli.jp/works/red-turtle', -1)
|
|
79
|
+
hbox.maximal(table)
|
|
80
|
+
|
|
81
|
+
main_window.show_the_controls
|
|
82
|
+
|
|
83
|
+
UI.window_on_closing(main_window) {
|
|
84
|
+
e 'Bye Bye'
|
|
85
|
+
UI.control_destroy(main_window)
|
|
86
|
+
UI.free_table_model(model)
|
|
87
|
+
IMAGES.each { |i| UI.free_image(i) }
|
|
88
|
+
UI.quit
|
|
89
|
+
0
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
UI.main_then_quit
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
require 'libui_paradise/autoinclude'
|
|
6
|
+
|
|
7
|
+
main_window = UI.window('hello world', 300, 200, 1)
|
|
8
|
+
|
|
9
|
+
font_button = UI.font_button
|
|
10
|
+
# =========================================================================== #
|
|
11
|
+
# === font_descriptor
|
|
12
|
+
#
|
|
13
|
+
# The font_descriptor will contain all the important information about the
|
|
14
|
+
# font at hand. It will be updated via UI.font_button_font().
|
|
15
|
+
# =========================================================================== #
|
|
16
|
+
font_descriptor = UI::FFI::FontDescriptor.malloc
|
|
17
|
+
UI.font_button_on_changed(font_button) {
|
|
18
|
+
UI.font_button_font(font_button, font_descriptor)
|
|
19
|
+
# ========================================================================= #
|
|
20
|
+
# The following line will output something like:
|
|
21
|
+
#
|
|
22
|
+
# {:family=>"Georgia", :size=>12.0, :weight=>700, :italic=>0, :stretch=>4}
|
|
23
|
+
#
|
|
24
|
+
# ========================================================================= #
|
|
25
|
+
p family: font_descriptor.Family.to_s,
|
|
26
|
+
size: font_descriptor.Size,
|
|
27
|
+
weight: font_descriptor.Weight,
|
|
28
|
+
italic: font_descriptor.Italic,
|
|
29
|
+
stretch: font_descriptor.Stretch
|
|
30
|
+
}
|
|
31
|
+
main_window.close_properly
|
|
32
|
+
main_window.child = font_button
|
|
33
|
+
main_window.control_show
|
|
34
|
+
UI.main_then_quit
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
require 'libui_paradise/autoinclude'
|
|
6
|
+
|
|
7
|
+
vbox = UI.vbox
|
|
8
|
+
|
|
9
|
+
date_time_picker = UI.new_date_time_picker
|
|
10
|
+
|
|
11
|
+
time = UI::FFI::TM.malloc
|
|
12
|
+
|
|
13
|
+
UI.date_time_picker_on_changed(date_time_picker) do
|
|
14
|
+
UI.date_time_picker_time(date_time_picker, time)
|
|
15
|
+
p sec: time.tm_sec,
|
|
16
|
+
min: time.tm_min,
|
|
17
|
+
hour: time.tm_hour,
|
|
18
|
+
mday: time.tm_mday,
|
|
19
|
+
mon: time.tm_mon,
|
|
20
|
+
year: time.tm_year,
|
|
21
|
+
wday: time.tm_wday,
|
|
22
|
+
yday: time.tm_yday,
|
|
23
|
+
isdst: time.tm_isdst
|
|
24
|
+
end
|
|
25
|
+
vbox.add(date_time_picker, 1)
|
|
26
|
+
|
|
27
|
+
main_window = UI.window('Date Time Pickers', 300, 200, 1)
|
|
28
|
+
main_window.close_properly
|
|
29
|
+
main_window.child = vbox
|
|
30
|
+
main_window.show_the_controls
|
|
31
|
+
UI.main_then_quit
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
require 'libui_paradise/autoinclude'
|
|
6
|
+
|
|
7
|
+
TITLE = 'msg box error'
|
|
8
|
+
main_window = UI.window(TITLE, 300, 200, 1)
|
|
9
|
+
|
|
10
|
+
button1 = UI.button('Text (click me)')
|
|
11
|
+
button1.on_clicked {
|
|
12
|
+
UI.msg_box_error(
|
|
13
|
+
main_window,
|
|
14
|
+
'Error',
|
|
15
|
+
"You clicked \nthe button"
|
|
16
|
+
)
|
|
17
|
+
0
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
hbox = UI.hbox
|
|
21
|
+
hbox.append(button1, 1)
|
|
22
|
+
main_window.close_properly
|
|
23
|
+
main_window.child = hbox
|
|
24
|
+
main_window.control_show
|
|
25
|
+
UI.main_then_quit
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
# https://github.com/jamescook/libui-ruby/blob/master/example/histogram.rb
|
|
6
|
+
# =========================================================================== #
|
|
7
|
+
require 'libui_paradise'
|
|
8
|
+
|
|
9
|
+
X_OFF_LEFT = 20
|
|
10
|
+
Y_OFF_TOP = 20
|
|
11
|
+
X_OFF_RIGHT = 20
|
|
12
|
+
Y_OFF_BOTTOM = 20
|
|
13
|
+
POINT_RADIUS = 5
|
|
14
|
+
|
|
15
|
+
init = UI.init
|
|
16
|
+
handler = UI.area_handler
|
|
17
|
+
histogram = UI.new_area(handler)
|
|
18
|
+
brush = UI::FFI::DrawBrush.malloc
|
|
19
|
+
color_button = UI.new_color_button
|
|
20
|
+
datapoints = []
|
|
21
|
+
|
|
22
|
+
def graph_size(area_width, area_height)
|
|
23
|
+
graph_width = area_width - X_OFF_LEFT - X_OFF_RIGHT
|
|
24
|
+
graph_height = area_height - Y_OFF_TOP - Y_OFF_BOTTOM
|
|
25
|
+
[graph_width, graph_height]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
matrix = UI::FFI::DrawMatrix.malloc
|
|
29
|
+
|
|
30
|
+
# === point_locations
|
|
31
|
+
def point_locations(datapoints, width, height)
|
|
32
|
+
xincr = width / 9.0 # 10 - 1 to make the last point be at the end
|
|
33
|
+
yincr = height / 100.0
|
|
34
|
+
|
|
35
|
+
data = []
|
|
36
|
+
datapoints.each_with_index do |dp, i|
|
|
37
|
+
val = 100 - UI.spinbox_value(dp)
|
|
38
|
+
data << [xincr * i, yincr * val]
|
|
39
|
+
i += 1
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
data
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# === construct_graph
|
|
46
|
+
def construct_graph(datapoints, width, height, should_extend)
|
|
47
|
+
locations = point_locations(datapoints, width, height)
|
|
48
|
+
path = UI.draw_new_path(0) # winding
|
|
49
|
+
first_location = locations[0] # x and y
|
|
50
|
+
UI.draw_path_new_figure(path, first_location[0], first_location[1])
|
|
51
|
+
locations.each do |loc|
|
|
52
|
+
UI.draw_path_line_to(path, loc[0], loc[1])
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
if should_extend
|
|
56
|
+
UI.draw_path_line_to(path, width, height)
|
|
57
|
+
UI.draw_path_line_to(path, 0, height)
|
|
58
|
+
UI.draw_path_close_figure(path)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
UI.draw_path_end(path)
|
|
62
|
+
|
|
63
|
+
path
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
handler_draw_event = Fiddle::Closure::BlockCaller.new(
|
|
67
|
+
0, [1, 1, 1]
|
|
68
|
+
) do |_area_handler, _area, area_draw_params|
|
|
69
|
+
area_draw_params = UI::FFI::AreaDrawParams.new(area_draw_params)
|
|
70
|
+
path = UI.draw_new_path(0) # winding
|
|
71
|
+
UI.draw_path_add_rectangle(path, 0, 0, area_draw_params.AreaWidth, area_draw_params.AreaHeight)
|
|
72
|
+
UI.draw_path_end(path)
|
|
73
|
+
set_solid_brush(brush, 0xFFFFFF, 1.0) # white
|
|
74
|
+
UI.draw_fill(area_draw_params.Context, path, brush.to_ptr)
|
|
75
|
+
UI.draw_free_path(path)
|
|
76
|
+
dsp = UI::FFI::DrawStrokeParams.malloc
|
|
77
|
+
dsp.Cap = 0 # flat
|
|
78
|
+
dsp.Join = 0 # miter
|
|
79
|
+
dsp.Thickness = 2
|
|
80
|
+
dsp.MiterLimit = 10 # DEFAULT_MITER_LIMIT
|
|
81
|
+
dashes = Fiddle::Pointer.malloc(8)
|
|
82
|
+
dsp.Dashes = dashes
|
|
83
|
+
dsp.NumDashes = 0
|
|
84
|
+
dsp.DashPhase = 0
|
|
85
|
+
|
|
86
|
+
# draw axes
|
|
87
|
+
set_solid_brush(brush, 0x000000, 1.0) # black
|
|
88
|
+
graph_width, graph_height = *graph_size(area_draw_params.AreaWidth, area_draw_params.AreaHeight)
|
|
89
|
+
|
|
90
|
+
path = UI.draw_new_path(0) # winding
|
|
91
|
+
UI.draw_path_new_figure(path, X_OFF_LEFT, Y_OFF_TOP)
|
|
92
|
+
UI.draw_path_line_to(path, X_OFF_LEFT, Y_OFF_TOP + graph_height)
|
|
93
|
+
UI.draw_path_line_to(path, X_OFF_LEFT + graph_width, Y_OFF_TOP + graph_height)
|
|
94
|
+
UI.draw_path_end(path)
|
|
95
|
+
UI.draw_stroke(area_draw_params.Context, path, brush, dsp)
|
|
96
|
+
UI.draw_free_path(path)
|
|
97
|
+
|
|
98
|
+
# now transform the coordinate space so (0, 0) is the top-left corner of the graph
|
|
99
|
+
UI.draw_matrix_set_identity(matrix)
|
|
100
|
+
UI.draw_matrix_translate(matrix, X_OFF_LEFT, Y_OFF_TOP)
|
|
101
|
+
UI.draw_transform(area_draw_params.Context, matrix)
|
|
102
|
+
|
|
103
|
+
# now get the color for the graph itself and set up the brush
|
|
104
|
+
# uiColorButtonColor(colorButton, &graphR, &graphG, &graphB, &graphA)
|
|
105
|
+
graph_r = Fiddle::Pointer.malloc(8) # double
|
|
106
|
+
graph_g = Fiddle::Pointer.malloc(8) # double
|
|
107
|
+
graph_b = Fiddle::Pointer.malloc(8) # double
|
|
108
|
+
graph_a = Fiddle::Pointer.malloc(8) # double
|
|
109
|
+
|
|
110
|
+
UI.color_button_color(color_button, graph_r, graph_g, graph_b, graph_a)
|
|
111
|
+
brush.Type = 0 # solid
|
|
112
|
+
brush.R = graph_r[0, 8].unpack1('d')
|
|
113
|
+
brush.G = graph_g[0, 8].unpack1('d')
|
|
114
|
+
brush.B = graph_b[0, 8].unpack1('d')
|
|
115
|
+
|
|
116
|
+
# now create the fill for the graph below the graph line
|
|
117
|
+
path = construct_graph(datapoints, graph_width, graph_height, true)
|
|
118
|
+
brush.A = graph_a[0, 8].unpack1('d') / 2.0
|
|
119
|
+
UI.draw_fill(area_draw_params.Context, path, brush)
|
|
120
|
+
UI.draw_free_path(path)
|
|
121
|
+
|
|
122
|
+
# now draw the histogram line
|
|
123
|
+
path = construct_graph(datapoints, graph_width, graph_height, false)
|
|
124
|
+
brush.A = graph_a[0, 8].unpack1('d')
|
|
125
|
+
UI.draw_stroke(area_draw_params.Context, path, brush, dsp)
|
|
126
|
+
UI.draw_free_path(path)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
handler.Draw = handler_draw_event
|
|
130
|
+
|
|
131
|
+
# Assigning to local variables
|
|
132
|
+
# This is intended to protect Fiddle::Closure from garbage collection.
|
|
133
|
+
# See https://github.com/kojix2/LibUI/issues/8
|
|
134
|
+
handler.MouseEvent = (c1 = Fiddle::Closure::BlockCaller.new(0, [0]) {})
|
|
135
|
+
handler.MouseCrossed = (c2 = Fiddle::Closure::BlockCaller.new(0, [0]) {})
|
|
136
|
+
handler.DragBroken = (c3 = Fiddle::Closure::BlockCaller.new(0, [0]) {})
|
|
137
|
+
handler.KeyEvent = (c4 = Fiddle::Closure::BlockCaller.new(1, [0]) { 0 })
|
|
138
|
+
|
|
139
|
+
UI.freeInitError(init) unless init.nil?
|
|
140
|
+
|
|
141
|
+
hbox = UI.hbox
|
|
142
|
+
UI.box_set_padded(hbox, 1)
|
|
143
|
+
|
|
144
|
+
vbox = UI.vbox
|
|
145
|
+
UI.box_set_padded(vbox, 1)
|
|
146
|
+
hbox.add(vbox, 0)
|
|
147
|
+
hbox.add(histogram, 1)
|
|
148
|
+
|
|
149
|
+
datapoints = Array.new(10) {
|
|
150
|
+
UI.new_spinbox(0, 100).tap { |datapoint|
|
|
151
|
+
UI.spinbox_set_value(datapoint, Random.new.rand(90))
|
|
152
|
+
UI.spinbox_on_changed(datapoint) {
|
|
153
|
+
UI.area_queue_redraw_all(histogram)
|
|
154
|
+
}
|
|
155
|
+
UI.box_append(vbox, datapoint, 0)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# =========================================================================== #
|
|
160
|
+
# === set_solid_brush
|
|
161
|
+
# =========================================================================== #
|
|
162
|
+
def set_solid_brush(brush, color = 0xFFFFFF, alpha = 1.0)
|
|
163
|
+
brush.Type = 0 # solid
|
|
164
|
+
brush.R = ((color >> 16) & 0xFF) / 255.0
|
|
165
|
+
brush.G = ((color >> 8) & 0xFF) / 255.0
|
|
166
|
+
brush.B = (color & 0xFF) / 255.0
|
|
167
|
+
brush.A = alpha
|
|
168
|
+
brush
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
set_solid_brush(brush, LibuiParadise::Extensions::COLOUR_BLUE, 1.0)
|
|
172
|
+
UI.color_button_set_color(color_button, brush.R, brush.G, brush.B, brush.A)
|
|
173
|
+
|
|
174
|
+
UI.color_button_on_changed(color_button) {
|
|
175
|
+
UI.area_queue_redraw_all(histogram)
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
vbox.add(color_button, 0)
|
|
179
|
+
|
|
180
|
+
MAIN_WINDOW = UI.new_window('histogram example', 640, 480, 1)
|
|
181
|
+
UI.window_set_margined(MAIN_WINDOW, 1)
|
|
182
|
+
UI.window_set_child(MAIN_WINDOW, hbox)
|
|
183
|
+
|
|
184
|
+
should_quit = proc { |_ptr|
|
|
185
|
+
UI.control_destroy(MAIN_WINDOW)
|
|
186
|
+
UI.quit
|
|
187
|
+
0
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
UI.window_on_closing(MAIN_WINDOW, should_quit)
|
|
191
|
+
UI.on_should_quit(should_quit)
|
|
192
|
+
MAIN_WINDOW.control_show
|
|
193
|
+
UI.main_then_quit
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/ruby -w
|
|
2
|
+
# Encoding: UTF-8
|
|
3
|
+
# frozen_string_literal: true
|
|
4
|
+
# =========================================================================== #
|
|
5
|
+
require 'libui_paradise/autoinclude'
|
|
6
|
+
|
|
7
|
+
TITLE = 'Combo Box Example'
|
|
8
|
+
WIDTH = 500
|
|
9
|
+
HEIGHT = 250
|
|
10
|
+
main_window = ui_main_window(TITLE, WIDTH, HEIGHT, 0)
|
|
11
|
+
|
|
12
|
+
@entry = ui_entry
|
|
13
|
+
|
|
14
|
+
@combo_box = ui_combobox(
|
|
15
|
+
[
|
|
16
|
+
'combobox Item 1',
|
|
17
|
+
'combobox Item 2',
|
|
18
|
+
'combobox Item 3'
|
|
19
|
+
]
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
# =========================================================================== #
|
|
23
|
+
# The next code used to be in place until September 2021. I will retain it
|
|
24
|
+
# here in the event that we need to use it again one day.
|
|
25
|
+
# =========================================================================== #
|
|
26
|
+
|
|
27
|
+
# combobox_selected_callback = proc { |pointer|
|
|
28
|
+
# e "New combobox selection: #{UI.combobox_selected(pointer)}"
|
|
29
|
+
# @entry.set_text(selected?(pointer))
|
|
30
|
+
# }
|
|
31
|
+
#
|
|
32
|
+
# UI.combobox_on_selected(@combo_box, combobox_selected_callback, nil)
|
|
33
|
+
|
|
34
|
+
ui_sync_connect(@combo_box, @entry)
|
|
35
|
+
|
|
36
|
+
box = padded_vbox
|
|
37
|
+
box.minimal(@combo_box)
|
|
38
|
+
box.minimal(@entry)
|
|
39
|
+
|
|
40
|
+
main_window.child = box
|
|
41
|
+
main_window.intelligent_exit
|