whirled_peas 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +6 -0
  4. data/README.md +62 -29
  5. data/Rakefile +3 -2
  6. data/examples/intro.rb +52 -0
  7. data/examples/scrolling.rb +53 -0
  8. data/lib/whirled_peas.rb +2 -8
  9. data/lib/whirled_peas/command_line.rb +25 -33
  10. data/lib/whirled_peas/graphics/box_painter.rb +9 -1
  11. data/lib/whirled_peas/graphics/composer.rb +80 -0
  12. data/lib/whirled_peas/graphics/container_coords.rb +18 -8
  13. data/lib/whirled_peas/graphics/container_dimensions.rb +17 -7
  14. data/lib/whirled_peas/graphics/container_painter.rb +151 -33
  15. data/lib/whirled_peas/graphics/debugger.rb +10 -1
  16. data/lib/whirled_peas/graphics/grid_painter.rb +14 -2
  17. data/lib/whirled_peas/graphics/mock_screen.rb +1 -1
  18. data/lib/whirled_peas/graphics/painter.rb +1 -6
  19. data/lib/whirled_peas/graphics/renderer.rb +1 -29
  20. data/lib/whirled_peas/graphics/screen.rb +8 -3
  21. data/lib/whirled_peas/graphics/text_painter.rb +6 -4
  22. data/lib/whirled_peas/settings/container_settings.rb +11 -0
  23. data/lib/whirled_peas/settings/debugger.rb +9 -0
  24. data/lib/whirled_peas/settings/grid_settings.rb +4 -0
  25. data/lib/whirled_peas/settings/scrollbar.rb +15 -0
  26. data/lib/whirled_peas/version.rb +1 -1
  27. data/screen_test/rendered/elements/box.frame +1 -1
  28. data/screen_test/rendered/elements/grid.frame +1 -1
  29. data/screen_test/rendered/elements/screen_overflow.frame +1 -0
  30. data/screen_test/rendered/elements/text.frame +1 -1
  31. data/screen_test/rendered/elements/text_multiline.frame +1 -1
  32. data/screen_test/rendered/settings/align/box.frame +1 -1
  33. data/screen_test/rendered/settings/align/box.rb +14 -10
  34. data/screen_test/rendered/settings/align/children_center.frame +1 -1
  35. data/screen_test/rendered/settings/align/children_left.frame +1 -1
  36. data/screen_test/rendered/settings/align/children_right.frame +1 -1
  37. data/screen_test/rendered/settings/align/grid.frame +1 -1
  38. data/screen_test/rendered/settings/ansi/bold.frame +1 -1
  39. data/screen_test/rendered/settings/ansi/color.frame +1 -1
  40. data/screen_test/rendered/settings/ansi/underline.frame +1 -1
  41. data/screen_test/rendered/settings/border.frame +1 -1
  42. data/screen_test/rendered/settings/flow/box_b2t.frame +1 -0
  43. data/screen_test/rendered/settings/flow/box_b2t.rb +24 -0
  44. data/screen_test/rendered/settings/flow/{l2r.frame → box_l2r.frame} +1 -1
  45. data/screen_test/rendered/settings/flow/{l2r.rb → box_l2r.rb} +0 -0
  46. data/screen_test/rendered/settings/flow/box_r2l.frame +1 -0
  47. data/screen_test/rendered/settings/flow/box_r2l.rb +24 -0
  48. data/screen_test/rendered/settings/flow/{t2b.frame → box_t2b.frame} +1 -1
  49. data/screen_test/rendered/settings/flow/{t2b.rb → box_t2b.rb} +0 -0
  50. data/screen_test/rendered/settings/flow/grid_b2t.frame +1 -0
  51. data/screen_test/rendered/settings/flow/grid_b2t.rb +14 -0
  52. data/screen_test/rendered/settings/flow/grid_l2r.frame +1 -0
  53. data/screen_test/rendered/settings/flow/grid_l2r.rb +14 -0
  54. data/screen_test/rendered/settings/flow/grid_r2l.frame +1 -0
  55. data/screen_test/rendered/settings/flow/grid_r2l.rb +14 -0
  56. data/screen_test/rendered/settings/flow/grid_t2b.frame +1 -0
  57. data/screen_test/rendered/settings/flow/grid_t2b.rb +14 -0
  58. data/screen_test/rendered/settings/height/box.frame +1 -1
  59. data/screen_test/rendered/settings/height/grid.frame +1 -1
  60. data/screen_test/rendered/settings/height/overflow_box.frame +1 -1
  61. data/screen_test/rendered/settings/height/overflow_box_l2r.frame +1 -1
  62. data/screen_test/rendered/settings/height/overflow_box_t2b.frame +1 -1
  63. data/screen_test/rendered/settings/height/overflow_grid.frame +1 -1
  64. data/screen_test/rendered/settings/margin.frame +1 -1
  65. data/screen_test/rendered/settings/padding.frame +1 -1
  66. data/screen_test/rendered/settings/position/box_left.frame +1 -1
  67. data/screen_test/rendered/settings/position/box_left_negative.frame +1 -1
  68. data/screen_test/rendered/settings/position/box_top.frame +1 -1
  69. data/screen_test/rendered/settings/position/box_top_negative.frame +1 -1
  70. data/screen_test/rendered/settings/position/grid_left.frame +1 -1
  71. data/screen_test/rendered/settings/position/grid_left_negative.frame +1 -1
  72. data/screen_test/rendered/settings/position/grid_top.frame +1 -1
  73. data/screen_test/rendered/settings/position/grid_top_negative.frame +1 -1
  74. data/screen_test/rendered/settings/scroll/horiz_box.frame +1 -0
  75. data/screen_test/rendered/settings/scroll/horiz_box.rb +15 -0
  76. data/screen_test/rendered/settings/scroll/vert_box.frame +1 -0
  77. data/screen_test/rendered/settings/scroll/vert_box.rb +18 -0
  78. data/screen_test/rendered/settings/title_font.frame +1 -1
  79. data/screen_test/rendered/settings/width/box.frame +1 -1
  80. data/screen_test/rendered/settings/width/grid.frame +1 -1
  81. data/screen_test/rendered/settings/width/overflow_box.frame +1 -1
  82. data/screen_test/rendered/settings/width/overflow_box_l2r.frame +1 -1
  83. data/screen_test/rendered/settings/width/overflow_box_t2b.frame +1 -1
  84. data/screen_test/rendered/settings/width/overflow_grid.frame +1 -1
  85. data/screen_test/screen_tester.rb +13 -3
  86. metadata +27 -16
  87. data/bin/debug +0 -35
  88. data/lib/whirled_peas/debugger.rb +0 -80
  89. data/lib/whirled_peas/template.rb +0 -5
  90. data/lib/whirled_peas/template/box_element.rb +0 -8
  91. data/lib/whirled_peas/template/composer.rb +0 -68
  92. data/lib/whirled_peas/template/container.rb +0 -28
  93. data/lib/whirled_peas/template/debugger.rb +0 -34
  94. data/lib/whirled_peas/template/element.rb +0 -13
  95. data/lib/whirled_peas/template/grid_element.rb +0 -8
  96. data/lib/whirled_peas/template/text_element.rb +0 -24
@@ -17,7 +17,16 @@ module WhirledPeas
17
17
  info << "#{indent + ' '}- Dimensions(#{dimensions})"
18
18
  info << "#{indent + ' '}- Settings"
19
19
  info << Settings::Debugger.new(painter.settings).debug(indent + ' ')
20
- if painter.is_a?(ContainerPainter)
20
+ if painter.is_a?(TextPainter)
21
+ content = if painter.content.length > 1
22
+ '<multiline>'
23
+ elsif painter.content.first.length > 12
24
+ "#{painter.content.first[0..9]}...".inspect
25
+ else
26
+ painter.content.first.inspect
27
+ end
28
+ info << "#{indent + ' '}- Content(value=#{content})"
29
+ elsif painter.is_a?(ContainerPainter)
21
30
  info << "#{indent + ' '}- Children"
22
31
  info += painter.each_child.map { |c| Debugger.new(c).debug(indent + ' ') }
23
32
  end
@@ -8,8 +8,7 @@ module WhirledPeas
8
8
  super
9
9
  return unless canvas.writable?
10
10
  each_child.with_index do |child, index|
11
- col_index = index % dimensions.num_cols
12
- row_index = index / dimensions.num_cols
11
+ col_index, row_index = grid_cell(index)
13
12
  content_left = coords(canvas).content_left(col_index)
14
13
  if settings.align_center?
15
14
  content_left += (dimensions.content_width - child.dimensions.outer_width) / 2
@@ -50,6 +49,19 @@ module WhirledPeas
50
49
  )
51
50
  end
52
51
  end
52
+
53
+ private
54
+
55
+ def grid_cell(index)
56
+ if settings.horizontal_flow?
57
+ col_index, row_index = [index % dimensions.num_cols, index / dimensions.num_cols]
58
+ col_index = dimensions.num_cols - col_index - 1 if settings.reverse_flow?
59
+ else
60
+ col_index, row_index = [index / dimensions.num_cols, index % dimensions.num_cols]
61
+ row_index = dimensions.num_rows - row_index - 1 if settings.reverse_flow?
62
+ end
63
+ [col_index, row_index]
64
+ end
53
65
  end
54
66
  private_constant :BoxPainter
55
67
  end
@@ -3,7 +3,7 @@ require_relative 'renderer'
3
3
  module WhirledPeas
4
4
  module Graphics
5
5
  class MockScreen
6
- def initialize(width, height)
6
+ def initialize(width:, height:)
7
7
  @width = width
8
8
  @height = height
9
9
  end
@@ -3,8 +3,7 @@ module WhirledPeas
3
3
  class Painter
4
4
  attr_reader :name, :settings
5
5
 
6
- def initialize(element, settings, name)
7
- @element = element
6
+ def initialize(name, settings)
8
7
  @settings = settings
9
8
  @name = name
10
9
  end
@@ -14,10 +13,6 @@ module WhirledPeas
14
13
 
15
14
  def dimensions
16
15
  end
17
-
18
- private
19
-
20
- attr_reader :element
21
16
  end
22
17
  private_constant :Painter
23
18
  end
@@ -1,21 +1,8 @@
1
- require 'whirled_peas/template/box_element'
2
- require 'whirled_peas/template/container'
3
- require 'whirled_peas/template/grid_element'
4
- require 'whirled_peas/template/text_element'
5
-
6
- require_relative 'box_painter'
7
1
  require_relative 'canvas'
8
- require_relative 'grid_painter'
9
- require_relative 'text_painter'
10
2
 
11
3
  module WhirledPeas
12
4
  module Graphics
13
5
  class Renderer
14
- PAINTERS = {
15
- Template::BoxElement => BoxPainter,
16
- Template::GridElement => GridPainter,
17
- Template::TextElement => TextPainter
18
- }
19
6
  def initialize(template, width, height)
20
7
  @template = template
21
8
  @width = width
@@ -23,27 +10,12 @@ module WhirledPeas
23
10
  end
24
11
 
25
12
  def paint(&block)
26
- painter.paint(Canvas.new(0, 0, width, height, 0, 0), &block)
27
- end
28
-
29
- def painter
30
- build(template)
13
+ template.paint(Canvas.new(0, 0, width, height, 0, 0), &block)
31
14
  end
32
15
 
33
16
  private
34
17
 
35
18
  attr_reader :template, :width, :height
36
-
37
- def build(element)
38
- unless PAINTERS.key?(element.class)
39
- raise ArgumentError, "Unable to render #{element.class}"
40
- end
41
- painter = PAINTERS[element.class].new(element, element.settings, element.name)
42
- if element.is_a?(Template::Container)
43
- element.each_child { |child| painter.add_child(build(child)) }
44
- end
45
- painter
46
- end
47
19
  end
48
20
  end
49
21
  end
@@ -12,12 +12,17 @@ module WhirledPeas
12
12
  [width || 0, height || 0]
13
13
  end
14
14
 
15
- def initialize(output=STDOUT)
15
+ def initialize(width: nil, height: nil, output: STDOUT)
16
16
  @output = output
17
17
  @terminal = HighLine.new.terminal
18
18
  @strokes = []
19
- refresh_size!
20
- Signal.trap('SIGWINCH', proc { self.refresh_size! })
19
+ if width && height
20
+ @width = width
21
+ @height = height
22
+ else
23
+ refresh_size!
24
+ Signal.trap('SIGWINCH', proc { self.refresh_size! })
25
+ end
21
26
  end
22
27
 
23
28
  def paint(template)
@@ -7,6 +7,8 @@ require_relative 'text_dimensions'
7
7
  module WhirledPeas
8
8
  module Graphics
9
9
  class TextPainter < Painter
10
+ attr_reader :content
11
+
10
12
  def paint(canvas, &block)
11
13
  return unless canvas.writable?
12
14
  formatting = [*settings.color, *settings.bg_color]
@@ -23,13 +25,13 @@ module WhirledPeas
23
25
  TextDimensions.new(content)
24
26
  end
25
27
 
26
- def content
27
- if settings.title_font
28
+ def content=(content)
29
+ @content = if settings.title_font
28
30
  Utils::TitleFont.to_s(
29
- element.content, settings.title_font
31
+ content, settings.title_font
30
32
  ).split("\n")
31
33
  else
32
- element.content.split("\n")
34
+ content.split("\n")
33
35
  end
34
36
  end
35
37
  end
@@ -4,6 +4,7 @@ require_relative 'element_settings'
4
4
  require_relative 'margin'
5
5
  require_relative 'padding'
6
6
  require_relative 'position'
7
+ require_relative 'scrollbar'
7
8
 
8
9
  module WhirledPeas
9
10
  module Settings
@@ -112,6 +113,16 @@ module WhirledPeas
112
113
  @_position || Position.new
113
114
  end
114
115
 
116
+ def set_scrollbar(horiz: nil, vert: nil)
117
+ @_scrollbar = Scrollbar.new unless @_scrollbar
118
+ @_scrollbar.horiz = horiz unless horiz.nil?
119
+ @_scrollbar.vert = vert unless vert.nil?
120
+ end
121
+
122
+ def scrollbar
123
+ @_scrollbar || Scrollbar.new
124
+ end
125
+
115
126
  def inherit(parent)
116
127
  super
117
128
  return unless parent.is_a?(ContainerSettings)
@@ -3,6 +3,7 @@ require_relative 'container_settings'
3
3
  require_relative 'margin'
4
4
  require_relative 'padding'
5
5
  require_relative 'position'
6
+ require_relative 'scrollbar'
6
7
 
7
8
  module WhirledPeas
8
9
  module Settings
@@ -41,6 +42,8 @@ module WhirledPeas
41
42
  border_value(value)
42
43
  when Padding
43
44
  padding_value(value)
45
+ when Scrollbar
46
+ scrollbar_value(value)
44
47
  else
45
48
  value.inspect
46
49
  end
@@ -82,6 +85,12 @@ module WhirledPeas
82
85
  return if values == ''
83
86
  "Padding(#{values})"
84
87
  end
88
+
89
+ def scrollbar_value(scrollbar)
90
+ values = non_defaults(scrollbar, Scrollbar.new, %i[horiz? vert?])
91
+ return if values == ''
92
+ "Scrollbar(#{values})"
93
+ end
85
94
  end
86
95
  end
87
96
  end
@@ -6,6 +6,10 @@ module WhirledPeas
6
6
  module Settings
7
7
  class GridSettings < ContainerSettings
8
8
  attr_accessor :num_cols
9
+
10
+ def set_scrollbar(*)
11
+ raise NotImplemented, 'Grids do not currently support scrollbars'
12
+ end
9
13
  end
10
14
  end
11
15
  end
@@ -0,0 +1,15 @@
1
+ module WhirledPeas
2
+ module Settings
3
+ class Scrollbar
4
+ attr_writer :horiz, :vert
5
+
6
+ def horiz?
7
+ @horiz == true
8
+ end
9
+
10
+ def vert?
11
+ @vert == true
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module WhirledPeas
2
- VERSION = '0.5.0'
2
+ VERSION = '0.6.0'
3
3
  end
@@ -1 +1 @@
1
- [?25lTOP LEFTBOTTOM LEFT TOP RIGHT  BOTTOM RIGHT[?25h
1
+ [?25lTOP LEFTBOTTOM LEFT TOP RIGHT  BOTTOM RIGHT[?25h
@@ -1 +1 @@
1
- [?25l┏━━━━━━┳━━━━━━┳━━━━━━┓┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┗━━━━━━┻━━━━━━┻━━━━━━┛Item 0Item 1Item 2Item 3Item 4Item 5Item 6[?25h
1
+ [?25l┏━━━━━━┳━━━━━━┳━━━━━━┓┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┗━━━━━━┻━━━━━━┻━━━━━━┛Item 0Item 1Item 2Item 3Item 4Item 5Item 6[?25h
@@ -0,0 +1 @@
1
+ [?25l--------------------------------------------------------------------------------[?25h
@@ -1 +1 @@
1
- [?25lHello, World![?25h
1
+ [?25lHello, World![?25h
@@ -1 +1 @@
1
- [?25lLine 1Line 2Line 3[?25h
1
+ [?25lLine 1Line 2Line 3[?25h
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxdefault┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxleft┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxcenter┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxright[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxdefault┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxleft┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxcenter┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxright[?25h
@@ -3,16 +3,20 @@ require 'whirled_peas'
3
3
  class TemplateFactory
4
4
  def build(*)
5
5
  WhirledPeas.template do |composer|
6
- [nil, :left, :center, :right].each do |align|
7
- composer.add_box("Alignment-#{align || :default}") do |composer, settings|
8
- settings.flow = :t2b
9
- settings.full_border
10
- settings.align = align
11
- # Keep the title long so grids below will be wide enough to use the
12
- # alignment attribute. Don't rely on the `width` attribute to keep
13
- # `align` isolated in this test.
14
- composer.add_text('Title') { 'This is an aligned box' }
15
- composer.add_text('Content') { align || :default }
6
+ composer.add_grid do |composer, settings|
7
+ settings.num_cols = 2
8
+
9
+ [nil, :left, :center, :right].each do |align|
10
+ composer.add_box("Alignment-#{align || :default}") do |composer, settings|
11
+ settings.flow = :t2b
12
+ settings.full_border
13
+ settings.align = align
14
+ # Keep the title long so grids below will be wide enough to use the
15
+ # alignment attribute. Don't rely on the `width` attribute to keep
16
+ # `align` isolated in this test.
17
+ composer.add_text('Title') { 'This is an aligned box' }
18
+ composer.add_text('Content') { align || :default }
19
+ end
16
20
  end
17
21
  end
18
22
  end
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned griddefault┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridleft┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridcenter┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridright[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned griddefault┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridleft┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┣━━━━━━━━━━━━━━━━━━━━━━━┫┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned gridcenter┏━━━━┃ ┣━━━━┃ ┗━━━━This[?25h
@@ -1 +1 @@
1
- [?25lThis is boldThis is not bold[?25h
1
+ [?25lThis is boldThis is not bold[?25h
@@ -1 +1 @@
1
- [?25lBLACK on WHITEGRAY on BRIGHT_REDRED on BRIGHT_GREENGREEN on BRIGHT_YELLOWYELLOW on BRIGHT_BLUEBLUE on BRIGHT_MAGENTAMAGENTA on BRIGHT_CYANCYAN on BRIGHT_WHITEWHITE on BLACKBRIGHT_RED on GRAYBRIGHT_GREEN on REDBRIGHT_YELLOW on GREENBRIGHT_BLUE on YELLOWBRIGHT_MAGENTA on BLUEBRIGHT_CYAN on MAGENTABRIGHT_WHITE on CYAN[?25h
1
+ [?25lBLACK on WHITEGRAY on BRIGHT_REDRED on BRIGHT_GREENGREEN on BRIGHT_YELLOWYELLOW on BRIGHT_BLUEBLUE on BRIGHT_MAGENTAMAGENTA on BRIGHT_CYANCYAN on BRIGHT_WHITEWHITE on BLACKBRIGHT_RED on GRAYBRIGHT_GREEN on REDBRIGHT_YELLOW on GREENBRIGHT_BLUE on YELLOWBRIGHT_MAGENTA on BLUEBRIGHT_CYAN on MAGENTABRIGHT_WHITE on CYAN[?25h
@@ -1 +1 @@
1
- [?25lThis is underlinedThis is not underlined[?25h
1
+ [?25lThis is underlinedThis is not underlined[?25h
@@ -1 +1 @@
1
- [?25l╔══╦══╦══╗║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╚══╩══╩══╝01234567891011[?25h
1
+ [?25l╔══╦══╦══╗║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╠══╬══╬══╣║ ║ ║ ║╚══╩══╩══╝01234567891011[?25h
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━┓┃ ┃┗━━━━━━━━━┛3. NARROW┏━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━┛2. WIDE┏━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━┛1. MEDIUM[?25h
@@ -0,0 +1,24 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer, settings|
6
+ settings.flow = :b2t
7
+ settings.full_border
8
+ composer.add_box('Medium') do |composer, settings|
9
+ settings.full_border
10
+ settings.set_padding(left: 3, right: 3)
11
+ '1. MEDIUM'
12
+ end
13
+ composer.add_box('Wide') do |composer, settings|
14
+ settings.full_border
15
+ settings.set_padding(left: 7, right: 7)
16
+ '2. WIDE'
17
+ end
18
+ composer.add_box('Narrow') do |composer, settings|
19
+ settings.full_border
20
+ '3. NARROW'
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━┛1. MEDIUM┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛2. TALL┏━━━━━━━━┓┃ ┃┗━━━━━━━━┛3. SHORT[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━┛1. MEDIUM┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛2. TALL┏━━━━━━━━┓┃ ┃┗━━━━━━━━┛3. SHORT[?25h
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━┓┃ ┃┗━━━━━━━━┛3. SHORT┏━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━┛2. TALL┏━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━┛1. MEDIUM[?25h
@@ -0,0 +1,24 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer, settings|
6
+ settings.flow = :r2l
7
+ settings.full_border
8
+ composer.add_box('Medium') do |composer, settings|
9
+ settings.set_padding(top: 2, bottom: 2)
10
+ settings.full_border
11
+ '1. MEDIUM'
12
+ end
13
+ composer.add_box('Tall') do |composer, settings|
14
+ settings.set_padding(top: 4, bottom: 4)
15
+ settings.full_border
16
+ '2. TALL'
17
+ end
18
+ composer.add_box('Short') do |composer, settings|
19
+ settings.full_border
20
+ '3. SHORT'
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1 +1 @@
1
- [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━┛1. MEDIUM┏━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━┛2. WIDE┏━━━━━━━━━┓┃ ┃┗━━━━━━━━━┛3. NARROW[?25h
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━┛┏━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━┛1. MEDIUM┏━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━┛2. WIDE┏━━━━━━━━━┓┃ ┃┗━━━━━━━━━┛3. NARROW[?25h
@@ -0,0 +1 @@
1
+ [?25l┏━━┳━━┳━━┳━━┓┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┗━━┻━━┻━━┻━━┛1234567891011121314[?25h
@@ -0,0 +1,14 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ composer.add_grid do |_, settings|
7
+ settings.flow = :b2t
8
+ settings.full_border
9
+ settings.num_cols = 4
10
+ 14.times.map { |i| i + 1 }
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━┳━━┳━━┳━━┓┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┣━━╋━━╋━━╋━━┫┃ ┃ ┃ ┃ ┃┗━━┻━━┻━━┻━━┛1234567891011121314[?25h