ratatui_ruby 0.8.0 → 0.9.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 +2 -2
- data/.builds/ruby-3.3.yml +2 -2
- data/.builds/ruby-3.4.yml +2 -2
- data/.builds/ruby-4.0.0.yml +2 -2
- data/.pre-commit-config.yaml +1 -1
- data/AGENTS.md +3 -3
- data/CHANGELOG.md +53 -1
- data/LICENSES/LGPL-3.0-or-later.txt +304 -0
- data/LICENSES/MIT-0.txt +16 -0
- data/README.md +33 -5
- data/Rakefile +1 -1
- data/doc/concepts/application_architecture.md +44 -3
- data/doc/concepts/application_testing.md +43 -1
- data/doc/concepts/async.md +32 -2
- data/doc/concepts/custom_widgets.md +247 -0
- data/doc/concepts/event_handling.md +32 -3
- data/doc/concepts/interactive_design.md +32 -2
- data/doc/contributors/auditing/parity.md +7 -1
- data/doc/contributors/design/ruby_frontend.md +85 -1
- data/doc/contributors/design/rust_backend.md +67 -1
- data/doc/contributors/developing_examples.md +56 -2
- data/doc/contributors/documentation_style.md +20 -3
- data/doc/contributors/future_work.md +169 -0
- data/doc/contributors/index.md +1 -1
- data/doc/contributors/v1.0.0_blockers.md +15 -175
- data/doc/getting_started/quickstart.md +22 -4
- data/doc/getting_started/why.md +1 -1
- data/doc/index.md +2 -1
- data/doc/troubleshooting/debugging.md +32 -2
- data/doc/troubleshooting/terminal_limitations.md +8 -2
- data/doc/troubleshooting/tui_output.md +42 -0
- data/examples/app_all_events/README.md +14 -2
- data/examples/app_all_events/app.rb +1 -1
- data/examples/app_all_events/model/app_model.rb +1 -1
- data/examples/app_all_events/model/event_color_cycle.rb +1 -1
- data/examples/app_all_events/model/event_entry.rb +1 -1
- data/examples/app_all_events/model/msg.rb +1 -1
- data/examples/app_all_events/model/timestamp.rb +1 -1
- data/examples/app_all_events/update.rb +1 -1
- data/examples/app_all_events/view/app_view.rb +1 -1
- data/examples/app_all_events/view/controls_view.rb +1 -1
- data/examples/app_all_events/view/counts_view.rb +1 -1
- data/examples/app_all_events/view/live_view.rb +1 -1
- data/examples/app_all_events/view/log_view.rb +1 -1
- data/examples/app_all_events/view.rb +1 -1
- data/examples/app_color_picker/README.md +20 -2
- data/examples/app_color_picker/app.rb +1 -1
- data/examples/app_color_picker/clipboard.rb +1 -1
- data/examples/app_color_picker/color.rb +1 -1
- data/examples/app_color_picker/controls.rb +1 -1
- data/examples/app_color_picker/copy_dialog.rb +1 -1
- data/examples/app_color_picker/export_pane.rb +1 -1
- data/examples/app_color_picker/harmony.rb +1 -1
- data/examples/app_color_picker/input.rb +1 -1
- data/examples/app_color_picker/main_container.rb +1 -1
- data/examples/app_color_picker/palette.rb +1 -1
- data/examples/app_login_form/README.md +8 -2
- data/examples/app_login_form/app.rb +1 -1
- data/examples/app_stateful_interaction/README.md +2 -2
- data/examples/app_stateful_interaction/app.rb +71 -17
- data/examples/timeout_demo.rb +1 -1
- data/examples/verify_quickstart_dsl/README.md +6 -0
- data/examples/verify_quickstart_dsl/app.rb +3 -3
- data/examples/verify_quickstart_layout/README.md +6 -0
- data/examples/verify_quickstart_layout/app.rb +3 -3
- data/examples/verify_quickstart_lifecycle/README.md +6 -0
- data/examples/verify_quickstart_lifecycle/app.rb +3 -3
- data/examples/verify_readme_usage/README.md +6 -0
- data/examples/verify_readme_usage/app.rb +3 -3
- data/examples/widget_barchart/README.md +6 -0
- data/examples/widget_barchart/app.rb +2 -2
- data/examples/widget_block/README.md +7 -1
- data/examples/widget_block/app.rb +2 -2
- data/examples/widget_box/README.md +6 -0
- data/examples/widget_box/app.rb +9 -6
- data/examples/widget_calendar/README.md +6 -0
- data/examples/widget_calendar/app.rb +2 -2
- data/examples/widget_canvas/README.md +4 -0
- data/examples/widget_canvas/app.rb +2 -2
- data/examples/widget_cell/README.md +6 -0
- data/examples/widget_cell/app.rb +2 -3
- data/examples/widget_center/README.md +4 -0
- data/examples/widget_center/app.rb +2 -2
- data/examples/widget_chart/README.md +6 -0
- data/examples/widget_chart/app.rb +2 -2
- data/examples/widget_gauge/README.md +6 -0
- data/examples/widget_gauge/app.rb +2 -2
- data/examples/widget_layout_split/README.md +6 -0
- data/examples/widget_layout_split/app.rb +3 -3
- data/examples/widget_line_gauge/README.md +6 -0
- data/examples/widget_line_gauge/app.rb +2 -2
- data/examples/widget_list/README.md +6 -0
- data/examples/widget_list/app.rb +2 -2
- data/examples/widget_map/README.md +8 -2
- data/examples/widget_map/app.rb +2 -2
- data/examples/widget_overlay/README.md +7 -1
- data/examples/widget_overlay/app.rb +2 -2
- data/examples/widget_popup/README.md +6 -0
- data/examples/widget_popup/app.rb +2 -2
- data/examples/widget_ratatui_logo/README.md +6 -0
- data/examples/widget_ratatui_logo/app.rb +2 -3
- data/examples/widget_ratatui_mascot/README.md +6 -0
- data/examples/widget_ratatui_mascot/app.rb +2 -2
- data/examples/widget_rect/README.md +12 -0
- data/examples/widget_rect/app.rb +40 -26
- data/examples/widget_render/README.md +6 -0
- data/examples/widget_render/app.rb +2 -2
- data/examples/widget_render/app.rbs +41 -0
- data/examples/widget_rich_text/README.md +6 -0
- data/examples/widget_rich_text/app.rb +2 -2
- data/examples/widget_scroll_text/README.md +6 -0
- data/examples/widget_scroll_text/app.rb +2 -2
- data/examples/widget_scrollbar/README.md +6 -0
- data/examples/widget_scrollbar/app.rb +2 -2
- data/examples/widget_sparkline/README.md +6 -0
- data/examples/widget_sparkline/app.rb +2 -2
- data/examples/widget_style_colors/README.md +6 -0
- data/examples/widget_style_colors/app.rb +2 -2
- data/examples/widget_table/README.md +8 -2
- data/examples/widget_table/app.rb +2 -2
- data/examples/widget_tabs/README.md +6 -0
- data/examples/widget_tabs/app.rb +2 -2
- data/examples/widget_text_width/README.md +6 -0
- data/examples/widget_text_width/app.rb +4 -4
- data/ext/ratatui_ruby/Cargo.lock +1 -1
- data/ext/ratatui_ruby/Cargo.toml +1 -1
- data/ext/ratatui_ruby/extconf.rb +2 -2
- data/ext/ratatui_ruby/src/rendering.rs +1 -1
- data/ext/ratatui_ruby/src/style.rs +0 -8
- data/ext/ratatui_ruby/src/widgets/chart.rs +0 -118
- data/ext/ratatui_ruby/src/widgets/list_state.rs +36 -0
- data/lib/ratatui_ruby/buffer/cell.rb +34 -2
- data/lib/ratatui_ruby/buffer.rb +2 -2
- data/lib/ratatui_ruby/cell.rb +34 -2
- data/lib/ratatui_ruby/event/focus_gained.rb +26 -2
- data/lib/ratatui_ruby/event/focus_lost.rb +26 -2
- data/lib/ratatui_ruby/event/key/character.rb +18 -2
- data/lib/ratatui_ruby/event/key/media.rb +2 -2
- data/lib/ratatui_ruby/event/key/modifier.rb +10 -2
- data/lib/ratatui_ruby/event/key/navigation.rb +2 -2
- data/lib/ratatui_ruby/event/key/system.rb +2 -2
- data/lib/ratatui_ruby/event/key.rb +114 -2
- data/lib/ratatui_ruby/event/mouse.rb +42 -2
- data/lib/ratatui_ruby/event/none.rb +10 -2
- data/lib/ratatui_ruby/event/paste.rb +34 -2
- data/lib/ratatui_ruby/event/resize.rb +34 -2
- data/lib/ratatui_ruby/event.rb +26 -2
- data/lib/ratatui_ruby/frame.rb +74 -2
- data/lib/ratatui_ruby/layout/constraint.rb +58 -2
- data/lib/ratatui_ruby/layout/layout.rb +47 -2
- data/lib/ratatui_ruby/layout/rect.rb +403 -2
- data/lib/ratatui_ruby/layout.rb +2 -2
- data/lib/ratatui_ruby/list_state.rb +113 -2
- data/lib/ratatui_ruby/output_guard.rb +26 -3
- data/lib/ratatui_ruby/schema/bar_chart/bar.rb +2 -2
- data/lib/ratatui_ruby/schema/bar_chart/bar_group.rb +2 -2
- data/lib/ratatui_ruby/schema/bar_chart.rb +50 -2
- data/lib/ratatui_ruby/schema/block.rb +21 -15
- data/lib/ratatui_ruby/schema/calendar.rb +2 -2
- data/lib/ratatui_ruby/schema/canvas.rb +10 -2
- data/lib/ratatui_ruby/schema/center.rb +10 -2
- data/lib/ratatui_ruby/schema/chart.rb +2 -28
- data/lib/ratatui_ruby/schema/clear.rb +10 -2
- data/lib/ratatui_ruby/schema/constraint.rb +58 -2
- data/lib/ratatui_ruby/schema/cursor.rb +10 -2
- data/lib/ratatui_ruby/schema/draw.rb +10 -2
- data/lib/ratatui_ruby/schema/gauge.rb +2 -2
- data/lib/ratatui_ruby/schema/layout.rb +18 -2
- data/lib/ratatui_ruby/schema/line_gauge.rb +2 -2
- data/lib/ratatui_ruby/schema/list.rb +10 -2
- data/lib/ratatui_ruby/schema/list_item.rb +10 -2
- data/lib/ratatui_ruby/schema/overlay.rb +10 -2
- data/lib/ratatui_ruby/schema/paragraph.rb +10 -2
- data/lib/ratatui_ruby/schema/ratatui_logo.rb +2 -2
- data/lib/ratatui_ruby/schema/ratatui_mascot.rb +2 -2
- data/lib/ratatui_ruby/schema/rect.rb +58 -2
- data/lib/ratatui_ruby/schema/row.rb +10 -2
- data/lib/ratatui_ruby/schema/scrollbar.rb +2 -2
- data/lib/ratatui_ruby/schema/shape/label.rb +10 -2
- data/lib/ratatui_ruby/schema/sparkline.rb +10 -2
- data/lib/ratatui_ruby/schema/style.rb +18 -2
- data/lib/ratatui_ruby/schema/table.rb +2 -2
- data/lib/ratatui_ruby/schema/tabs.rb +2 -2
- data/lib/ratatui_ruby/schema/text.rb +34 -2
- data/lib/ratatui_ruby/scrollbar_state.rb +10 -2
- data/lib/ratatui_ruby/style/style.rb +18 -2
- data/lib/ratatui_ruby/style.rb +2 -2
- data/lib/ratatui_ruby/table_state.rb +10 -2
- data/lib/ratatui_ruby/terminal_lifecycle.rb +18 -3
- data/lib/ratatui_ruby/test_helper/event_injection.rb +34 -2
- data/lib/ratatui_ruby/test_helper/snapshot.rb +74 -9
- data/lib/ratatui_ruby/test_helper/style_assertions.rb +98 -2
- data/lib/ratatui_ruby/test_helper/terminal.rb +50 -2
- data/lib/ratatui_ruby/test_helper/test_doubles.rb +18 -2
- data/lib/ratatui_ruby/test_helper.rb +10 -2
- data/lib/ratatui_ruby/tui/buffer_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/canvas_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/core.rb +2 -2
- data/lib/ratatui_ruby/tui/layout_factories.rb +32 -2
- data/lib/ratatui_ruby/tui/state_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/style_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/text_factories.rb +2 -2
- data/lib/ratatui_ruby/tui/widget_factories.rb +2 -2
- data/lib/ratatui_ruby/tui.rb +11 -3
- data/lib/ratatui_ruby/version.rb +3 -3
- data/lib/ratatui_ruby/widgets/bar_chart/bar.rb +2 -2
- data/lib/ratatui_ruby/widgets/bar_chart/bar_group.rb +2 -2
- data/lib/ratatui_ruby/widgets/bar_chart.rb +58 -2
- data/lib/ratatui_ruby/widgets/block.rb +37 -15
- data/lib/ratatui_ruby/widgets/calendar.rb +2 -2
- data/lib/ratatui_ruby/widgets/canvas.rb +10 -2
- data/lib/ratatui_ruby/widgets/cell.rb +10 -2
- data/lib/ratatui_ruby/widgets/center.rb +10 -2
- data/lib/ratatui_ruby/widgets/chart.rb +2 -28
- data/lib/ratatui_ruby/widgets/clear.rb +10 -2
- data/lib/ratatui_ruby/widgets/cursor.rb +10 -2
- data/lib/ratatui_ruby/widgets/gauge.rb +16 -2
- data/lib/ratatui_ruby/widgets/line_gauge.rb +16 -2
- data/lib/ratatui_ruby/widgets/list.rb +41 -2
- data/lib/ratatui_ruby/widgets/list_item.rb +10 -2
- data/lib/ratatui_ruby/widgets/overlay.rb +10 -2
- data/lib/ratatui_ruby/widgets/paragraph.rb +10 -2
- data/lib/ratatui_ruby/widgets/ratatui_logo.rb +2 -2
- data/lib/ratatui_ruby/widgets/ratatui_mascot.rb +2 -2
- data/lib/ratatui_ruby/widgets/row.rb +10 -2
- data/lib/ratatui_ruby/widgets/scrollbar.rb +2 -2
- data/lib/ratatui_ruby/widgets/shape/label.rb +10 -2
- data/lib/ratatui_ruby/widgets/sparkline.rb +10 -2
- data/lib/ratatui_ruby/widgets/table.rb +62 -2
- data/lib/ratatui_ruby/widgets/tabs.rb +2 -2
- data/lib/ratatui_ruby/widgets.rb +2 -2
- data/lib/ratatui_ruby.rb +90 -2
- data/sig/examples/app_all_events/view.rbs +7 -1
- data/sig/examples/app_all_events/view_state.rbs +7 -1
- data/sig/examples/app_color_picker/app.rbs +5 -0
- data/sig/examples/app_stateful_interaction/app.rbs +7 -1
- data/sig/examples/verify_quickstart_dsl/app.rbs +7 -1
- data/sig/examples/verify_quickstart_lifecycle/app.rbs +7 -1
- data/sig/examples/verify_readme_usage/app.rbs +7 -1
- data/sig/examples/widget_block_demo/app.rbs +6 -0
- data/sig/examples/widget_box_demo/app.rbs +7 -1
- data/sig/examples/widget_calendar_demo/app.rbs +7 -1
- data/sig/examples/widget_cell_demo/app.rbs +7 -1
- data/sig/examples/widget_chart_demo/app.rbs +7 -1
- data/sig/examples/widget_gauge_demo/app.rbs +7 -1
- data/sig/examples/widget_layout_split/app.rbs +7 -1
- data/sig/examples/widget_line_gauge_demo/app.rbs +7 -1
- data/sig/examples/widget_list_demo/app.rbs +5 -0
- data/sig/examples/widget_map_demo/app.rbs +7 -1
- data/sig/examples/widget_popup_demo/app.rbs +7 -1
- data/sig/examples/widget_ratatui_logo_demo/app.rbs +7 -1
- data/sig/examples/widget_ratatui_mascot_demo/app.rbs +7 -1
- data/sig/examples/widget_rect/app.rbs +7 -1
- data/sig/examples/widget_render/app.rbs +7 -1
- data/sig/examples/widget_rich_text/app.rbs +7 -1
- data/sig/examples/widget_scroll_text/app.rbs +7 -1
- data/sig/examples/widget_scrollbar_demo/app.rbs +7 -1
- data/sig/examples/widget_sparkline_demo/app.rbs +7 -1
- data/sig/examples/widget_style_colors/app.rbs +7 -1
- data/sig/examples/widget_table_demo/app.rbs +7 -1
- data/sig/examples/widget_text_width/app.rbs +7 -1
- data/sig/ratatui_ruby/event.rbs +7 -1
- data/sig/ratatui_ruby/frame.rbs +15 -3
- data/sig/ratatui_ruby/list_state.rbs +11 -1
- data/sig/ratatui_ruby/ratatui_ruby.rbs +8 -2
- data/sig/ratatui_ruby/schema/bar_chart/bar.rbs +7 -1
- data/sig/ratatui_ruby/schema/bar_chart/bar_group.rbs +6 -0
- data/sig/ratatui_ruby/schema/bar_chart.rbs +6 -0
- data/sig/ratatui_ruby/schema/block.rbs +7 -1
- data/sig/ratatui_ruby/schema/calendar.rbs +6 -0
- data/sig/ratatui_ruby/schema/canvas.rbs +6 -0
- data/sig/ratatui_ruby/schema/center.rbs +6 -0
- data/sig/ratatui_ruby/schema/chart.rbs +6 -9
- data/sig/ratatui_ruby/schema/constraint.rbs +6 -0
- data/sig/ratatui_ruby/schema/cursor.rbs +6 -0
- data/sig/ratatui_ruby/schema/draw.rbs +6 -0
- data/sig/ratatui_ruby/schema/gauge.rbs +9 -1
- data/sig/ratatui_ruby/schema/layout.rbs +6 -0
- data/sig/ratatui_ruby/schema/line_gauge.rbs +9 -1
- data/sig/ratatui_ruby/schema/list.rbs +9 -1
- data/sig/ratatui_ruby/schema/list_item.rbs +7 -1
- data/sig/ratatui_ruby/schema/overlay.rbs +6 -0
- data/sig/ratatui_ruby/schema/paragraph.rbs +6 -0
- data/sig/ratatui_ruby/schema/ratatui_logo.rbs +6 -0
- data/sig/ratatui_ruby/schema/ratatui_mascot.rbs +5 -0
- data/sig/ratatui_ruby/schema/rect.rbs +30 -0
- data/sig/ratatui_ruby/schema/row.rbs +7 -1
- data/sig/ratatui_ruby/schema/scrollbar.rbs +6 -0
- data/sig/ratatui_ruby/schema/sparkline.rbs +6 -0
- data/sig/ratatui_ruby/schema/style.rbs +7 -1
- data/sig/ratatui_ruby/schema/table.rbs +11 -1
- data/sig/ratatui_ruby/schema/tabs.rbs +6 -0
- data/sig/ratatui_ruby/schema/text.rbs +7 -1
- data/sig/ratatui_ruby/scrollbar_state.rbs +7 -1
- data/sig/ratatui_ruby/session.rbs +7 -1
- data/sig/ratatui_ruby/table_state.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/event_injection.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/snapshot.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/style_assertions.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/terminal.rbs +7 -1
- data/sig/ratatui_ruby/test_helper/test_doubles.rbs +7 -1
- data/sig/ratatui_ruby/test_helper.rbs +7 -1
- data/sig/ratatui_ruby/tui/buffer_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/canvas_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/core.rbs +7 -1
- data/sig/ratatui_ruby/tui/layout_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/state_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/style_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/text_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui/widget_factories.rbs +7 -1
- data/sig/ratatui_ruby/tui.rbs +7 -1
- data/sig/ratatui_ruby/version.rbs +6 -0
- data/tasks/autodoc/examples.rb +1 -1
- data/tasks/autodoc/member.rb +1 -1
- data/tasks/autodoc/name.rb +1 -1
- data/tasks/bump/cargo_lockfile.rb +1 -1
- data/tasks/bump/changelog.rb +1 -1
- data/tasks/bump/header.rb +1 -1
- data/tasks/bump/history.rb +1 -1
- data/tasks/bump/links.rb +1 -1
- data/tasks/bump/manifest.rb +1 -1
- data/tasks/bump/ruby_gem.rb +1 -1
- data/tasks/bump/sem_ver.rb +1 -1
- data/tasks/bump/unreleased_section.rb +1 -1
- data/tasks/license/headers_md.rb +223 -0
- data/tasks/license/headers_rb.rb +210 -0
- data/tasks/license/license_utils.rb +130 -0
- data/tasks/license/snippets_md.rb +315 -0
- data/tasks/license/snippets_rdoc.rb +150 -0
- data/tasks/license.rake +91 -0
- data/tasks/rdoc_config.rb +1 -1
- data/tasks/resources/build.yml.erb +13 -7
- data/tasks/sourcehut.rake +3 -1
- data/tasks/terminal_preview/app_screenshot.rb +1 -1
- data/tasks/terminal_preview/crash_report.rb +1 -1
- data/tasks/terminal_preview/example_app.rb +1 -1
- data/tasks/terminal_preview/launcher_script.rb +1 -1
- data/tasks/terminal_preview/preview_collection.rb +1 -1
- data/tasks/terminal_preview/preview_timing.rb +1 -1
- data/tasks/terminal_preview/safety_confirmation.rb +1 -1
- data/tasks/terminal_preview/saved_screenshot.rb +1 -1
- data/tasks/terminal_preview/system_appearance.rb +1 -1
- data/tasks/terminal_preview/terminal_window.rb +1 -1
- data/tasks/terminal_preview/window_id.rb +1 -1
- data/tasks/website/index_page.rb +1 -1
- data/tasks/website/version.rb +1 -1
- data/tasks/website/version_menu.rb +1 -1
- data/tasks/website/versioned_documentation.rb +1 -1
- data/tasks/website/website.rb +1 -1
- metadata +13 -3
- data/doc/migration/v0_7_0.md +0 -236
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -69,6 +69,20 @@ module RatatuiRuby
|
|
|
69
69
|
ratio = Float(ratio || 0.0)
|
|
70
70
|
super(ratio:, label:, style:, gauge_style:, block:, use_unicode:)
|
|
71
71
|
end
|
|
72
|
+
|
|
73
|
+
# Returns true if the gauge has any fill (ratio > 0).
|
|
74
|
+
#
|
|
75
|
+
# @return [Boolean]
|
|
76
|
+
def filled?
|
|
77
|
+
ratio > 0
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Returns true if the gauge is at 100% or more (ratio >= 1.0).
|
|
81
|
+
#
|
|
82
|
+
# @return [Boolean]
|
|
83
|
+
def complete?
|
|
84
|
+
ratio >= 1.0
|
|
85
|
+
end
|
|
72
86
|
end
|
|
73
87
|
end
|
|
74
88
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -77,6 +77,20 @@ module RatatuiRuby
|
|
|
77
77
|
unfilled_symbol:
|
|
78
78
|
)
|
|
79
79
|
end
|
|
80
|
+
|
|
81
|
+
# Returns true if the gauge has any fill (ratio > 0).
|
|
82
|
+
#
|
|
83
|
+
# @return [Boolean]
|
|
84
|
+
def filled?
|
|
85
|
+
ratio > 0
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Returns true if the gauge is at 100% or more (ratio >= 1.0).
|
|
89
|
+
#
|
|
90
|
+
# @return [Boolean]
|
|
91
|
+
def complete?
|
|
92
|
+
ratio >= 1.0
|
|
93
|
+
end
|
|
80
94
|
end
|
|
81
95
|
end
|
|
82
96
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -20,6 +20,11 @@ module RatatuiRuby
|
|
|
20
20
|
#
|
|
21
21
|
# === Examples
|
|
22
22
|
#
|
|
23
|
+
#--
|
|
24
|
+
# SPDX-SnippetBegin
|
|
25
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
26
|
+
# SPDX-License-Identifier: MIT-0
|
|
27
|
+
#++
|
|
23
28
|
# # Basic List
|
|
24
29
|
# List.new(items: ["Item 1", "Item 2"])
|
|
25
30
|
#
|
|
@@ -30,7 +35,27 @@ module RatatuiRuby
|
|
|
30
35
|
# highlight_style: Style.new(bg: :blue),
|
|
31
36
|
# highlight_symbol: ">> "
|
|
32
37
|
# )
|
|
38
|
+
#--
|
|
39
|
+
# SPDX-SnippetEnd
|
|
40
|
+
#++
|
|
33
41
|
class List < Data.define(:items, :selected_index, :offset, :style, :highlight_style, :highlight_symbol, :repeat_highlight_symbol, :highlight_spacing, :direction, :scroll_padding, :block)
|
|
42
|
+
##
|
|
43
|
+
# Highlight spacing: always show the spacing column.
|
|
44
|
+
HIGHLIGHT_ALWAYS = :always
|
|
45
|
+
##
|
|
46
|
+
# Highlight spacing: show spacing only when an item is selected (default).
|
|
47
|
+
HIGHLIGHT_WHEN_SELECTED = :when_selected
|
|
48
|
+
##
|
|
49
|
+
# Highlight spacing: never show the spacing column.
|
|
50
|
+
HIGHLIGHT_NEVER = :never
|
|
51
|
+
|
|
52
|
+
##
|
|
53
|
+
# Direction: render items from top to bottom (default).
|
|
54
|
+
DIRECTION_TOP_TO_BOTTOM = :top_to_bottom
|
|
55
|
+
##
|
|
56
|
+
# Direction: render items from bottom to top.
|
|
57
|
+
DIRECTION_BOTTOM_TO_TOP = :bottom_to_top
|
|
58
|
+
|
|
34
59
|
##
|
|
35
60
|
# :attr_reader: items
|
|
36
61
|
# The items to display.
|
|
@@ -124,6 +149,20 @@ module RatatuiRuby
|
|
|
124
149
|
block:
|
|
125
150
|
)
|
|
126
151
|
end
|
|
152
|
+
|
|
153
|
+
# Returns true if an item is selected.
|
|
154
|
+
#
|
|
155
|
+
# @return [Boolean]
|
|
156
|
+
def selected?
|
|
157
|
+
!selected_index.nil?
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Returns true if the list has no items.
|
|
161
|
+
#
|
|
162
|
+
# @return [Boolean]
|
|
163
|
+
def empty?
|
|
164
|
+
items.empty?
|
|
165
|
+
end
|
|
127
166
|
end
|
|
128
167
|
end
|
|
129
168
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -17,6 +17,11 @@ module RatatuiRuby
|
|
|
17
17
|
#
|
|
18
18
|
# === Examples
|
|
19
19
|
#
|
|
20
|
+
#--
|
|
21
|
+
# SPDX-SnippetBegin
|
|
22
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
23
|
+
# SPDX-License-Identifier: MIT-0
|
|
24
|
+
#++
|
|
20
25
|
# # Item with red background
|
|
21
26
|
# ListItem.new(content: "Error", style: Style.new(bg: :red))
|
|
22
27
|
#
|
|
@@ -24,6 +29,9 @@ module RatatuiRuby
|
|
|
24
29
|
# ListItem.new(
|
|
25
30
|
# content: Text::Span.new(content: "Status: OK", style: Style.new(fg: :green, modifiers: [:bold]))
|
|
26
31
|
# )
|
|
32
|
+
#--
|
|
33
|
+
# SPDX-SnippetEnd
|
|
34
|
+
#++
|
|
27
35
|
class ListItem < Data.define(:content, :style)
|
|
28
36
|
##
|
|
29
37
|
# :attr_reader: content
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -19,6 +19,11 @@ module RatatuiRuby
|
|
|
19
19
|
#
|
|
20
20
|
# === Examples
|
|
21
21
|
#
|
|
22
|
+
#--
|
|
23
|
+
# SPDX-SnippetBegin
|
|
24
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
25
|
+
# SPDX-License-Identifier: MIT-0
|
|
26
|
+
#++
|
|
22
27
|
# Overlay.new(
|
|
23
28
|
# layers: [
|
|
24
29
|
# BackgroundMap.new,
|
|
@@ -26,6 +31,9 @@ module RatatuiRuby
|
|
|
26
31
|
# ModalDialog.new # Draws over everything
|
|
27
32
|
# ]
|
|
28
33
|
# )
|
|
34
|
+
#--
|
|
35
|
+
# SPDX-SnippetEnd
|
|
36
|
+
#++
|
|
29
37
|
class Overlay < Data.define(:layers)
|
|
30
38
|
##
|
|
31
39
|
# :attr_reader: layers
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -17,6 +17,11 @@ module RatatuiRuby
|
|
|
17
17
|
#
|
|
18
18
|
# === Examples
|
|
19
19
|
#
|
|
20
|
+
#--
|
|
21
|
+
# SPDX-SnippetBegin
|
|
22
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
23
|
+
# SPDX-License-Identifier: MIT-0
|
|
24
|
+
#++
|
|
20
25
|
# # Basic Text
|
|
21
26
|
# Paragraph.new(text: "Hello, World!")
|
|
22
27
|
#
|
|
@@ -30,6 +35,9 @@ module RatatuiRuby
|
|
|
30
35
|
#
|
|
31
36
|
# # Scrolling mechanism
|
|
32
37
|
# Paragraph.new(text: large_text, scroll: [scroll_y, 0])
|
|
38
|
+
#--
|
|
39
|
+
# SPDX-SnippetEnd
|
|
40
|
+
#++
|
|
33
41
|
class Paragraph < Data.define(:text, :style, :block, :wrap, :alignment, :scroll)
|
|
34
42
|
##
|
|
35
43
|
# :attr_reader: text
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -17,6 +17,11 @@ module RatatuiRuby
|
|
|
17
17
|
#
|
|
18
18
|
# === Examples
|
|
19
19
|
#
|
|
20
|
+
#--
|
|
21
|
+
# SPDX-SnippetBegin
|
|
22
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
23
|
+
# SPDX-License-Identifier: MIT-0
|
|
24
|
+
#++
|
|
20
25
|
# # Row with red background
|
|
21
26
|
# Row.new(cells: ["Error", "Something went wrong"], style: Style.new(bg: :red))
|
|
22
27
|
#
|
|
@@ -28,6 +33,9 @@ module RatatuiRuby
|
|
|
28
33
|
# ],
|
|
29
34
|
# height: 2
|
|
30
35
|
# )
|
|
36
|
+
#--
|
|
37
|
+
# SPDX-SnippetEnd
|
|
38
|
+
#++
|
|
31
39
|
class Row < Data.define(:cells, :style, :height, :top_margin, :bottom_margin)
|
|
32
40
|
##
|
|
33
41
|
# :attr_reader: cells
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -20,6 +20,11 @@ module RatatuiRuby
|
|
|
20
20
|
#
|
|
21
21
|
# === Examples
|
|
22
22
|
#
|
|
23
|
+
#--
|
|
24
|
+
# SPDX-SnippetBegin
|
|
25
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
26
|
+
# SPDX-License-Identifier: MIT-0
|
|
27
|
+
#++
|
|
23
28
|
# # Simple label
|
|
24
29
|
# Shape::Label.new(x: 0, y: 0, text: "Origin")
|
|
25
30
|
#
|
|
@@ -38,6 +43,9 @@ module RatatuiRuby
|
|
|
38
43
|
# Text::Span.new(content: "World", style: Style.new(fg: :blue))
|
|
39
44
|
# ])
|
|
40
45
|
# )
|
|
46
|
+
#--
|
|
47
|
+
# SPDX-SnippetEnd
|
|
48
|
+
#++
|
|
41
49
|
class Label < Data.define(:x, :y, :text, :style)
|
|
42
50
|
##
|
|
43
51
|
# :attr_reader: x
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -72,6 +72,11 @@ module RatatuiRuby
|
|
|
72
72
|
#
|
|
73
73
|
# === Examples
|
|
74
74
|
#
|
|
75
|
+
#--
|
|
76
|
+
# SPDX-SnippetBegin
|
|
77
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
78
|
+
# SPDX-License-Identifier: MIT-0
|
|
79
|
+
#++
|
|
75
80
|
# bar_set: {
|
|
76
81
|
# empty: " ",
|
|
77
82
|
# one_eighth: " ",
|
|
@@ -91,6 +96,9 @@ module RatatuiRuby
|
|
|
91
96
|
#
|
|
92
97
|
# # Array (9 items)
|
|
93
98
|
# bar_set: [" ", " ", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
|
|
99
|
+
#--
|
|
100
|
+
# SPDX-SnippetEnd
|
|
101
|
+
#++
|
|
94
102
|
|
|
95
103
|
BAR_KEYS = %i[empty one_eighth one_quarter three_eighths half five_eighths three_quarters seven_eighths full].freeze
|
|
96
104
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
|
@@ -24,6 +24,38 @@ module RatatuiRuby
|
|
|
24
24
|
#
|
|
25
25
|
# ruby examples/widget_table_flex/app.rb
|
|
26
26
|
class Table < Data.define(:header, :rows, :widths, :row_highlight_style, :highlight_symbol, :highlight_spacing, :column_highlight_style, :cell_highlight_style, :selected_row, :selected_column, :offset, :block, :footer, :flex, :style, :column_spacing)
|
|
27
|
+
##
|
|
28
|
+
# Highlight spacing: always show the spacing column.
|
|
29
|
+
HIGHLIGHT_ALWAYS = :always
|
|
30
|
+
##
|
|
31
|
+
# Highlight spacing: show spacing only when a row is selected (default).
|
|
32
|
+
HIGHLIGHT_WHEN_SELECTED = :when_selected
|
|
33
|
+
##
|
|
34
|
+
# Highlight spacing: never show the spacing column.
|
|
35
|
+
HIGHLIGHT_NEVER = :never
|
|
36
|
+
|
|
37
|
+
##
|
|
38
|
+
# Flex: use legacy column sizing.
|
|
39
|
+
FLEX_LEGACY = :legacy
|
|
40
|
+
##
|
|
41
|
+
# Flex: align columns to start.
|
|
42
|
+
FLEX_START = :start
|
|
43
|
+
##
|
|
44
|
+
# Flex: center columns.
|
|
45
|
+
FLEX_CENTER = :center
|
|
46
|
+
##
|
|
47
|
+
# Flex: align columns to end.
|
|
48
|
+
FLEX_END = :end
|
|
49
|
+
##
|
|
50
|
+
# Flex: space between columns.
|
|
51
|
+
FLEX_SPACE_BETWEEN = :space_between
|
|
52
|
+
##
|
|
53
|
+
# Flex: space around columns.
|
|
54
|
+
FLEX_SPACE_AROUND = :space_around
|
|
55
|
+
##
|
|
56
|
+
# Flex: space evenly between columns.
|
|
57
|
+
FLEX_SPACE_EVENLY = :space_evenly
|
|
58
|
+
|
|
27
59
|
##
|
|
28
60
|
# :attr_reader: header
|
|
29
61
|
# Header row content (Array of Strings, Text::Spans, Text::Lines, or Paragraphs).
|
|
@@ -138,6 +170,34 @@ module RatatuiRuby
|
|
|
138
170
|
column_spacing: Integer(column_spacing)
|
|
139
171
|
)
|
|
140
172
|
end
|
|
173
|
+
|
|
174
|
+
# Returns true if a row is selected.
|
|
175
|
+
#
|
|
176
|
+
# @return [Boolean]
|
|
177
|
+
def row_selected?
|
|
178
|
+
!selected_row.nil?
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Returns true if a column is selected.
|
|
182
|
+
#
|
|
183
|
+
# @return [Boolean]
|
|
184
|
+
def column_selected?
|
|
185
|
+
!selected_column.nil?
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Returns true if both a row and column are selected (a cell is selected).
|
|
189
|
+
#
|
|
190
|
+
# @return [Boolean]
|
|
191
|
+
def cell_selected?
|
|
192
|
+
row_selected? && column_selected?
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# Returns true if the table has no rows.
|
|
196
|
+
#
|
|
197
|
+
# @return [Boolean]
|
|
198
|
+
def empty?
|
|
199
|
+
rows.empty?
|
|
200
|
+
end
|
|
141
201
|
end
|
|
142
202
|
end
|
|
143
203
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
data/lib/ratatui_ruby/widgets.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
module RatatuiRuby
|
data/lib/ratatui_ruby.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
#--
|
|
4
|
-
# SPDX-FileCopyrightText:
|
|
5
|
-
# SPDX-License-Identifier:
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
6
6
|
#++
|
|
7
7
|
|
|
8
8
|
require_relative "ratatui_ruby/version"
|
|
@@ -53,11 +53,19 @@ module RatatuiRuby
|
|
|
53
53
|
#
|
|
54
54
|
# === Example
|
|
55
55
|
#
|
|
56
|
+
#--
|
|
57
|
+
# SPDX-SnippetBegin
|
|
58
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
59
|
+
# SPDX-License-Identifier: MIT-0
|
|
60
|
+
#++
|
|
56
61
|
# begin
|
|
57
62
|
# RatatuiRuby.run { |tui| ... }
|
|
58
63
|
# rescue RatatuiRuby::Error => e
|
|
59
64
|
# puts "RatatuiRuby error: #{e.message}"
|
|
60
65
|
# end
|
|
66
|
+
#--
|
|
67
|
+
# SPDX-SnippetEnd
|
|
68
|
+
#++
|
|
61
69
|
class Error < StandardError
|
|
62
70
|
# Operational failure during terminal I/O.
|
|
63
71
|
#
|
|
@@ -71,11 +79,19 @@ module RatatuiRuby
|
|
|
71
79
|
#
|
|
72
80
|
# === Example
|
|
73
81
|
#
|
|
82
|
+
#--
|
|
83
|
+
# SPDX-SnippetBegin
|
|
84
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
85
|
+
# SPDX-License-Identifier: MIT-0
|
|
86
|
+
#++
|
|
74
87
|
# begin
|
|
75
88
|
# RatatuiRuby.init_terminal
|
|
76
89
|
# rescue RatatuiRuby::Error::Terminal => e
|
|
77
90
|
# puts "Terminal failed: #{e.message}"
|
|
78
91
|
# end
|
|
92
|
+
#--
|
|
93
|
+
# SPDX-SnippetEnd
|
|
94
|
+
#++
|
|
79
95
|
class Terminal < Error; end
|
|
80
96
|
|
|
81
97
|
# Object lifetime violation.
|
|
@@ -91,9 +107,17 @@ module RatatuiRuby
|
|
|
91
107
|
#
|
|
92
108
|
# === Example
|
|
93
109
|
#
|
|
110
|
+
#--
|
|
111
|
+
# SPDX-SnippetBegin
|
|
112
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
113
|
+
# SPDX-License-Identifier: MIT-0
|
|
114
|
+
#++
|
|
94
115
|
# stored_frame = nil
|
|
95
116
|
# RatatuiRuby.draw { |frame| stored_frame = frame }
|
|
96
117
|
# stored_frame.area # => raises Error::Safety
|
|
118
|
+
#--
|
|
119
|
+
# SPDX-SnippetEnd
|
|
120
|
+
#++
|
|
97
121
|
class Safety < Error; end
|
|
98
122
|
|
|
99
123
|
# State invariant violation.
|
|
@@ -109,8 +133,16 @@ module RatatuiRuby
|
|
|
109
133
|
#
|
|
110
134
|
# === Example
|
|
111
135
|
#
|
|
136
|
+
#--
|
|
137
|
+
# SPDX-SnippetBegin
|
|
138
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
139
|
+
# SPDX-License-Identifier: MIT-0
|
|
140
|
+
#++
|
|
112
141
|
# RatatuiRuby.init_terminal
|
|
113
142
|
# RatatuiRuby.init_terminal # => raises Error::Invariant
|
|
143
|
+
#--
|
|
144
|
+
# SPDX-SnippetEnd
|
|
145
|
+
#++
|
|
114
146
|
class Invariant < Error; end
|
|
115
147
|
end
|
|
116
148
|
|
|
@@ -149,8 +181,16 @@ module RatatuiRuby
|
|
|
149
181
|
# [event_type] "key" or "mouse"
|
|
150
182
|
# [data] a Hash containing event data
|
|
151
183
|
#
|
|
184
|
+
#--
|
|
185
|
+
# SPDX-SnippetBegin
|
|
186
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
187
|
+
# SPDX-License-Identifier: MIT-0
|
|
188
|
+
#++
|
|
152
189
|
# inject_test_event("key", { code: "a" })
|
|
153
190
|
#
|
|
191
|
+
#--
|
|
192
|
+
# SPDX-SnippetEnd
|
|
193
|
+
#++
|
|
154
194
|
# (Native method implemented in Rust)
|
|
155
195
|
|
|
156
196
|
##
|
|
@@ -189,20 +229,44 @@ module RatatuiRuby
|
|
|
189
229
|
# {Frame} object for imperative drawing.
|
|
190
230
|
#
|
|
191
231
|
# [tree] A widget tree (Widgets::Paragraph, Layout::Layout, etc.) to render. Optional if
|
|
232
|
+
#--
|
|
233
|
+
# SPDX-SnippetBegin
|
|
234
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
235
|
+
# SPDX-License-Identifier: MIT-0
|
|
236
|
+
#++
|
|
192
237
|
# a block is given.
|
|
193
238
|
#
|
|
239
|
+
#--
|
|
240
|
+
# SPDX-SnippetEnd
|
|
241
|
+
#++
|
|
194
242
|
# === Examples
|
|
195
243
|
#
|
|
196
244
|
# Legacy declarative style (tree-based):
|
|
197
245
|
#
|
|
246
|
+
#--
|
|
247
|
+
# SPDX-SnippetBegin
|
|
248
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
249
|
+
# SPDX-License-Identifier: MIT-0
|
|
250
|
+
#++
|
|
198
251
|
# RatatuiRuby.draw(Widgets::Paragraph.new(text: "Hello"))
|
|
199
252
|
#
|
|
253
|
+
#--
|
|
254
|
+
# SPDX-SnippetEnd
|
|
255
|
+
#++
|
|
200
256
|
# New imperative style (block-based):
|
|
201
257
|
#
|
|
258
|
+
#--
|
|
259
|
+
# SPDX-SnippetBegin
|
|
260
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
261
|
+
# SPDX-License-Identifier: MIT-0
|
|
262
|
+
#++
|
|
202
263
|
# RatatuiRuby.draw do |frame|
|
|
203
264
|
# frame.render_widget(Widgets::Paragraph.new(text: "Hello"), frame.area)
|
|
204
265
|
# end
|
|
205
266
|
#
|
|
267
|
+
#--
|
|
268
|
+
# SPDX-SnippetEnd
|
|
269
|
+
#++
|
|
206
270
|
def self.draw(tree = nil, &block)
|
|
207
271
|
if tree && block
|
|
208
272
|
raise ArgumentError, "Cannot provide both a tree and a block to draw"
|
|
@@ -229,11 +293,24 @@ module RatatuiRuby
|
|
|
229
293
|
# This method checks for an event. It returns the event if one is found. It returns {RatatuiRuby::Event::None} if the timeout expires.
|
|
230
294
|
#
|
|
231
295
|
# [timeout] Float seconds to wait (default: 0.016).
|
|
296
|
+
#--
|
|
297
|
+
# SPDX-SnippetBegin
|
|
298
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
299
|
+
# SPDX-License-Identifier: MIT-0
|
|
300
|
+
#++
|
|
232
301
|
# Pass <tt>nil</tt> to block indefinitely (wait forever).
|
|
233
302
|
# Pass <tt>0.0</tt> for a non-blocking check.
|
|
234
303
|
#
|
|
304
|
+
#--
|
|
305
|
+
# SPDX-SnippetEnd
|
|
306
|
+
#++
|
|
235
307
|
# === Examples
|
|
236
308
|
#
|
|
309
|
+
#--
|
|
310
|
+
# SPDX-SnippetBegin
|
|
311
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long
|
|
312
|
+
# SPDX-License-Identifier: MIT-0
|
|
313
|
+
#++
|
|
237
314
|
# # Standard loop (approx 60 FPS)
|
|
238
315
|
# event = RatatuiRuby.poll_event
|
|
239
316
|
#
|
|
@@ -243,6 +320,9 @@ module RatatuiRuby
|
|
|
243
320
|
# # Non-blocking check (returns immediately)
|
|
244
321
|
# event = RatatuiRuby.poll_event(timeout: 0.0)
|
|
245
322
|
#
|
|
323
|
+
#--
|
|
324
|
+
# SPDX-SnippetEnd
|
|
325
|
+
#++
|
|
246
326
|
def self.poll_event(timeout: 0.016)
|
|
247
327
|
raise ArgumentError, "timeout must be non-negative" if timeout && timeout < 0
|
|
248
328
|
|
|
@@ -293,11 +373,19 @@ module RatatuiRuby
|
|
|
293
373
|
#
|
|
294
374
|
# === Example
|
|
295
375
|
#
|
|
376
|
+
#--
|
|
377
|
+
# SPDX-SnippetBegin
|
|
378
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long
|
|
379
|
+
# SPDX-License-Identifier: MIT-0
|
|
380
|
+
#++
|
|
296
381
|
# cell = RatatuiRuby.get_cell_at(10, 5)
|
|
297
382
|
# expect(cell.symbol).to eq("X")
|
|
298
383
|
# expect(cell.fg).to eq(:red)
|
|
299
384
|
# expect(cell).to be_bold
|
|
300
385
|
#
|
|
386
|
+
#--
|
|
387
|
+
# SPDX-SnippetEnd
|
|
388
|
+
#++
|
|
301
389
|
def self.get_cell_at(x, y)
|
|
302
390
|
raw = _get_cell_at(x, y)
|
|
303
391
|
Buffer::Cell.new(
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
#--
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
6
|
+
#++
|
|
7
|
+
|
|
2
8
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
3
9
|
|
|
4
10
|
module View
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
#--
|
|
4
|
+
# SPDX-FileCopyrightText: 2026 Kerrick Long <me@kerricklong.com>
|
|
5
|
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
6
|
+
#++
|
|
7
|
+
|
|
2
8
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
3
9
|
|
|
4
10
|
class ViewState < Data
|