libui_paradise 0.2.48
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of libui_paradise might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/README.md +2064 -0
- data/doc/README.gen +1923 -0
- data/doc/SNIPPETS.md +94 -0
- data/doc/todo/todo.md +16 -0
- data/lib/libui_paradise/autoinclude.rb +9 -0
- data/lib/libui_paradise/base/base.rb +154 -0
- data/lib/libui_paradise/colours/colours.rb +14 -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/complex/001_hbox_example.rb +17 -0
- data/lib/libui_paradise/examples/complex/002_tabs_example.rb +25 -0
- data/lib/libui_paradise/examples/complex/003_open_file_button_example.rb +38 -0
- data/lib/libui_paradise/examples/complex/004_font_button.rb +41 -0
- data/lib/libui_paradise/examples/complex/005_search_entry_example.rb +18 -0
- data/lib/libui_paradise/examples/complex/006_coloured_boxes_example.rb +22 -0
- data/lib/libui_paradise/examples/complex/007_slider_example.rb +31 -0
- data/lib/libui_paradise/examples/complex/008_radio_button_example.rb +23 -0
- data/lib/libui_paradise/examples/complex/009_separator_example.rb +25 -0
- data/lib/libui_paradise/examples/complex/010_table_example.rb +55 -0
- data/lib/libui_paradise/examples/complex/011_two_buttons_showing_how_to_enable_and_disable_them.rb +32 -0
- data/lib/libui_paradise/examples/complex/012_password_entry_example.rb +29 -0
- data/lib/libui_paradise/examples/complex/013_form_example.rb +38 -0
- data/lib/libui_paradise/examples/complex/014_text_example.rb +18 -0
- data/lib/libui_paradise/examples/complex/015_text_view_example.rb +16 -0
- data/lib/libui_paradise/examples/complex/016_grid_example.rb +31 -0
- data/lib/libui_paradise/examples/complex/017_unicode_text_example.rb +30 -0
- data/lib/libui_paradise/examples/complex/018_spinbutton_example.rb +33 -0
- data/lib/libui_paradise/examples/complex/019_combo_box_example.rb +50 -0
- data/lib/libui_paradise/examples/complex/020_checkbox_example.rb +81 -0
- data/lib/libui_paradise/examples/complex/021_font_example.rb +115 -0
- data/lib/libui_paradise/examples/complex/022_simple_notepad_example.rb +25 -0
- data/lib/libui_paradise/examples/complex/023_msg_box_error.rb +27 -0
- data/lib/libui_paradise/examples/complex/024_parse_config_file_example.config +6 -0
- data/lib/libui_paradise/examples/complex/024_parse_config_file_example.rb +15 -0
- data/lib/libui_paradise/examples/complex/025_colour_button.rb +53 -0
- data/lib/libui_paradise/examples/complex/026_basic_table_image.rb +96 -0
- data/lib/libui_paradise/examples/complex/027_basic_button_example.rb +19 -0
- data/lib/libui_paradise/examples/complex/028_try_for_automatic_button_press_event_after_a_delay.rb +47 -0
- data/lib/libui_paradise/examples/complex/029_progressbar_example.rb +116 -0
- data/lib/libui_paradise/examples/complex/030_entry_responds_to_comment_as_synonymous_to_the_enter_key_pressed_example.rb +140 -0
- data/lib/libui_paradise/examples/complex/031_notification_functionality_example.rb +96 -0
- data/lib/libui_paradise/examples/complex/032_simple_window_example.rb +69 -0
- data/lib/libui_paradise/examples/complex/033_daemonize_and_exit_after_delay_example.rb +91 -0
- data/lib/libui_paradise/examples/simple/001_open_file_example.rb +35 -0
- data/lib/libui_paradise/examples/simple/002_histogram_example.rb +207 -0
- data/lib/libui_paradise/examples/simple/003_fancy_text_example.rb +220 -0
- data/lib/libui_paradise/examples/simple/004_date_time_picker.rb +52 -0
- data/lib/libui_paradise/examples/simple/005_text_drawing_example.rb +185 -0
- data/lib/libui_paradise/examples/simple/006_midi_player.rb +96 -0
- data/lib/libui_paradise/examples/simple/007_control_gallery.rb +191 -0
- data/lib/libui_paradise/examples/simple/008_basic_area_example.rb +56 -0
- data/lib/libui_paradise/examples/simple/009_spectrum.rb +107 -0
- data/lib/libui_paradise/examples/simple/README.md +7 -0
- data/lib/libui_paradise/experimental/dsl.rb +17 -0
- data/lib/libui_paradise/extensions/counters.rb +58 -0
- data/lib/libui_paradise/extensions/extensions.rb +29 -0
- data/lib/libui_paradise/extensions/hash_fiddle_pointer_widgets.rb +150 -0
- data/lib/libui_paradise/extensions/misc.rb +754 -0
- data/lib/libui_paradise/fiddle/pointer.rb +1157 -0
- data/lib/libui_paradise/generic_window/README.md +9 -0
- data/lib/libui_paradise/generic_window/generic_window.rb +79 -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/box.rb +156 -0
- data/lib/libui_paradise/libui_classes/grid.rb +55 -0
- data/lib/libui_paradise/libui_classes/libui_classes.rb +1610 -0
- data/lib/libui_paradise/project/project.rb +28 -0
- data/lib/libui_paradise/prototype/README.md +3 -0
- data/lib/libui_paradise/prototype/prototype.rb +107 -0
- data/lib/libui_paradise/requires/require_the_libui_classes.rb +29 -0
- data/lib/libui_paradise/requires/require_the_libui_paradise_project.rb +12 -0
- data/lib/libui_paradise/toplevel_methods/misc.rb +13 -0
- data/lib/libui_paradise/version/version.rb +17 -0
- data/lib/libui_paradise.rb +1 -0
- data/libui_paradise.gemspec +49 -0
- data/test/testing_generic_window.rb +19 -0
- metadata +156 -0
@@ -0,0 +1,207 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# https://github.com/kojix2/LibUI/blob/main/examples/histogram.rb
|
6
|
+
#
|
7
|
+
# That was initially inspired by:
|
8
|
+
#
|
9
|
+
# https://github.com/jamescook/libui-ruby/blob/master/example/histogram.rb
|
10
|
+
#
|
11
|
+
# =========================================================================== #
|
12
|
+
require 'libui'
|
13
|
+
|
14
|
+
UI = LibUI
|
15
|
+
|
16
|
+
X_OFF_LEFT = 20
|
17
|
+
Y_OFF_TOP = 20
|
18
|
+
X_OFF_RIGHT = 20
|
19
|
+
Y_OFF_BOTTOM = 20
|
20
|
+
POINT_RADIUS = 5
|
21
|
+
|
22
|
+
# =========================================================================== #
|
23
|
+
# === BLUE
|
24
|
+
# =========================================================================== #
|
25
|
+
BLUE = 0x1E90FF
|
26
|
+
|
27
|
+
init = LibUI.init
|
28
|
+
handler = LibUI::FFI::AreaHandler.malloc
|
29
|
+
handler.to_ptr.free = Fiddle::RUBY_FREE
|
30
|
+
histogram = LibUI.new_area(handler)
|
31
|
+
brush = LibUI::FFI::DrawBrush.malloc
|
32
|
+
brush.to_ptr.free = Fiddle::RUBY_FREE
|
33
|
+
color_button = LibUI.new_color_button
|
34
|
+
datapoints = []
|
35
|
+
|
36
|
+
def graph_size(area_width, area_height)
|
37
|
+
graph_width = area_width - X_OFF_LEFT - X_OFF_RIGHT
|
38
|
+
graph_height = area_height - Y_OFF_TOP - Y_OFF_BOTTOM
|
39
|
+
[graph_width, graph_height]
|
40
|
+
end
|
41
|
+
|
42
|
+
matrix = UI::FFI::DrawMatrix.malloc
|
43
|
+
matrix.to_ptr.free = Fiddle::RUBY_FREE
|
44
|
+
|
45
|
+
def point_locations(datapoints, width, height)
|
46
|
+
xincr = width / 9.0 # 10 - 1 to make the last point be at the end
|
47
|
+
yincr = height / 100.0
|
48
|
+
|
49
|
+
data = []
|
50
|
+
datapoints.each_with_index do |dp, i|
|
51
|
+
val = 100 - UI.spinbox_value(dp)
|
52
|
+
data << [xincr * i, yincr * val]
|
53
|
+
i += 1
|
54
|
+
end
|
55
|
+
|
56
|
+
data
|
57
|
+
end
|
58
|
+
|
59
|
+
def construct_graph(datapoints, width, height, should_extend)
|
60
|
+
locations = point_locations(datapoints, width, height)
|
61
|
+
path = UI.draw_new_path(0) # winding
|
62
|
+
first_location = locations[0] # x and y
|
63
|
+
UI.draw_path_new_figure(path, first_location[0], first_location[1])
|
64
|
+
locations.each do |loc|
|
65
|
+
UI.draw_path_line_to(path, loc[0], loc[1])
|
66
|
+
end
|
67
|
+
|
68
|
+
if should_extend
|
69
|
+
UI.draw_path_line_to(path, width, height)
|
70
|
+
UI.draw_path_line_to(path, 0, height)
|
71
|
+
UI.draw_path_close_figure(path)
|
72
|
+
end
|
73
|
+
|
74
|
+
UI.draw_path_end(path)
|
75
|
+
|
76
|
+
path
|
77
|
+
end
|
78
|
+
|
79
|
+
handler_draw_event = Fiddle::Closure::BlockCaller.new(
|
80
|
+
0, [1, 1, 1]
|
81
|
+
) do |_area_handler, _area, area_draw_params|
|
82
|
+
area_draw_params = UI::FFI::AreaDrawParams.new(area_draw_params)
|
83
|
+
path = UI.draw_new_path(0) # winding
|
84
|
+
UI.draw_path_add_rectangle(path, 0, 0, area_draw_params.AreaWidth, area_draw_params.AreaHeight)
|
85
|
+
UI.draw_path_end(path)
|
86
|
+
set_solid_brush(brush, 0xFFFFFF, 1.0) # white
|
87
|
+
UI.draw_fill(area_draw_params.Context, path, brush.to_ptr)
|
88
|
+
UI.draw_free_path(path)
|
89
|
+
dsp = UI::FFI::DrawStrokeParams.malloc
|
90
|
+
dsp.to_ptr.free = Fiddle::RUBY_FREE
|
91
|
+
dsp.Cap = 0 # flat
|
92
|
+
dsp.Join = 0 # miter
|
93
|
+
dsp.Thickness = 2
|
94
|
+
dsp.MiterLimit = 10 # DEFAULT_MITER_LIMIT
|
95
|
+
dashes = Fiddle::Pointer.malloc(8, Fiddle::RUBY_FREE)
|
96
|
+
dsp.Dashes = dashes
|
97
|
+
dsp.NumDashes = 0
|
98
|
+
dsp.DashPhase = 0
|
99
|
+
|
100
|
+
# draw axes
|
101
|
+
set_solid_brush(brush, 0x000000, 1.0) # black
|
102
|
+
graph_width, graph_height = *graph_size(area_draw_params.AreaWidth, area_draw_params.AreaHeight)
|
103
|
+
|
104
|
+
path = UI.draw_new_path(0) # winding
|
105
|
+
UI.draw_path_new_figure(path, X_OFF_LEFT, Y_OFF_TOP)
|
106
|
+
UI.draw_path_line_to(path, X_OFF_LEFT, Y_OFF_TOP + graph_height)
|
107
|
+
UI.draw_path_line_to(path, X_OFF_LEFT + graph_width, Y_OFF_TOP + graph_height)
|
108
|
+
UI.draw_path_end(path)
|
109
|
+
UI.draw_stroke(area_draw_params.Context, path, brush, dsp)
|
110
|
+
UI.draw_free_path(path)
|
111
|
+
|
112
|
+
# now transform the coordinate space so (0, 0) is the top-left corner of the graph
|
113
|
+
UI.draw_matrix_set_identity(matrix)
|
114
|
+
UI.draw_matrix_translate(matrix, X_OFF_LEFT, Y_OFF_TOP)
|
115
|
+
UI.draw_transform(area_draw_params.Context, matrix)
|
116
|
+
|
117
|
+
# now get the color for the graph itself and set up the brush
|
118
|
+
# uiColorButtonColor(colorButton, &graphR, &graphG, &graphB, &graphA)
|
119
|
+
graph_r = Fiddle::Pointer.malloc(8, Fiddle::RUBY_FREE) # double
|
120
|
+
graph_g = Fiddle::Pointer.malloc(8, Fiddle::RUBY_FREE) # double
|
121
|
+
graph_b = Fiddle::Pointer.malloc(8, Fiddle::RUBY_FREE) # double
|
122
|
+
graph_a = Fiddle::Pointer.malloc(8, Fiddle::RUBY_FREE) # double
|
123
|
+
|
124
|
+
UI.color_button_color(color_button, graph_r, graph_g, graph_b, graph_a)
|
125
|
+
brush.Type = 0 # solid
|
126
|
+
brush.R = graph_r[0, 8].unpack1('d')
|
127
|
+
brush.G = graph_g[0, 8].unpack1('d')
|
128
|
+
brush.B = graph_b[0, 8].unpack1('d')
|
129
|
+
|
130
|
+
# now create the fill for the graph below the graph line
|
131
|
+
path = construct_graph(datapoints, graph_width, graph_height, true)
|
132
|
+
brush.A = graph_a[0, 8].unpack1('d') / 2.0
|
133
|
+
UI.draw_fill(area_draw_params.Context, path, brush)
|
134
|
+
UI.draw_free_path(path)
|
135
|
+
|
136
|
+
# now draw the histogram line
|
137
|
+
path = construct_graph(datapoints, graph_width, graph_height, false)
|
138
|
+
brush.A = graph_a[0, 8].unpack1('d')
|
139
|
+
UI.draw_stroke(area_draw_params.Context, path, brush, dsp)
|
140
|
+
UI.draw_free_path(path)
|
141
|
+
end
|
142
|
+
|
143
|
+
# Assigning to local variables
|
144
|
+
# This is intended to protect Fiddle::Closure from garbage collection.
|
145
|
+
# See https://github.com/kojix2/LibUI/issues/8
|
146
|
+
do_nothing = Fiddle::Closure::BlockCaller.new(0, [0]) {}
|
147
|
+
key_event = Fiddle::Closure::BlockCaller.new(1, [0]) { 0 }
|
148
|
+
handler.Draw = handler_draw_event
|
149
|
+
handler.MouseEvent = do_nothing
|
150
|
+
handler.MouseCrossed = do_nothing
|
151
|
+
handler.DragBroken = do_nothing
|
152
|
+
handler.KeyEvent = key_event
|
153
|
+
|
154
|
+
UI.freeInitError(init) unless init.nil?
|
155
|
+
|
156
|
+
hbox = UI.new_horizontal_box
|
157
|
+
UI.box_set_padded(hbox, 1)
|
158
|
+
|
159
|
+
vbox = UI.new_vertical_box
|
160
|
+
UI.box_set_padded(vbox, 1)
|
161
|
+
UI.box_append(hbox, vbox, 0)
|
162
|
+
UI.box_append(hbox, histogram, 1)
|
163
|
+
|
164
|
+
datapoints = Array.new(10) do
|
165
|
+
UI.new_spinbox(0, 100).tap do |datapoint|
|
166
|
+
UI.spinbox_set_value(datapoint, Random.new.rand(90))
|
167
|
+
UI.spinbox_on_changed(datapoint) do
|
168
|
+
UI.area_queue_redraw_all(histogram)
|
169
|
+
end
|
170
|
+
UI.box_append(vbox, datapoint, 0)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def set_solid_brush(brush, color, alpha)
|
175
|
+
brush.Type = 0 # solid
|
176
|
+
brush.R = ((color >> 16) & 0xFF) / 255.0
|
177
|
+
brush.G = ((color >> 8) & 0xFF) / 255.0
|
178
|
+
brush.B = (color & 0xFF) / 255.0
|
179
|
+
brush.A = alpha
|
180
|
+
brush
|
181
|
+
end
|
182
|
+
|
183
|
+
set_solid_brush(brush, BLUE, 1.0)
|
184
|
+
LibUI.color_button_set_color(color_button, brush.R, brush.G, brush.B, brush.A)
|
185
|
+
|
186
|
+
LibUI.color_button_on_changed(color_button) {
|
187
|
+
LibUI.area_queue_redraw_all(histogram)
|
188
|
+
}
|
189
|
+
|
190
|
+
LibUI.box_append(vbox, color_button, 0)
|
191
|
+
|
192
|
+
MAIN_WINDOW = LibUI.new_window('Histogram example', 800, 600, 1)
|
193
|
+
LibUI.window_set_margined(MAIN_WINDOW, 1)
|
194
|
+
LibUI.window_set_child(MAIN_WINDOW, hbox)
|
195
|
+
|
196
|
+
should_quit = proc { |_ptr|
|
197
|
+
LibUI.control_destroy(MAIN_WINDOW)
|
198
|
+
LibUI.quit
|
199
|
+
0
|
200
|
+
}
|
201
|
+
|
202
|
+
LibUI.window_on_closing(MAIN_WINDOW, should_quit)
|
203
|
+
LibUI.on_should_quit(should_quit)
|
204
|
+
LibUI.control_show(MAIN_WINDOW)
|
205
|
+
|
206
|
+
LibUI.main
|
207
|
+
LibUI.quit
|
@@ -0,0 +1,220 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# require '003_fancy_text_example.rb'
|
6
|
+
# =========================================================================== #
|
7
|
+
require 'libui'
|
8
|
+
|
9
|
+
UI = LibUI
|
10
|
+
UI.init
|
11
|
+
|
12
|
+
# =========================================================================== #
|
13
|
+
# === WIDTH
|
14
|
+
# =========================================================================== #
|
15
|
+
WIDTH = 1000
|
16
|
+
|
17
|
+
# =========================================================================== #
|
18
|
+
# === USE_THIS_FONT
|
19
|
+
# =========================================================================== #
|
20
|
+
USE_THIS_FONT = 'Hack' # Or 'Courier New'.
|
21
|
+
|
22
|
+
# =========================================================================== #
|
23
|
+
# === append_with_attribute
|
24
|
+
# =========================================================================== #
|
25
|
+
def append_with_attribute(attr_str, what, attr1, attr2)
|
26
|
+
start_pos = LibUI.attributed_string_len(attr_str)
|
27
|
+
end_pos = start_pos + what.length
|
28
|
+
LibUI.attributed_string_append_unattributed(attr_str, what)
|
29
|
+
LibUI.attributed_string_set_attribute(attr_str, attr1, start_pos, end_pos)
|
30
|
+
LibUI.attributed_string_set_attribute(attr_str, attr2, start_pos, end_pos) if attr2
|
31
|
+
end
|
32
|
+
|
33
|
+
# =========================================================================== #
|
34
|
+
# === make_attribute_string
|
35
|
+
#
|
36
|
+
# Create a new attributed string.
|
37
|
+
# =========================================================================== #
|
38
|
+
def make_attribute_string
|
39
|
+
attr_str = LibUI.new_attributed_string(
|
40
|
+
"Drawing strings with libui is done with the "\
|
41
|
+
"uiAttributedString and uiDrawTextLayout objects.\n" \
|
42
|
+
'uiAttributedString lets you have a variety of attributes: '
|
43
|
+
)
|
44
|
+
|
45
|
+
attr1 = LibUI.new_family_attribute(USE_THIS_FONT)
|
46
|
+
append_with_attribute(attr_str, 'font family', attr1, nil)
|
47
|
+
LibUI.attributed_string_append_unattributed(attr_str, ', ')
|
48
|
+
|
49
|
+
# ========================================================================= #
|
50
|
+
# === Use a bigger font next
|
51
|
+
# ========================================================================= #
|
52
|
+
bigger_font = UI.new_size_attribute(45)
|
53
|
+
append_with_attribute(attr_str, 'font size', bigger_font, nil)
|
54
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
55
|
+
|
56
|
+
# ========================================================================= #
|
57
|
+
# === Make bold text next (bold tag)
|
58
|
+
# ========================================================================= #
|
59
|
+
attr1 = LibUI.new_weight_attribute(LibUI::TextWeightBold)
|
60
|
+
append_with_attribute(attr_str, 'font weight', attr1, nil)
|
61
|
+
LibUI.attributed_string_append_unattributed(attr_str, ', ')
|
62
|
+
|
63
|
+
attr1 = LibUI.new_italic_attribute(UI::TextItalicItalic)
|
64
|
+
append_with_attribute(attr_str, 'font italicness', attr1, nil)
|
65
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
66
|
+
|
67
|
+
attr1 = LibUI.new_stretch_attribute(UI::TextStretchCondensed)
|
68
|
+
append_with_attribute(attr_str, 'font stretch', attr1, nil)
|
69
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
70
|
+
|
71
|
+
# ========================================================================= #
|
72
|
+
# Influence the text-colour via RGB values.
|
73
|
+
# ========================================================================= #
|
74
|
+
attr1 = LibUI.new_color_attribute(0.75, 0.25, 0.5, 0.75)
|
75
|
+
append_with_attribute(attr_str, 'text color', attr1, nil)
|
76
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
77
|
+
|
78
|
+
attr1 = LibUI.new_background_attribute(0.5, 0.5, 0.25, 0.5)
|
79
|
+
append_with_attribute(attr_str, 'text background color', attr1, nil)
|
80
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
81
|
+
|
82
|
+
attr1 = UI.new_underline_attribute(UI::UnderlineSingle)
|
83
|
+
append_with_attribute(attr_str, 'underline style', attr1, nil)
|
84
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
85
|
+
|
86
|
+
UI.attributed_string_append_unattributed(attr_str, 'and ')
|
87
|
+
attr1 = LibUI.new_underline_attribute(UI::UnderlineDouble)
|
88
|
+
attr2 = LibUI.new_underline_color_attribute(UI::UnderlineColorCustom, 1.0, 0.0, 0.5, 1.0)
|
89
|
+
append_with_attribute(attr_str, 'underline color', attr1, attr2)
|
90
|
+
UI.attributed_string_append_unattributed(attr_str, '. ')
|
91
|
+
|
92
|
+
UI.attributed_string_append_unattributed(attr_str, 'Furthermore, there are attributes allowing for ')
|
93
|
+
attr1 = LibUI.new_underline_attribute(UI::UnderlineSuggestion)
|
94
|
+
attr2 = LibUI.new_underline_color_attribute(UI::UnderlineColorSpelling, 0, 0, 0, 0)
|
95
|
+
append_with_attribute(attr_str, 'special underlines for indicating spelling errors', attr1, attr2)
|
96
|
+
UI.attributed_string_append_unattributed(attr_str, ' (and other types of errors) ')
|
97
|
+
|
98
|
+
UI.attributed_string_append_unattributed(attr_str,
|
99
|
+
'and control over OpenType features such as ligatures (for instance, ')
|
100
|
+
otf = UI.new_open_type_features
|
101
|
+
UI.open_type_features_add(otf, 'l', 'i', 'g', 'a', 0)
|
102
|
+
attr1 = UI.new_features_attribute(otf)
|
103
|
+
append_with_attribute(attr_str, 'afford', attr1, nil)
|
104
|
+
UI.attributed_string_append_unattributed(attr_str, ' vs. ')
|
105
|
+
UI.open_type_features_add(otf, 'l', 'i', 'g', 'a', 1)
|
106
|
+
attr1 = UI.new_features_attribute(otf)
|
107
|
+
append_with_attribute(attr_str, 'afford', attr1, nil)
|
108
|
+
UI.free_open_type_features(otf)
|
109
|
+
UI.attributed_string_append_unattributed(attr_str, ").\n")
|
110
|
+
|
111
|
+
UI.attributed_string_append_unattributed(attr_str,
|
112
|
+
'Use the controls '\
|
113
|
+
'opposite to the text '\
|
114
|
+
'to control properties of the text.')
|
115
|
+
attr_str
|
116
|
+
end
|
117
|
+
|
118
|
+
# =========================================================================== #
|
119
|
+
# === on_font_changed
|
120
|
+
# =========================================================================== #
|
121
|
+
def on_font_changed(area)
|
122
|
+
UI.area_queue_redraw_all(area)
|
123
|
+
end
|
124
|
+
|
125
|
+
# =========================================================================== #
|
126
|
+
# === on_combobox_selected
|
127
|
+
# =========================================================================== #
|
128
|
+
def on_combobox_selected(area)
|
129
|
+
UI.area_queue_redraw_all(area)
|
130
|
+
end
|
131
|
+
|
132
|
+
# === draw_event
|
133
|
+
def draw_event(adp, attr_str, font_button, alignment)
|
134
|
+
area_draw_params = UI::FFI::AreaDrawParams.new(adp)
|
135
|
+
default_font = UI::FFI::FontDescriptor.malloc
|
136
|
+
default_font.to_ptr.free = Fiddle::RUBY_FREE
|
137
|
+
default_font = UI::FFI::FontDescriptor.malloc
|
138
|
+
default_font.to_ptr.free = Fiddle::RUBY_FREE
|
139
|
+
params = UI::FFI::DrawTextLayoutParams.malloc
|
140
|
+
params.to_ptr.free = Fiddle::RUBY_FREE
|
141
|
+
|
142
|
+
params.String = attr_str
|
143
|
+
UI.font_button_font(font_button, default_font)
|
144
|
+
params.DefaultFont = default_font
|
145
|
+
params.Width = area_draw_params.AreaWidth
|
146
|
+
params.Align = UI.combobox_selected(alignment)
|
147
|
+
text_layout = UI.draw_new_text_layout(params)
|
148
|
+
UI.draw_text(area_draw_params.Context, text_layout, 0, 0)
|
149
|
+
UI.draw_free_text_layout(text_layout)
|
150
|
+
UI.free_font_button_font(default_font)
|
151
|
+
end
|
152
|
+
|
153
|
+
UI.init
|
154
|
+
|
155
|
+
handler = UI::FFI::AreaHandler.malloc
|
156
|
+
handler.to_ptr.free = Fiddle::RUBY_FREE
|
157
|
+
handler_draw_event = Fiddle::Closure::BlockCaller.new(0, [1, 1, 1]) do |_, _area, adp|
|
158
|
+
draw_event(adp, @attr_str, @font_button, @alignment)
|
159
|
+
end
|
160
|
+
|
161
|
+
handler.Draw = handler_draw_event
|
162
|
+
|
163
|
+
do_nothing = Fiddle::Closure::BlockCaller.new(0, [0]) {}
|
164
|
+
key_event = Fiddle::Closure::BlockCaller.new(1, [0]) { 0 }
|
165
|
+
handler.MouseEvent = do_nothing
|
166
|
+
handler.MouseCrossed = do_nothing
|
167
|
+
handler.DragBroken = do_nothing
|
168
|
+
handler.KeyEvent = key_event
|
169
|
+
|
170
|
+
LibUI.on_should_quit {
|
171
|
+
LibUI.control_destroy(main_window)
|
172
|
+
}
|
173
|
+
|
174
|
+
# =========================================================================== #
|
175
|
+
# Assign to the main attributed string next.
|
176
|
+
# =========================================================================== #
|
177
|
+
@attr_str = make_attribute_string
|
178
|
+
|
179
|
+
main_window = LibUI.new_window('Text-Drawing Example', WIDTH, 480, 1)
|
180
|
+
LibUI.window_set_margined(main_window, 1)
|
181
|
+
LibUI.window_on_closing(main_window) {
|
182
|
+
LibUI.control_destroy(main_window)
|
183
|
+
LibUI.quit
|
184
|
+
0
|
185
|
+
}
|
186
|
+
|
187
|
+
hbox = LibUI.new_horizontal_box
|
188
|
+
LibUI.box_set_padded(hbox, 1)
|
189
|
+
LibUI.window_set_child(main_window, hbox)
|
190
|
+
|
191
|
+
vbox = LibUI.new_vertical_box
|
192
|
+
LibUI.box_set_padded(vbox, 1)
|
193
|
+
LibUI.box_append(hbox, vbox, 0)
|
194
|
+
|
195
|
+
@font_button = LibUI.new_font_button
|
196
|
+
LibUI.font_button_on_changed(@font_button) { on_font_changed(@area) }
|
197
|
+
LibUI.box_append(vbox, @font_button, 0)
|
198
|
+
|
199
|
+
form = LibUI.new_form
|
200
|
+
LibUI.form_set_padded(form, 1)
|
201
|
+
LibUI.box_append(vbox, form, 0)
|
202
|
+
|
203
|
+
# Add a combobox entry next.
|
204
|
+
# @alignment = ui_combobox(%w( Left Center Right ))
|
205
|
+
@alignment = LibUI.new_combobox
|
206
|
+
LibUI.combobox_append(@alignment, 'Left')
|
207
|
+
LibUI.combobox_append(@alignment, 'Center')
|
208
|
+
LibUI.combobox_append(@alignment, 'Right')
|
209
|
+
LibUI.combobox_set_selected(@alignment, 0)
|
210
|
+
LibUI.combobox_on_selected(@alignment) { on_combobox_selected(@area) }
|
211
|
+
LibUI.form_append(form, 'Alignment', @alignment, 0)
|
212
|
+
|
213
|
+
@area = LibUI.new_area(handler)
|
214
|
+
LibUI.box_append(hbox, @area, 1)
|
215
|
+
|
216
|
+
LibUI.control_show(main_window)
|
217
|
+
LibUI.main
|
218
|
+
|
219
|
+
LibUI.free_attributed_string(@attr_str)
|
220
|
+
LibUI.uninit
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# require 'libui_paradise/examples/simple/004_date_time_picker.rb'
|
6
|
+
# =========================================================================== #
|
7
|
+
require 'libui'
|
8
|
+
|
9
|
+
alias e puts
|
10
|
+
|
11
|
+
# =========================================================================== #
|
12
|
+
# === TITLE
|
13
|
+
# =========================================================================== #
|
14
|
+
TITLE = 'Date Time Pickers'
|
15
|
+
|
16
|
+
LibUI.init
|
17
|
+
|
18
|
+
vbox = LibUI.new_vertical_box
|
19
|
+
|
20
|
+
date_time_picker = LibUI.new_date_time_picker
|
21
|
+
|
22
|
+
time = LibUI::FFI::TM.malloc
|
23
|
+
|
24
|
+
LibUI.date_time_picker_on_changed(date_time_picker) {
|
25
|
+
LibUI.date_time_picker_time(date_time_picker, time)
|
26
|
+
p sec: time.tm_sec,
|
27
|
+
min: time.tm_min,
|
28
|
+
hour: time.tm_hour,
|
29
|
+
mday: time.tm_mday,
|
30
|
+
mon: time.tm_mon,
|
31
|
+
year: time.tm_year,
|
32
|
+
wday: time.tm_wday,
|
33
|
+
yday: time.tm_yday,
|
34
|
+
isdst: time.tm_isdst
|
35
|
+
}
|
36
|
+
|
37
|
+
LibUI.box_set_padded(vbox, 1)
|
38
|
+
LibUI.box_append(vbox, date_time_picker, 1)
|
39
|
+
|
40
|
+
main_window = LibUI.new_window(TITLE, 300, 200, 1)
|
41
|
+
LibUI.window_set_margined(main_window, 1)
|
42
|
+
|
43
|
+
LibUI.window_on_closing(main_window) {
|
44
|
+
LibUI.control_destroy(main_window)
|
45
|
+
LibUI.quit
|
46
|
+
0
|
47
|
+
}
|
48
|
+
|
49
|
+
LibUI.window_set_child(main_window, vbox)
|
50
|
+
LibUI.control_show(main_window)
|
51
|
+
LibUI.main
|
52
|
+
LibUI.quit
|
@@ -0,0 +1,185 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# 005_text_drawing_example.rb
|
6
|
+
# =========================================================================== #
|
7
|
+
require 'libui'
|
8
|
+
|
9
|
+
UI = LibUI
|
10
|
+
|
11
|
+
# =========================================================================== #
|
12
|
+
# === append_with_attribute
|
13
|
+
# =========================================================================== #
|
14
|
+
def append_with_attribute(attr_str, what, attr1, attr2)
|
15
|
+
start_pos = LibUI.attributed_string_len(attr_str)
|
16
|
+
end_pos = start_pos + what.length
|
17
|
+
LibUI.attributed_string_append_unattributed(attr_str, what)
|
18
|
+
LibUI.attributed_string_set_attribute(attr_str, attr1, start_pos, end_pos)
|
19
|
+
LibUI.attributed_string_set_attribute(attr_str, attr2, start_pos, end_pos) if attr2
|
20
|
+
end
|
21
|
+
|
22
|
+
# =========================================================================== #
|
23
|
+
# === make_attribute_string
|
24
|
+
# =========================================================================== #
|
25
|
+
def make_attribute_string
|
26
|
+
attr_str = LibUI.new_attributed_string(
|
27
|
+
"Drawing strings with libui is done with the uiAttributedString and uiDrawTextLayout objects.\n" \
|
28
|
+
'uiAttributedString lets you have a variety of attributes: '
|
29
|
+
)
|
30
|
+
|
31
|
+
attr1 = LibUI.new_family_attribute('Courier New')
|
32
|
+
append_with_attribute(attr_str, 'font family', attr1, nil)
|
33
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
34
|
+
|
35
|
+
attr1 = LibUI.new_size_attribute(18)
|
36
|
+
append_with_attribute(attr_str, 'font size', attr1, nil)
|
37
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
38
|
+
|
39
|
+
attr1 = UI.new_weight_attribute(UI::TextWeightBold)
|
40
|
+
append_with_attribute(attr_str, 'font weight', attr1, nil)
|
41
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
42
|
+
|
43
|
+
attr1 = UI.new_italic_attribute(UI::TextItalicItalic)
|
44
|
+
append_with_attribute(attr_str, 'font italicness', attr1, nil)
|
45
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
46
|
+
|
47
|
+
attr1 = UI.new_stretch_attribute(UI::TextStretchCondensed)
|
48
|
+
append_with_attribute(attr_str, 'font stretch', attr1, nil)
|
49
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
50
|
+
|
51
|
+
attr1 = UI.new_color_attribute(0.75, 0.25, 0.5, 0.75)
|
52
|
+
append_with_attribute(attr_str, 'text color', attr1, nil)
|
53
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
54
|
+
|
55
|
+
attr1 = UI.new_background_attribute(0.5, 0.5, 0.25, 0.5)
|
56
|
+
append_with_attribute(attr_str, 'text background color', attr1, nil)
|
57
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
58
|
+
|
59
|
+
attr1 = UI.new_underline_attribute(UI::UnderlineSingle)
|
60
|
+
append_with_attribute(attr_str, 'underline style', attr1, nil)
|
61
|
+
UI.attributed_string_append_unattributed(attr_str, ', ')
|
62
|
+
|
63
|
+
UI.attributed_string_append_unattributed(attr_str, 'and ')
|
64
|
+
attr1 = UI.new_underline_attribute(UI::UnderlineDouble)
|
65
|
+
attr2 = UI.new_underline_color_attribute(UI::UnderlineColorCustom, 1.0, 0.0, 0.5, 1.0)
|
66
|
+
append_with_attribute(attr_str, 'underline color', attr1, attr2)
|
67
|
+
UI.attributed_string_append_unattributed(attr_str, '. ')
|
68
|
+
|
69
|
+
UI.attributed_string_append_unattributed(attr_str, 'Furthermore, there are attributes allowing for ')
|
70
|
+
attr1 = UI.new_underline_attribute(UI::UnderlineSuggestion)
|
71
|
+
attr2 = UI.new_underline_color_attribute(UI::UnderlineColorSpelling, 0, 0, 0, 0)
|
72
|
+
append_with_attribute(attr_str, 'special underlines for indicating spelling errors', attr1, attr2)
|
73
|
+
UI.attributed_string_append_unattributed(attr_str, ' (and other types of errors) ')
|
74
|
+
|
75
|
+
UI.attributed_string_append_unattributed(attr_str,
|
76
|
+
'and control over OpenType features such as ligatures (for instance, ')
|
77
|
+
otf = LibUI.new_open_type_features
|
78
|
+
LibUI.open_type_features_add(otf, 'l', 'i', 'g', 'a', 0)
|
79
|
+
attr1 = UI.new_features_attribute(otf)
|
80
|
+
append_with_attribute(attr_str, 'afford', attr1, nil)
|
81
|
+
LibUI.attributed_string_append_unattributed(attr_str, ' vs. ')
|
82
|
+
LibUI.open_type_features_add(otf, 'l', 'i', 'g', 'a', 1)
|
83
|
+
attr1 = UI.new_features_attribute(otf)
|
84
|
+
append_with_attribute(attr_str, 'afford', attr1, nil)
|
85
|
+
LibUI.free_open_type_features(otf)
|
86
|
+
LibUI.attributed_string_append_unattributed(attr_str, ").\n")
|
87
|
+
|
88
|
+
LibUI.attributed_string_append_unattributed(attr_str,
|
89
|
+
"\nUse the controls opposite to the text to control "\
|
90
|
+
"properties of the text.")
|
91
|
+
attr_str
|
92
|
+
end
|
93
|
+
|
94
|
+
def on_font_changed(area)
|
95
|
+
LibUI.area_queue_redraw_all(area)
|
96
|
+
end
|
97
|
+
|
98
|
+
def on_combobox_selected(area)
|
99
|
+
LibUI.area_queue_redraw_all(area)
|
100
|
+
end
|
101
|
+
|
102
|
+
def draw_event(adp, attr_str, font_button, alignment)
|
103
|
+
area_draw_params = UI::FFI::AreaDrawParams.new(adp)
|
104
|
+
default_font = UI::FFI::FontDescriptor.malloc
|
105
|
+
default_font.to_ptr.free = Fiddle::RUBY_FREE
|
106
|
+
default_font = UI::FFI::FontDescriptor.malloc
|
107
|
+
default_font.to_ptr.free = Fiddle::RUBY_FREE
|
108
|
+
params = UI::FFI::DrawTextLayoutParams.malloc
|
109
|
+
params.to_ptr.free = Fiddle::RUBY_FREE
|
110
|
+
|
111
|
+
params.String = attr_str
|
112
|
+
UI.font_button_font(font_button, default_font)
|
113
|
+
params.DefaultFont = default_font
|
114
|
+
params.Width = area_draw_params.AreaWidth
|
115
|
+
params.Align = UI.combobox_selected(alignment)
|
116
|
+
text_layout = UI.draw_new_text_layout(params)
|
117
|
+
UI.draw_text(area_draw_params.Context, text_layout, 0, 0)
|
118
|
+
UI.draw_free_text_layout(text_layout)
|
119
|
+
UI.free_font_button_font(default_font)
|
120
|
+
end
|
121
|
+
|
122
|
+
LibUI.init
|
123
|
+
|
124
|
+
handler = UI::FFI::AreaHandler.malloc
|
125
|
+
handler.to_ptr.free = Fiddle::RUBY_FREE
|
126
|
+
|
127
|
+
handler_draw_event = Fiddle::Closure::BlockCaller.new(0, [1, 1, 1]) do |_, _area, adp|
|
128
|
+
draw_event(adp, @attr_str, @font_button, @alignment)
|
129
|
+
end
|
130
|
+
|
131
|
+
handler.Draw = handler_draw_event
|
132
|
+
|
133
|
+
do_nothing = Fiddle::Closure::BlockCaller.new(0, [0]) {}
|
134
|
+
key_event = Fiddle::Closure::BlockCaller.new(1, [0]) { 0 }
|
135
|
+
handler.MouseEvent = do_nothing
|
136
|
+
handler.MouseCrossed = do_nothing
|
137
|
+
handler.DragBroken = do_nothing
|
138
|
+
handler.KeyEvent = key_event
|
139
|
+
|
140
|
+
UI.on_should_quit do
|
141
|
+
UI.control_destroy(main_window)
|
142
|
+
end
|
143
|
+
|
144
|
+
@attr_str = make_attribute_string
|
145
|
+
|
146
|
+
main_window = UI.new_window('Text-Drawing Example', 640, 480, 1)
|
147
|
+
UI.window_set_margined(main_window, 1)
|
148
|
+
UI.window_on_closing(main_window) do
|
149
|
+
UI.control_destroy(main_window)
|
150
|
+
UI.quit
|
151
|
+
0
|
152
|
+
end
|
153
|
+
|
154
|
+
hbox = UI.new_horizontal_box
|
155
|
+
UI.box_set_padded(hbox, 1)
|
156
|
+
UI.window_set_child(main_window, hbox)
|
157
|
+
|
158
|
+
vbox = UI.new_vertical_box
|
159
|
+
UI.box_set_padded(vbox, 1)
|
160
|
+
UI.box_append(hbox, vbox, 0)
|
161
|
+
|
162
|
+
@font_button = UI.new_font_button
|
163
|
+
UI.font_button_on_changed(@font_button) { on_font_changed(@area) }
|
164
|
+
UI.box_append(vbox, @font_button, 0)
|
165
|
+
|
166
|
+
form = UI.new_form
|
167
|
+
UI.form_set_padded(form, 1)
|
168
|
+
UI.box_append(vbox, form, 0)
|
169
|
+
|
170
|
+
@alignment = UI.new_combobox
|
171
|
+
UI.combobox_append(@alignment, 'Left')
|
172
|
+
UI.combobox_append(@alignment, 'Center')
|
173
|
+
UI.combobox_append(@alignment, 'Right')
|
174
|
+
UI.combobox_set_selected(@alignment, 0)
|
175
|
+
UI.combobox_on_selected(@alignment) { on_combobox_selected(@area) }
|
176
|
+
UI.form_append(form, 'Alignment', @alignment, 0)
|
177
|
+
|
178
|
+
@area = LibUI.new_area(handler)
|
179
|
+
LibUI.box_append(hbox, @area, 1)
|
180
|
+
|
181
|
+
LibUI.control_show(main_window)
|
182
|
+
LibUI.main
|
183
|
+
|
184
|
+
LibUI.free_attributed_string(@attr_str)
|
185
|
+
LibUI.uninit
|