libui_paradise 0.2.49 → 0.4.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +405 -259
- data/bin/libui_message +7 -0
- data/doc/README.gen +356 -131
- data/doc/todo/todo.md +14 -5
- data/lib/libui_paradise/autoinclude.rb +2 -1
- data/lib/libui_paradise/base/base.rb +51 -62
- data/lib/libui_paradise/base_module/base_module.rb +1514 -0
- data/lib/libui_paradise/colours/colours.rb +14 -2
- data/lib/libui_paradise/domain_specific_language/README.md +6 -0
- data/lib/libui_paradise/examples/complex/002_tabs_example.rb +1 -2
- data/lib/libui_paradise/examples/complex/003_open_file_button_example.rb +3 -5
- data/lib/libui_paradise/examples/complex/006_coloured_boxes_example.rb +2 -2
- data/lib/libui_paradise/examples/complex/007_slider_example.rb +10 -4
- data/lib/libui_paradise/examples/complex/008_radio_button_example.rb +2 -2
- data/lib/libui_paradise/examples/complex/009_separator_example.rb +2 -2
- data/lib/libui_paradise/examples/complex/010_table_example.rb +139 -49
- data/lib/libui_paradise/examples/complex/011_two_buttons_showing_how_to_enable_and_disable_them.rb +2 -1
- data/lib/libui_paradise/examples/complex/012_password_entry_example.rb +1 -1
- data/lib/libui_paradise/examples/complex/013_form_example.rb +1 -1
- data/lib/libui_paradise/examples/complex/014_text_example.rb +1 -1
- data/lib/libui_paradise/examples/complex/015_text_view_example.rb +4 -4
- data/lib/libui_paradise/examples/complex/016_grid_example.rb +20 -11
- data/lib/libui_paradise/examples/complex/017_unicode_text_example.rb +2 -2
- data/lib/libui_paradise/examples/complex/018_spinbutton_example.rb +1 -1
- data/lib/libui_paradise/examples/complex/019_combo_box_example.rb +1 -1
- data/lib/libui_paradise/examples/complex/020_checkbox_example.rb +5 -5
- data/lib/libui_paradise/examples/complex/021_font_example.rb +4 -3
- data/lib/libui_paradise/examples/complex/022_simple_notepad_example.rb +3 -3
- data/lib/libui_paradise/examples/complex/023_msg_box_error.rb +5 -5
- data/lib/libui_paradise/examples/complex/024_parse_config_file_example.rb +2 -2
- data/lib/libui_paradise/examples/complex/025_colour_button.rb +1 -1
- data/lib/libui_paradise/examples/complex/026_basic_table_image.rb +5 -8
- data/lib/libui_paradise/examples/complex/027_basic_button_example.rb +3 -3
- data/lib/libui_paradise/examples/complex/028_try_for_automatic_button_press_event_after_a_delay.rb +4 -5
- data/lib/libui_paradise/examples/complex/029_progressbar_example.rb +4 -5
- data/lib/libui_paradise/examples/complex/030_entry_responds_to_comment_as_synonymous_to_the_enter_key_pressed_example.rb +5 -6
- data/lib/libui_paradise/examples/complex/031_notification_functionality_example.rb +3 -2
- data/lib/libui_paradise/examples/complex/032_simple_window_example.rb +2 -1
- data/lib/libui_paradise/examples/complex/033_daemonize_and_exit_after_delay_example.rb +3 -2
- data/lib/libui_paradise/examples/complex/034_bold_text_example.rb +115 -0
- data/lib/libui_paradise/examples/complex/035_parse_into_table_example.rb +109 -0
- data/lib/libui_paradise/examples/simple/001_open_file_example.rb +1 -1
- data/lib/libui_paradise/examples/simple/002_histogram_example.rb +6 -6
- data/lib/libui_paradise/examples/simple/003_fancy_text_example.rb +80 -43
- data/lib/libui_paradise/examples/simple/005_text_drawing_example.rb +11 -11
- data/lib/libui_paradise/examples/simple/007_control_gallery.rb +21 -14
- data/lib/libui_paradise/examples/simple/009_spectrum.rb +7 -1
- data/lib/libui_paradise/examples/simple/010_font_button.rb +31 -0
- data/lib/libui_paradise/examples/simple/011_simple_notepad.rb +24 -0
- data/lib/libui_paradise/examples/simple/012_table_example.rb +71 -0
- data/lib/libui_paradise/examples/simple/013_scrolling_pane_example.rb +28 -0
- data/lib/libui_paradise/examples/simple/014_simple_entry_example.rb +30 -0
- data/lib/libui_paradise/examples/simple/015_slider_example.rb +32 -0
- data/lib/libui_paradise/fiddle/{pointer.rb → fiddle.rb} +768 -615
- data/lib/libui_paradise/generic_window/generic_window.rb +1 -1
- data/lib/libui_paradise/images/README.md +5 -2
- data/lib/libui_paradise/libui_classes/button.rb +31 -0
- data/lib/libui_paradise/libui_classes/entry.rb +35 -0
- data/lib/libui_paradise/libui_classes/grid.rb +14 -23
- data/lib/libui_paradise/libui_classes/hbox.rb +39 -0
- data/lib/libui_paradise/libui_classes/libui_classes.rb +9 -1595
- data/lib/libui_paradise/libui_classes/msg_box.rb +121 -0
- data/lib/libui_paradise/libui_classes/msg_box_error.rb +41 -0
- data/lib/libui_paradise/libui_classes/slider.rb +28 -0
- data/lib/libui_paradise/libui_classes/spinbox.rb +48 -0
- data/lib/libui_paradise/libui_classes/vbox.rb +38 -0
- data/lib/libui_paradise/project/project.rb +6 -1
- data/lib/libui_paradise/prototype/prototype.rb +8 -10
- data/lib/libui_paradise/requires/require_the_libui_classes.rb +2 -2
- data/lib/libui_paradise/requires/require_the_libui_paradise_project.rb +5 -3
- data/lib/libui_paradise/toplevel_methods/add_to_the_registered_widgets.rb +70 -0
- data/lib/libui_paradise/toplevel_methods/hash_fiddle_pointer_widgets.rb +37 -0
- data/lib/libui_paradise/toplevel_methods/toplevel_counters.rb +83 -0
- data/lib/libui_paradise/toplevel_methods/toplevel_methods.rb +792 -0
- data/lib/libui_paradise/version/version.rb +2 -2
- data/lib/libui_paradise.rb +0 -0
- data/libui_paradise.gemspec +5 -4
- data/test/testing_generic_window.rb +2 -0
- metadata +35 -30
- data/doc/SNIPPETS.md +0 -94
- data/lib/libui_paradise/extensions/counters.rb +0 -58
- data/lib/libui_paradise/extensions/extensions.rb +0 -29
- data/lib/libui_paradise/extensions/hash_fiddle_pointer_widgets.rb +0 -150
- data/lib/libui_paradise/extensions/misc.rb +0 -754
- data/lib/libui_paradise/libui_classes/box.rb +0 -156
- data/lib/libui_paradise/toplevel_methods/misc.rb +0 -13
data/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
[](https://www.ruby-lang.org/en/)
|
|
3
3
|
[](https://badge.fury.io/rb/libui_paradise)
|
|
4
4
|
|
|
5
|
-
This gem was <b>last updated</b> on the <span style="color: darkblue; font-weight: bold">
|
|
5
|
+
This gem was <b>last updated</b> on the <span style="color: darkblue; font-weight: bold">28.12.2023</span> (dd.mm.yyyy notation), at <span style="color: steelblue; font-weight: bold">22:23:45</span> o'clock.
|
|
6
6
|
|
|
7
7
|
## The libui_paradise project
|
|
8
8
|
|
|
@@ -13,12 +13,12 @@ by me via **gimp** and ImageMagick - the rounded borders were
|
|
|
13
13
|
done via ImageMagick. You can re-use this image if you would like to,
|
|
14
14
|
including the colour-pattern, via a **CC BY 3.0** licence. See the following
|
|
15
15
|
link for that licence: https://creativecommons.org/licenses/by/3.0/. For
|
|
16
|
-
|
|
16
|
+
<b>cfdg</b> itself, have a look at: https://www.contextfreeart.org/gallery/)
|
|
17
17
|
|
|
18
|
-
The
|
|
18
|
+
The <b>libui_paradise project</b> aims to enhance the official (upstream)
|
|
19
19
|
ruby-libui bindings a little bit.
|
|
20
20
|
|
|
21
|
-
You can find the upstream ruby-libui bindings, maintained by
|
|
21
|
+
You can find the upstream ruby-libui bindings, maintained by <b>kojix2</b>,
|
|
22
22
|
here:
|
|
23
23
|
|
|
24
24
|
https://rubygems.org/gems/libui
|
|
@@ -154,7 +154,7 @@ around one day, that idea should be retained for other GUIs
|
|
|
154
154
|
in the future.
|
|
155
155
|
|
|
156
156
|
It's quite difficult to get GTK and ruby-gtk to work on
|
|
157
|
-
|
|
157
|
+
<b>windows</b> - I tried to compile it some weeks ago but I
|
|
158
158
|
ended up having "missing symbols" error messages afterwards.
|
|
159
159
|
I managed to get the hello-world.c example working, but the
|
|
160
160
|
more complicated examples did not work for me.
|
|
@@ -172,7 +172,7 @@ no binary bundles for ruby-gtk on windows anymore either. I
|
|
|
172
172
|
assume it is possible if you know msys2, and the windows
|
|
173
173
|
platform, but I am no expert on either, so ...)
|
|
174
174
|
|
|
175
|
-
|
|
175
|
+
<b>libui</b> is so much simpler to use on windows than GTK,
|
|
176
176
|
though - just do **gem install libui** and it'll work,
|
|
177
177
|
as-is. Literally. That's it. I tried it on my windows
|
|
178
178
|
laptop and it **does** indeed work. That convinced me
|
|
@@ -286,7 +286,8 @@ sense in this regard.
|
|
|
286
286
|
|
|
287
287
|
## How to add a margin in LibUI
|
|
288
288
|
|
|
289
|
-
Use
|
|
289
|
+
Use the following API if you wish to have your main window
|
|
290
|
+
use a margin:
|
|
290
291
|
|
|
291
292
|
LibUI.window_set_margined(MAIN_WINDOW, 1)
|
|
292
293
|
|
|
@@ -432,14 +433,19 @@ Or just:
|
|
|
432
433
|
|
|
433
434
|
Since as of 2022 I prefer the longer variant, e. g. **LibUI**init. The
|
|
434
435
|
old UI constant ("alias") will be retained, but new code added to the
|
|
435
|
-
libui_paradise gem will not use
|
|
436
|
-
|
|
437
|
-
|
|
436
|
+
libui_paradise gem will not use <b>UI</b> - instead the slightly longer
|
|
437
|
+
<b>LibUI</b> is used.
|
|
438
|
+
|
|
439
|
+
Note that since as of <b>December 2023</b>, whenever the libui_paradise
|
|
440
|
+
gem is required, <b>LibuiParadise.init</b> is automatically called,
|
|
441
|
+
which in turn invokes LibUI.init. The reason as to why this is
|
|
442
|
+
the new default is so that we can omit one line of code.
|
|
443
|
+
|
|
438
444
|
## Subclassing
|
|
439
445
|
|
|
440
446
|
Currently subclassing from LibUI elements does not work - I simply
|
|
441
|
-
have no idea how to "subclass" from a
|
|
442
|
-
have to build up a data structure that behaves like
|
|
447
|
+
have no idea how to "subclass" from a <b>Fiddle::Pointer</b>. Perhaps we
|
|
448
|
+
have to build up a data structure that behaves like <b>Fiddle::Pointer</b>
|
|
443
449
|
but also has methods that allow for a more direct 'OOP behaviour'. Has
|
|
444
450
|
anyone tried this yet? I am scared to try considering I already got
|
|
445
451
|
segfaults everywhere ...
|
|
@@ -456,8 +462,8 @@ The following API can be used to create a new scrolling area:
|
|
|
456
462
|
|
|
457
463
|
LibUI.new_scrolling_area
|
|
458
464
|
|
|
459
|
-
Scrolling areas
|
|
460
|
-
amount that can be scrolled is determined by the area's
|
|
465
|
+
<b>Scrolling areas</b> may contain horizontal and vertical scrollbars.
|
|
466
|
+
The amount that can be scrolled is determined by the area's
|
|
461
467
|
size, which is decided by the programmer (both when creating
|
|
462
468
|
the Area and by a call to SetSize). Only a portion of the
|
|
463
469
|
Area is visible at any time; drawing and mouse events are
|
|
@@ -465,9 +471,9 @@ automatically adjusted to match what portion is visible,
|
|
|
465
471
|
so you do not have to worry about scrolling in your
|
|
466
472
|
event handlers.
|
|
467
473
|
|
|
468
|
-
The method LibUI.new_scrolling_area() accepts three arguments
|
|
474
|
+
The method <b>LibUI.new_scrolling_area()</b> accepts <b>three arguments</b>.
|
|
469
475
|
The second and third are width and height, respectively
|
|
470
|
-
(as
|
|
476
|
+
(as <b>integers</b>).
|
|
471
477
|
|
|
472
478
|
The first argument is the area handle. It has the following
|
|
473
479
|
pointer types (struct):
|
|
@@ -478,7 +484,7 @@ pointer types (struct):
|
|
|
478
484
|
.DragBroken
|
|
479
485
|
.KeyEvent
|
|
480
486
|
|
|
481
|
-
The handlerDraw() function in C looks like this:
|
|
487
|
+
The <b>handlerDraw() function</b> in C looks like this:
|
|
482
488
|
|
|
483
489
|
static void handlerDraw(uiAreaHandler *a, uiArea *area, uiAreaDrawParams *p)
|
|
484
490
|
{
|
|
@@ -497,6 +503,12 @@ The handlerDraw() function in C looks like this:
|
|
|
497
503
|
uiFreeFontButtonFont(&defaultFont);
|
|
498
504
|
}
|
|
499
505
|
|
|
506
|
+
This means that you will have to pass three arguments to
|
|
507
|
+
this method - all are mandatory. Failure to do so may yield an
|
|
508
|
+
error message, such as:
|
|
509
|
+
|
|
510
|
+
gems/libui-0.1.2.pre/lib/libui/ffi.rb:20:in `call': wrong number of arguments (given 0, expected 3) (ArgumentError)
|
|
511
|
+
|
|
500
512
|
The scrollable area may look like this:
|
|
501
513
|
|
|
502
514
|
<img src="https://raw.githubusercontent.com/msink/kotlin-libui/master/samples/hello/hello-windows.png">
|
|
@@ -518,9 +530,10 @@ label / ui_text widget.
|
|
|
518
530
|
|
|
519
531
|
## Working with combo-boxes
|
|
520
532
|
|
|
521
|
-
To create a combo-box in vanilla libui, do this:
|
|
533
|
+
To create a combo-box in vanilla libui, do this in plain ruby-libui:
|
|
522
534
|
|
|
523
|
-
alignment = LibUI.new_combobox
|
|
535
|
+
alignment = LibUI.new_combobox # Here we actually create the combobox.
|
|
536
|
+
# Next, we show how to append to a combobox:
|
|
524
537
|
LibUI.combobox_append(alignment, 'Left')
|
|
525
538
|
LibUI.combobox_append(alignment, 'Center')
|
|
526
539
|
LibUI.combobox_append(alignment, 'Right')
|
|
@@ -552,11 +565,11 @@ For instance:
|
|
|
552
565
|
|
|
553
566
|
LibUI.combobox_set_selected(combobox, 0) # The first one will be active too.
|
|
554
567
|
|
|
555
|
-
To
|
|
568
|
+
To <b>query the currently selected value</b>, use:
|
|
556
569
|
|
|
557
570
|
LibUI.combobox_selected(pointer)
|
|
558
571
|
|
|
559
|
-
This is usually done via a
|
|
572
|
+
This is usually done via a <b>proc {}</b> object. See kojix2' examples.
|
|
560
573
|
|
|
561
574
|
In LibuiParadise a few custom methods were added, such as
|
|
562
575
|
**.ui_sync_connect()**. This method was added to connect a
|
|
@@ -578,11 +591,32 @@ So:
|
|
|
578
591
|
There are probably more elegant ways to solve this, but I only
|
|
579
592
|
wanted to solve this quickly and move on.
|
|
580
593
|
|
|
581
|
-
|
|
594
|
+
To add content to an editable combobox youc an use:
|
|
595
|
+
|
|
596
|
+
LibUI.append() # .append() adds the named item to the end of the EditableCombobox.
|
|
597
|
+
|
|
598
|
+
A more concise example for populating a combobox may be
|
|
599
|
+
this one here:
|
|
600
|
+
|
|
601
|
+
combo_box = LibUI.combobox {
|
|
602
|
+
['combobox Item 1', 'combobox Item 2', 'combobox Item 3']
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
The <b>source code</b> to the combo-box in libui, at the least
|
|
582
606
|
for UNIX/Linux, can be seen here:
|
|
583
607
|
|
|
584
608
|
https://github.com/andlabs/libui/blob/master/unix/combobox.c
|
|
585
609
|
|
|
610
|
+
## How to add a libui-widget to the main window - how to designate a child widget:
|
|
611
|
+
|
|
612
|
+
LibUI.window_set_child(main_window, button) # Both these widgets have to be created first, of course.
|
|
613
|
+
|
|
614
|
+
## LibUI.control_show
|
|
615
|
+
|
|
616
|
+
No clue what this does so far.
|
|
617
|
+
|
|
618
|
+
LibUI.control_show(main_window)
|
|
619
|
+
|
|
586
620
|
## Error messages and ui_error_message
|
|
587
621
|
|
|
588
622
|
In LibUI respectively ruby-libui you can display error messages
|
|
@@ -606,22 +640,37 @@ respectively.
|
|
|
606
640
|
**Form** is a container that takes labels for its contents. This is currently
|
|
607
641
|
just a stub though - we may have to research this with better examples.
|
|
608
642
|
|
|
609
|
-
## Libui
|
|
643
|
+
## Checkboxes in Libui-ng
|
|
610
644
|
|
|
611
|
-
A simple checkbox example in
|
|
645
|
+
A simple checkbox example in <b>plain</b> ruby-libui follows:
|
|
612
646
|
|
|
613
|
-
checkbox =
|
|
614
|
-
checkbox_toggle_callback = proc { |
|
|
615
|
-
checked =
|
|
616
|
-
|
|
647
|
+
checkbox = LibUI.checkbox('Checkbox')
|
|
648
|
+
checkbox_toggle_callback = proc { |pointer|
|
|
649
|
+
checked = LibUI.checkbox_checked(pointer) == 1
|
|
650
|
+
LibUI.checkbox_set_text(ptr, "I am the checkbox (#{checked})")
|
|
617
651
|
}
|
|
618
652
|
|
|
653
|
+
Or:
|
|
654
|
+
|
|
655
|
+
checkbox = LibUI.new_checkbox('Checkbox')
|
|
656
|
+
# ui_checkbox can be used if you use the libui_paradise gem.
|
|
657
|
+
|
|
619
658
|
This may look like so on Linux:
|
|
620
659
|
|
|
621
660
|
<img src="https://i.imgur.com/d7qWalZ.png" style="margin-left: 2em; padding: 4px; border: 1px solid black;">
|
|
622
661
|
|
|
623
|
-
To
|
|
624
|
-
following
|
|
662
|
+
To set such a checkbox to the <b>checked-state</b> (that is, as if
|
|
663
|
+
the user clicked on it), use the following method, if you use the
|
|
664
|
+
libui_paradise gem:
|
|
665
|
+
|
|
666
|
+
checkbox.set_checked(1)
|
|
667
|
+
|
|
668
|
+
To query its state use:
|
|
669
|
+
|
|
670
|
+
checked = LibUI.checkbox_checked(pointer) == 1
|
|
671
|
+
|
|
672
|
+
To <b>query</b> whether a checkbox is <b>active</b>, use code such as
|
|
673
|
+
the following:
|
|
625
674
|
|
|
626
675
|
checkbox.is_active?
|
|
627
676
|
checkbox.active?
|
|
@@ -630,22 +679,35 @@ This depends on the modifications to Fiddler::Pointer, so
|
|
|
630
679
|
be wary when you use this - there be dragons (perhaps). Most
|
|
631
680
|
of these modifications are based on **.object_id**, which is
|
|
632
681
|
registered in a main, toplevel Hash in the
|
|
633
|
-
|
|
682
|
+
<b>libui_paradise project</b>. Not very elegant, but simple, and
|
|
634
683
|
it works (for the most part).
|
|
635
684
|
|
|
685
|
+
The toggle-event for a checkbox can be triggered via:
|
|
686
|
+
|
|
687
|
+
checkbox_toggle_callback = proc { |pointer|
|
|
688
|
+
checked = LibLibUI.checkbox_checked(pointer) == 1
|
|
689
|
+
LibUI.window_set_title(MAIN_WINDOW, "Checkbox is #{checked}")
|
|
690
|
+
LibUI.checkbox_set_text(pointer, "I am the checkbox (#{checked})")
|
|
691
|
+
0
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
To respond to <b>on-toggled events</b>, do use:
|
|
695
|
+
|
|
696
|
+
LibUI.checkbox_on_toggled(checkbox, checkbox_toggle_callback, nil)
|
|
697
|
+
|
|
636
698
|
## Adding a widget into another widget
|
|
637
699
|
|
|
638
|
-
I chose the following
|
|
700
|
+
I chose the following <b>API</b> for this:
|
|
639
701
|
|
|
640
702
|
box1.add(box2, 1)
|
|
641
703
|
|
|
642
|
-
Note that this is "cheating" a bit because the method
|
|
643
|
-
on
|
|
644
|
-
also seems to work to some extent. Which is amazing ... :-)
|
|
704
|
+
Note that this is "cheating" a bit because the method <b>.add()</b> is
|
|
705
|
+
defined on <b>Fiddle::Pointer</b>. That's scary! Segfaults coming your
|
|
706
|
+
way. But it also seems to work to some extent. Which is amazing ... :-)
|
|
645
707
|
|
|
646
708
|
In ruby-gtk it is quite common to use **.add()**. While **.pack_start()**
|
|
647
709
|
and **.pack_end()** are available in ruby-gtk as well, I think .add() is
|
|
648
|
-
the simpler name. We just
|
|
710
|
+
the simpler name. We just <b>add a widget to another widget</b> - job done.
|
|
649
711
|
|
|
650
712
|
(I may also use << as alias to .add() and while << is great, remember
|
|
651
713
|
that it can not easily be used all the time, e. g. box1 << box2 <<
|
|
@@ -686,6 +748,20 @@ The notebook-tab may look like this:
|
|
|
686
748
|
|
|
687
749
|
<img src="https://i.imgur.com/olWQAIJ.png" style="margin-left: 2em">
|
|
688
750
|
|
|
751
|
+
A new tab can be created via:
|
|
752
|
+
|
|
753
|
+
tab = LibUI.new_tab
|
|
754
|
+
|
|
755
|
+
To populate the notebook-tab you can use .tab_append() such as
|
|
756
|
+
shown next:
|
|
757
|
+
|
|
758
|
+
hbox1 = LibUI.new_horizontal_box
|
|
759
|
+
hbox2 = LibUI.new_horizontal_box
|
|
760
|
+
LibUI.tab_append(tab, 'Page 1', hbox1)
|
|
761
|
+
LibUI.tab_append(tab, 'Page 2', hbox2)
|
|
762
|
+
LibUI.tab_append(tab, 'Page 3', UI.new_horizontal_box)
|
|
763
|
+
LibUI.box_append(inner2, tab, 1)
|
|
764
|
+
|
|
689
765
|
## Create a vertical box:
|
|
690
766
|
|
|
691
767
|
Use code like this:
|
|
@@ -699,8 +775,8 @@ If you use the libui_paradise gem, you can use this:
|
|
|
699
775
|
|
|
700
776
|
## Adding a horizontal separator or a vertical separator
|
|
701
777
|
|
|
702
|
-
The method
|
|
703
|
-
first create) a horizontal separator
|
|
778
|
+
The method <b>LibUI.new_horizontal_separator</b> can be used to add (or
|
|
779
|
+
rather first create) <b>a horizontal separator</b>.
|
|
704
780
|
|
|
705
781
|
You can then add it via .add() or << if you use the libui_paradise
|
|
706
782
|
project. Alternatively you can use the toplevel method provided by
|
|
@@ -749,6 +825,10 @@ not necessarily recommending this be done, but **if** you ever have
|
|
|
749
825
|
such a use case then you can use it - which is another reason why
|
|
750
826
|
I added this screenshot, so that I don't forget. :)
|
|
751
827
|
|
|
828
|
+
The toplevel method <b>LibuiParadise.horizontal_separator()</b>
|
|
829
|
+
has also been added; it is simply a wrapper towards
|
|
830
|
+
<b>LibUI.new_horizontal_separator()</b>.
|
|
831
|
+
|
|
752
832
|
## Padding elements in LibUI
|
|
753
833
|
|
|
754
834
|
The general API for setting padding to a container in LibUI
|
|
@@ -832,18 +912,38 @@ hand. Only the raw filename will be used, so if you
|
|
|
832
912
|
have a file at **/tmp/foo/bar.rb** then the title
|
|
833
913
|
of the window will be **bar.rb**.
|
|
834
914
|
|
|
835
|
-
##
|
|
915
|
+
## Entries in libui (libui-entry)
|
|
836
916
|
|
|
837
|
-
|
|
917
|
+
Let's first show how an <b>entry</b> in libui may look like:
|
|
838
918
|
|
|
839
919
|
<img src="https://raw.githubusercontent.com/parro-it/libui-node/master/docs/media/UiEntry.png" style="margin-left:1em">
|
|
840
920
|
|
|
841
|
-
Such an entry can be set to be
|
|
921
|
+
Such an entry can be set to be <b>read only</b> (readOnly: Boolean, aka true or false).
|
|
922
|
+
This means that it can not be changed by the user; it is then only used to
|
|
923
|
+
display some content.
|
|
842
924
|
|
|
843
|
-
The upstream C code for libui-entry, for
|
|
925
|
+
The upstream C code for libui-entry, for <b>unix/</b>, can be seen here:
|
|
844
926
|
|
|
845
927
|
https://github.com/andlabs/libui/blob/master/unix/entry.c
|
|
846
928
|
|
|
929
|
+
To create a new libui-entry, in raw libui-code, use this method:
|
|
930
|
+
|
|
931
|
+
LibUI.new_entry
|
|
932
|
+
entry = LibUI.new_entry # or better, this variant
|
|
933
|
+
|
|
934
|
+
In ruby, for the LibUI namespace, you can set text on an entry
|
|
935
|
+
by calling <b>LibUI.entry_set_text()</b>, such as shown in
|
|
936
|
+
the following example:
|
|
937
|
+
|
|
938
|
+
LibUI.entry_set_text(entry, 'Please enter your feelings')
|
|
939
|
+
|
|
940
|
+
If you use the libui_paradise gem, a modification in Fiddle
|
|
941
|
+
is to allow the method calls called .is_read_only and its
|
|
942
|
+
alias name, .readonly. This can be called on the entry,
|
|
943
|
+
such as:
|
|
944
|
+
|
|
945
|
+
entry.readonly
|
|
946
|
+
|
|
847
947
|
## Borderless windows and fullscreen windows
|
|
848
948
|
|
|
849
949
|
A window that is **borderless: true** will not show any title or
|
|
@@ -853,18 +953,26 @@ To set the main window to full screen (occupy the whole monitor) do:
|
|
|
853
953
|
|
|
854
954
|
LibUI.window_set_fullscreen(main_window, 1)
|
|
855
955
|
|
|
956
|
+
## How to add a new main window:
|
|
957
|
+
# width, height, hasMenubar
|
|
958
|
+
main_window = LibUI.new_window('hello world', 300, 200, 1)
|
|
959
|
+
|
|
960
|
+
The source code for this method can be seen here:
|
|
961
|
+
|
|
962
|
+
https://raw.githubusercontent.com/libui-ng/libui-ng/master/unix/window.c
|
|
963
|
+
|
|
856
964
|
## Spinbutton / Spinbox
|
|
857
965
|
|
|
858
966
|
You can use the following API for a spinbox:
|
|
859
967
|
|
|
860
|
-
|
|
968
|
+
LibUI.new_spinbox
|
|
861
969
|
|
|
862
970
|
To create a new spinbox.
|
|
863
971
|
|
|
864
972
|
To specify the **min** and **max** range, pass them as parameters
|
|
865
973
|
on creation-time:
|
|
866
974
|
|
|
867
|
-
|
|
975
|
+
LibUI.new_spinbox(0, 100)
|
|
868
976
|
|
|
869
977
|
If you use the extensions found in the libui_paradise gem then
|
|
870
978
|
you can do this instead:
|
|
@@ -884,9 +992,9 @@ to see how this works.
|
|
|
884
992
|
|
|
885
993
|
Relevant methods in regard to the spinbox in libui are as follows:
|
|
886
994
|
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
995
|
+
LibUI.spinbox_on_changed()
|
|
996
|
+
LibUI.spinbox_set_value()
|
|
997
|
+
LibUI.spinbox_value()
|
|
890
998
|
|
|
891
999
|
To **set** a value use either of the following two methods:
|
|
892
1000
|
|
|
@@ -903,31 +1011,34 @@ A text-view widget shows content, such as the content of a local file.
|
|
|
903
1011
|
|
|
904
1012
|
In libui the general API for this is:
|
|
905
1013
|
|
|
906
|
-
|
|
1014
|
+
LibUI.new_multiline_entry # this is a textview
|
|
907
1015
|
|
|
908
1016
|
## Control Gallery
|
|
909
1017
|
|
|
910
|
-
Here is an image, from kotlin-libui
|
|
1018
|
+
Here is an image, from <b>kotlin-libui</b>, how this may look on windows:
|
|
911
1019
|
|
|
912
1020
|
<img src="https://raw.githubusercontent.com/msink/kotlin-libui/master/samples/controlgallery/controlgallery-windows7.png" style="margin-left: 2em">
|
|
913
1021
|
|
|
914
|
-
## LibUI.new_button() - how to work with buttons in LibUI
|
|
1022
|
+
## LibUI.new_button() - how to work with buttons in LibUI in general
|
|
915
1023
|
|
|
916
|
-
<b>LibUI.new_button</b> allows us to create a new button
|
|
1024
|
+
<b>LibUI.new_button</b> allows us to create a new button, via
|
|
1025
|
+
the LibUI gem maintained by kojix2.
|
|
917
1026
|
|
|
918
|
-
Examples:
|
|
1027
|
+
Examples for this, syntax-wise, follow:
|
|
919
1028
|
|
|
920
1029
|
button1 = LibUI.new_button('Text')
|
|
921
1030
|
button2 = LibUI.new_button('▶')
|
|
1031
|
+
button3 = LibUI.new_button('■') # You can use Unicode / Emojis here just fine.
|
|
1032
|
+
button3 = LibUI.new_button('♥') # This also gives you a way to do simple GUI elements, thanks to Unicode / Emoji.
|
|
922
1033
|
|
|
923
|
-
Now, we need to "tell" this button what to do when it is
|
|
924
|
-
|
|
1034
|
+
Now, we need to "<i>tell</i>" this button what to do when it is clicked
|
|
1035
|
+
by the user. This is done via the method <b>LibUI.button_on_clicked()</b>.
|
|
925
1036
|
|
|
926
|
-
|
|
1037
|
+
Usage example:
|
|
927
1038
|
|
|
928
|
-
LibUI.button_on_clicked(button)
|
|
929
|
-
LibUI.msg_box(MAIN_WINDOW, 'Information', 'You clicked the button')
|
|
930
|
-
|
|
1039
|
+
LibUI.button_on_clicked(button) {
|
|
1040
|
+
LibUI.msg_box(MAIN_WINDOW, 'Information', 'You clicked the button') # Show a message-box upon clicking this button.
|
|
1041
|
+
}
|
|
931
1042
|
|
|
932
1043
|
## Enabling / Disabling buttons in libui
|
|
933
1044
|
|
|
@@ -1073,115 +1184,6 @@ to be simpler for the time being. I may plan to change a lot more one day,
|
|
|
1073
1184
|
if I ever manage to find out how to simulate proper subclasses via
|
|
1074
1185
|
Fiddle::Pointer ... :)
|
|
1075
1186
|
|
|
1076
|
-
--------------------------------------------------------------------------------
|
|
1077
|
-
## SNIPPETS.md
|
|
1078
|
-
|
|
1079
|
-
Next, the content of the file called **SNIPPETS.md** will be shown. Note
|
|
1080
|
-
that this file will eventually be integreated into this file, and then
|
|
1081
|
-
subsequently removed one day.
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
<pre>
|
|
1085
|
-
# How to add a new main window:
|
|
1086
|
-
# width, height, hasMenubar
|
|
1087
|
-
main_window = UI.new_window('hello world', 300, 200, 1)
|
|
1088
|
-
|
|
1089
|
-
Source code:
|
|
1090
|
-
|
|
1091
|
-
https://raw.githubusercontent.com/andlabs/libui/master/unix/window.c
|
|
1092
|
-
|
|
1093
|
-
# How to add a libui-widget to the main window / Designate a child widget:
|
|
1094
|
-
|
|
1095
|
-
UI.window_set_child(main_window, button)
|
|
1096
|
-
|
|
1097
|
-
# Act on closing-event (on quit tag):
|
|
1098
|
-
|
|
1099
|
-
UI.window_on_closing(main_window) {
|
|
1100
|
-
puts 'Bye Bye'
|
|
1101
|
-
UI.control_destroy(main_window)
|
|
1102
|
-
UI.quit
|
|
1103
|
-
0
|
|
1104
|
-
}
|
|
1105
|
-
# Or simpler:
|
|
1106
|
-
close_properly(main_window)
|
|
1107
|
-
|
|
1108
|
-
# Add the window to the main UI:
|
|
1109
|
-
|
|
1110
|
-
UI.control_show(main_window)
|
|
1111
|
-
main_window.show_the_controls # Or use this one here.
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
# Add a checkbox (checkbox tag, checkbutton)
|
|
1115
|
-
|
|
1116
|
-
checkbox = UI.new_checkbox('Checkbox') # or ui_checkbox
|
|
1117
|
-
checkbox_toggle_callback = proc { |pointer|
|
|
1118
|
-
checked = UI.checkbox_checked(pointer) == 1
|
|
1119
|
-
UI.window_set_title(MAIN_WINDOW, "Checkbox is #{checked}")
|
|
1120
|
-
UI.checkbox_set_text(pointer, "I am the checkbox (#{checked})")
|
|
1121
|
-
0
|
|
1122
|
-
}
|
|
1123
|
-
UI.checkbox_on_toggled(checkbox, checkbox_toggle_callback, nil)
|
|
1124
|
-
UI.box_append(inner, checkbox, 0)
|
|
1125
|
-
|
|
1126
|
-
To set it checked:
|
|
1127
|
-
|
|
1128
|
-
checkbox.set_checked(1)
|
|
1129
|
-
|
|
1130
|
-
To query its state:
|
|
1131
|
-
|
|
1132
|
-
checked = UI.checkbox_checked(pointer) == 1
|
|
1133
|
-
|
|
1134
|
-
# And the control:
|
|
1135
|
-
|
|
1136
|
-
UI.control_show(main_window)
|
|
1137
|
-
|
|
1138
|
-
# Using a text-entry (ui entry tag):
|
|
1139
|
-
|
|
1140
|
-
text_entry = UI.new_entry
|
|
1141
|
-
UI.entry_set_text(text_entry, 'Please enter your feelings')
|
|
1142
|
-
UI.entry_on_changed(text_entry, text_changed_callback, nil)
|
|
1143
|
-
|
|
1144
|
-
# To set this on a "multiline entry", aka spanning several
|
|
1145
|
-
# rows, do use:
|
|
1146
|
-
UI.multiline_entry_set_text(entry1, 'Yo there')
|
|
1147
|
-
ui_text_view # an alias used in libui_paradise
|
|
1148
|
-
|
|
1149
|
-
text1 = UI.entry_text(entry1) # Obtain text. You may have to call .to_s on it, to guarantee the String.
|
|
1150
|
-
UI.multiline_entry_text # Obtain the text from a multiline entry.
|
|
1151
|
-
|
|
1152
|
-
# Create a combobox (combo tag, combobox tag):
|
|
1153
|
-
|
|
1154
|
-
combobox_selected_callback = proc { |ptr|
|
|
1155
|
-
puts "New combobox selection: #{UI.combobox_selected(ptr)}"
|
|
1156
|
-
}
|
|
1157
|
-
cbox = UI.new_combobox
|
|
1158
|
-
UI.combobox_append(cbox, 'combobox Item 1')
|
|
1159
|
-
UI.combobox_append(cbox, 'combobox Item 2')
|
|
1160
|
-
UI.combobox_append(cbox, 'combobox Item 3')
|
|
1161
|
-
UI.box_append(inner, cbox, 0)
|
|
1162
|
-
UI.combobox_on_selected(cbox, combobox_selected_callback, nil)
|
|
1163
|
-
|
|
1164
|
-
# Or more concise:
|
|
1165
|
-
combo_box = UI.combobox {
|
|
1166
|
-
['combobox Item 1', 'combobox Item 2', 'combobox Item 3']
|
|
1167
|
-
}
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
# Add content to an editable combox:
|
|
1171
|
-
|
|
1172
|
-
UI.append() # .append() adds the named item to the end of the EditableCombobox.
|
|
1173
|
-
|
|
1174
|
-
# How to build a menu-interface (menu tag):
|
|
1175
|
-
|
|
1176
|
-
help_menu = UI.new_menu('Help')
|
|
1177
|
-
version_item = UI.menu_append_item(help_menu, 'Version')
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
</pre>
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
--------------------------------------------------------------------------------
|
|
1184
|
-
|
|
1185
1187
|
## Advantages and Disadvantages of the libui project
|
|
1186
1188
|
|
|
1187
1189
|
It would be unfair to only selectively name advantages but not talk about
|
|
@@ -1189,29 +1191,31 @@ disadvantages, so this subsection will show some limitations, trade-offs,
|
|
|
1189
1191
|
constraints and opportunities. This is not complete, but it may become
|
|
1190
1192
|
somewhat more complete over time. Stay tuned.
|
|
1191
1193
|
|
|
1192
|
-
(a) Advantages:
|
|
1194
|
+
(a) Advantages of LibUI:
|
|
1193
1195
|
|
|
1194
|
-
- Works on windows out-of-the-box after
|
|
1196
|
+
- Works on the windows platform, out-of-the-box, after the libui-gem has been installed.
|
|
1195
1197
|
- Is super-simple to use compared to other toolkits, including ruby-gtk.
|
|
1196
|
-
- Super-simple to build up a prototype for a GUI, buttons that work,
|
|
1197
|
-
|
|
1198
|
-
IMO.
|
|
1198
|
+
- Super-simple to build up a prototype for a GUI, buttons that work, spin-boxes, text-views
|
|
1199
|
+
and so forth. Faster than any other toolkit, IMO.
|
|
1199
1200
|
- Works cross-platform.
|
|
1200
1201
|
|
|
1201
|
-
(b) Disadvantage:
|
|
1202
|
+
(b) Disadvantage of LibUI:
|
|
1202
1203
|
|
|
1203
1204
|
- Limited ability to control the layout and size of widgets.
|
|
1204
|
-
- May look like utter crap ... :-)
|
|
1205
|
-
- Some functionality is missing, such as a scrolled-window for every widget
|
|
1205
|
+
- May look like utter crap on some platforms ... :-)
|
|
1206
|
+
- Some functionality is flat-out missing, such as a scrolled-window for every widget
|
|
1207
|
+
or tooltips for every widget.
|
|
1206
1208
|
- No way to use different fonts in the same application and choosing a font
|
|
1207
1209
|
is needlessly complicated. (This may not be completely correct, though -
|
|
1208
|
-
the glimmer-dsl-libui has
|
|
1210
|
+
the glimmer-dsl-libui has examples that seem to work. But if you ask me
|
|
1209
1211
|
right now in 2021 how this works via a standalone example then I can
|
|
1210
1212
|
happily tell you I have absolutely no idea. Which brings me to the
|
|
1211
|
-
next problem...)
|
|
1212
|
-
- Lack of documentation. This part is REALLY annoying
|
|
1213
|
+
next problem ...)
|
|
1214
|
+
- Lack of documentation overall. This part is REALLY annoying, because there
|
|
1215
|
+
are only few users, so asking others about documentation when there is nobody
|
|
1216
|
+
else using it, plan sucks ...
|
|
1213
1217
|
|
|
1214
|
-
Some more disadvantages relate to Fiddle::Pointer
|
|
1218
|
+
Some more disadvantages relate to <b>Fiddle::Pointer</b>. You kind of need to
|
|
1215
1219
|
know C fairly well as well as the GC in ruby, in order to understand
|
|
1216
1220
|
what is going on. Since I don't, I hit a dead end, kind of.
|
|
1217
1221
|
|
|
@@ -1219,6 +1223,10 @@ This is so far in September 2021. Let's see what the future brings.
|
|
|
1219
1223
|
Perhaps other toolkits will learn from libui and implement the good
|
|
1220
1224
|
parts for **their own** widget set.
|
|
1221
1225
|
|
|
1226
|
+
Update in December 2023: things improved a bit, so the above is not
|
|
1227
|
+
100% correct anymore. In particular libui-ng may receive some more
|
|
1228
|
+
usability-centric updates in the next months.
|
|
1229
|
+
|
|
1222
1230
|
## LibuiParadise.parse_this_config_file()
|
|
1223
1231
|
|
|
1224
1232
|
This method can be used to parse a .config file. This file should
|
|
@@ -1268,17 +1276,21 @@ You can also use something like '95%' as input. In that case the
|
|
|
1268
1276
|
desired value will be calculated depending on the max-resolution
|
|
1269
1277
|
of the current display. This presently only works on **linux**; if
|
|
1270
1278
|
someone knows how to make this work on windows and Mac OSX let
|
|
1271
|
-
me know. (On these systems
|
|
1272
|
-
value of 1024 for width and 800 for height
|
|
1279
|
+
me know. (On these two systems the method will instead default
|
|
1280
|
+
to a hardcoded value of 1024 for width and 800 for height; these
|
|
1281
|
+
values, I think, are probably fairly safe, to also support older
|
|
1282
|
+
laptops. Evidently for smartphone devices this won't work, so
|
|
1283
|
+
if anyone has an idea how to handle this differently let me
|
|
1284
|
+
know).
|
|
1273
1285
|
|
|
1274
1286
|
The following example shows how to use a percentage value:
|
|
1275
1287
|
|
|
1276
|
-
set_height('80%')
|
|
1288
|
+
set_height('80%') # 80% of the max-height.
|
|
1277
1289
|
|
|
1278
1290
|
## Coloured Text
|
|
1279
1291
|
|
|
1280
1292
|
At this point I only show how this may look on Win7, re-using
|
|
1281
|
-
the picture the
|
|
1293
|
+
the picture the <b>kotlin-libui developers</b> made available:
|
|
1282
1294
|
|
|
1283
1295
|
<img src="https://raw.githubusercontent.com/msink/kotlin-libui/master/samples/drawtext/drawtext-windows7.png" style="margin-left: 2em">
|
|
1284
1296
|
|
|
@@ -1390,9 +1402,9 @@ shows how this may look (on icewm):
|
|
|
1390
1402
|
The syntax goes something like this:
|
|
1391
1403
|
|
|
1392
1404
|
rb = ui_radio_buttons
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1405
|
+
LibUI.radio_buttons_append(rb, 'Radio Button 1')
|
|
1406
|
+
LibUI.radio_buttons_append(rb, 'Radio Button 2')
|
|
1407
|
+
LibUI.radio_buttons_append(rb, 'Radio Button 3')
|
|
1396
1408
|
outer_vbox.minimal(rb) # add the radio-button control to the box.
|
|
1397
1409
|
|
|
1398
1410
|
In other words: you instantiate a new rb-radio-button 'pointer';
|
|
@@ -1427,26 +1439,67 @@ For "raw" libui, use this:
|
|
|
1427
1439
|
|
|
1428
1440
|
## Tables in LibUI
|
|
1429
1441
|
|
|
1430
|
-
|
|
1442
|
+
The API for creating a new table in <b>LibUI</b> is this:
|
|
1431
1443
|
|
|
1432
1444
|
table = LibUI.new_table
|
|
1433
|
-
|
|
1434
|
-
|
|
1445
|
+
table = LibUI.new_table(table_model)
|
|
1446
|
+
|
|
1447
|
+
You need to use a model for the table, and pass it as
|
|
1448
|
+
its first argument. The next line of code shows how
|
|
1449
|
+
this is done:
|
|
1450
|
+
|
|
1451
|
+
model = LibUI.new_table_model(model_handler) # create the model here
|
|
1452
|
+
|
|
1453
|
+
Next you have to prevent segfaults by .malloc-ating the
|
|
1454
|
+
table params. This can be done in the following manner:
|
|
1435
1455
|
|
|
1436
1456
|
table_params = LibUI::FFI::TableParams.malloc
|
|
1437
1457
|
table_params = Fiddle::RUBY_FREE
|
|
1438
1458
|
table_params.Model = model
|
|
1439
1459
|
table_params.RowBackgroundColorModelColumn = -1
|
|
1440
|
-
table = LibUI.new_table(table_params)
|
|
1460
|
+
table = LibUI.new_table(table_params) # And pass it here.
|
|
1441
1461
|
|
|
1442
|
-
The table header is an array that contains the following attributes:
|
|
1462
|
+
The <b>table header</b> is an array that contains the following attributes:
|
|
1443
1463
|
|
|
1444
|
-
1. editable, bool type
|
|
1464
|
+
1. editable, bool type: determines whether column is editable
|
|
1445
1465
|
2. textColor
|
|
1446
1466
|
3. title
|
|
1447
1467
|
4. type, specify value of button, image, imgtext, progress, checkbox, checkboxtext, color, text
|
|
1448
1468
|
|
|
1449
|
-
|
|
1469
|
+
See the example distributed in this gem, in the file at
|
|
1470
|
+
<b>examples/simple/012_table_example.rb</b>.
|
|
1471
|
+
|
|
1472
|
+
This will yield the following result - at the least on Linux and IceWM:
|
|
1473
|
+
|
|
1474
|
+
<img src="https://i.imgur.com/Y7m58DH.png" style="margin: 1em">
|
|
1475
|
+
|
|
1476
|
+
You can append a new text column via:
|
|
1477
|
+
|
|
1478
|
+
::LibUI.table_append_text_column(table, 'Header goes in here', 0, -1)
|
|
1479
|
+
|
|
1480
|
+
As this is a bit cumbersome to type, libui_paradise simplifies this
|
|
1481
|
+
a tiny bit into:
|
|
1482
|
+
|
|
1483
|
+
table.append_text_column('Header goes in here', 0, -1)
|
|
1484
|
+
|
|
1485
|
+
Be careful to <b>only</b> append entries there if the underlying
|
|
1486
|
+
dataset - our Array - also contains these entries; otherwise the
|
|
1487
|
+
application would segfault. The example at
|
|
1488
|
+
<b>examples/complex/010_table_example.rb</b> shows this - look
|
|
1489
|
+
at the commented out example to test it.
|
|
1490
|
+
|
|
1491
|
+
In November 2023 the API was a bit simplified, towards this:
|
|
1492
|
+
|
|
1493
|
+
table.append_text_column('Header goes in here', 0)
|
|
1494
|
+
table.append_text_column('Another header goes in here', 1)
|
|
1495
|
+
table.append_text_column('And this is yet another header', 2)
|
|
1496
|
+
|
|
1497
|
+
So you can now omit the last -1 part. Expect more simplifications
|
|
1498
|
+
in the future - all that malloc stuff should be handled by
|
|
1499
|
+
libui_paradise, rather than in the downstream application
|
|
1500
|
+
code.
|
|
1501
|
+
|
|
1502
|
+
Note that this section is incomplete; it's a bit complicated.
|
|
1450
1503
|
|
|
1451
1504
|
In the end, this is possible though:
|
|
1452
1505
|
|
|
@@ -1525,7 +1578,7 @@ Available "**new**"-widgets in LibUI:
|
|
|
1525
1578
|
LibUI.new_table_value_color
|
|
1526
1579
|
LibUI.new_table_value_string
|
|
1527
1580
|
LibUI.new_time_picker
|
|
1528
|
-
LibUI.new_menu
|
|
1581
|
+
LibUI.new_menu # this is a menu, appearing on the upper area
|
|
1529
1582
|
LibUI.new_multiline_entry # this is a textview
|
|
1530
1583
|
LibUI.new_non_wrapping_multiline_entry
|
|
1531
1584
|
LibUI.new_open_type_features
|
|
@@ -1544,8 +1597,8 @@ Available "**new**"-widgets in LibUI:
|
|
|
1544
1597
|
LibUI.new_weight_attribute
|
|
1545
1598
|
LibUI.new_form # this is a form
|
|
1546
1599
|
LibUI.new_size_attribute
|
|
1547
|
-
LibUI.new_window
|
|
1548
|
-
LibUI.new_slider # this is a slider
|
|
1600
|
+
LibUI.new_window # this will create a new window, such as a gtk-window on linux
|
|
1601
|
+
LibUI.new_slider # this is a slider, allowing the user to set a value via a small GUI-handle
|
|
1549
1602
|
|
|
1550
1603
|
## A search entry in LibUI
|
|
1551
1604
|
|
|
@@ -1572,9 +1625,23 @@ Example for this:
|
|
|
1572
1625
|
width = canvas.width
|
|
1573
1626
|
height = canvas.height
|
|
1574
1627
|
|
|
1575
|
-
##
|
|
1628
|
+
## How to to build a menu-interface (menu tag):
|
|
1629
|
+
|
|
1630
|
+
Building a menu in libui is possible by using the method
|
|
1631
|
+
<b>LibUI.new_menu()</b>.
|
|
1632
|
+
|
|
1633
|
+
A more complete example follows:
|
|
1634
|
+
|
|
1635
|
+
help_menu = LibUI.new_menu('Help')
|
|
1636
|
+
version_item = LibUI.menu_append_item(help_menu, 'Version')
|
|
1576
1637
|
|
|
1577
|
-
|
|
1638
|
+
On IceWM this may look like this:
|
|
1639
|
+
|
|
1640
|
+
<img src="https://i.imgur.com/1rWYcZM.png" style="margin: 1em">
|
|
1641
|
+
|
|
1642
|
+
## Creating a new drawing area in LibUI
|
|
1643
|
+
|
|
1644
|
+
The following code should suffice:
|
|
1578
1645
|
|
|
1579
1646
|
handler = LibUI::FFI::AreaHandler.malloc
|
|
1580
1647
|
handler.to_ptr.free = Fiddle::RUBY_FREE
|
|
@@ -1582,12 +1649,19 @@ This should suffice:
|
|
|
1582
1649
|
|
|
1583
1650
|
## Horizontal boxes
|
|
1584
1651
|
|
|
1585
|
-
A HBox represents a horizontal box
|
|
1586
|
-
|
|
1587
|
-
|
|
1652
|
+
A <b>HBox</b> represents a <b>horizontal box</b>.
|
|
1653
|
+
|
|
1654
|
+
In pure ruby-libui a new horizontal box (hbox) can be created via:
|
|
1655
|
+
|
|
1656
|
+
hbox = LibUI.new_horizontal_box
|
|
1657
|
+
|
|
1658
|
+
The API for putting something into a hbox goes as follows, such as
|
|
1659
|
+
when you wish to put a text-entry into the hbox:
|
|
1588
1660
|
|
|
1589
1661
|
LibUI.box_append(hbox1, text_entry, 1)
|
|
1590
1662
|
|
|
1663
|
+
If you use libui_paradise then you can also use << instead.
|
|
1664
|
+
|
|
1591
1665
|
## The slider widget
|
|
1592
1666
|
|
|
1593
1667
|
If you use the LibuiParadise gem then you can create and use a new slider
|
|
@@ -1600,12 +1674,25 @@ like this:
|
|
|
1600
1674
|
puts "New Slider value: #{UI.slider_value(ptr)}"
|
|
1601
1675
|
0
|
|
1602
1676
|
}
|
|
1603
|
-
|
|
1677
|
+
LibUI.slider_on_changed(slider, slider_changed_callback) # last element is nil, but it seems we can omit it
|
|
1604
1678
|
|
|
1605
1679
|
This may look like so on Linux:
|
|
1606
1680
|
|
|
1607
1681
|
<img src="https://i.imgur.com/GVKPMS7.png" style="margin-left: 3em">
|
|
1608
1682
|
|
|
1683
|
+
In raw-libui you instantiate a new slider in this way:
|
|
1684
|
+
|
|
1685
|
+
slider = LibUI.new_slider(0, 10)
|
|
1686
|
+
|
|
1687
|
+
The two values here, 0 and 10, specify start and end position.
|
|
1688
|
+
|
|
1689
|
+
Note that you can also use the block-form rather than use
|
|
1690
|
+
a proc-callback. Example for this:
|
|
1691
|
+
|
|
1692
|
+
LibUI.slider_on_changed(slider1) {|widget|
|
|
1693
|
+
puts 'The value of the slider was changed.'
|
|
1694
|
+
}
|
|
1695
|
+
|
|
1609
1696
|
## Create a new tabbed notebook:
|
|
1610
1697
|
|
|
1611
1698
|
ui_tabs
|
|
@@ -1668,7 +1755,7 @@ For instance, the text-weight part accepts these values
|
|
|
1668
1755
|
maximum
|
|
1669
1756
|
# or any number between minimum and maximum
|
|
1670
1757
|
|
|
1671
|
-
To create an attributed String you can use the following API:
|
|
1758
|
+
To create an <b>attributed String</b> you can use the following API:
|
|
1672
1759
|
|
|
1673
1760
|
string = LibUI.new_attributed_string
|
|
1674
1761
|
attributes = LibUI.new_family_attribute("Courier New 30") # Specify a certain font.
|
|
@@ -1800,6 +1887,7 @@ may be helpful.
|
|
|
1800
1887
|
The API for creating a new grid in libui is quite complex and
|
|
1801
1888
|
hard to remember:
|
|
1802
1889
|
|
|
1890
|
+
# gtk-widget, left, top, xspan, yspan, hexpand, halign, vexpand, valign
|
|
1803
1891
|
LibUI.grid_append(grid, entry1, 0, 0, 2, 1, 0, 0, 1, 0)
|
|
1804
1892
|
LibUI.grid_append(grid, text('Yo2'), 1, 0, 1, 1, 0, 0, 1, 0) # text() can be used if you use the libui_paradise gem
|
|
1805
1893
|
|
|
@@ -1830,10 +1918,12 @@ The documentation for Go has this signature:
|
|
|
1830
1918
|
|
|
1831
1919
|
Append adds the given control to the Grid, at the given coordinate.
|
|
1832
1920
|
|
|
1833
|
-
|
|
1834
|
-
into the grid, so the numbers that follow afterwards are the ones
|
|
1835
|
-
that are important.
|
|
1836
|
-
|
|
1921
|
+
The element called <b>uiControl c</b> refers to the widget that is to be embedded
|
|
1922
|
+
into the grid-widget, so the numbers that follow afterwards are the ones
|
|
1923
|
+
that are important.
|
|
1924
|
+
|
|
1925
|
+
Let's have a look at these numbers, based on the above API call, and only
|
|
1926
|
+
list these again, without the <b>()</b> this time, to simplify reading:
|
|
1837
1927
|
|
|
1838
1928
|
# left, top, xspan, yspan, hexpand, halign, vexpand, valign
|
|
1839
1929
|
# 0, 0, 2, 1, 0, 0, 1, 0
|
|
@@ -1844,26 +1934,27 @@ expand horizontally or vertically. halign and valign, I think,
|
|
|
1844
1934
|
are used to align the grid-cell horizontally and vertically, so you
|
|
1845
1935
|
can position them exactly in the middle.
|
|
1846
1936
|
|
|
1847
|
-
Recently (August 2021) I discovered that you can actually
|
|
1848
|
-
a button-in-a-button. I don't know whether this is a bug or
|
|
1849
|
-
a feature, but it is hilarious.
|
|
1937
|
+
Recently (in <b>August 2021</b>) I discovered that you can actually
|
|
1938
|
+
put a button-in-a-button. I don't know whether this is a bug or
|
|
1939
|
+
a feature, but it is hilarious nonetheless.
|
|
1850
1940
|
|
|
1851
|
-
The 'raw' code I used for this was the following:
|
|
1941
|
+
The '<b>raw</b>' code I used for this was the following:
|
|
1852
1942
|
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1943
|
+
LibUI.grid_append(grid, UI.new_button('3'),0,1,1,1,1,1,1,1)
|
|
1944
|
+
LibUI.grid_append(grid, UI.new_button('4'),1,1,1,1,1,1,1,1)
|
|
1945
|
+
LibUI.grid_append(grid, UI.new_button('5'),0,1,1,1,1,0,1,0)
|
|
1946
|
+
LibUI.grid_append(grid, UI.new_button('6'),1,1,1,1,1,0,1,0)
|
|
1857
1947
|
|
|
1858
|
-
This led to the following
|
|
1948
|
+
This led to the following widget setup, as shown in this
|
|
1949
|
+
image:
|
|
1859
1950
|
|
|
1860
1951
|
<img src="https://i.imgur.com/6sWwWKh.png" style="margin-left: 1em">
|
|
1861
1952
|
|
|
1862
1953
|
The smaller buttons and the larger buttons can be clicked. They
|
|
1863
|
-
reside in the same grid-cell. I
|
|
1864
|
-
bug or a feature really, but this was quite hilarious to see.
|
|
1865
|
-
In the event that I may forget this, I'll keep this here as
|
|
1866
|
-
|
|
1954
|
+
reside in the same grid-cell. As stated I do not know whether this is
|
|
1955
|
+
a bug or a feature really, but this was quite hilarious to see.
|
|
1956
|
+
In the event that I may forget this, I'll keep this here as a
|
|
1957
|
+
<b>reference</b>.
|
|
1867
1958
|
|
|
1868
1959
|
If you want to pad the grid you can use the following method:
|
|
1869
1960
|
|
|
@@ -1901,12 +1992,13 @@ Usage example for the new API:
|
|
|
1901
1992
|
{ left: 2, top: 3, xspan: 3, yspan: 3, hexpand: 0, halign: 0, vexpand: 0, valign: 0 }
|
|
1902
1993
|
)
|
|
1903
1994
|
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1995
|
+
This again requires more argument, but on the plus side it allows you complete
|
|
1996
|
+
control over each positional argument.
|
|
1997
|
+
|
|
1998
|
+
In the closing days of <b>August 2022</b> I went on to improve the above. Three
|
|
1999
|
+
new methods were "added" to grid (actually Fiddle::Pointer, but hopefully one
|
|
2000
|
+
day I can find out how to work on a grid directly in libui; right now I seem
|
|
2001
|
+
to only have to work with raw pointers, which confuses me).
|
|
1910
2002
|
|
|
1911
2003
|
These three methods are:
|
|
1912
2004
|
|
|
@@ -1998,9 +2090,10 @@ An entry can be <b>set read only</b> via:
|
|
|
1998
2090
|
|
|
1999
2091
|
entry.read_only # This has not been added into libui-paradise yet.
|
|
2000
2092
|
|
|
2001
|
-
To <b>respond</b> to <b>on-changed events</b>, you can use
|
|
2093
|
+
To <b>respond</b> to <b>on-changed events</b>, you can use the following
|
|
2094
|
+
toplevel API:
|
|
2002
2095
|
|
|
2003
|
-
|
|
2096
|
+
LibUI.entry_on_changed()
|
|
2004
2097
|
|
|
2005
2098
|
A more complete example of this:
|
|
2006
2099
|
|
|
@@ -2029,8 +2122,43 @@ following simplified method call instead:
|
|
|
2029
2122
|
puts 'The text is now: '+entry.text?
|
|
2030
2123
|
}
|
|
2031
2124
|
|
|
2125
|
+
## Using a pop-up message box in plain libui:
|
|
2126
|
+
|
|
2127
|
+
LibUI.msg_box(MAIN_WINDOW, 'Information', 'You clicked the button')
|
|
2128
|
+
LibUI.msg_box(main_window,
|
|
2129
|
+
'Tiny Midi Player',
|
|
2130
|
+
"Written in Ruby\n" \
|
|
2131
|
+
"https://github.com/kojix2/libui\n Version #{VERSION}"
|
|
2132
|
+
)
|
|
2133
|
+
|
|
2134
|
+
## LibUI.attributed_string_len()
|
|
2135
|
+
|
|
2136
|
+
The method LibUI.attributed_string_len() will return an Integer value.
|
|
2137
|
+
|
|
2138
|
+
A usage example follows:
|
|
2139
|
+
|
|
2140
|
+
start_position = LibUI.attributed_string_len(self)
|
|
2141
|
+
|
|
2142
|
+
## How to create an .exe file on Windows via libui
|
|
2143
|
+
|
|
2144
|
+
First check: https://github.com/larsch/ocra/
|
|
2145
|
+
|
|
2146
|
+
In order to build an .exe file with Ocra, include 3 DLLs from ruby_builtin_dlls
|
|
2147
|
+
folder:
|
|
2148
|
+
|
|
2149
|
+
ocra examples/control_gallery.rb --dll ruby_builtin_dlls/libssp-0.dll --dll ruby_builtin_dlls/libgmp-10.dll --dll ruby_builtin_dlls/libffi-7.dll --gem-all=fiddle
|
|
2150
|
+
|
|
2151
|
+
Add additional options below if necessary.
|
|
2152
|
+
|
|
2153
|
+
--window
|
|
2154
|
+
--add-all-core
|
|
2155
|
+
--chdir-first
|
|
2156
|
+
--icon assets\app.ico
|
|
2157
|
+
--verbose
|
|
2158
|
+
--output out\gallery.exe
|
|
2159
|
+
|
|
2032
2160
|
|
|
2033
|
-
## Contact information and mandatory 2FA coming up in 2022
|
|
2161
|
+
## Contact information and mandatory 2FA (no longer) coming up in 2022 / 2023
|
|
2034
2162
|
|
|
2035
2163
|
If your creative mind has ideas and specific suggestions to make this gem
|
|
2036
2164
|
more useful in general, feel free to drop me an email at any time, via:
|
|
@@ -2038,35 +2166,53 @@ more useful in general, feel free to drop me an email at any time, via:
|
|
|
2038
2166
|
shevy@inbox.lt
|
|
2039
2167
|
|
|
2040
2168
|
Before that email I used an email account at Google gmail, but in **2021** I
|
|
2041
|
-
decided to slowly abandon gmail for various reasons. In order to limit
|
|
2169
|
+
decided to slowly abandon gmail, for various reasons. In order to limit the
|
|
2042
2170
|
explanation here, allow me to just briefly state that I do not feel as if I
|
|
2043
|
-
want to promote any Google service anymore
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2171
|
+
want to promote any Google service anymore when the user becomes the end
|
|
2172
|
+
product (such as via data collection by upstream services, including other
|
|
2173
|
+
proxy-services). My feeling is that this is a hugely flawed business model
|
|
2174
|
+
to begin with, and I no longer wish to support this in any way, even if
|
|
2175
|
+
only indirectly so, such as by using services of companies that try to
|
|
2176
|
+
promote this flawed model.
|
|
2177
|
+
|
|
2178
|
+
In regards to responding to emails: please keep in mind that responding
|
|
2179
|
+
may take some time, depending on the amount of work I may have at that
|
|
2180
|
+
moment. So it is not that emails are ignored; it is more that I have not
|
|
2181
|
+
(yet) found the time to read and reply. This means there may be a delay
|
|
2182
|
+
of days, weeks and in some instances also months. There is, unfortunately,
|
|
2183
|
+
not much I can do when I need to prioritise my time investment, but I try
|
|
2184
|
+
to consider <b>all</b> feedback as an opportunity to improve my projects
|
|
2185
|
+
nonetheless.
|
|
2186
|
+
|
|
2187
|
+
In <b>2022</b> rubygems.org decided to make 2FA mandatory for every
|
|
2188
|
+
gem owner eventually:
|
|
2189
|
+
|
|
2190
|
+
see
|
|
2191
|
+
https://blog.rubygems.org/2022/06/13/making-packages-more-secure.html
|
|
2192
|
+
|
|
2193
|
+
Mandatory 2FA will eventually be extended to all rubygems.org developers and
|
|
2194
|
+
maintainers. As I can not use 2FA, for reasons I will skip explaining here,
|
|
2195
|
+
this means that my projects will eventually be removed, as I no longer
|
|
2196
|
+
have any control over my projects hosted on rubygems.org (because I
|
|
2197
|
+
can not use 2FA).
|
|
2198
|
+
|
|
2199
|
+
At that point, I no longer have any control what is done to my projects
|
|
2200
|
+
since whoever is controlling the gems ecosystem took away our control
|
|
2201
|
+
here. I am not sure at which point ruby became corporate-controlled -
|
|
2202
|
+
that was not the case several years ago, so something has
|
|
2203
|
+
changed.
|
|
2204
|
+
|
|
2205
|
+
Ruby also only allows 2FA users to participate on the issue tracker these
|
|
2206
|
+
days:
|
|
2207
|
+
|
|
2208
|
+
https://bugs.ruby-lang.org/issues/18800
|
|
2209
|
+
|
|
2210
|
+
But this has been reverted some months ago, so it is no longer applicable.
|
|
2211
|
+
Suffice to say that I do not think that we should only be allowed to
|
|
2212
|
+
interact on the world wide web when some 'authority' authenticated us,
|
|
2213
|
+
such as via mandatory 2FA, so I hope this won't come back again.
|
|
2214
|
+
|
|
2215
|
+
Fighting spam is a noble goal, but when it also means you lock out
|
|
2216
|
+
real human people then this is definitely NOT a good situation
|
|
2217
|
+
to be had.
|
|
2072
2218
|
|