libui_paradise 0.3.9 → 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.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +176 -155
  3. data/bin/libui_message +1 -1
  4. data/doc/README.gen +175 -85
  5. data/doc/todo/todo.md +9 -5
  6. data/lib/libui_paradise/autoinclude.rb +2 -1
  7. data/lib/libui_paradise/base/base.rb +17 -67
  8. data/lib/libui_paradise/base_module/base_module.rb +1514 -0
  9. data/lib/libui_paradise/colours/colours.rb +4 -4
  10. data/lib/libui_paradise/domain_specific_language/README.md +6 -0
  11. data/lib/libui_paradise/examples/complex/002_tabs_example.rb +1 -2
  12. data/lib/libui_paradise/examples/complex/003_open_file_button_example.rb +1 -1
  13. data/lib/libui_paradise/examples/complex/006_coloured_boxes_example.rb +2 -2
  14. data/lib/libui_paradise/examples/complex/007_slider_example.rb +10 -4
  15. data/lib/libui_paradise/examples/complex/008_radio_button_example.rb +2 -2
  16. data/lib/libui_paradise/examples/complex/009_separator_example.rb +2 -2
  17. data/lib/libui_paradise/examples/complex/010_table_example.rb +5 -9
  18. data/lib/libui_paradise/examples/complex/011_two_buttons_showing_how_to_enable_and_disable_them.rb +2 -1
  19. data/lib/libui_paradise/examples/complex/012_password_entry_example.rb +1 -1
  20. data/lib/libui_paradise/examples/complex/013_form_example.rb +1 -1
  21. data/lib/libui_paradise/examples/complex/014_text_example.rb +1 -1
  22. data/lib/libui_paradise/examples/complex/015_text_view_example.rb +4 -4
  23. data/lib/libui_paradise/examples/complex/016_grid_example.rb +20 -11
  24. data/lib/libui_paradise/examples/complex/017_unicode_text_example.rb +2 -2
  25. data/lib/libui_paradise/examples/complex/018_spinbutton_example.rb +1 -1
  26. data/lib/libui_paradise/examples/complex/019_combo_box_example.rb +1 -1
  27. data/lib/libui_paradise/examples/complex/020_checkbox_example.rb +5 -5
  28. data/lib/libui_paradise/examples/complex/021_font_example.rb +4 -3
  29. data/lib/libui_paradise/examples/complex/022_simple_notepad_example.rb +3 -3
  30. data/lib/libui_paradise/examples/complex/023_msg_box_error.rb +5 -5
  31. data/lib/libui_paradise/examples/complex/024_parse_config_file_example.rb +2 -2
  32. data/lib/libui_paradise/examples/complex/025_colour_button.rb +1 -1
  33. data/lib/libui_paradise/examples/complex/026_basic_table_image.rb +5 -8
  34. data/lib/libui_paradise/examples/complex/027_basic_button_example.rb +3 -3
  35. data/lib/libui_paradise/examples/complex/028_try_for_automatic_button_press_event_after_a_delay.rb +4 -5
  36. data/lib/libui_paradise/examples/complex/029_progressbar_example.rb +4 -5
  37. data/lib/libui_paradise/examples/complex/030_entry_responds_to_comment_as_synonymous_to_the_enter_key_pressed_example.rb +5 -6
  38. data/lib/libui_paradise/examples/complex/031_notification_functionality_example.rb +3 -2
  39. data/lib/libui_paradise/examples/complex/032_simple_window_example.rb +2 -1
  40. data/lib/libui_paradise/examples/complex/033_daemonize_and_exit_after_delay_example.rb +3 -2
  41. data/lib/libui_paradise/examples/complex/034_bold_text_example.rb +115 -0
  42. data/lib/libui_paradise/examples/complex/035_parse_into_table_example.rb +109 -0
  43. data/lib/libui_paradise/examples/simple/001_open_file_example.rb +1 -1
  44. data/lib/libui_paradise/examples/simple/002_histogram_example.rb +6 -6
  45. data/lib/libui_paradise/examples/simple/003_fancy_text_example.rb +63 -35
  46. data/lib/libui_paradise/examples/simple/005_text_drawing_example.rb +3 -3
  47. data/lib/libui_paradise/examples/simple/007_control_gallery.rb +2 -1
  48. data/lib/libui_paradise/examples/simple/009_spectrum.rb +7 -1
  49. data/lib/libui_paradise/examples/simple/012_table_example.rb +5 -5
  50. data/lib/libui_paradise/examples/simple/013_scrolling_pane_example.rb +28 -0
  51. data/lib/libui_paradise/examples/simple/014_simple_entry_example.rb +30 -0
  52. data/lib/libui_paradise/examples/simple/015_slider_example.rb +32 -0
  53. data/lib/libui_paradise/fiddle/fiddle.rb +771 -636
  54. data/lib/libui_paradise/libui_classes/button.rb +31 -0
  55. data/lib/libui_paradise/libui_classes/entry.rb +35 -0
  56. data/lib/libui_paradise/libui_classes/grid.rb +14 -26
  57. data/lib/libui_paradise/libui_classes/hbox.rb +39 -0
  58. data/lib/libui_paradise/libui_classes/libui_classes.rb +9 -1630
  59. data/lib/libui_paradise/libui_classes/msg_box.rb +121 -0
  60. data/lib/libui_paradise/libui_classes/msg_box_error.rb +41 -0
  61. data/lib/libui_paradise/libui_classes/slider.rb +28 -0
  62. data/lib/libui_paradise/libui_classes/spinbox.rb +48 -0
  63. data/lib/libui_paradise/libui_classes/vbox.rb +38 -0
  64. data/lib/libui_paradise/project/project.rb +2 -1
  65. data/lib/libui_paradise/prototype/prototype.rb +8 -8
  66. data/lib/libui_paradise/requires/require_the_libui_classes.rb +2 -2
  67. data/lib/libui_paradise/requires/require_the_libui_paradise_project.rb +4 -2
  68. data/lib/libui_paradise/toplevel_methods/add_to_the_registered_widgets.rb +70 -0
  69. data/lib/libui_paradise/toplevel_methods/hash_fiddle_pointer_widgets.rb +37 -0
  70. data/lib/libui_paradise/{extensions → toplevel_methods}/toplevel_counters.rb +26 -1
  71. data/lib/libui_paradise/toplevel_methods/toplevel_methods.rb +792 -0
  72. data/lib/libui_paradise/version/version.rb +2 -2
  73. data/test/testing_generic_window.rb +2 -0
  74. metadata +22 -8
  75. data/doc/SNIPPETS.md +0 -65
  76. data/lib/libui_paradise/extensions/extensions.rb +0 -979
  77. data/lib/libui_paradise/libui_classes/box.rb +0 -157
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9cacc003686df08d02f1de8ff360f704eae2c1b4a678bb5040ffc6e193d3e0b3
4
- data.tar.gz: fd46f7096a785932ba3806ab82e31df87f902a7fa969c703542e74100710a34a
3
+ metadata.gz: fbe4ce296951afeee71f86f5247ff8b3f9b1d0606c37837748a62a6430baafec
4
+ data.tar.gz: 2edec366d003bd364608162a327473585794d7eb8836d9b35ba7547139d7877e
5
5
  SHA512:
6
- metadata.gz: b0940f2cc4cd87f2bb28d568ad2ee41b8f5fb552463daeeb8717487e7934beca29670296cc1fc768240da0ae89ef2e28ee16ba580c926815466cfc4c37f44336
7
- data.tar.gz: 108d2613bfacb5945285f31ce6827150863bc98cd887dfe4b3b2d4174e3795fe5d4dacb416dcb1eede79498d4f34d75c7fc5cbab570fb8b12cea049551ce576f
6
+ metadata.gz: ba3eeb6f909676b603d5ced9bda9561efe965a7935b8073e41a466288c13073f2bd5498831c67c90b4d5eb733325c62a7e573e018857013a8ac089de9f7a46a6
7
+ data.tar.gz: d44ea32762e050927fa36c6d6302f6ee224066ac117f6b429d89826d5e11b42df4de73aca810b9ad556b4e68aae52efc6730230ca57d0ca9b4ef03ecd1c13c2a
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  [![forthebadge](https://forthebadge.com/images/badges/made-with-ruby.svg)](https://www.ruby-lang.org/en/)
3
3
  [![Gem Version](https://badge.fury.io/rb/libui_paradise.svg)](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">12.12.2023</span> (dd.mm.yyyy notation), at <span style="color: steelblue; font-weight: bold">14:47:37</span> o'clock.
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
- **cfdg** itself, have a look at: https://www.contextfreeart.org/gallery/)
16
+ <b>cfdg</b> itself, have a look at: https://www.contextfreeart.org/gallery/)
17
17
 
18
- The **libui_paradise project** aims to enhance the official (upstream)
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 **kojix2**,
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
- **windows** - I tried to compile it some weeks ago but I
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
- **libui** is so much simpler to use on windows than GTK,
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 something like:
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 **UI** - instead the slightly longer
436
- **LibUI** is used.
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 **Fiddle::Pointer**. Perhaps we
442
- have to build up a data structure that behaves like **Fiddle::Pointer**
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 have horziontal and vertical scrollbars. The
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 **integers**).
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):
@@ -497,6 +503,12 @@ The <b>handlerDraw() function</b> 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">
@@ -521,6 +533,7 @@ label / ui_text widget.
521
533
  To create a combo-box in vanilla libui, do this in plain ruby-libui:
522
534
 
523
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 **query the currently selected value**, use:
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 **proc {}** object. See kojix2' examples.
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
@@ -582,11 +595,28 @@ To add content to an editable combobox youc an use:
582
595
 
583
596
  LibUI.append() # .append() adds the named item to the end of the EditableCombobox.
584
597
 
585
- The **source code** to the combo-box in libui, at the least
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
586
606
  for UNIX/Linux, can be seen here:
587
607
 
588
608
  https://github.com/andlabs/libui/blob/master/unix/combobox.c
589
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
+
590
620
  ## Error messages and ui_error_message
591
621
 
592
622
  In LibUI respectively ruby-libui you can display error messages
@@ -612,7 +642,7 @@ just a stub though - we may have to research this with better examples.
612
642
 
613
643
  ## Checkboxes in Libui-ng
614
644
 
615
- A simple checkbox example in **plain** ruby-libui follows:
645
+ A simple checkbox example in <b>plain</b> ruby-libui follows:
616
646
 
617
647
  checkbox = LibUI.checkbox('Checkbox')
618
648
  checkbox_toggle_callback = proc { |pointer|
@@ -629,8 +659,8 @@ This may look like so on Linux:
629
659
 
630
660
  <img src="https://i.imgur.com/d7qWalZ.png" style="margin-left: 2em; padding: 4px; border: 1px solid black;">
631
661
 
632
- To set such a checkbox to the checked-state (that is, as if the
633
- user clicked on it), use the following method, if you use the
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
634
664
  libui_paradise gem:
635
665
 
636
666
  checkbox.set_checked(1)
@@ -639,8 +669,8 @@ To query its state use:
639
669
 
640
670
  checked = LibUI.checkbox_checked(pointer) == 1
641
671
 
642
- To <b>query</b> whether a checkbox is **active**, use code such as the
643
- following:
672
+ To <b>query</b> whether a checkbox is <b>active</b>, use code such as
673
+ the following:
644
674
 
645
675
  checkbox.is_active?
646
676
  checkbox.active?
@@ -649,7 +679,7 @@ This depends on the modifications to Fiddler::Pointer, so
649
679
  be wary when you use this - there be dragons (perhaps). Most
650
680
  of these modifications are based on **.object_id**, which is
651
681
  registered in a main, toplevel Hash in the
652
- **libui_paradise project**. Not very elegant, but simple, and
682
+ <b>libui_paradise project</b>. Not very elegant, but simple, and
653
683
  it works (for the most part).
654
684
 
655
685
  The toggle-event for a checkbox can be triggered via:
@@ -661,23 +691,23 @@ The toggle-event for a checkbox can be triggered via:
661
691
  0
662
692
  }
663
693
 
664
- To respond to on-toggled events, do:
694
+ To respond to <b>on-toggled events</b>, do use:
665
695
 
666
696
  LibUI.checkbox_on_toggled(checkbox, checkbox_toggle_callback, nil)
667
697
 
668
698
  ## Adding a widget into another widget
669
699
 
670
- I chose the following **API** for this:
700
+ I chose the following <b>API</b> for this:
671
701
 
672
702
  box1.add(box2, 1)
673
703
 
674
- Note that this is "cheating" a bit because the method **.add()** is defined
675
- on **Fiddle::Pointer**. That's scary! Segfaults coming your way. But it
676
- 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 ... :-)
677
707
 
678
708
  In ruby-gtk it is quite common to use **.add()**. While **.pack_start()**
679
709
  and **.pack_end()** are available in ruby-gtk as well, I think .add() is
680
- the simpler name. We just **add a widget to another widget** - job done.
710
+ the simpler name. We just <b>add a widget to another widget</b> - job done.
681
711
 
682
712
  (I may also use << as alias to .add() and while << is great, remember
683
713
  that it can not easily be used all the time, e. g. box1 << box2 <<
@@ -745,8 +775,8 @@ If you use the libui_paradise gem, you can use this:
745
775
 
746
776
  ## Adding a horizontal separator or a vertical separator
747
777
 
748
- The method **UI.new_horizontal_separator** can be used to add (or rather
749
- 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>.
750
780
 
751
781
  You can then add it via .add() or << if you use the libui_paradise
752
782
  project. Alternatively you can use the toplevel method provided by
@@ -795,6 +825,10 @@ not necessarily recommending this be done, but **if** you ever have
795
825
  such a use case then you can use it - which is another reason why
796
826
  I added this screenshot, so that I don't forget. :)
797
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
+
798
832
  ## Padding elements in LibUI
799
833
 
800
834
  The general API for setting padding to a container in LibUI
@@ -878,24 +912,38 @@ hand. Only the raw filename will be used, so if you
878
912
  have a file at **/tmp/foo/bar.rb** then the title
879
913
  of the window will be **bar.rb**.
880
914
 
881
- ## Entry in libui
915
+ ## Entries in libui (libui-entry)
882
916
 
883
- An entry in libui may look like this:
917
+ Let's first show how an <b>entry</b> in libui may look like:
884
918
 
885
919
  <img src="https://raw.githubusercontent.com/parro-it/libui-node/master/docs/media/UiEntry.png" style="margin-left:1em">
886
920
 
887
- Such an entry can be set to be **read only** (readOnly: Boolean, aka true or false).
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.
888
924
 
889
- The upstream C code for libui-entry, for **unix/**, can be seen here:
925
+ The upstream C code for libui-entry, for <b>unix/</b>, can be seen here:
890
926
 
891
927
  https://github.com/andlabs/libui/blob/master/unix/entry.c
892
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
+
893
934
  In ruby, for the LibUI namespace, you can set text on an entry
894
935
  by calling <b>LibUI.entry_set_text()</b>, such as shown in
895
936
  the following example:
896
937
 
897
938
  LibUI.entry_set_text(entry, 'Please enter your feelings')
898
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
+
899
947
  ## Borderless windows and fullscreen windows
900
948
 
901
949
  A window that is **borderless: true** will not show any title or
@@ -905,6 +953,14 @@ To set the main window to full screen (occupy the whole monitor) do:
905
953
 
906
954
  LibUI.window_set_fullscreen(main_window, 1)
907
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
+
908
964
  ## Spinbutton / Spinbox
909
965
 
910
966
  You can use the following API for a spinbox:
@@ -959,29 +1015,30 @@ In libui the general API for this is:
959
1015
 
960
1016
  ## Control Gallery
961
1017
 
962
- Here is an image, from kotlin-libui, how this may look on windows:
1018
+ Here is an image, from <b>kotlin-libui</b>, how this may look on windows:
963
1019
 
964
1020
  <img src="https://raw.githubusercontent.com/msink/kotlin-libui/master/samples/controlgallery/controlgallery-windows7.png" style="margin-left: 2em">
965
1021
 
966
1022
  ## LibUI.new_button() - how to work with buttons in LibUI in general
967
1023
 
968
- <b>LibUI.new_button</b> allows us to create a new button via
969
- LibUI.
1024
+ <b>LibUI.new_button</b> allows us to create a new button, via
1025
+ the LibUI gem maintained by kojix2.
970
1026
 
971
- Examples for this:
1027
+ Examples for this, syntax-wise, follow:
972
1028
 
973
1029
  button1 = LibUI.new_button('Text')
974
1030
  button2 = LibUI.new_button('▶')
975
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.
976
1033
 
977
- Now, we need to "tell" this button what to do when it is clicked.
978
- This is done via Libui.button_on_clicked().
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>.
979
1036
 
980
- Example:
1037
+ Usage example:
981
1038
 
982
- LibUI.button_on_clicked(button) do
983
- LibUI.msg_box(MAIN_WINDOW, 'Information', 'You clicked the button')
984
- end
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
+ }
985
1042
 
986
1043
  ## Enabling / Disabling buttons in libui
987
1044
 
@@ -1127,86 +1184,6 @@ to be simpler for the time being. I may plan to change a lot more one day,
1127
1184
  if I ever manage to find out how to simulate proper subclasses via
1128
1185
  Fiddle::Pointer ... :)
1129
1186
 
1130
- --------------------------------------------------------------------------------
1131
- ## SNIPPETS.md
1132
-
1133
- Next, the content of the file called **SNIPPETS.md** will be shown. Note
1134
- that this file will eventually be integreated into this file, and then
1135
- subsequently removed one day.
1136
-
1137
-
1138
- <pre>
1139
- # How to add a new main window:
1140
- # width, height, hasMenubar
1141
- main_window = UI.new_window('hello world', 300, 200, 1)
1142
-
1143
- Source code:
1144
-
1145
- https://raw.githubusercontent.com/andlabs/libui/master/unix/window.c
1146
-
1147
- # How to add a libui-widget to the main window / Designate a child widget:
1148
-
1149
- UI.window_set_child(main_window, button)
1150
-
1151
- # Act on closing-event (on quit tag):
1152
-
1153
- UI.window_on_closing(main_window) {
1154
- puts 'Bye Bye'
1155
- UI.control_destroy(main_window)
1156
- UI.quit
1157
- 0
1158
- }
1159
- # Or simpler:
1160
- close_properly(main_window)
1161
-
1162
- # Add the window to the main UI:
1163
-
1164
- UI.control_show(main_window)
1165
- main_window.show_the_controls # Or use this one here.
1166
-
1167
- # And the control:
1168
-
1169
- UI.control_show(main_window)
1170
-
1171
- # Using a text-entry (ui entry tag):
1172
-
1173
- text_entry = UI.new_entry
1174
- UI.entry_set_text(text_entry, 'Please enter your feelings')
1175
- UI.entry_on_changed(text_entry, text_changed_callback, nil)
1176
-
1177
- # To set this on a "multiline entry", aka spanning several
1178
- # rows, do use:
1179
- UI.multiline_entry_set_text(entry1, 'Yo there')
1180
- ui_text_view # an alias used in libui_paradise
1181
-
1182
- text1 = UI.entry_text(entry1) # Obtain text. You may have to call .to_s on it, to guarantee the String.
1183
- UI.multiline_entry_text # Obtain the text from a multiline entry.
1184
-
1185
- # Create a combobox (combo tag, combobox tag):
1186
-
1187
- combobox_selected_callback = proc { |ptr|
1188
- puts "New combobox selection: #{UI.combobox_selected(ptr)}"
1189
- }
1190
- cbox = UI.new_combobox
1191
- UI.combobox_append(cbox, 'combobox Item 1')
1192
- UI.combobox_append(cbox, 'combobox Item 2')
1193
- UI.combobox_append(cbox, 'combobox Item 3')
1194
- UI.box_append(inner, cbox, 0)
1195
- UI.combobox_on_selected(cbox, combobox_selected_callback, nil)
1196
-
1197
- # Or more concise:
1198
- combo_box = LibUI.combobox {
1199
- ['combobox Item 1', 'combobox Item 2', 'combobox Item 3']
1200
- }
1201
-
1202
-
1203
-
1204
-
1205
- </pre>
1206
-
1207
-
1208
- --------------------------------------------------------------------------------
1209
-
1210
1187
  ## Advantages and Disadvantages of the libui project
1211
1188
 
1212
1189
  It would be unfair to only selectively name advantages but not talk about
@@ -1214,29 +1191,31 @@ disadvantages, so this subsection will show some limitations, trade-offs,
1214
1191
  constraints and opportunities. This is not complete, but it may become
1215
1192
  somewhat more complete over time. Stay tuned.
1216
1193
 
1217
- (a) Advantages:
1194
+ (a) Advantages of LibUI:
1218
1195
 
1219
- - Works on windows out-of-the-box after you installed the libui-gem.
1196
+ - Works on the windows platform, out-of-the-box, after the libui-gem has been installed.
1220
1197
  - Is super-simple to use compared to other toolkits, including ruby-gtk.
1221
- - Super-simple to build up a prototype for a GUI, buttons that work,
1222
- spin-boxes, text-views and so forth. Faster than any other toolkit
1223
- 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.
1224
1200
  - Works cross-platform.
1225
1201
 
1226
- (b) Disadvantage:
1202
+ (b) Disadvantage of LibUI:
1227
1203
 
1228
1204
  - Limited ability to control the layout and size of widgets.
1229
- - May look like utter crap ... :-)
1230
- - 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.
1231
1208
  - No way to use different fonts in the same application and choosing a font
1232
1209
  is needlessly complicated. (This may not be completely correct, though -
1233
- the glimmer-dsl-libui has example that seem to work. But if you ask me
1210
+ the glimmer-dsl-libui has examples that seem to work. But if you ask me
1234
1211
  right now in 2021 how this works via a standalone example then I can
1235
1212
  happily tell you I have absolutely no idea. Which brings me to the
1236
- next problem...)
1237
- - 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 ...
1238
1217
 
1239
- Some more disadvantages relate to Fiddle::Pointer. You kind of need to
1218
+ Some more disadvantages relate to <b>Fiddle::Pointer</b>. You kind of need to
1240
1219
  know C fairly well as well as the GC in ruby, in order to understand
1241
1220
  what is going on. Since I don't, I hit a dead end, kind of.
1242
1221
 
@@ -1244,6 +1223,10 @@ This is so far in September 2021. Let's see what the future brings.
1244
1223
  Perhaps other toolkits will learn from libui and implement the good
1245
1224
  parts for **their own** widget set.
1246
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
+
1247
1230
  ## LibuiParadise.parse_this_config_file()
1248
1231
 
1249
1232
  This method can be used to parse a .config file. This file should
@@ -1293,17 +1276,21 @@ You can also use something like '95%' as input. In that case the
1293
1276
  desired value will be calculated depending on the max-resolution
1294
1277
  of the current display. This presently only works on **linux**; if
1295
1278
  someone knows how to make this work on windows and Mac OSX let
1296
- me know. (On these systems it will instead default to a hardcoded
1297
- 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).
1298
1285
 
1299
1286
  The following example shows how to use a percentage value:
1300
1287
 
1301
- set_height('80%')
1288
+ set_height('80%') # 80% of the max-height.
1302
1289
 
1303
1290
  ## Coloured Text
1304
1291
 
1305
1292
  At this point I only show how this may look on Win7, re-using
1306
- the picture the **kotlin-libui developers** made available:
1293
+ the picture the <b>kotlin-libui developers</b> made available:
1307
1294
 
1308
1295
  <img src="https://raw.githubusercontent.com/msink/kotlin-libui/master/samples/drawtext/drawtext-windows7.png" style="margin-left: 2em">
1309
1296
 
@@ -1610,8 +1597,8 @@ Available "**new**"-widgets in LibUI:
1610
1597
  LibUI.new_weight_attribute
1611
1598
  LibUI.new_form # this is a form
1612
1599
  LibUI.new_size_attribute
1613
- LibUI.new_window
1614
- 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
1615
1602
 
1616
1603
  ## A search entry in LibUI
1617
1604
 
@@ -1640,9 +1627,18 @@ Example for this:
1640
1627
 
1641
1628
  ## How to to build a menu-interface (menu tag):
1642
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
+
1643
1635
  help_menu = LibUI.new_menu('Help')
1644
1636
  version_item = LibUI.menu_append_item(help_menu, 'Version')
1645
1637
 
1638
+ On IceWM this may look like this:
1639
+
1640
+ <img src="https://i.imgur.com/1rWYcZM.png" style="margin: 1em">
1641
+
1646
1642
  ## Creating a new drawing area in LibUI
1647
1643
 
1648
1644
  The following code should suffice:
@@ -1684,6 +1680,19 @@ This may look like so on Linux:
1684
1680
 
1685
1681
  <img src="https://i.imgur.com/GVKPMS7.png" style="margin-left: 3em">
1686
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
+
1687
1696
  ## Create a new tabbed notebook:
1688
1697
 
1689
1698
  ui_tabs
@@ -1878,6 +1887,7 @@ may be helpful.
1878
1887
  The API for creating a new grid in libui is quite complex and
1879
1888
  hard to remember:
1880
1889
 
1890
+ # gtk-widget, left, top, xspan, yspan, hexpand, halign, vexpand, valign
1881
1891
  LibUI.grid_append(grid, entry1, 0, 0, 2, 1, 0, 0, 1, 0)
1882
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
1883
1893
 
@@ -1908,10 +1918,12 @@ The documentation for Go has this signature:
1908
1918
 
1909
1919
  Append adds the given control to the Grid, at the given coordinate.
1910
1920
 
1911
- I assume that **uiControl c** refers to the widget that is to be embedded
1912
- into the grid, so the numbers that follow afterwards are the ones
1913
- that are important. Let's have a look at them, based on the above API
1914
- call, and only list these again, without the **()**:
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:
1915
1927
 
1916
1928
  # left, top, xspan, yspan, hexpand, halign, vexpand, valign
1917
1929
  # 0, 0, 2, 1, 0, 0, 1, 0
@@ -1980,12 +1992,13 @@ Usage example for the new API:
1980
1992
  { left: 2, top: 3, xspan: 3, yspan: 3, hexpand: 0, halign: 0, vexpand: 0, valign: 0 }
1981
1993
  )
1982
1994
 
1983
- In the closing days of <b>August 2022</b> I went on
1984
- to improve the above. Three new methods were "added"
1985
- to grid (actually Fiddle::Pointer, but hopefully one
1986
- day I can find out how to work on a grid directly
1987
- in libui; right now I seem to only have to work with
1988
- raw pointers, which confuses me).
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).
1989
2002
 
1990
2003
  These three methods are:
1991
2004
 
@@ -2118,6 +2131,14 @@ following simplified method call instead:
2118
2131
  "https://github.com/kojix2/libui\n Version #{VERSION}"
2119
2132
  )
2120
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
+
2121
2142
  ## How to create an .exe file on Windows via libui
2122
2143
 
2123
2144
  First check: https://github.com/larsch/ocra/
data/bin/libui_message CHANGED
@@ -4,4 +4,4 @@
4
4
  # =========================================================================== #
5
5
  require 'libui_paradise'
6
6
 
7
- LibuiParadise::Extensions.message_box(text: ARGV)
7
+ LibuiParadise.message_box(text: ARGV)