whirled_peas 0.7.1 → 0.11.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/.gitignore +1 -0
- data/CHANGELOG.md +25 -0
- data/README.md +530 -121
- data/Rakefile +1 -20
- data/bin/easing +33 -0
- data/bin/reset_cursor +11 -0
- data/bin/screen_test +68 -0
- data/examples/components.rb +35 -0
- data/examples/graph.rb +54 -0
- data/examples/intro.rb +3 -3
- data/examples/scrolling.rb +13 -23
- data/lib/data/themes.yaml +13 -0
- data/lib/whirled_peas.rb +33 -13
- data/lib/whirled_peas/animator.rb +5 -0
- data/lib/whirled_peas/animator/debug_consumer.rb +17 -0
- data/lib/whirled_peas/animator/easing.rb +72 -0
- data/lib/whirled_peas/animator/frame.rb +5 -0
- data/lib/whirled_peas/animator/frameset.rb +33 -0
- data/lib/whirled_peas/animator/producer.rb +35 -0
- data/lib/whirled_peas/animator/renderer_consumer.rb +31 -0
- data/lib/whirled_peas/command.rb +5 -0
- data/lib/whirled_peas/command/base.rb +86 -0
- data/lib/whirled_peas/command/config_command.rb +44 -0
- data/lib/whirled_peas/command/debug.rb +21 -0
- data/lib/whirled_peas/command/fonts.rb +22 -0
- data/lib/whirled_peas/command/frame_command.rb +34 -0
- data/lib/whirled_peas/command/frames.rb +24 -0
- data/lib/whirled_peas/command/help.rb +38 -0
- data/lib/whirled_peas/command/play.rb +112 -0
- data/lib/whirled_peas/command/record.rb +57 -0
- data/lib/whirled_peas/command/still.rb +29 -0
- data/lib/whirled_peas/command/themes.rb +77 -0
- data/lib/whirled_peas/command_line.rb +24 -212
- data/lib/whirled_peas/component.rb +35 -0
- data/lib/whirled_peas/component/list_with_active.rb +88 -0
- data/lib/whirled_peas/config.rb +56 -6
- data/lib/whirled_peas/device.rb +5 -0
- data/lib/whirled_peas/device/null_device.rb +8 -0
- data/lib/whirled_peas/device/output_file.rb +19 -0
- data/lib/whirled_peas/device/screen.rb +26 -0
- data/lib/whirled_peas/graphics/box_painter.rb +4 -4
- data/lib/whirled_peas/graphics/composer.rb +27 -2
- data/lib/whirled_peas/graphics/container_coords.rb +24 -2
- data/lib/whirled_peas/graphics/container_painter.rb +63 -82
- data/lib/whirled_peas/graphics/content_dimensions.rb +19 -0
- data/lib/whirled_peas/graphics/content_painter.rb +20 -0
- data/lib/whirled_peas/graphics/debugger.rb +1 -7
- data/lib/whirled_peas/graphics/graph_dimensions.rb +12 -0
- data/lib/whirled_peas/graphics/graph_painter.rb +97 -0
- data/lib/whirled_peas/graphics/grid_painter.rb +0 -3
- data/lib/whirled_peas/graphics/painter.rb +10 -0
- data/lib/whirled_peas/graphics/renderer.rb +8 -2
- data/lib/whirled_peas/graphics/scrollbar_helper.rb +124 -0
- data/lib/whirled_peas/graphics/text_painter.rb +7 -11
- data/lib/whirled_peas/null_logger.rb +0 -1
- data/lib/whirled_peas/settings/border.rb +25 -4
- data/lib/whirled_peas/settings/container_settings.rb +14 -9
- data/lib/whirled_peas/settings/debugger.rb +1 -1
- data/lib/whirled_peas/settings/element_settings.rb +12 -3
- data/lib/whirled_peas/settings/graph_settings.rb +21 -0
- data/lib/whirled_peas/settings/grid_settings.rb +7 -0
- data/lib/whirled_peas/settings/position.rb +17 -5
- data/lib/whirled_peas/settings/text_settings.rb +1 -0
- data/lib/whirled_peas/settings/theme.rb +40 -0
- data/lib/whirled_peas/settings/theme_library.rb +63 -0
- data/lib/whirled_peas/utils/ansi.rb +13 -0
- data/lib/whirled_peas/utils/file_handler.rb +57 -0
- data/lib/whirled_peas/version.rb +1 -1
- data/screen_test/components/list_with_active/l2r_active_color.frame +1 -0
- data/screen_test/components/list_with_active/l2r_active_color.rb +18 -0
- data/screen_test/components/list_with_active/l2r_position_end.frame +1 -0
- data/screen_test/components/list_with_active/l2r_position_end.rb +16 -0
- data/screen_test/components/list_with_active/l2r_position_middle.frame +1 -0
- data/screen_test/components/list_with_active/l2r_position_middle.rb +16 -0
- data/screen_test/components/list_with_active/l2r_position_start.frame +1 -0
- data/screen_test/components/list_with_active/l2r_position_start.rb +16 -0
- data/screen_test/components/list_with_active/l2r_separator.frame +1 -0
- data/screen_test/components/list_with_active/l2r_separator.rb +17 -0
- data/screen_test/components/list_with_active/t2b_active_color.frame +1 -0
- data/screen_test/components/list_with_active/t2b_active_color.rb +19 -0
- data/screen_test/components/list_with_active/t2b_position_end.frame +1 -0
- data/screen_test/components/list_with_active/t2b_position_end.rb +17 -0
- data/screen_test/components/list_with_active/t2b_position_middle.frame +1 -0
- data/screen_test/components/list_with_active/t2b_position_middle.rb +17 -0
- data/screen_test/components/list_with_active/t2b_position_start.frame +1 -0
- data/screen_test/components/list_with_active/t2b_position_start.rb +17 -0
- data/screen_test/components/list_with_active/t2b_separator.frame +1 -0
- data/screen_test/components/list_with_active/t2b_separator.rb +18 -0
- data/screen_test/elements/box.frame +1 -1
- data/screen_test/elements/box.rb +1 -1
- data/screen_test/elements/graph.frame +1 -0
- data/screen_test/elements/graph.rb +12 -0
- data/screen_test/elements/grid.frame +1 -1
- data/screen_test/elements/grid.rb +1 -1
- data/screen_test/elements/screen_overflow_x.frame +1 -1
- data/screen_test/elements/screen_overflow_x.rb +1 -1
- data/screen_test/elements/screen_overflow_y.frame +1 -1
- data/screen_test/elements/screen_overflow_y.rb +1 -1
- data/screen_test/elements/text.frame +1 -1
- data/screen_test/elements/text.rb +1 -1
- data/screen_test/elements/text_multiline.frame +1 -1
- data/screen_test/elements/text_multiline.rb +1 -1
- data/screen_test/elements/theme.frame +1 -0
- data/screen_test/elements/theme.rb +26 -0
- data/screen_test/settings/align/box_around.frame +1 -1
- data/screen_test/settings/align/box_around.rb +1 -1
- data/screen_test/settings/align/box_between.frame +1 -1
- data/screen_test/settings/align/box_between.rb +1 -1
- data/screen_test/settings/align/box_center.frame +1 -1
- data/screen_test/settings/align/box_center.rb +1 -1
- data/screen_test/settings/align/box_default.frame +1 -1
- data/screen_test/settings/align/box_default.rb +1 -1
- data/screen_test/settings/align/box_evenly.frame +1 -1
- data/screen_test/settings/align/box_evenly.rb +1 -1
- data/screen_test/settings/align/box_left.frame +1 -1
- data/screen_test/settings/align/box_left.rb +1 -1
- data/screen_test/settings/align/box_right.frame +1 -1
- data/screen_test/settings/align/box_right.rb +1 -1
- data/screen_test/settings/align/children_center.frame +1 -1
- data/screen_test/settings/align/children_center.rb +1 -1
- data/screen_test/settings/align/children_left.frame +1 -1
- data/screen_test/settings/align/children_left.rb +1 -1
- data/screen_test/settings/align/children_right.frame +1 -1
- data/screen_test/settings/align/children_right.rb +1 -1
- data/screen_test/settings/align/grid_center.frame +1 -1
- data/screen_test/settings/align/grid_center.rb +1 -1
- data/screen_test/settings/align/grid_default.frame +1 -1
- data/screen_test/settings/align/grid_default.rb +1 -1
- data/screen_test/settings/align/grid_left.frame +1 -1
- data/screen_test/settings/align/grid_left.rb +1 -1
- data/screen_test/settings/align/grid_right.frame +1 -1
- data/screen_test/settings/align/grid_right.rb +1 -1
- data/screen_test/settings/ansi/bold.frame +1 -1
- data/screen_test/settings/ansi/bold.rb +1 -1
- data/screen_test/settings/ansi/color.frame +1 -1
- data/screen_test/settings/ansi/color.rb +1 -1
- data/screen_test/settings/ansi/underline.frame +1 -1
- data/screen_test/settings/ansi/underline.rb +1 -1
- data/screen_test/settings/border.frame +1 -1
- data/screen_test/settings/border.rb +1 -1
- data/screen_test/settings/content_start/box_bottom.frame +1 -0
- data/screen_test/settings/content_start/box_bottom.rb +17 -0
- data/screen_test/settings/content_start/box_left.frame +1 -0
- data/screen_test/settings/{position → content_start}/box_left.rb +2 -2
- data/screen_test/settings/content_start/box_left_negative.frame +1 -0
- data/screen_test/settings/{position → content_start}/box_left_negative.rb +2 -2
- data/screen_test/settings/content_start/box_right.frame +1 -0
- data/screen_test/settings/content_start/box_right.rb +17 -0
- data/screen_test/settings/content_start/box_top.frame +1 -0
- data/screen_test/settings/{position → content_start}/box_top.rb +2 -2
- data/screen_test/settings/content_start/box_top_negative.frame +1 -0
- data/screen_test/settings/{position → content_start}/box_top_negative.rb +2 -2
- data/screen_test/settings/content_start/grid_left.frame +1 -0
- data/screen_test/settings/{position → content_start}/grid_left.rb +2 -2
- data/screen_test/settings/content_start/grid_left_negative.frame +1 -0
- data/screen_test/settings/{position → content_start}/grid_left_negative.rb +2 -2
- data/screen_test/settings/content_start/grid_top.frame +1 -0
- data/screen_test/settings/{position → content_start}/grid_top.rb +2 -2
- data/screen_test/settings/content_start/grid_top_negative.frame +1 -0
- data/screen_test/settings/{position → content_start}/grid_top_negative.rb +2 -2
- data/screen_test/settings/flow/box_b2t.frame +1 -1
- data/screen_test/settings/flow/box_b2t.rb +1 -1
- data/screen_test/settings/flow/box_l2r.frame +1 -1
- data/screen_test/settings/flow/box_l2r.rb +1 -1
- data/screen_test/settings/flow/box_r2l.frame +1 -1
- data/screen_test/settings/flow/box_r2l.rb +1 -1
- data/screen_test/settings/flow/box_t2b.frame +1 -1
- data/screen_test/settings/flow/box_t2b.rb +1 -1
- data/screen_test/settings/flow/grid_b2t.frame +1 -1
- data/screen_test/settings/flow/grid_b2t.rb +1 -1
- data/screen_test/settings/flow/grid_l2r.frame +1 -1
- data/screen_test/settings/flow/grid_l2r.rb +1 -1
- data/screen_test/settings/flow/grid_r2l.frame +1 -1
- data/screen_test/settings/flow/grid_r2l.rb +1 -1
- data/screen_test/settings/flow/grid_t2b.frame +1 -1
- data/screen_test/settings/flow/grid_t2b.rb +1 -1
- data/screen_test/settings/height/box.frame +1 -1
- data/screen_test/settings/height/box.rb +1 -1
- data/screen_test/settings/height/box_border_sizing.frame +1 -1
- data/screen_test/settings/height/box_border_sizing.rb +1 -1
- data/screen_test/settings/height/grid.frame +1 -1
- data/screen_test/settings/height/grid.rb +1 -1
- data/screen_test/settings/height/overflow_box.frame +1 -1
- data/screen_test/settings/height/overflow_box.rb +1 -1
- data/screen_test/settings/height/overflow_box_l2r.frame +1 -1
- data/screen_test/settings/height/overflow_box_l2r.rb +1 -1
- data/screen_test/settings/height/overflow_box_t2b.frame +1 -1
- data/screen_test/settings/height/overflow_box_t2b.rb +1 -1
- data/screen_test/settings/height/overflow_grid.frame +1 -1
- data/screen_test/settings/height/overflow_grid.rb +1 -1
- data/screen_test/settings/margin.frame +1 -1
- data/screen_test/settings/margin.rb +1 -1
- data/screen_test/settings/padding.frame +1 -1
- data/screen_test/settings/padding.rb +1 -1
- data/screen_test/settings/scroll/horiz_box.frame +1 -1
- data/screen_test/settings/scroll/horiz_box.rb +3 -5
- data/screen_test/settings/scroll/horiz_box_align_center.rb +3 -5
- data/screen_test/settings/scroll/horiz_box_align_right.rb +3 -5
- data/screen_test/settings/scroll/vert_box.frame +1 -1
- data/screen_test/settings/scroll/vert_box.rb +6 -8
- data/screen_test/settings/title_font.frame +1 -1
- data/screen_test/settings/title_font.rb +1 -1
- data/screen_test/settings/valign/box_around.frame +1 -1
- data/screen_test/settings/valign/box_around.rb +1 -1
- data/screen_test/settings/valign/box_between.frame +1 -1
- data/screen_test/settings/valign/box_between.rb +1 -1
- data/screen_test/settings/valign/box_bottom.frame +1 -1
- data/screen_test/settings/valign/box_bottom.rb +1 -1
- data/screen_test/settings/valign/box_default.frame +1 -1
- data/screen_test/settings/valign/box_default.rb +1 -1
- data/screen_test/settings/valign/box_evenly.frame +1 -1
- data/screen_test/settings/valign/box_evenly.rb +1 -1
- data/screen_test/settings/valign/box_middle.frame +1 -1
- data/screen_test/settings/valign/box_middle.rb +1 -1
- data/screen_test/settings/valign/box_top.frame +1 -1
- data/screen_test/settings/valign/box_top.rb +1 -1
- data/screen_test/settings/valign/grid_bottom.frame +1 -1
- data/screen_test/settings/valign/grid_bottom.rb +1 -1
- data/screen_test/settings/valign/grid_default.frame +1 -1
- data/screen_test/settings/valign/grid_default.rb +1 -1
- data/screen_test/settings/valign/grid_middle.frame +1 -1
- data/screen_test/settings/valign/grid_middle.rb +1 -1
- data/screen_test/settings/valign/grid_top.frame +1 -1
- data/screen_test/settings/valign/grid_top.rb +1 -1
- data/screen_test/settings/width/box_border_sizing.frame +1 -1
- data/screen_test/settings/width/box_border_sizing.rb +1 -1
- data/screen_test/settings/width/box_content.frame +1 -1
- data/screen_test/settings/width/box_content.rb +1 -1
- data/screen_test/settings/width/box_default.frame +1 -1
- data/screen_test/settings/width/box_default.rb +1 -1
- data/screen_test/settings/width/grid.frame +1 -1
- data/screen_test/settings/width/grid.rb +1 -1
- data/screen_test/settings/width/overflow_align_center.frame +1 -1
- data/screen_test/settings/width/overflow_align_center.rb +1 -1
- data/screen_test/settings/width/overflow_align_right.frame +1 -1
- data/screen_test/settings/width/overflow_align_right.rb +1 -1
- data/screen_test/settings/width/overflow_box.frame +1 -1
- data/screen_test/settings/width/overflow_box.rb +1 -1
- data/screen_test/settings/width/overflow_box_l2r.frame +1 -1
- data/screen_test/settings/width/overflow_box_l2r.rb +1 -1
- data/screen_test/settings/width/overflow_box_t2b.frame +1 -1
- data/screen_test/settings/width/overflow_box_t2b.rb +1 -1
- data/screen_test/settings/width/overflow_grid.frame +1 -1
- data/screen_test/settings/width/overflow_grid.rb +1 -1
- data/tools/whirled_peas/tools/screen_tester.rb +131 -65
- metadata +86 -25
- data/lib/whirled_peas/frame.rb +0 -6
- data/lib/whirled_peas/frame/consumer.rb +0 -30
- data/lib/whirled_peas/frame/debug_consumer.rb +0 -30
- data/lib/whirled_peas/frame/event_loop.rb +0 -90
- data/lib/whirled_peas/frame/producer.rb +0 -67
- data/lib/whirled_peas/graphics/screen.rb +0 -70
- data/lib/whirled_peas/graphics/text_dimensions.rb +0 -15
- data/screen_test/settings/position/box_left.frame +0 -1
- data/screen_test/settings/position/box_left_negative.frame +0 -1
- data/screen_test/settings/position/box_top.frame +0 -1
- data/screen_test/settings/position/box_top_negative.frame +0 -1
- data/screen_test/settings/position/grid_left.frame +0 -1
- data/screen_test/settings/position/grid_left_negative.frame +0 -1
- data/screen_test/settings/position/grid_top.frame +0 -1
- data/screen_test/settings/position/grid_top_negative.frame +0 -1
@@ -12,8 +12,6 @@ require_relative 'vert_alignment'
|
|
12
12
|
module WhirledPeas
|
13
13
|
module Settings
|
14
14
|
class ContainerSettings < ElementSettings
|
15
|
-
attr_accessor :width, :height
|
16
|
-
|
17
15
|
def align
|
18
16
|
@_align || Alignment::DEFAULT
|
19
17
|
end
|
@@ -98,7 +96,7 @@ module WhirledPeas
|
|
98
96
|
end
|
99
97
|
|
100
98
|
def border
|
101
|
-
@_border ||= Border.new
|
99
|
+
@_border ||= Border.new(theme)
|
102
100
|
end
|
103
101
|
|
104
102
|
def flow=(flow)
|
@@ -177,13 +175,20 @@ module WhirledPeas
|
|
177
175
|
@_padding ||= Padding.new
|
178
176
|
end
|
179
177
|
|
180
|
-
def
|
181
|
-
|
182
|
-
|
178
|
+
def set_content_start(left: nil, top: nil, right: nil, bottom: nil)
|
179
|
+
if left && right
|
180
|
+
raise ArgumentError, 'Setting left and right content_start is not supported'
|
181
|
+
elsif top && bottom
|
182
|
+
raise ArgumentError, 'Setting top and bottom content_start is not supported'
|
183
|
+
end
|
184
|
+
content_start.left = left if left
|
185
|
+
content_start.top = top if top
|
186
|
+
content_start.right = right if right
|
187
|
+
content_start.bottom = bottom if bottom
|
183
188
|
end
|
184
189
|
|
185
|
-
def
|
186
|
-
@
|
190
|
+
def content_start
|
191
|
+
@_content_start ||= Position.new
|
187
192
|
end
|
188
193
|
|
189
194
|
def set_scrollbar(horiz: nil, vert: nil)
|
@@ -214,7 +219,7 @@ module WhirledPeas
|
|
214
219
|
def inherit(parent)
|
215
220
|
super
|
216
221
|
return unless parent.is_a?(ContainerSettings)
|
217
|
-
|
222
|
+
@_border = Border.inherit(parent.border)
|
218
223
|
end
|
219
224
|
|
220
225
|
protected
|
@@ -8,13 +8,22 @@ module WhirledPeas
|
|
8
8
|
module Settings
|
9
9
|
class ElementSettings
|
10
10
|
def self.inherit(parent)
|
11
|
-
child = self.new
|
11
|
+
child = self.new(parent.theme)
|
12
12
|
child.inherit(parent)
|
13
13
|
child
|
14
14
|
end
|
15
15
|
|
16
|
+
attr_accessor :theme, :width, :height
|
17
|
+
|
18
|
+
def initialize(theme)
|
19
|
+
@theme = theme
|
20
|
+
end
|
21
|
+
|
22
|
+
def validate!
|
23
|
+
end
|
24
|
+
|
16
25
|
def bg_color
|
17
|
-
@_bg_color ||
|
26
|
+
@_bg_color || theme.bg_color
|
18
27
|
end
|
19
28
|
|
20
29
|
def bg_color=(color)
|
@@ -30,7 +39,7 @@ module WhirledPeas
|
|
30
39
|
end
|
31
40
|
|
32
41
|
def color
|
33
|
-
@_color ||
|
42
|
+
@_color || theme.color
|
34
43
|
end
|
35
44
|
|
36
45
|
def color=(color)
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'text_color'
|
2
|
+
require_relative 'element_settings'
|
3
|
+
|
4
|
+
module WhirledPeas
|
5
|
+
module Settings
|
6
|
+
class GraphSettings < ElementSettings
|
7
|
+
def axis_color
|
8
|
+
@_axis_color || theme.axis_color
|
9
|
+
end
|
10
|
+
|
11
|
+
def axis_color=(color)
|
12
|
+
@_axis_color = TextColor.validate!(color)
|
13
|
+
end
|
14
|
+
|
15
|
+
def validate!
|
16
|
+
super
|
17
|
+
raise SettingsError, "`height` must be set for GraphSettings" if height.nil?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -7,6 +7,13 @@ module WhirledPeas
|
|
7
7
|
class GridSettings < ContainerSettings
|
8
8
|
attr_accessor :num_cols
|
9
9
|
|
10
|
+
def validate!
|
11
|
+
super
|
12
|
+
if num_cols.nil? || num_cols <= 0
|
13
|
+
raise SettingsError, "`num_cols` must be set to a positive number for GridSettings"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
10
17
|
def set_scrollbar(*)
|
11
18
|
raise NotImplementedError, 'Grids do not support scrollbars'
|
12
19
|
end
|
@@ -1,14 +1,26 @@
|
|
1
1
|
module WhirledPeas
|
2
2
|
module Settings
|
3
3
|
class Position
|
4
|
-
|
4
|
+
attr_reader :left, :top, :right, :bottom
|
5
5
|
|
6
|
-
def left
|
7
|
-
@
|
6
|
+
def left=(value)
|
7
|
+
@right = nil
|
8
|
+
@left = value
|
8
9
|
end
|
9
10
|
|
10
|
-
def top
|
11
|
-
@
|
11
|
+
def top=(value)
|
12
|
+
@bottom = nil
|
13
|
+
@top = value
|
14
|
+
end
|
15
|
+
|
16
|
+
def right=(value)
|
17
|
+
@left = nil
|
18
|
+
@right = value
|
19
|
+
end
|
20
|
+
|
21
|
+
def bottom=(value)
|
22
|
+
@top = nil
|
23
|
+
@bottom = value
|
12
24
|
end
|
13
25
|
end
|
14
26
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'whirled_peas/utils/title_font'
|
2
|
+
|
3
|
+
require_relative 'bg_color'
|
4
|
+
require_relative 'text_color'
|
5
|
+
|
6
|
+
module WhirledPeas
|
7
|
+
module Settings
|
8
|
+
class Theme
|
9
|
+
attr_reader :color, :bg_color, :title_font
|
10
|
+
|
11
|
+
def color=(value)
|
12
|
+
@color = TextColor.validate!(value)
|
13
|
+
end
|
14
|
+
|
15
|
+
def bg_color=(value)
|
16
|
+
@bg_color = BgColor.validate!(value)
|
17
|
+
end
|
18
|
+
|
19
|
+
def border_color=(value)
|
20
|
+
@border_color = TextColor.validate!(value)
|
21
|
+
end
|
22
|
+
|
23
|
+
def border_color
|
24
|
+
@border_color || color
|
25
|
+
end
|
26
|
+
|
27
|
+
def axis_color=(value)
|
28
|
+
@axis_color = TextColor.validate!(value)
|
29
|
+
end
|
30
|
+
|
31
|
+
def axis_color
|
32
|
+
@axis_color || border_color
|
33
|
+
end
|
34
|
+
|
35
|
+
def title_font=(value)
|
36
|
+
@title_font = Utils::TitleFont.validate!(value)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
require_relative 'theme'
|
4
|
+
|
5
|
+
module WhirledPeas
|
6
|
+
module Settings
|
7
|
+
module ThemeLibrary
|
8
|
+
CONFIG_FILE = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'data', 'themes.yaml')
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def theme_names
|
12
|
+
themes.keys
|
13
|
+
end
|
14
|
+
|
15
|
+
def add(name, theme)
|
16
|
+
themes[name] = theme
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(name)
|
20
|
+
unless themes.key?(name)
|
21
|
+
expected = themes.keys.map(&:inspect).join(', ')
|
22
|
+
raise ArgumentError, "Unknown theme: #{name.inspect}, expecting one of #{expected}"
|
23
|
+
end
|
24
|
+
themes[name]
|
25
|
+
end
|
26
|
+
|
27
|
+
def default_name
|
28
|
+
themes.keys.first
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def themes
|
34
|
+
return @themes if @themes
|
35
|
+
@themes = {}
|
36
|
+
config = YAML.load_file(CONFIG_FILE)
|
37
|
+
config.each do |name, settings|
|
38
|
+
name = name.to_sym
|
39
|
+
theme = Theme.new
|
40
|
+
settings.each do |key, value|
|
41
|
+
case key
|
42
|
+
when 'color'
|
43
|
+
theme.color = value
|
44
|
+
when 'bg_color'
|
45
|
+
theme.bg_color = value
|
46
|
+
when 'border_color'
|
47
|
+
theme.border_color = value
|
48
|
+
when 'axis_color'
|
49
|
+
theme.axis_color = value
|
50
|
+
when 'title_font'
|
51
|
+
theme.title_font = value
|
52
|
+
else
|
53
|
+
raise ArgumentError, "Unexpected theme setting: #{key} in #{CONFIG_FILE}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
@themes[name] = theme
|
57
|
+
end
|
58
|
+
@themes
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -28,6 +28,19 @@ module WhirledPeas
|
|
28
28
|
BRIGHT_OFFSET = 60
|
29
29
|
|
30
30
|
class << self
|
31
|
+
def with_screen(output=STDOUT, width: nil, height: nil, &block)
|
32
|
+
require 'highline'
|
33
|
+
unless width && height
|
34
|
+
width, height = HighLine.new.terminal.terminal_size
|
35
|
+
end
|
36
|
+
yield width, height
|
37
|
+
ensure
|
38
|
+
output.print clear
|
39
|
+
output.print cursor_pos(top: height - 1)
|
40
|
+
output.print cursor_visible(true)
|
41
|
+
output.flush
|
42
|
+
end
|
43
|
+
|
31
44
|
def cursor_pos(top: 0, left: 0)
|
32
45
|
"#{ESC}[#{top + 1};#{left + 1}H"
|
33
46
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'zlib'
|
3
|
+
|
4
|
+
module WhirledPeas
|
5
|
+
module Utils
|
6
|
+
module FileHandler
|
7
|
+
module FileWriter
|
8
|
+
VERSION = '1'
|
9
|
+
|
10
|
+
def self.write(fp, renders)
|
11
|
+
fp.puts renders.count
|
12
|
+
renders.each do |strokes|
|
13
|
+
encoded = Base64.encode64(strokes)
|
14
|
+
fp.puts encoded.count("\n")
|
15
|
+
fp.puts encoded
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
private_constant :FileWriter
|
20
|
+
|
21
|
+
class FileReaderV1
|
22
|
+
def self.read(fp)
|
23
|
+
num_renders = Integer(fp.readline.chomp, 10)
|
24
|
+
num_renders.times.map do
|
25
|
+
num_strokes = Integer(fp.readline.chomp, 10)
|
26
|
+
Base64.decode64(num_strokes.times.map { fp.readline }.join)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :file
|
33
|
+
end
|
34
|
+
private_constant :FileReaderV1
|
35
|
+
|
36
|
+
READERS = {
|
37
|
+
'1' => FileReaderV1
|
38
|
+
}
|
39
|
+
private_constant :READERS
|
40
|
+
|
41
|
+
def self.write(file, renders)
|
42
|
+
Zlib::GzipWriter.open(file, Zlib::BEST_COMPRESSION) do |gz|
|
43
|
+
gz.puts FileWriter::VERSION
|
44
|
+
FileWriter.write(gz, renders)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.read(file)
|
49
|
+
Zlib::GzipReader.open(file) do |gz|
|
50
|
+
version = gz.gets.chomp
|
51
|
+
raise ArgumentError, "Invalid file: #{file}" unless READERS.key?(version)
|
52
|
+
READERS[version].read(gz)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/whirled_peas/version.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
[?25l[1;1H[J[1;1H[97m[40m [0m[2;1H[97m[40m [0m[3;1H[97m[40m [0m[4;1H[97m[40m [0m[5;1H[97m[40m [0m[6;1H[97m[40m [0m[7;1H[97m[40m [0m[8;1H[97m[40m [0m[9;1H[97m[40m [0m[10;1H[97m[40m [0m[11;1H[97m[40m [0m[12;1H[97m[40m [0m[13;1H[97m[40m [0m[14;1H[97m[40m [0m[15;1H[97m[40m [0m[16;1H[97m[40m [0m[17;1H[97m[40m [0m[18;1H[97m[40m [0m[19;1H[97m[40m [0m[20;1H[97m[40m [0m[21;1H[97m[40m [0m[22;1H[97m[40m [0m[23;1H[97m[40m [0m[24;1H[97m[40m [0m[1;1H[97m[40m┏━━━━━━━━━━┓[0m[2;1H[97m[40m┃ ┃[0m[3;1H[97m[40m┃ ▗▄▄▄▖ ┃[0m[4;1H[97m[40m┗━━━━━━━━━━┛[0m[2;2H[97m[40mH[0m[2;3H[97m[40mI[0m[2;4H[97m[40mJ[0m[2;5H[97m[40mK[0m[2;6H[97m[40mL[0m[2;7H[97m[40mM[0m[2;8H[90m[107mN[0m[2;9H[97m[40mO[0m[2;10H[97m[40mP[0m[2;11H[97m[40mQ[0m[0m[24;1H[?25h
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'whirled_peas'
|
2
|
+
require 'whirled_peas/component/list_with_active'
|
3
|
+
|
4
|
+
class TemplateFactory
|
5
|
+
ITEMS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars
|
6
|
+
|
7
|
+
def build(*)
|
8
|
+
WhirledPeas.template(:test) do |composer, settings|
|
9
|
+
WhirledPeas.component(composer, settings, :list_with_active) do |component|
|
10
|
+
component.items = ITEMS
|
11
|
+
component.active_index = ITEMS.length / 2
|
12
|
+
component.viewport_size = 10
|
13
|
+
component.active_color = :gray
|
14
|
+
component.active_bg_color = :bright_white
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
[?25l[1;1H[J[1;1H[97m[40m [0m[2;1H[97m[40m [0m[3;1H[97m[40m [0m[4;1H[97m[40m [0m[5;1H[97m[40m [0m[6;1H[97m[40m [0m[7;1H[97m[40m [0m[8;1H[97m[40m [0m[9;1H[97m[40m [0m[10;1H[97m[40m [0m[11;1H[97m[40m [0m[12;1H[97m[40m [0m[13;1H[97m[40m [0m[14;1H[97m[40m [0m[15;1H[97m[40m [0m[16;1H[97m[40m [0m[17;1H[97m[40m [0m[18;1H[97m[40m [0m[19;1H[97m[40m [0m[20;1H[97m[40m [0m[21;1H[97m[40m [0m[22;1H[97m[40m [0m[23;1H[97m[40m [0m[24;1H[97m[40m [0m[1;1H[97m[40m┏━━━━━━━━━━┓[0m[2;1H[97m[40m┃ ┃[0m[3;1H[97m[40m┃ ▄▄▄▄┃[0m[4;1H[97m[40m┗━━━━━━━━━━┛[0m[2;2H[97m[40mQ[0m[2;3H[97m[40mR[0m[2;4H[97m[40mS[0m[2;5H[97m[40mT[0m[2;6H[97m[40mU[0m[2;7H[97m[40mV[0m[2;8H[97m[40mW[0m[2;9H[97m[40mX[0m[2;10H[97m[40mY[0m[2;11H[97m[40mZ[0m[0m[24;1H[?25h
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'whirled_peas'
|
2
|
+
require 'whirled_peas/component/list_with_active'
|
3
|
+
|
4
|
+
class TemplateFactory
|
5
|
+
ITEMS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars
|
6
|
+
|
7
|
+
def build(*)
|
8
|
+
WhirledPeas.template(:test) do |composer, settings|
|
9
|
+
WhirledPeas.component(composer, settings, :list_with_active) do |component|
|
10
|
+
component.items = ITEMS
|
11
|
+
component.active_index = ITEMS.size - 1
|
12
|
+
component.viewport_size = 10
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
[?25l[1;1H[J[1;1H[97m[40m [0m[2;1H[97m[40m [0m[3;1H[97m[40m [0m[4;1H[97m[40m [0m[5;1H[97m[40m [0m[6;1H[97m[40m [0m[7;1H[97m[40m [0m[8;1H[97m[40m [0m[9;1H[97m[40m [0m[10;1H[97m[40m [0m[11;1H[97m[40m [0m[12;1H[97m[40m [0m[13;1H[97m[40m [0m[14;1H[97m[40m [0m[15;1H[97m[40m [0m[16;1H[97m[40m [0m[17;1H[97m[40m [0m[18;1H[97m[40m [0m[19;1H[97m[40m [0m[20;1H[97m[40m [0m[21;1H[97m[40m [0m[22;1H[97m[40m [0m[23;1H[97m[40m [0m[24;1H[97m[40m [0m[1;1H[97m[40m┏━━━━━━━━━━┓[0m[2;1H[97m[40m┃ ┃[0m[3;1H[97m[40m┃ ▗▄▄▄▖ ┃[0m[4;1H[97m[40m┗━━━━━━━━━━┛[0m[2;2H[97m[40mH[0m[2;3H[97m[40mI[0m[2;4H[97m[40mJ[0m[2;5H[97m[40mK[0m[2;6H[97m[40mL[0m[2;7H[97m[40mM[0m[2;8H[97m[40mN[0m[2;9H[97m[40mO[0m[2;10H[97m[40mP[0m[2;11H[97m[40mQ[0m[0m[24;1H[?25h
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'whirled_peas'
|
2
|
+
require 'whirled_peas/component/list_with_active'
|
3
|
+
|
4
|
+
class TemplateFactory
|
5
|
+
ITEMS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars
|
6
|
+
|
7
|
+
def build(*)
|
8
|
+
WhirledPeas.template(:test) do |composer, settings|
|
9
|
+
WhirledPeas.component(composer, settings, :list_with_active) do |component|
|
10
|
+
component.items = ITEMS
|
11
|
+
component.active_index = ITEMS.length / 2
|
12
|
+
component.viewport_size = 10
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
[?25l[1;1H[J[1;1H[97m[40m [0m[2;1H[97m[40m [0m[3;1H[97m[40m [0m[4;1H[97m[40m [0m[5;1H[97m[40m [0m[6;1H[97m[40m [0m[7;1H[97m[40m [0m[8;1H[97m[40m [0m[9;1H[97m[40m [0m[10;1H[97m[40m [0m[11;1H[97m[40m [0m[12;1H[97m[40m [0m[13;1H[97m[40m [0m[14;1H[97m[40m [0m[15;1H[97m[40m [0m[16;1H[97m[40m [0m[17;1H[97m[40m [0m[18;1H[97m[40m [0m[19;1H[97m[40m [0m[20;1H[97m[40m [0m[21;1H[97m[40m [0m[22;1H[97m[40m [0m[23;1H[97m[40m [0m[24;1H[97m[40m [0m[1;1H[97m[40m┏━━━━━━━━━━┓[0m[2;1H[97m[40m┃ ┃[0m[3;1H[97m[40m┃▄▄▄▖ ┃[0m[4;1H[97m[40m┗━━━━━━━━━━┛[0m[2;2H[97m[40mA[0m[2;3H[97m[40mB[0m[2;4H[97m[40mC[0m[2;5H[97m[40mD[0m[2;6H[97m[40mE[0m[2;7H[97m[40mF[0m[2;8H[97m[40mG[0m[2;9H[97m[40mH[0m[2;10H[97m[40mI[0m[2;11H[97m[40mJ[0m[0m[24;1H[?25h
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'whirled_peas'
|
2
|
+
require 'whirled_peas/component/list_with_active'
|
3
|
+
|
4
|
+
class TemplateFactory
|
5
|
+
ITEMS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars
|
6
|
+
|
7
|
+
def build(*)
|
8
|
+
WhirledPeas.template(:test) do |composer, settings|
|
9
|
+
WhirledPeas.component(composer, settings, :list_with_active) do |component|
|
10
|
+
component.items = ITEMS
|
11
|
+
component.active_index = 0
|
12
|
+
component.viewport_size = 10
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|