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
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-FileCopyrightText: 2025 Kerrick Long <me@kerricklong.com>
|
|
4
|
+
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
|
+
|
|
6
|
+
module RatatuiRuby
|
|
7
|
+
# Provides access to the terminal buffer for rendering widgets.
|
|
8
|
+
#
|
|
9
|
+
# Rendering in immediate-mode TUIs requires knowing the terminal dimensions and
|
|
10
|
+
# placing widgets at specific positions. Without explicit control, layout
|
|
11
|
+
# calculations become duplicated between rendering and hit testing.
|
|
12
|
+
#
|
|
13
|
+
# This class exposes the terminal frame during a draw call. It provides the
|
|
14
|
+
# current area and methods to render widgets at precise locations.
|
|
15
|
+
#
|
|
16
|
+
# Use it inside a <tt>RatatuiRuby.draw</tt> block to render widgets with full
|
|
17
|
+
# control over placement.
|
|
18
|
+
#
|
|
19
|
+
# === Examples
|
|
20
|
+
#
|
|
21
|
+
# Basic usage with a single widget:
|
|
22
|
+
#
|
|
23
|
+
# RatatuiRuby.draw do |frame|
|
|
24
|
+
# paragraph = RatatuiRuby::Paragraph.new(text: "Hello, world!")
|
|
25
|
+
# frame.render_widget(paragraph, frame.area)
|
|
26
|
+
# end
|
|
27
|
+
#
|
|
28
|
+
# Using Layout.split for multi-region layouts:
|
|
29
|
+
#
|
|
30
|
+
# RatatuiRuby.draw do |frame|
|
|
31
|
+
# sidebar, main = RatatuiRuby::Layout.split(
|
|
32
|
+
# frame.area,
|
|
33
|
+
# direction: :horizontal,
|
|
34
|
+
# constraints: [
|
|
35
|
+
# RatatuiRuby::Constraint.length(20),
|
|
36
|
+
# RatatuiRuby::Constraint.fill(1)
|
|
37
|
+
# ]
|
|
38
|
+
# )
|
|
39
|
+
#
|
|
40
|
+
# frame.render_widget(sidebar_widget, sidebar)
|
|
41
|
+
# frame.render_widget(main_widget, main)
|
|
42
|
+
#
|
|
43
|
+
# # Store rects for hit testing — no duplication!
|
|
44
|
+
# @regions = { sidebar: sidebar, main: main }
|
|
45
|
+
# end
|
|
46
|
+
class Frame
|
|
47
|
+
##
|
|
48
|
+
# :method: area
|
|
49
|
+
# :call-seq: area() -> Rect
|
|
50
|
+
#
|
|
51
|
+
# Returns the full terminal area as a Rect.
|
|
52
|
+
#
|
|
53
|
+
# The returned Rect represents the entire drawable area of the terminal.
|
|
54
|
+
# Use it as the starting point for layout calculations.
|
|
55
|
+
#
|
|
56
|
+
# === Example
|
|
57
|
+
#
|
|
58
|
+
# RatatuiRuby.draw do |frame|
|
|
59
|
+
# puts "Terminal size: #{frame.area.width}x#{frame.area.height}"
|
|
60
|
+
# end
|
|
61
|
+
#
|
|
62
|
+
# (Native method implemented in Rust)
|
|
63
|
+
|
|
64
|
+
##
|
|
65
|
+
# :method: render_widget
|
|
66
|
+
# :call-seq: render_widget(widget, area) -> nil
|
|
67
|
+
#
|
|
68
|
+
# Renders a widget at the specified area.
|
|
69
|
+
#
|
|
70
|
+
# Widgets in RatatuiRuby are immutable Data objects. This method takes a
|
|
71
|
+
# widget and a Rect, rendering the widget's content within that region.
|
|
72
|
+
#
|
|
73
|
+
# [widget]
|
|
74
|
+
# The widget to render (Paragraph, Layout, List, Table, etc.).
|
|
75
|
+
# [area]
|
|
76
|
+
# A Rect specifying where to render the widget.
|
|
77
|
+
#
|
|
78
|
+
# === Example
|
|
79
|
+
#
|
|
80
|
+
# RatatuiRuby.draw do |frame|
|
|
81
|
+
# para = RatatuiRuby::Paragraph.new(text: "Content")
|
|
82
|
+
# frame.render_widget(para, frame.area)
|
|
83
|
+
# end
|
|
84
|
+
#
|
|
85
|
+
# (Native method implemented in Rust)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
module RatatuiRuby
|
|
7
7
|
class BarChart
|
|
8
8
|
# A bar in a grouped bar chart.
|
|
9
|
-
#
|
|
9
|
+
#
|
|
10
10
|
# === Examples
|
|
11
11
|
#
|
|
12
12
|
# BarChart::Bar.new(value: 10, style: Style.new(fg: :red), label: "A")
|
|
@@ -14,32 +14,32 @@ module RatatuiRuby
|
|
|
14
14
|
##
|
|
15
15
|
# :attr_reader: value
|
|
16
16
|
# The value of the bar (Integer).
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
##
|
|
19
19
|
# :attr_reader: label
|
|
20
20
|
# The label of the bar (optional String).
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
##
|
|
23
23
|
# :attr_reader: style
|
|
24
24
|
# The style of the bar (optional Style).
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
##
|
|
27
27
|
# :attr_reader: value_style
|
|
28
28
|
# The style of the value (optional Style).
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
##
|
|
31
31
|
# :attr_reader: text_value
|
|
32
32
|
# The text to display as the value (optional String).
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
def initialize(value:, label: nil, style: nil, value_style: nil, text_value: nil)
|
|
35
35
|
super(
|
|
36
36
|
value: Integer(value),
|
|
37
|
-
label
|
|
38
|
-
style
|
|
39
|
-
value_style
|
|
40
|
-
text_value:
|
|
37
|
+
label:,
|
|
38
|
+
style:,
|
|
39
|
+
value_style:,
|
|
40
|
+
text_value:
|
|
41
41
|
)
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
end
|
|
45
|
-
end
|
|
45
|
+
end
|
|
@@ -4,234 +4,234 @@
|
|
|
4
4
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
5
5
|
|
|
6
6
|
module RatatuiRuby
|
|
7
|
-
|
|
7
|
+
# Displays categorical data as bars.
|
|
8
|
+
#
|
|
9
|
+
# Raw tables of numbers are hard to scan. Comparing magnitudes requires mental arithmetic, which slows down decision-making.
|
|
10
|
+
#
|
|
11
|
+
# This widget visualizes the data. It renders vertical bars proportional to their value.
|
|
12
|
+
#
|
|
13
|
+
# Use it to compare server loads, sales figures, or any discrete datasets.
|
|
14
|
+
#
|
|
15
|
+
# {rdoc-image:/doc/images/widget_barchart_demo.png}[link:/examples/widget_barchart_demo/app_rb.html]
|
|
16
|
+
#
|
|
17
|
+
# === Example
|
|
18
|
+
#
|
|
19
|
+
# Run the interactive demo from the terminal:
|
|
20
|
+
#
|
|
21
|
+
# ruby examples/widget_barchart_demo/app.rb
|
|
22
|
+
#
|
|
23
|
+
# # Grouped Bar Chart
|
|
24
|
+
# BarChart.new(
|
|
25
|
+
# data: [
|
|
26
|
+
# BarGroup.new(label: "Q1", bars: [Bar.new(value: 40), Bar.new(value: 45)]),
|
|
27
|
+
# BarGroup.new(label: "Q2", bars: [Bar.new(value: 50), Bar.new(value: 55)])
|
|
28
|
+
# ],
|
|
29
|
+
# bar_width: 5,
|
|
30
|
+
# group_gap: 3
|
|
31
|
+
# )
|
|
32
|
+
class BarChart < Data.define(:data, :bar_width, :bar_gap, :group_gap, :max, :style, :block, :direction, :label_style, :value_style, :bar_set)
|
|
33
|
+
##
|
|
34
|
+
##
|
|
35
|
+
##
|
|
36
|
+
##
|
|
37
|
+
# :attr_reader: data
|
|
38
|
+
# The data to display.
|
|
8
39
|
#
|
|
9
|
-
#
|
|
40
|
+
# Supports multiple formats:
|
|
41
|
+
# [<tt>Hash</tt>]
|
|
42
|
+
# Mapping labels (<tt>String</tt> or <tt>Symbol</tt>) to values (<tt>Integer</tt>).
|
|
43
|
+
# [<tt>Array</tt> of tuples]
|
|
44
|
+
# Ordered list of <tt>["Label", Value]</tt> or <tt>["Label", Value, Style]</tt> pairs.
|
|
45
|
+
# [<tt>Array</tt> of <tt>BarChart::BarGroup</tt>]
|
|
46
|
+
# List of <tt>BarChart::BarGroup</tt> objects for grouped charts.
|
|
10
47
|
#
|
|
11
|
-
#
|
|
48
|
+
# === Examples
|
|
49
|
+
#
|
|
50
|
+
# Hash (Simple):
|
|
51
|
+
# { "Apples" => 10, :Oranges => 15 }
|
|
12
52
|
#
|
|
13
|
-
#
|
|
53
|
+
# Array of Tuples (Ordered):
|
|
54
|
+
# [["Mon", 20], ["Tue", 30], ["Wed", 25]]
|
|
55
|
+
#
|
|
56
|
+
# BarGroup (Grouped):
|
|
57
|
+
# [
|
|
58
|
+
# RatatuiRuby::BarChart::BarGroup.new(label: "Q1", bars: [
|
|
59
|
+
# RatatuiRuby::BarChart::Bar.new(value: 50, label: "Rev"),
|
|
60
|
+
# RatatuiRuby::BarChart::Bar.new(value: 30, label: "Cost")
|
|
61
|
+
# ])
|
|
62
|
+
# ]
|
|
63
|
+
|
|
64
|
+
##
|
|
65
|
+
# :attr_reader: bar_width
|
|
66
|
+
# Width of each bar in characters.
|
|
67
|
+
|
|
68
|
+
##
|
|
69
|
+
# :attr_reader: bar_gap
|
|
70
|
+
# Spaces between bars.
|
|
71
|
+
|
|
72
|
+
##
|
|
73
|
+
# :attr_reader: group_gap
|
|
74
|
+
# Spaces between groups (for grouped bar charts).
|
|
75
|
+
|
|
76
|
+
##
|
|
77
|
+
# :attr_reader: max
|
|
78
|
+
# Maximum value for the Y-axis (optional).
|
|
79
|
+
#
|
|
80
|
+
# If nil, it is calculated from the data.
|
|
81
|
+
|
|
82
|
+
##
|
|
83
|
+
# :attr_reader: style
|
|
84
|
+
# Style for the bars.
|
|
85
|
+
|
|
86
|
+
##
|
|
87
|
+
# :attr_reader: block
|
|
88
|
+
# Optional wrapping block.
|
|
89
|
+
|
|
90
|
+
##
|
|
91
|
+
# :attr_reader: label_style
|
|
92
|
+
# Style for the bar labels (optional).
|
|
93
|
+
|
|
94
|
+
##
|
|
95
|
+
# :attr_reader: value_style
|
|
96
|
+
# Style for the bar values (optional).
|
|
97
|
+
|
|
98
|
+
##
|
|
99
|
+
# :attr_reader: bar_set
|
|
100
|
+
# Custom characters for the bars (optional).
|
|
101
|
+
#
|
|
102
|
+
# A Hash with keys defining the characters for the bars.
|
|
103
|
+
# 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>.
|
|
104
|
+
#
|
|
105
|
+
# You can also use integers (0-8) as keys, where 0 is empty, 4 is half, and 8 is full.
|
|
106
|
+
#
|
|
107
|
+
# Alternatively, you can pass an Array of 9 strings, where index 0 is empty and index 8 is full.
|
|
14
108
|
#
|
|
15
109
|
# === Examples
|
|
16
110
|
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
111
|
+
# bar_set: {
|
|
112
|
+
# empty: " ",
|
|
113
|
+
# one_eighth: " ",
|
|
114
|
+
# one_quarter: "▂",
|
|
115
|
+
# three_eighths: "▃",
|
|
116
|
+
# half: "▄",
|
|
117
|
+
# five_eighths: "▅",
|
|
118
|
+
# three_quarters: "▆",
|
|
119
|
+
# seven_eighths: "▇",
|
|
120
|
+
# full: "█"
|
|
121
|
+
# }
|
|
22
122
|
#
|
|
23
|
-
# #
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
##
|
|
69
|
-
# :attr_reader: bar_gap
|
|
70
|
-
# Spaces between bars.
|
|
71
|
-
|
|
72
|
-
##
|
|
73
|
-
# :attr_reader: group_gap
|
|
74
|
-
# Spaces between groups (for grouped bar charts).
|
|
75
|
-
|
|
76
|
-
##
|
|
77
|
-
# :attr_reader: max
|
|
78
|
-
# Maximum value for the Y-axis (optional).
|
|
79
|
-
#
|
|
80
|
-
# If nil, it is calculated from the data.
|
|
81
|
-
|
|
82
|
-
##
|
|
83
|
-
# :attr_reader: style
|
|
84
|
-
# Style for the bars.
|
|
85
|
-
|
|
86
|
-
##
|
|
87
|
-
# :attr_reader: block
|
|
88
|
-
# Optional wrapping block.
|
|
89
|
-
|
|
90
|
-
##
|
|
91
|
-
# :attr_reader: label_style
|
|
92
|
-
# Style for the bar labels (optional).
|
|
93
|
-
|
|
94
|
-
##
|
|
95
|
-
# :attr_reader: value_style
|
|
96
|
-
# Style for the bar values (optional).
|
|
97
|
-
|
|
98
|
-
##
|
|
99
|
-
# :attr_reader: bar_set
|
|
100
|
-
# Custom characters for the bars (optional).
|
|
101
|
-
#
|
|
102
|
-
# A Hash with keys defining the characters for the bars.
|
|
103
|
-
# 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>.
|
|
104
|
-
#
|
|
105
|
-
# You can also use integers (0-8) as keys, where 0 is empty, 4 is half, and 8 is full.
|
|
106
|
-
#
|
|
107
|
-
# Alternatively, you can pass an Array of 9 strings, where index 0 is empty and index 8 is full.
|
|
108
|
-
#
|
|
109
|
-
# === Examples
|
|
110
|
-
#
|
|
111
|
-
# bar_set: {
|
|
112
|
-
# empty: " ",
|
|
113
|
-
# one_eighth: " ",
|
|
114
|
-
# one_quarter: "▂",
|
|
115
|
-
# three_eighths: "▃",
|
|
116
|
-
# half: "▄",
|
|
117
|
-
# five_eighths: "▅",
|
|
118
|
-
# three_quarters: "▆",
|
|
119
|
-
# seven_eighths: "▇",
|
|
120
|
-
# full: "█"
|
|
121
|
-
# }
|
|
122
|
-
#
|
|
123
|
-
# # Numeric keys (0-8)
|
|
124
|
-
# bar_set: {
|
|
125
|
-
# 0 => " ", 1 => " ", 2 => "▂", 3 => "▃", 4 => "▄", 5 => "▅", 6 => "▆", 7 => "▇", 8 => "█"
|
|
126
|
-
# }
|
|
127
|
-
#
|
|
128
|
-
# # Array (9 items)
|
|
129
|
-
# bar_set: [" ", " ", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
|
|
130
|
-
|
|
131
|
-
BAR_KEYS = %i[empty one_eighth one_quarter three_eighths half five_eighths three_quarters seven_eighths full].freeze
|
|
132
|
-
|
|
133
|
-
# Creates a new BarChart widget.
|
|
134
|
-
#
|
|
135
|
-
# [data]
|
|
136
|
-
# Data to display. Hash, Array of arrays, or Array of BarGroup.
|
|
137
|
-
# [bar_width]
|
|
138
|
-
# Width of each bar (Integer).
|
|
139
|
-
# [bar_gap]
|
|
140
|
-
# Gap between bars (Integer).
|
|
141
|
-
# [group_gap]
|
|
142
|
-
# Gap between groups (Integer).
|
|
143
|
-
# [max]
|
|
144
|
-
# Maximum value of the bar chart (Integer).
|
|
145
|
-
# [style]
|
|
146
|
-
# Base style for the widget (Style).
|
|
147
|
-
# [block]
|
|
148
|
-
# Block to render around the chart (Block).
|
|
149
|
-
# [direction]
|
|
150
|
-
# Direction of the bars (:vertical or :horizontal).
|
|
151
|
-
# [label_style]
|
|
152
|
-
# Style object for labels (optional).
|
|
153
|
-
# [value_style]
|
|
154
|
-
# Style object for values (optional).
|
|
155
|
-
# [bar_set]
|
|
156
|
-
# Hash or Array: Custom characters for the bars.
|
|
157
|
-
def initialize(data:, bar_width: 3, bar_gap: 1, group_gap: 0, max: nil, style: nil, block: nil, direction: :vertical, label_style: nil, value_style: nil, bar_set: nil)
|
|
158
|
-
if bar_set
|
|
159
|
-
if bar_set.is_a?(Array) && bar_set.size == 9
|
|
160
|
-
# Convert Array to Hash using BAR_KEYS order
|
|
161
|
-
bar_set = BAR_KEYS.zip(bar_set).to_h
|
|
162
|
-
else
|
|
163
|
-
bar_set = bar_set.dup
|
|
164
|
-
# Normalize numeric keys (0-8) to symbolic keys
|
|
165
|
-
BAR_KEYS.each_with_index do |key, i|
|
|
166
|
-
if val = bar_set.delete(i) || bar_set.delete(i.to_s)
|
|
167
|
-
bar_set[key] = val
|
|
168
|
-
end
|
|
123
|
+
# # Numeric keys (0-8)
|
|
124
|
+
# bar_set: {
|
|
125
|
+
# 0 => " ", 1 => " ", 2 => "▂", 3 => "▃", 4 => "▄", 5 => "▅", 6 => "▆", 7 => "▇", 8 => "█"
|
|
126
|
+
# }
|
|
127
|
+
#
|
|
128
|
+
# # Array (9 items)
|
|
129
|
+
# bar_set: [" ", " ", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
|
|
130
|
+
|
|
131
|
+
BAR_KEYS = %i[empty one_eighth one_quarter three_eighths half five_eighths three_quarters seven_eighths full].freeze
|
|
132
|
+
|
|
133
|
+
# Creates a new BarChart widget.
|
|
134
|
+
#
|
|
135
|
+
# [data]
|
|
136
|
+
# Data to display. Hash, Array of arrays, or Array of BarGroup.
|
|
137
|
+
# [bar_width]
|
|
138
|
+
# Width of each bar (Integer).
|
|
139
|
+
# [bar_gap]
|
|
140
|
+
# Gap between bars (Integer).
|
|
141
|
+
# [group_gap]
|
|
142
|
+
# Gap between groups (Integer).
|
|
143
|
+
# [max]
|
|
144
|
+
# Maximum value of the bar chart (Integer).
|
|
145
|
+
# [style]
|
|
146
|
+
# Base style for the widget (Style).
|
|
147
|
+
# [block]
|
|
148
|
+
# Block to render around the chart (Block).
|
|
149
|
+
# [direction]
|
|
150
|
+
# Direction of the bars (:vertical or :horizontal).
|
|
151
|
+
# [label_style]
|
|
152
|
+
# Style object for labels (optional).
|
|
153
|
+
# [value_style]
|
|
154
|
+
# Style object for values (optional).
|
|
155
|
+
# [bar_set]
|
|
156
|
+
# Hash or Array: Custom characters for the bars.
|
|
157
|
+
def initialize(data:, bar_width: 3, bar_gap: 1, group_gap: 0, max: nil, style: nil, block: nil, direction: :vertical, label_style: nil, value_style: nil, bar_set: nil)
|
|
158
|
+
if bar_set
|
|
159
|
+
if bar_set.is_a?(Array) && bar_set.size == 9
|
|
160
|
+
# Convert Array to Hash using BAR_KEYS order
|
|
161
|
+
bar_set = BAR_KEYS.zip(bar_set).to_h
|
|
162
|
+
else
|
|
163
|
+
bar_set = bar_set.dup
|
|
164
|
+
# Normalize numeric keys (0-8) to symbolic keys
|
|
165
|
+
BAR_KEYS.each_with_index do |key, i|
|
|
166
|
+
if (val = bar_set.delete(i) || bar_set.delete(i.to_s))
|
|
167
|
+
bar_set[key] = val
|
|
169
168
|
end
|
|
170
169
|
end
|
|
171
170
|
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Normalize data to Array of BarGroup
|
|
174
|
+
data = if data.is_a?(Hash)
|
|
175
|
+
if direction == :horizontal
|
|
176
|
+
bars = data.map do |label, value|
|
|
177
|
+
Bar.new(value:, label: label.to_s)
|
|
178
|
+
end
|
|
179
|
+
[BarGroup.new(label: "", bars:)]
|
|
180
|
+
else
|
|
181
|
+
data.map do |label, value|
|
|
182
|
+
BarGroup.new(label: label.to_s, bars: [Bar.new(value:)])
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
elsif data.is_a?(Array)
|
|
186
|
+
if data.empty?
|
|
187
|
+
[]
|
|
188
|
+
elsif data.first.is_a?(BarGroup)
|
|
189
|
+
data
|
|
190
|
+
elsif data.first.is_a?(Array)
|
|
191
|
+
# Tuples
|
|
192
|
+
if direction == :horizontal
|
|
193
|
+
bars = data.map do |item|
|
|
194
|
+
label = item[0].to_s
|
|
195
|
+
value = item[1]
|
|
196
|
+
style = item[2]
|
|
197
|
+
|
|
198
|
+
bar = Bar.new(value:, label:)
|
|
199
|
+
bar = bar.with(style:) if style
|
|
200
|
+
bar
|
|
201
|
+
end
|
|
202
|
+
[BarGroup.new(label: "", bars:)]
|
|
203
|
+
else
|
|
204
|
+
data.map do |item|
|
|
205
|
+
label = item[0].to_s
|
|
206
|
+
value = item[1]
|
|
207
|
+
style = item[2]
|
|
172
208
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
end
|
|
185
|
-
elsif data.is_a?(Array)
|
|
186
|
-
if data.empty?
|
|
187
|
-
[]
|
|
188
|
-
elsif data.first.is_a?(BarGroup)
|
|
189
|
-
data
|
|
190
|
-
elsif data.first.is_a?(Array)
|
|
191
|
-
# Tuples
|
|
192
|
-
if direction == :horizontal
|
|
193
|
-
bars = data.map do |item|
|
|
194
|
-
label = item[0].to_s
|
|
195
|
-
value = item[1]
|
|
196
|
-
style = item[2]
|
|
197
|
-
|
|
198
|
-
bar = Bar.new(value: value, label: label)
|
|
199
|
-
bar = bar.with(style: style) if style
|
|
200
|
-
bar
|
|
201
|
-
end
|
|
202
|
-
[BarGroup.new(label: "", bars: bars)]
|
|
203
|
-
else
|
|
204
|
-
data.map do |item|
|
|
205
|
-
label = item[0].to_s
|
|
206
|
-
value = item[1]
|
|
207
|
-
style = item[2]
|
|
208
|
-
|
|
209
|
-
bar = Bar.new(value: value)
|
|
210
|
-
bar = bar.with(style: style) if style
|
|
211
|
-
BarGroup.new(label: label, bars: [bar])
|
|
212
|
-
end
|
|
213
|
-
end
|
|
214
|
-
else
|
|
215
|
-
# Fallback
|
|
216
|
-
data
|
|
217
|
-
end
|
|
218
|
-
else
|
|
219
|
-
data
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
super(
|
|
223
|
-
data: data,
|
|
224
|
-
bar_width: Integer(bar_width),
|
|
225
|
-
bar_gap: Integer(bar_gap),
|
|
226
|
-
group_gap: Integer(group_gap),
|
|
227
|
-
max: max.nil? ? nil : Integer(max),
|
|
228
|
-
style: style,
|
|
229
|
-
block: block,
|
|
230
|
-
direction: direction,
|
|
231
|
-
label_style: label_style,
|
|
232
|
-
value_style: value_style,
|
|
233
|
-
bar_set: bar_set
|
|
234
|
-
)
|
|
209
|
+
bar = Bar.new(value:)
|
|
210
|
+
bar = bar.with(style:) if style
|
|
211
|
+
BarGroup.new(label:, bars: [bar])
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
else
|
|
215
|
+
# Fallback
|
|
216
|
+
data
|
|
217
|
+
end
|
|
218
|
+
else
|
|
219
|
+
data
|
|
235
220
|
end
|
|
221
|
+
|
|
222
|
+
super(
|
|
223
|
+
data:,
|
|
224
|
+
bar_width: Integer(bar_width),
|
|
225
|
+
bar_gap: Integer(bar_gap),
|
|
226
|
+
group_gap: Integer(group_gap),
|
|
227
|
+
max: max.nil? ? nil : Integer(max),
|
|
228
|
+
style:,
|
|
229
|
+
block:,
|
|
230
|
+
direction:,
|
|
231
|
+
label_style:,
|
|
232
|
+
value_style:,
|
|
233
|
+
bar_set:
|
|
234
|
+
)
|
|
236
235
|
end
|
|
236
|
+
end
|
|
237
237
|
end
|