ratatui_ruby 0.4.0 → 0.5.0
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/.builds/ruby-3.2.yml +1 -1
- data/.builds/ruby-3.3.yml +1 -1
- data/.builds/ruby-3.4.yml +1 -1
- data/.builds/ruby-4.0.0.yml +1 -1
- data/AGENTS.md +87 -171
- data/CHANGELOG.md +38 -1
- data/README.md +8 -3
- data/REUSE.toml +20 -0
- data/doc/application_architecture.md +105 -45
- data/doc/application_testing.md +5 -3
- data/doc/contributors/design/ruby_frontend.md +9 -5
- data/doc/contributors/developing_examples.md +76 -18
- data/doc/contributors/documentation_style.md +7 -0
- data/doc/contributors/index.md +2 -0
- data/doc/event_handling.md +10 -4
- data/doc/images/app_all_events.png +0 -0
- data/doc/images/app_color_picker.png +0 -0
- data/doc/images/verify_readme_usage.png +0 -0
- data/doc/images/widget_barchart_demo.png +0 -0
- data/doc/images/widget_block_padding.png +0 -0
- data/doc/images/widget_block_titles.png +0 -0
- data/doc/images/widget_box_demo.png +0 -0
- data/doc/images/widget_calendar_demo.png +0 -0
- data/doc/images/widget_cell_demo.png +0 -0
- data/doc/images/widget_chart_demo.png +0 -0
- data/doc/images/widget_gauge_demo.png +0 -0
- data/doc/images/widget_layout_split.png +0 -0
- data/doc/images/widget_line_gauge_demo.png +0 -0
- data/doc/images/widget_list_demo.png +0 -0
- data/doc/images/widget_ratatui_logo_demo.png +0 -0
- data/doc/images/widget_ratatui_mascot_demo.png +0 -0
- data/doc/images/widget_render.png +0 -0
- data/doc/images/widget_scrollbar_demo.png +0 -0
- data/doc/images/widget_sparkline_demo.png +0 -0
- data/doc/images/widget_style_colors.png +0 -0
- data/doc/images/widget_table_flex.png +0 -0
- data/doc/images/widget_tabs_demo.png +0 -0
- data/doc/interactive_design.md +25 -30
- data/doc/quickstart.md +147 -120
- data/examples/app_all_events/README.md +81 -0
- data/examples/app_all_events/app.rb +93 -0
- data/examples/app_all_events/model/event_color_cycle.rb +41 -0
- data/examples/app_all_events/model/event_entry.rb +75 -0
- data/examples/app_all_events/model/events.rb +180 -0
- data/examples/app_all_events/model/highlight.rb +57 -0
- data/examples/app_all_events/model/timestamp.rb +54 -0
- data/examples/app_all_events/test/snapshots/after_focus_lost.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_focus_regained.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_horizontal_resize.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_key_a.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_key_ctrl_x.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_mouse_click.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_mouse_drag.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_multiple_events.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_paste.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_resize.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_right_click.txt +24 -0
- data/examples/app_all_events/test/snapshots/after_vertical_resize.txt +24 -0
- data/examples/app_all_events/test/snapshots/initial_state.txt +24 -0
- data/examples/app_all_events/view/app_view.rb +78 -0
- data/examples/app_all_events/view/controls_view.rb +50 -0
- data/examples/app_all_events/view/counts_view.rb +55 -0
- data/examples/app_all_events/view/live_view.rb +69 -0
- data/examples/app_all_events/view/log_view.rb +60 -0
- data/examples/app_all_events/view.rb +7 -0
- data/examples/app_all_events/view_state.rb +42 -0
- data/examples/app_color_picker/README.md +94 -0
- data/examples/app_color_picker/app.rb +112 -0
- data/examples/app_color_picker/clipboard.rb +84 -0
- data/examples/app_color_picker/color.rb +191 -0
- data/examples/app_color_picker/copy_dialog.rb +170 -0
- data/examples/app_color_picker/harmony.rb +56 -0
- data/examples/app_color_picker/input.rb +142 -0
- data/examples/app_color_picker/palette.rb +80 -0
- data/examples/app_color_picker/scene.rb +201 -0
- data/examples/{login_form → app_login_form}/app.rb +39 -42
- data/examples/{map_demo → app_map_demo}/app.rb +24 -21
- data/examples/{table_select → app_table_select}/app.rb +68 -65
- data/examples/{quickstart_dsl → verify_quickstart_dsl}/app.rb +15 -6
- data/examples/verify_quickstart_layout/app.rb +69 -0
- data/examples/{quickstart_lifecycle → verify_quickstart_lifecycle}/app.rb +19 -10
- data/examples/verify_readme_usage/app.rb +34 -0
- data/examples/widget_barchart_demo/app.rb +238 -0
- data/examples/{block_padding → widget_block_padding}/app.rb +17 -13
- data/examples/{block_titles → widget_block_titles}/app.rb +25 -17
- data/examples/{box_demo → widget_box_demo}/app.rb +99 -65
- data/examples/widget_calendar_demo/app.rb +109 -0
- data/examples/widget_cell_demo/app.rb +104 -0
- data/examples/widget_chart_demo/app.rb +213 -0
- data/examples/widget_gauge_demo/app.rb +212 -0
- data/examples/widget_layout_split/app.rb +246 -0
- data/examples/widget_line_gauge_demo/app.rb +217 -0
- data/examples/widget_list_demo/app.rb +382 -0
- data/examples/widget_list_styles/app.rb +141 -0
- data/examples/widget_popup_demo/app.rb +104 -0
- data/examples/widget_ratatui_logo_demo/app.rb +103 -0
- data/examples/widget_ratatui_mascot_demo/app.rb +93 -0
- data/examples/widget_rect/app.rb +205 -0
- data/examples/widget_render/app.rb +184 -0
- data/examples/widget_rich_text/app.rb +137 -0
- data/examples/widget_scroll_text/app.rb +108 -0
- data/examples/widget_scrollbar_demo/app.rb +153 -0
- data/examples/widget_sparkline_demo/app.rb +274 -0
- data/examples/widget_style_colors/app.rb +19 -21
- data/examples/widget_table_flex/app.rb +95 -0
- data/examples/widget_tabs_demo/app.rb +167 -0
- data/ext/ratatui_ruby/Cargo.lock +1 -1
- data/ext/ratatui_ruby/Cargo.toml +1 -1
- data/ext/ratatui_ruby/src/events.rs +121 -36
- data/ext/ratatui_ruby/src/frame.rs +115 -0
- data/ext/ratatui_ruby/src/lib.rs +79 -26
- data/ext/ratatui_ruby/src/rendering.rs +8 -4
- data/ext/ratatui_ruby/src/style.rs +138 -57
- data/ext/ratatui_ruby/src/terminal.rs +5 -9
- data/ext/ratatui_ruby/src/text.rs +13 -6
- data/ext/ratatui_ruby/src/widgets/barchart.rs +56 -54
- data/ext/ratatui_ruby/src/widgets/block.rs +7 -6
- data/ext/ratatui_ruby/src/widgets/canvas.rs +21 -3
- data/ext/ratatui_ruby/src/widgets/chart.rs +20 -10
- data/ext/ratatui_ruby/src/widgets/layout.rs +9 -4
- data/ext/ratatui_ruby/src/widgets/list.rs +32 -9
- data/ext/ratatui_ruby/src/widgets/overlay.rs +2 -1
- data/ext/ratatui_ruby/src/widgets/paragraph.rs +1 -1
- data/ext/ratatui_ruby/src/widgets/ratatui_logo.rs +19 -8
- data/ext/ratatui_ruby/src/widgets/ratatui_mascot.rs +17 -10
- data/ext/ratatui_ruby/src/widgets/scrollbar.rs +4 -2
- data/ext/ratatui_ruby/src/widgets/sparkline.rs +14 -11
- data/ext/ratatui_ruby/src/widgets/table.rs +8 -4
- data/ext/ratatui_ruby/src/widgets/tabs.rs +11 -11
- data/lib/ratatui_ruby/cell.rb +3 -3
- data/lib/ratatui_ruby/event/key.rb +1 -1
- data/lib/ratatui_ruby/event/none.rb +43 -0
- data/lib/ratatui_ruby/event.rb +56 -4
- data/lib/ratatui_ruby/frame.rb +87 -0
- data/lib/ratatui_ruby/schema/bar_chart/bar.rb +11 -11
- data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +1 -5
- data/lib/ratatui_ruby/schema/bar_chart.rb +217 -217
- data/lib/ratatui_ruby/schema/block.rb +163 -168
- data/lib/ratatui_ruby/schema/calendar.rb +66 -67
- data/lib/ratatui_ruby/schema/canvas.rb +63 -63
- data/lib/ratatui_ruby/schema/center.rb +46 -46
- data/lib/ratatui_ruby/schema/chart.rb +135 -143
- data/lib/ratatui_ruby/schema/clear.rb +42 -42
- data/lib/ratatui_ruby/schema/constraint.rb +76 -76
- data/lib/ratatui_ruby/schema/cursor.rb +25 -25
- data/lib/ratatui_ruby/schema/gauge.rb +53 -53
- data/lib/ratatui_ruby/schema/layout.rb +87 -87
- data/lib/ratatui_ruby/schema/line_gauge.rb +62 -62
- data/lib/ratatui_ruby/schema/list.rb +86 -84
- data/lib/ratatui_ruby/schema/overlay.rb +31 -31
- data/lib/ratatui_ruby/schema/paragraph.rb +80 -80
- data/lib/ratatui_ruby/schema/ratatui_logo.rb +10 -6
- data/lib/ratatui_ruby/schema/ratatui_mascot.rb +10 -5
- data/lib/ratatui_ruby/schema/rect.rb +60 -60
- data/lib/ratatui_ruby/schema/scrollbar.rb +119 -119
- data/lib/ratatui_ruby/schema/shape/label.rb +1 -1
- data/lib/ratatui_ruby/schema/sparkline.rb +111 -110
- data/lib/ratatui_ruby/schema/style.rb +46 -46
- data/lib/ratatui_ruby/schema/table.rb +112 -119
- data/lib/ratatui_ruby/schema/tabs.rb +66 -67
- data/lib/ratatui_ruby/session/autodoc.rb +417 -0
- data/lib/ratatui_ruby/session.rb +40 -23
- data/lib/ratatui_ruby/test_helper.rb +185 -19
- data/lib/ratatui_ruby/version.rb +1 -1
- data/lib/ratatui_ruby.rb +65 -39
- data/{examples/sparkline_demo → sig/examples/app_all_events}/app.rbs +3 -2
- data/sig/examples/app_all_events/model/event_entry.rbs +16 -0
- data/sig/examples/app_all_events/model/events.rbs +15 -0
- data/sig/examples/app_all_events/model/timestamp.rbs +11 -0
- data/sig/examples/app_all_events/view/app_view.rbs +8 -0
- data/sig/examples/app_all_events/view/controls_view.rbs +6 -0
- data/sig/examples/app_all_events/view/counts_view.rbs +6 -0
- data/sig/examples/app_all_events/view/live_view.rbs +6 -0
- data/sig/examples/app_all_events/view/log_view.rbs +6 -0
- data/sig/examples/app_all_events/view.rbs +8 -0
- data/sig/examples/app_all_events/view_state.rbs +15 -0
- data/{examples/list_demo → sig/examples/app_color_picker}/app.rbs +2 -2
- data/sig/examples/app_login_form/app.rbs +11 -0
- data/sig/examples/app_map_demo/app.rbs +11 -0
- data/sig/examples/app_table_select/app.rbs +11 -0
- data/sig/examples/verify_quickstart_dsl/app.rbs +11 -0
- data/sig/examples/verify_quickstart_lifecycle/app.rbs +11 -0
- data/sig/examples/verify_readme_usage/app.rbs +11 -0
- data/sig/examples/widget_block_padding/app.rbs +11 -0
- data/sig/examples/widget_block_titles/app.rbs +11 -0
- data/sig/examples/widget_box_demo/app.rbs +11 -0
- data/sig/examples/widget_calendar_demo/app.rbs +11 -0
- data/sig/examples/widget_cell_demo/app.rbs +11 -0
- data/sig/examples/widget_chart_demo/app.rbs +11 -0
- data/{examples/gauge_demo → sig/examples/widget_gauge_demo}/app.rbs +4 -0
- data/sig/examples/widget_layout_split/app.rbs +10 -0
- data/sig/examples/widget_line_gauge_demo/app.rbs +11 -0
- data/sig/examples/widget_list_demo/app.rbs +12 -0
- data/sig/examples/widget_list_styles/app.rbs +11 -0
- data/sig/examples/widget_popup_demo/app.rbs +11 -0
- data/sig/examples/widget_ratatui_logo_demo/app.rbs +11 -0
- data/sig/examples/widget_ratatui_mascot_demo/app.rbs +11 -0
- data/sig/examples/widget_rect/app.rbs +12 -0
- data/sig/examples/widget_render/app.rbs +10 -0
- data/sig/examples/widget_rich_text/app.rbs +11 -0
- data/sig/examples/widget_scroll_text/app.rbs +11 -0
- data/sig/examples/widget_scrollbar_demo/app.rbs +11 -0
- data/sig/examples/widget_sparkline_demo/app.rbs +10 -0
- data/{examples → sig/examples}/widget_style_colors/app.rbs +1 -1
- data/sig/examples/widget_table_flex/app.rbs +11 -0
- data/sig/ratatui_ruby/frame.rbs +9 -0
- data/sig/ratatui_ruby/ratatui_ruby.rbs +3 -2
- data/sig/ratatui_ruby/schema/draw.rbs +4 -0
- data/sig/ratatui_ruby/schema/layout.rbs +1 -1
- data/sig/ratatui_ruby/session.rbs +94 -0
- data/tasks/autodoc/inventory.rb +61 -0
- data/tasks/autodoc/member.rb +56 -0
- data/tasks/autodoc/name.rb +19 -0
- data/tasks/autodoc/notice.rb +26 -0
- data/tasks/autodoc/rbs.rb +38 -0
- data/tasks/autodoc/rdoc.rb +45 -0
- data/tasks/autodoc.rake +47 -0
- data/tasks/bump/history.rb +2 -2
- data/tasks/doc.rake +600 -6
- data/tasks/example_viewer.html.erb +172 -0
- data/tasks/lint.rake +8 -4
- data/tasks/resources/index.html.erb +6 -0
- data/tasks/sourcehut.rake +4 -4
- data/tasks/terminal_preview/app_screenshot.rb +1 -3
- data/tasks/terminal_preview/crash_report.rb +7 -9
- data/tasks/terminal_preview/launcher_script.rb +4 -6
- data/tasks/terminal_preview/preview_collection.rb +4 -6
- data/tasks/terminal_preview/safety_confirmation.rb +3 -5
- data/tasks/terminal_preview/saved_screenshot.rb +7 -9
- data/tasks/terminal_preview/terminal_window.rb +7 -9
- data/tasks/test.rake +1 -1
- data/tasks/website/index_page.rb +3 -3
- data/tasks/website/version.rb +10 -10
- data/tasks/website/version_menu.rb +10 -12
- data/tasks/website/versioned_documentation.rb +49 -17
- data/tasks/website/website.rb +6 -8
- data/tasks/website.rake +4 -4
- metadata +156 -125
- data/LICENSES/BSD-2-Clause.txt +0 -9
- data/doc/contributors/better_dx.md +0 -543
- data/doc/contributors/example_analysis.md +0 -82
- data/doc/images/all_events.png +0 -0
- data/doc/images/block_padding.png +0 -0
- data/doc/images/block_titles.png +0 -0
- data/doc/images/box_demo.png +0 -0
- data/doc/images/calendar_demo.png +0 -0
- data/doc/images/cell_demo.png +0 -0
- data/doc/images/chart_demo.png +0 -0
- data/doc/images/flex_layout.png +0 -0
- data/doc/images/gauge_demo.png +0 -0
- data/doc/images/line_gauge_demo.png +0 -0
- data/doc/images/list_demo.png +0 -0
- data/doc/images/readme_usage.png +0 -0
- data/doc/images/scrollbar_demo.png +0 -0
- data/doc/images/sparkline_demo.png +0 -0
- data/doc/images/table_flex.png +0 -0
- data/examples/all_events/app.rb +0 -169
- data/examples/all_events/app.rbs +0 -7
- data/examples/all_events/test_app.rb +0 -139
- data/examples/analytics/app.rb +0 -258
- data/examples/analytics/app.rbs +0 -7
- data/examples/analytics/test_app.rb +0 -132
- data/examples/block_padding/app.rbs +0 -7
- data/examples/block_padding/test_app.rb +0 -31
- data/examples/block_titles/app.rbs +0 -7
- data/examples/block_titles/test_app.rb +0 -34
- data/examples/box_demo/app.rbs +0 -7
- data/examples/box_demo/test_app.rb +0 -88
- data/examples/calendar_demo/app.rb +0 -101
- data/examples/calendar_demo/app.rbs +0 -7
- data/examples/calendar_demo/test_app.rb +0 -108
- data/examples/cell_demo/app.rb +0 -108
- data/examples/cell_demo/app.rbs +0 -7
- data/examples/cell_demo/test_app.rb +0 -36
- data/examples/chart_demo/app.rb +0 -203
- data/examples/chart_demo/app.rbs +0 -7
- data/examples/chart_demo/test_app.rb +0 -102
- data/examples/custom_widget/app.rb +0 -51
- data/examples/custom_widget/app.rbs +0 -7
- data/examples/custom_widget/test_app.rb +0 -30
- data/examples/flex_layout/app.rb +0 -156
- data/examples/flex_layout/app.rbs +0 -7
- data/examples/flex_layout/test_app.rb +0 -65
- data/examples/gauge_demo/app.rb +0 -182
- data/examples/gauge_demo/test_app.rb +0 -120
- data/examples/hit_test/app.rb +0 -175
- data/examples/hit_test/app.rbs +0 -7
- data/examples/hit_test/test_app.rb +0 -102
- data/examples/line_gauge_demo/app.rb +0 -190
- data/examples/line_gauge_demo/app.rbs +0 -7
- data/examples/line_gauge_demo/test_app.rb +0 -129
- data/examples/list_demo/app.rb +0 -253
- data/examples/list_demo/test_app.rb +0 -237
- data/examples/list_styles/app.rb +0 -140
- data/examples/list_styles/app.rbs +0 -7
- data/examples/list_styles/test_app.rb +0 -157
- data/examples/login_form/app.rbs +0 -7
- data/examples/login_form/test_app.rb +0 -51
- data/examples/map_demo/app.rbs +0 -7
- data/examples/map_demo/test_app.rb +0 -149
- data/examples/mouse_events/app.rb +0 -97
- data/examples/mouse_events/app.rbs +0 -7
- data/examples/mouse_events/test_app.rb +0 -53
- data/examples/popup_demo/app.rb +0 -103
- data/examples/popup_demo/app.rbs +0 -7
- data/examples/popup_demo/test_app.rb +0 -54
- data/examples/quickstart_dsl/app.rbs +0 -7
- data/examples/quickstart_dsl/test_app.rb +0 -29
- data/examples/quickstart_lifecycle/app.rbs +0 -7
- data/examples/quickstart_lifecycle/test_app.rb +0 -29
- data/examples/ratatui_logo_demo/app.rb +0 -79
- data/examples/ratatui_logo_demo/app.rbs +0 -7
- data/examples/ratatui_logo_demo/test_app.rb +0 -51
- data/examples/ratatui_mascot_demo/app.rb +0 -84
- data/examples/ratatui_mascot_demo/app.rbs +0 -7
- data/examples/ratatui_mascot_demo/test_app.rb +0 -47
- data/examples/readme_usage/app.rb +0 -29
- data/examples/readme_usage/app.rbs +0 -7
- data/examples/readme_usage/test_app.rb +0 -29
- data/examples/rich_text/app.rb +0 -141
- data/examples/rich_text/app.rbs +0 -7
- data/examples/rich_text/test_app.rb +0 -166
- data/examples/scroll_text/app.rb +0 -103
- data/examples/scroll_text/app.rbs +0 -7
- data/examples/scroll_text/test_app.rb +0 -110
- data/examples/scrollbar_demo/app.rb +0 -143
- data/examples/scrollbar_demo/app.rbs +0 -7
- data/examples/scrollbar_demo/test_app.rb +0 -77
- data/examples/sparkline_demo/app.rb +0 -240
- data/examples/sparkline_demo/test_app.rb +0 -107
- data/examples/table_flex/app.rb +0 -65
- data/examples/table_flex/app.rbs +0 -7
- data/examples/table_flex/test_app.rb +0 -36
- data/examples/table_select/app.rbs +0 -7
- data/examples/table_select/test_app.rb +0 -180
- data/examples/widget_style_colors/test_app.rb +0 -48
- /data/doc/images/{analytics.png → app_analytics.png} +0 -0
- /data/doc/images/{custom_widget.png → app_custom_widget.png} +0 -0
- /data/doc/images/{login_form.png → app_login_form.png} +0 -0
- /data/doc/images/{map_demo.png → app_map_demo.png} +0 -0
- /data/doc/images/{mouse_events.png → app_mouse_events.png} +0 -0
- /data/doc/images/{table_select.png → app_table_select.png} +0 -0
- /data/doc/images/{quickstart_dsl.png → verify_quickstart_dsl.png} +0 -0
- /data/doc/images/{ratatui_logo_demo.png → verify_quickstart_layout.png} +0 -0
- /data/doc/images/{quickstart_lifecycle.png → verify_quickstart_lifecycle.png} +0 -0
- /data/doc/images/{list_styles.png → widget_list_styles.png} +0 -0
- /data/doc/images/{popup_demo.png → widget_popup_demo.png} +0 -0
- /data/doc/images/{hit_test.png → widget_rect.png} +0 -0
- /data/doc/images/{rich_text.png → widget_rich_text.png} +0 -0
- /data/doc/images/{scroll_text.png → widget_scroll_text.png} +0 -0
|
@@ -4,70 +4,70 @@
|
|
|
4
4
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
5
|
|
|
6
6
|
module RatatuiRuby
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
7
|
+
# Defines a rectangular area in the terminal grid.
|
|
8
|
+
#
|
|
9
|
+
# Geometry management involves passing groups of four integers (`x, y, width, height`) repeatedly.
|
|
10
|
+
# This is verbose and prone to parameter mismatch errors.
|
|
11
|
+
#
|
|
12
|
+
# This class encapsulates the geometry. It provides a standard primitive for passing area definitions
|
|
13
|
+
# between layout engines and rendering functions.
|
|
14
|
+
#
|
|
15
|
+
# Use it when manual positioning is required or when querying layout results.
|
|
16
|
+
#
|
|
17
|
+
# === Examples
|
|
18
|
+
#
|
|
19
|
+
# area = Rect.new(x: 0, y: 0, width: 80, height: 24)
|
|
20
|
+
# puts area.width # => 80
|
|
21
|
+
class Rect < Data.define(:x, :y, :width, :height)
|
|
22
|
+
##
|
|
23
|
+
# :attr_reader: x
|
|
24
|
+
# X coordinate (column) of the top-left corner (Integer, coerced via +to_int+ or +to_i+).
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
##
|
|
27
|
+
# :attr_reader: y
|
|
28
|
+
# Y coordinate (row) of the top-left corner (Integer, coerced via +to_int+ or +to_i+).
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
##
|
|
31
|
+
# :attr_reader: width
|
|
32
|
+
# Width in characters (Integer, coerced via +to_int+ or +to_i+).
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
##
|
|
35
|
+
# :attr_reader: height
|
|
36
|
+
# Height in characters (Integer, coerced via +to_int+ or +to_i+).
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
38
|
+
# Creates a new Rect.
|
|
39
|
+
#
|
|
40
|
+
# All parameters accept any object responding to +to_int+ or +to_i+ (duck-typed).
|
|
41
|
+
#
|
|
42
|
+
# [x] Column index (Numeric).
|
|
43
|
+
# [y] Row index (Numeric).
|
|
44
|
+
# [width] Width in columns (Numeric).
|
|
45
|
+
# [height] Height in rows (Numeric).
|
|
46
|
+
def initialize(x: 0, y: 0, width: 0, height: 0)
|
|
47
|
+
super(
|
|
48
|
+
x: Integer(x),
|
|
49
|
+
y: Integer(y),
|
|
50
|
+
width: Integer(width),
|
|
51
|
+
height: Integer(height)
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
end
|
|
55
|
+
# Tests whether a point is inside this rectangle.
|
|
56
|
+
#
|
|
57
|
+
# Essential for hit testing mouse clicks against layout regions.
|
|
58
|
+
#
|
|
59
|
+
# area = Rect.new(x: 10, y: 5, width: 20, height: 10)
|
|
60
|
+
# area.contains?(15, 8) # => true
|
|
61
|
+
# area.contains?(5, 8) # => false
|
|
62
|
+
#
|
|
63
|
+
# [px]
|
|
64
|
+
# X coordinate to test (column).
|
|
65
|
+
# [py]
|
|
66
|
+
# Y coordinate to test (row).
|
|
67
|
+
#
|
|
68
|
+
# Returns true if the point (px, py) is within the rectangle bounds.
|
|
69
|
+
def contains?(px, py)
|
|
70
|
+
px >= x && px < x + width && py >= y && py < y + height
|
|
72
71
|
end
|
|
72
|
+
end
|
|
73
73
|
end
|
|
@@ -4,138 +4,138 @@
|
|
|
4
4
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
5
|
|
|
6
6
|
module RatatuiRuby
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
7
|
+
# Visualizes the scroll state of a viewport.
|
|
8
|
+
#
|
|
9
|
+
# Content overflows. Users get lost in long lists without landmarks. They need to know where they are and how much is left.
|
|
10
|
+
#
|
|
11
|
+
# This widget maps your context. It draws a track and a thumb, representing your current position relative to the total length.
|
|
12
|
+
#
|
|
13
|
+
# Overlay it on top of lists, paragraphs, or tables to provide spatial awareness.
|
|
14
|
+
#
|
|
15
|
+
# {rdoc-image:/doc/images/widget_scrollbar_demo.png}[link:/examples/widget_scrollbar_demo/app_rb.html]
|
|
16
|
+
#
|
|
17
|
+
# === Example
|
|
18
|
+
#
|
|
19
|
+
# Run the interactive demo from the terminal:
|
|
20
|
+
#
|
|
21
|
+
# ruby examples/widget_scrollbar_demo/app.rb
|
|
22
|
+
class Scrollbar < Data.define(
|
|
23
|
+
:content_length,
|
|
24
|
+
:position,
|
|
25
|
+
:orientation,
|
|
26
|
+
:thumb_symbol,
|
|
27
|
+
:thumb_style,
|
|
28
|
+
:track_symbol,
|
|
29
|
+
:track_style,
|
|
30
|
+
:begin_symbol,
|
|
31
|
+
:begin_style,
|
|
32
|
+
:end_symbol,
|
|
33
|
+
:end_style,
|
|
34
|
+
:style,
|
|
35
|
+
:block
|
|
36
|
+
)
|
|
37
|
+
##
|
|
38
|
+
# :attr_reader: content_length
|
|
39
|
+
# Total items or lines in the content.
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
##
|
|
42
|
+
# :attr_reader: position
|
|
43
|
+
# Current scroll offset (index).
|
|
44
|
+
#
|
|
45
|
+
# Maps to Ratatui's <tt>ScrollbarState::get_position()</tt> (new in 0.30.0).
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
##
|
|
48
|
+
# :attr_reader: orientation
|
|
49
|
+
# Direction of the scrollbar.
|
|
50
|
+
#
|
|
51
|
+
# <tt>:vertical</tt> (default, alias for <tt>:vertical_right</tt>), <tt>:horizontal</tt> (alias for <tt>:horizontal_bottom</tt>),
|
|
52
|
+
# <tt>:vertical_left</tt>, <tt>:vertical_right</tt>, <tt>:horizontal_top</tt>, or <tt>:horizontal_bottom</tt>.
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
##
|
|
55
|
+
# :attr_reader: thumb_symbol
|
|
56
|
+
# Symbol used to represent the current position indicator.
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
##
|
|
59
|
+
# :attr_reader: thumb_style
|
|
60
|
+
# Style of the position indicator (thumb).
|
|
61
61
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
##
|
|
63
|
+
# :attr_reader: track_symbol
|
|
64
|
+
# Symbol used to represent the empty space of the scrollbar.
|
|
65
65
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
##
|
|
67
|
+
# :attr_reader: track_style
|
|
68
|
+
# Style of the filled track area.
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
##
|
|
71
|
+
# :attr_reader: begin_symbol
|
|
72
|
+
# Symbol rendered at the start of the track (e.g., arrow).
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
##
|
|
75
|
+
# :attr_reader: begin_style
|
|
76
|
+
# Style of the start symbol.
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
##
|
|
79
|
+
# :attr_reader: end_symbol
|
|
80
|
+
# Symbol rendered at the end of the track (e.g., arrow).
|
|
81
81
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
##
|
|
83
|
+
# :attr_reader: end_style
|
|
84
|
+
# Style of the end symbol.
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
##
|
|
87
|
+
# :attr_reader: style
|
|
88
|
+
# Base style applied to the entire widget.
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
##
|
|
91
|
+
# :attr_reader: block
|
|
92
|
+
# Optional wrapping block.
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
94
|
+
# Creates a new Scrollbar.
|
|
95
|
+
#
|
|
96
|
+
# [content_length] Integer.
|
|
97
|
+
# [position] Integer.
|
|
98
|
+
# [orientation] Symbol (default: <tt>:vertical</tt>).
|
|
99
|
+
# [thumb_symbol] String (default: <tt>"█"</tt>).
|
|
100
|
+
# [thumb_style] Style (optional).
|
|
101
|
+
# [track_symbol] String (optional).
|
|
102
|
+
# [track_style] Style (optional).
|
|
103
|
+
# [begin_symbol] String (optional).
|
|
104
|
+
# [begin_style] Style (optional).
|
|
105
|
+
# [end_symbol] String (optional).
|
|
106
|
+
# [end_style] Style (optional).
|
|
107
|
+
# [style] Style (optional).
|
|
108
|
+
# [block] Block (optional).
|
|
109
|
+
def initialize(
|
|
110
|
+
content_length:,
|
|
111
|
+
position:,
|
|
112
|
+
orientation: :vertical,
|
|
113
|
+
thumb_symbol: "█",
|
|
114
|
+
thumb_style: nil,
|
|
115
|
+
track_symbol: nil,
|
|
116
|
+
track_style: nil,
|
|
117
|
+
begin_symbol: nil,
|
|
118
|
+
begin_style: nil,
|
|
119
|
+
end_symbol: nil,
|
|
120
|
+
end_style: nil,
|
|
121
|
+
style: nil,
|
|
122
|
+
block: nil
|
|
123
|
+
)
|
|
124
|
+
super(
|
|
125
|
+
content_length: Integer(content_length),
|
|
126
|
+
position: Integer(position),
|
|
127
|
+
orientation:,
|
|
128
|
+
thumb_symbol:,
|
|
129
|
+
thumb_style:,
|
|
130
|
+
track_symbol:,
|
|
131
|
+
track_style:,
|
|
132
|
+
begin_symbol:,
|
|
133
|
+
begin_style:,
|
|
134
|
+
end_symbol:,
|
|
135
|
+
end_style:,
|
|
136
|
+
style:,
|
|
137
|
+
block:
|
|
123
138
|
)
|
|
124
|
-
super(
|
|
125
|
-
content_length: Integer(content_length),
|
|
126
|
-
position: Integer(position),
|
|
127
|
-
orientation: orientation,
|
|
128
|
-
thumb_symbol: thumb_symbol,
|
|
129
|
-
thumb_style: thumb_style,
|
|
130
|
-
track_symbol: track_symbol,
|
|
131
|
-
track_style: track_style,
|
|
132
|
-
begin_symbol: begin_symbol,
|
|
133
|
-
begin_style: begin_style,
|
|
134
|
-
end_symbol: end_symbol,
|
|
135
|
-
end_style: end_style,
|
|
136
|
-
style: style,
|
|
137
|
-
block: block
|
|
138
|
-
)
|
|
139
|
-
end
|
|
140
139
|
end
|
|
140
|
+
end
|
|
141
141
|
end
|
|
@@ -59,7 +59,7 @@ module RatatuiRuby
|
|
|
59
59
|
# [text] Text content (String or Text::Line).
|
|
60
60
|
# [style] Style (optional).
|
|
61
61
|
def initialize(x:, y:, text:, style: nil)
|
|
62
|
-
super(x: Float(x), y: Float(y), text
|
|
62
|
+
super(x: Float(x), y: Float(y), text:, style:)
|
|
63
63
|
end
|
|
64
64
|
end
|
|
65
65
|
end
|
|
@@ -4,128 +4,129 @@
|
|
|
4
4
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
5
|
|
|
6
6
|
module RatatuiRuby
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
7
|
+
# Displays high-density data in a compact row.
|
|
8
|
+
#
|
|
9
|
+
# Users need context. A single value ("90% CPU") tells you current status, but not the trend.
|
|
10
|
+
# Full charts take up too much room.
|
|
11
|
+
#
|
|
12
|
+
# This widget solves the density problem. It condenses history into a single line of variable-height blocks.
|
|
13
|
+
#
|
|
14
|
+
# Use it in dashboards, headers, or list items to providing trending data at a glance.
|
|
15
|
+
#
|
|
16
|
+
# {rdoc-image:/doc/images/widget_sparkline_demo.png}[link:/examples/widget_sparkline_demo/app_rb.html]
|
|
17
|
+
#
|
|
18
|
+
# === Example
|
|
19
|
+
#
|
|
20
|
+
# Run the interactive demo from the terminal:
|
|
21
|
+
#
|
|
22
|
+
# ruby examples/widget_sparkline_demo/app.rb
|
|
23
|
+
class Sparkline < Data.define(:data, :max, :style, :block, :direction, :absent_value_symbol, :absent_value_style, :bar_set)
|
|
24
|
+
##
|
|
25
|
+
# :attr_reader: data
|
|
26
|
+
# Array of integer values to plot.
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
##
|
|
29
|
+
# :attr_reader: max
|
|
30
|
+
# Maximum value for scaling (optional).
|
|
31
|
+
#
|
|
32
|
+
# If nil, derived from data max.
|
|
32
33
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
##
|
|
35
|
+
# :attr_reader: style
|
|
36
|
+
# Style for the bars.
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
##
|
|
39
|
+
# :attr_reader: block
|
|
40
|
+
# Optional wrapping block.
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
##
|
|
43
|
+
# :attr_reader: direction
|
|
44
|
+
# Direction to render data.
|
|
45
|
+
#
|
|
46
|
+
# Accepts +:left_to_right+ (default) or +:right_to_left+.
|
|
47
|
+
# Use +:right_to_left+ when new data should appear on the left.
|
|
47
48
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
##
|
|
50
|
+
# :attr_reader: absent_value_symbol
|
|
51
|
+
# Character to render for absent (nil) values (optional).
|
|
52
|
+
#
|
|
53
|
+
# If nil, absent values are rendered with a space.
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
##
|
|
56
|
+
# :attr_reader: absent_value_style
|
|
57
|
+
# Style for absent (nil) values (optional).
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
59
|
+
##
|
|
60
|
+
# :attr_reader: bar_set
|
|
61
|
+
# Custom characters for the bars (optional).
|
|
62
|
+
#
|
|
63
|
+
# A Hash with keys defining the characters for the bars.
|
|
64
|
+
# Keys: <tt>:empty</tt>, <tt>:one_eighth</tt>, <tt>:one_quarter</tt>, <tt>:three_eighths</tt>, <tt>:half</tt>, <tt>:five_eighths</tt>, <tt>:three_quarters</tt>, <tt>:seven_eighths</tt>, <tt>:full</tt>.
|
|
65
|
+
#
|
|
66
|
+
# You can also use integers (0-8) as keys, where 0 is empty, 4 is half, and 8 is full.
|
|
67
|
+
#
|
|
68
|
+
# Alternatively, you can pass an Array of 9 strings, where index 0 is empty and index 8 is full.
|
|
69
|
+
#
|
|
70
|
+
# === Examples
|
|
71
|
+
#
|
|
72
|
+
# bar_set: {
|
|
73
|
+
# empty: " ",
|
|
74
|
+
# one_eighth: " ",
|
|
75
|
+
# one_quarter: "▂",
|
|
76
|
+
# three_eighths: "▃",
|
|
77
|
+
# half: "▄",
|
|
78
|
+
# five_eighths: "▅",
|
|
79
|
+
# three_quarters: "▆",
|
|
80
|
+
# seven_eighths: "▇",
|
|
81
|
+
# full: "█"
|
|
82
|
+
# }
|
|
83
|
+
#
|
|
84
|
+
# # Numeric keys (0-8)
|
|
85
|
+
# bar_set: {
|
|
86
|
+
# 0 => " ", 1 => " ", 2 => "▂", 3 => "▃", 4 => "▄", 5 => "▅", 6 => "▆", 7 => "▇", 8 => "█"
|
|
87
|
+
# }
|
|
88
|
+
#
|
|
89
|
+
# # Array (9 items)
|
|
90
|
+
# bar_set: [" ", " ", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
|
|
90
91
|
|
|
91
|
-
|
|
92
|
+
BAR_KEYS = %i[empty one_eighth one_quarter three_eighths half five_eighths three_quarters seven_eighths full].freeze
|
|
92
93
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
end
|
|
94
|
+
# Creates a new Sparkline widget.
|
|
95
|
+
#
|
|
96
|
+
# [data] Array of Integers or nil. nil marks an absent value (distinct from 0).
|
|
97
|
+
# [max] Max value (optional).
|
|
98
|
+
# [style] Style (optional).
|
|
99
|
+
# [block] Block (optional).
|
|
100
|
+
# [direction] +:left_to_right+ or +:right_to_left+ (default: +:left_to_right+).
|
|
101
|
+
# [absent_value_symbol] Character for absent (nil) values (optional).
|
|
102
|
+
# [absent_value_style] Style for absent (nil) values (optional).
|
|
103
|
+
# [bar_set] Hash or Array of custom characters (optional).
|
|
104
|
+
def initialize(data:, max: nil, style: nil, block: nil, direction: :left_to_right, absent_value_symbol: nil, absent_value_style: nil, bar_set: nil)
|
|
105
|
+
if bar_set
|
|
106
|
+
if bar_set.is_a?(Array) && bar_set.size == 9
|
|
107
|
+
# Convert Array to Hash using BAR_KEYS order
|
|
108
|
+
bar_set = BAR_KEYS.zip(bar_set).to_h
|
|
109
|
+
else
|
|
110
|
+
bar_set = bar_set.dup
|
|
111
|
+
# Normalize numeric keys (0-8) to symbolic keys
|
|
112
|
+
BAR_KEYS.each_with_index do |key, i|
|
|
113
|
+
if (val = bar_set.delete(i) || bar_set.delete(i.to_s))
|
|
114
|
+
bar_set[key] = val
|
|
115
115
|
end
|
|
116
116
|
end
|
|
117
117
|
end
|
|
118
|
-
coerced_data = data.map { |v| v.nil? ? nil : Integer(v) }
|
|
119
|
-
super(
|
|
120
|
-
data: coerced_data,
|
|
121
|
-
max: max.nil? ? nil : Integer(max),
|
|
122
|
-
style: style,
|
|
123
|
-
block: block,
|
|
124
|
-
direction: direction,
|
|
125
|
-
absent_value_symbol: absent_value_symbol,
|
|
126
|
-
absent_value_style: absent_value_style,
|
|
127
|
-
bar_set: bar_set
|
|
128
|
-
)
|
|
129
118
|
end
|
|
119
|
+
coerced_data = data.map { |v| v.nil? ? nil : Integer(v) }
|
|
120
|
+
super(
|
|
121
|
+
data: coerced_data,
|
|
122
|
+
max: max.nil? ? nil : Integer(max),
|
|
123
|
+
style:,
|
|
124
|
+
block:,
|
|
125
|
+
direction:,
|
|
126
|
+
absent_value_symbol:,
|
|
127
|
+
absent_value_style:,
|
|
128
|
+
bar_set:
|
|
129
|
+
)
|
|
130
130
|
end
|
|
131
|
+
end
|
|
131
132
|
end
|