whirled_peas 0.2.0 → 0.6.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.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -0
  3. data/CHANGELOG.md +38 -0
  4. data/Gemfile +1 -0
  5. data/README.md +275 -81
  6. data/Rakefile +38 -3
  7. data/examples/intro.rb +52 -0
  8. data/examples/scrolling.rb +53 -0
  9. data/exe/whirled_peas +7 -0
  10. data/lib/whirled_peas.rb +12 -42
  11. data/lib/whirled_peas/command_line.rb +255 -0
  12. data/lib/whirled_peas/config.rb +21 -0
  13. data/lib/whirled_peas/errors.rb +7 -0
  14. data/lib/whirled_peas/frame.rb +0 -8
  15. data/lib/whirled_peas/frame/consumer.rb +14 -50
  16. data/lib/whirled_peas/frame/debug_consumer.rb +30 -0
  17. data/lib/whirled_peas/frame/event_loop.rb +68 -38
  18. data/lib/whirled_peas/frame/producer.rb +36 -32
  19. data/lib/whirled_peas/graphics.rb +5 -0
  20. data/lib/whirled_peas/graphics/box_painter.rb +108 -0
  21. data/lib/whirled_peas/graphics/canvas.rb +107 -0
  22. data/lib/whirled_peas/graphics/composer.rb +80 -0
  23. data/lib/whirled_peas/graphics/container_coords.rb +71 -0
  24. data/lib/whirled_peas/graphics/container_dimensions.rb +75 -0
  25. data/lib/whirled_peas/graphics/container_painter.rb +234 -0
  26. data/lib/whirled_peas/graphics/debugger.rb +52 -0
  27. data/lib/whirled_peas/graphics/grid_painter.rb +68 -0
  28. data/lib/whirled_peas/graphics/mock_screen.rb +26 -0
  29. data/lib/whirled_peas/graphics/painter.rb +19 -0
  30. data/lib/whirled_peas/graphics/renderer.rb +21 -0
  31. data/lib/whirled_peas/graphics/screen.rb +70 -0
  32. data/lib/whirled_peas/graphics/text_dimensions.rb +15 -0
  33. data/lib/whirled_peas/graphics/text_painter.rb +40 -0
  34. data/lib/whirled_peas/settings.rb +5 -0
  35. data/lib/whirled_peas/settings/bg_color.rb +22 -0
  36. data/lib/whirled_peas/settings/border.rb +101 -0
  37. data/lib/whirled_peas/settings/box_settings.rb +8 -0
  38. data/lib/whirled_peas/settings/color.rb +69 -0
  39. data/lib/whirled_peas/settings/container_settings.rb +139 -0
  40. data/lib/whirled_peas/settings/debugger.rb +96 -0
  41. data/lib/whirled_peas/settings/display_flow.rb +25 -0
  42. data/lib/whirled_peas/settings/element_settings.rb +61 -0
  43. data/lib/whirled_peas/settings/grid_settings.rb +15 -0
  44. data/lib/whirled_peas/settings/margin.rb +8 -0
  45. data/lib/whirled_peas/settings/padding.rb +8 -0
  46. data/lib/whirled_peas/settings/position.rb +15 -0
  47. data/lib/whirled_peas/settings/scrollbar.rb +15 -0
  48. data/lib/whirled_peas/settings/spacing.rb +24 -0
  49. data/lib/whirled_peas/settings/text_align.rb +19 -0
  50. data/lib/whirled_peas/settings/text_color.rb +19 -0
  51. data/lib/whirled_peas/settings/text_settings.rb +15 -0
  52. data/lib/whirled_peas/utils.rb +5 -0
  53. data/lib/whirled_peas/utils/ansi.rb +53 -0
  54. data/lib/whirled_peas/utils/formatted_string.rb +64 -0
  55. data/lib/whirled_peas/utils/title_font.rb +75 -0
  56. data/lib/whirled_peas/version.rb +1 -1
  57. data/screen_test/rendered/elements/box.frame +1 -0
  58. data/screen_test/rendered/elements/box.rb +20 -0
  59. data/screen_test/rendered/elements/grid.frame +1 -0
  60. data/screen_test/rendered/elements/grid.rb +13 -0
  61. data/screen_test/rendered/elements/screen_overflow.frame +1 -0
  62. data/screen_test/rendered/elements/screen_overflow.rb +9 -0
  63. data/screen_test/rendered/elements/text.frame +1 -0
  64. data/screen_test/rendered/elements/text.rb +9 -0
  65. data/screen_test/rendered/elements/text_multiline.frame +1 -0
  66. data/screen_test/rendered/elements/text_multiline.rb +9 -0
  67. data/screen_test/rendered/settings/align/box.frame +1 -0
  68. data/screen_test/rendered/settings/align/box.rb +24 -0
  69. data/screen_test/rendered/settings/align/children_center.frame +1 -0
  70. data/screen_test/rendered/settings/align/children_center.rb +13 -0
  71. data/screen_test/rendered/settings/align/children_left.frame +1 -0
  72. data/screen_test/rendered/settings/align/children_left.rb +13 -0
  73. data/screen_test/rendered/settings/align/children_right.frame +1 -0
  74. data/screen_test/rendered/settings/align/children_right.rb +13 -0
  75. data/screen_test/rendered/settings/align/grid.frame +1 -0
  76. data/screen_test/rendered/settings/align/grid.rb +20 -0
  77. data/screen_test/rendered/settings/ansi/bold.frame +1 -0
  78. data/screen_test/rendered/settings/ansi/bold.rb +15 -0
  79. data/screen_test/rendered/settings/ansi/color.frame +1 -0
  80. data/screen_test/rendered/settings/ansi/color.rb +37 -0
  81. data/screen_test/rendered/settings/ansi/underline.frame +1 -0
  82. data/screen_test/rendered/settings/ansi/underline.rb +15 -0
  83. data/screen_test/rendered/settings/border.frame +1 -0
  84. data/screen_test/rendered/settings/border.rb +13 -0
  85. data/screen_test/rendered/settings/flow/box_b2t.frame +1 -0
  86. data/screen_test/rendered/settings/flow/box_b2t.rb +24 -0
  87. data/screen_test/rendered/settings/flow/box_l2r.frame +1 -0
  88. data/screen_test/rendered/settings/flow/box_l2r.rb +24 -0
  89. data/screen_test/rendered/settings/flow/box_r2l.frame +1 -0
  90. data/screen_test/rendered/settings/flow/box_r2l.rb +24 -0
  91. data/screen_test/rendered/settings/flow/box_t2b.frame +1 -0
  92. data/screen_test/rendered/settings/flow/box_t2b.rb +24 -0
  93. data/screen_test/rendered/settings/flow/grid_b2t.frame +1 -0
  94. data/screen_test/rendered/settings/flow/grid_b2t.rb +14 -0
  95. data/screen_test/rendered/settings/flow/grid_l2r.frame +1 -0
  96. data/screen_test/rendered/settings/flow/grid_l2r.rb +14 -0
  97. data/screen_test/rendered/settings/flow/grid_r2l.frame +1 -0
  98. data/screen_test/rendered/settings/flow/grid_r2l.rb +14 -0
  99. data/screen_test/rendered/settings/flow/grid_t2b.frame +1 -0
  100. data/screen_test/rendered/settings/flow/grid_t2b.rb +14 -0
  101. data/screen_test/rendered/settings/height/box.frame +1 -0
  102. data/screen_test/rendered/settings/height/box.rb +13 -0
  103. data/screen_test/rendered/settings/height/grid.frame +1 -0
  104. data/screen_test/rendered/settings/height/grid.rb +14 -0
  105. data/screen_test/rendered/settings/height/overflow_box.frame +1 -0
  106. data/screen_test/rendered/settings/height/overflow_box.rb +13 -0
  107. data/screen_test/rendered/settings/height/overflow_box_l2r.frame +1 -0
  108. data/screen_test/rendered/settings/height/overflow_box_l2r.rb +15 -0
  109. data/screen_test/rendered/settings/height/overflow_box_t2b.frame +1 -0
  110. data/screen_test/rendered/settings/height/overflow_box_t2b.rb +14 -0
  111. data/screen_test/rendered/settings/height/overflow_grid.frame +1 -0
  112. data/screen_test/rendered/settings/height/overflow_grid.rb +16 -0
  113. data/screen_test/rendered/settings/margin.frame +1 -0
  114. data/screen_test/rendered/settings/margin.rb +14 -0
  115. data/screen_test/rendered/settings/padding.frame +1 -0
  116. data/screen_test/rendered/settings/padding.rb +11 -0
  117. data/screen_test/rendered/settings/position/box_left.frame +1 -0
  118. data/screen_test/rendered/settings/position/box_left.rb +17 -0
  119. data/screen_test/rendered/settings/position/box_left_negative.frame +1 -0
  120. data/screen_test/rendered/settings/position/box_left_negative.rb +17 -0
  121. data/screen_test/rendered/settings/position/box_top.frame +1 -0
  122. data/screen_test/rendered/settings/position/box_top.rb +17 -0
  123. data/screen_test/rendered/settings/position/box_top_negative.frame +1 -0
  124. data/screen_test/rendered/settings/position/box_top_negative.rb +17 -0
  125. data/screen_test/rendered/settings/position/grid_left.frame +1 -0
  126. data/screen_test/rendered/settings/position/grid_left.rb +18 -0
  127. data/screen_test/rendered/settings/position/grid_left_negative.frame +1 -0
  128. data/screen_test/rendered/settings/position/grid_left_negative.rb +18 -0
  129. data/screen_test/rendered/settings/position/grid_top.frame +1 -0
  130. data/screen_test/rendered/settings/position/grid_top.rb +18 -0
  131. data/screen_test/rendered/settings/position/grid_top_negative.frame +1 -0
  132. data/screen_test/rendered/settings/position/grid_top_negative.rb +18 -0
  133. data/screen_test/rendered/settings/scroll/horiz_box.frame +1 -0
  134. data/screen_test/rendered/settings/scroll/horiz_box.rb +15 -0
  135. data/screen_test/rendered/settings/scroll/vert_box.frame +1 -0
  136. data/screen_test/rendered/settings/scroll/vert_box.rb +18 -0
  137. data/screen_test/rendered/settings/title_font.frame +1 -0
  138. data/screen_test/rendered/settings/title_font.rb +12 -0
  139. data/screen_test/rendered/settings/width/box.frame +1 -0
  140. data/screen_test/rendered/settings/width/box.rb +13 -0
  141. data/screen_test/rendered/settings/width/grid.frame +1 -0
  142. data/screen_test/rendered/settings/width/grid.rb +14 -0
  143. data/screen_test/rendered/settings/width/overflow_box.frame +1 -0
  144. data/screen_test/rendered/settings/width/overflow_box.rb +11 -0
  145. data/screen_test/rendered/settings/width/overflow_box_l2r.frame +1 -0
  146. data/screen_test/rendered/settings/width/overflow_box_l2r.rb +14 -0
  147. data/screen_test/rendered/settings/width/overflow_box_t2b.frame +1 -0
  148. data/screen_test/rendered/settings/width/overflow_box_t2b.rb +15 -0
  149. data/screen_test/rendered/settings/width/overflow_grid.frame +1 -0
  150. data/screen_test/rendered/settings/width/overflow_grid.rb +14 -0
  151. data/screen_test/screen_tester.rb +201 -0
  152. data/whirled_peas.gemspec +4 -2
  153. metadata +147 -20
  154. data/lib/whirled_peas/ui.rb +0 -7
  155. data/lib/whirled_peas/ui/ansi.rb +0 -154
  156. data/lib/whirled_peas/ui/canvas.rb +0 -35
  157. data/lib/whirled_peas/ui/element.rb +0 -225
  158. data/lib/whirled_peas/ui/painter.rb +0 -283
  159. data/lib/whirled_peas/ui/screen.rb +0 -62
  160. data/lib/whirled_peas/ui/settings.rb +0 -521
  161. data/lib/whirled_peas/ui/stroke.rb +0 -29
  162. data/sandbox/auto.rb +0 -13
  163. data/sandbox/box.rb +0 -19
  164. data/sandbox/grid.rb +0 -13
  165. data/sandbox/sandbox.rb +0 -17
  166. data/sandbox/text.rb +0 -33
@@ -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
@@ -0,0 +1,24 @@
1
+ module WhirledPeas
2
+ module Settings
3
+ class Spacing
4
+ attr_writer :left, :top, :right, :bottom
5
+
6
+ def left
7
+ @left || 0
8
+ end
9
+
10
+ def top
11
+ @top || 0
12
+ end
13
+
14
+ def right
15
+ @right || 0
16
+ end
17
+
18
+ def bottom
19
+ @bottom || 0
20
+ end
21
+ end
22
+ private_constant :Spacing
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ module WhirledPeas
2
+ module Settings
3
+ module TextAlign
4
+ LEFT = :left
5
+ CENTER = :center
6
+ RIGHT = :right
7
+
8
+ def self.validate!(align)
9
+ return unless align
10
+ if [TextAlign::LEFT, TextAlign::CENTER, TextAlign::RIGHT].include?(align)
11
+ align
12
+ else
13
+ raise ArgumentError, "Unsupported text alignment: #{align}"
14
+ end
15
+ end
16
+ end
17
+ private_constant :TextAlign
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'whirled_peas/utils/ansi'
2
+
3
+ require_relative 'color'
4
+
5
+ module WhirledPeas
6
+ module Settings
7
+ class TextColor < Color
8
+ BLACK = new(Utils::Ansi::BLACK)
9
+ RED = new(Utils::Ansi::RED)
10
+ GREEN = new(Utils::Ansi::GREEN)
11
+ YELLOW = new(Utils::Ansi::YELLOW)
12
+ BLUE = new(Utils::Ansi::BLUE)
13
+ MAGENTA = new(Utils::Ansi::MAGENTA)
14
+ CYAN = new(Utils::Ansi::CYAN)
15
+ WHITE = new(Utils::Ansi::WHITE)
16
+ GRAY = BLACK.bright
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ require 'whirled_peas/utils/title_font'
2
+
3
+ require_relative 'element_settings'
4
+
5
+ module WhirledPeas
6
+ module Settings
7
+ class TextSettings < ElementSettings
8
+ attr_reader :title_font
9
+
10
+ def title_font=(font)
11
+ @title_font = Utils::TitleFont.validate!(font)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module WhirledPeas
2
+ module Utils
3
+ end
4
+ private_constant :Utils
5
+ end
@@ -0,0 +1,53 @@
1
+ module WhirledPeas
2
+ module Utils
3
+ # Helper module for working with ANSI escape codes. The most useful ANSI escape codes
4
+ # relate to text formatting.
5
+ #
6
+ # @see https://en.wikipedia.org/wiki/ANSI_escape_code
7
+ module Ansi
8
+ ESC = "\033"
9
+
10
+ END_FORMATTING = 0
11
+ private_constant :END_FORMATTING
12
+
13
+ # Text formatting constants
14
+ BOLD = 1
15
+ UNDERLINE = 4
16
+
17
+ # Text and background color constants
18
+ BLACK = 30
19
+ RED = 31
20
+ GREEN = 32
21
+ YELLOW = 33
22
+ BLUE = 34
23
+ MAGENTA = 35
24
+ CYAN = 36
25
+ WHITE = 37
26
+
27
+ # Bright colors are offset by this much from their standard versions
28
+ BRIGHT_OFFSET = 60
29
+
30
+ class << self
31
+ def cursor_pos(top: 0, left: 0)
32
+ "#{ESC}[#{top + 1};#{left + 1}H"
33
+ end
34
+
35
+ def cursor_visible(visible)
36
+ visible ? "#{ESC}[?25h" : "#{ESC}[?25l"
37
+ end
38
+
39
+ def clear_down
40
+ "#{ESC}[J"
41
+ end
42
+
43
+ def clear
44
+ esc_seq(END_FORMATTING)
45
+ end
46
+
47
+ def esc_seq(code)
48
+ "#{ESC}[#{code}m"
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,64 @@
1
+ require_relative 'ansi'
2
+
3
+ module WhirledPeas
4
+ module Utils
5
+ class FormattedString
6
+ def self.blank
7
+ new('')
8
+ end
9
+
10
+ def initialize(raw, formatting=nil)
11
+ @raw = raw
12
+ @formatting = [*formatting]
13
+ end
14
+
15
+ def length
16
+ raw.length
17
+ end
18
+
19
+ def [](index_or_range)
20
+ self.class.new(raw[index_or_range], foramtting)
21
+ end
22
+
23
+ def blank?
24
+ raw.empty?
25
+ end
26
+
27
+ def hash
28
+ [raw, formatting].hash
29
+ end
30
+
31
+ def ==(other)
32
+ case other
33
+ when self.class
34
+ hash == other.hash
35
+ when String
36
+ formatting.empty? && raw == other
37
+ else
38
+ false
39
+ end
40
+ end
41
+
42
+ def to_s
43
+ if raw.empty? || formatting.length == 0
44
+ raw
45
+ else
46
+ start_formatting = formatting.map { |code| Ansi.esc_seq(code) }.join
47
+ "#{start_formatting}#{raw}#{Ansi.clear}"
48
+ end
49
+ end
50
+
51
+ def inspect
52
+ if raw.empty? || formatting.length == 0
53
+ raw.inspect
54
+ else
55
+ "<#{formatting.join(', ')}>#{raw}<0>".inspect
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ attr_reader :raw, :formatting
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,75 @@
1
+ module WhirledPeas
2
+ module Utils
3
+ module TitleFont
4
+ PREFERRED_DEFAULT_FONT = :ansishadow
5
+ FONT_CACHE = File.join(ENV['HOME'] || '.', '.whirled_peas.fonts')
6
+
7
+ class << self
8
+ def validate!(font_key)
9
+ return unless font_key
10
+ return font_key if fonts.key?(font_key)
11
+ allowed = fonts.keys.map(&:inspect).sort
12
+ message = "Unrecognized font: '#{font_key.inspect}', expecting one of #{allowed.join(', ')}"
13
+ raise ArgumentError, message
14
+ end
15
+
16
+ def to_s(string, font_key)
17
+ require 'ruby_figlet'
18
+ RubyFiglet::Figlet.new(string, fonts[font_key]).to_s
19
+ end
20
+
21
+ def fonts
22
+ return @fonts if @fonts
23
+ File.exist?(FONT_CACHE) ? load_fonts_from_cache : load_fonts_from_figlet
24
+ @fonts
25
+ end
26
+
27
+ def load_fonts_from_cache
28
+ require 'json'
29
+ @fonts = {}
30
+ File.open(FONT_CACHE, 'r') do |fp|
31
+ JSON.parse(fp.read).each do |key, value|
32
+ @fonts[key.to_sym] = value
33
+ end
34
+ end
35
+ @fonts
36
+ end
37
+
38
+ def load_fonts_from_figlet
39
+ require 'ruby_figlet'
40
+ require 'json'
41
+ @fonts = {}
42
+ RubyFiglet::Figlet.available.strip.split("\n").each do |font|
43
+ # Load the font to be sure it exists on the system
44
+ next unless available?(font)
45
+ string_key = font.downcase.gsub(/\W/, '')
46
+ string_key = "_#{string_key}" if string_key[0] !~ /[a-z]/
47
+ string_key.gsub!(/\d+$/, '')
48
+ next if @fonts.key?(string_key)
49
+ @fonts[string_key.to_sym] = font
50
+ end
51
+ @fonts[:default] ||= @fonts[PREFERRED_DEFAULT_FONT] || @fonts.values.first
52
+ File.open(FONT_CACHE, 'w') { |fp| fp.write(JSON.generate(@fonts)) }
53
+ @fonts
54
+ end
55
+
56
+ private
57
+
58
+ def available?(font)
59
+ # Figlet's font loader prints to STDOUT if the font file is not found.
60
+ # Temporarily redirect STDOUT to /dev/null while the font file is loaded
61
+ # then remove the redirect in an ensure block. Also, if a font file is
62
+ # not available, a SystemExit is raise :/
63
+ original_stdout = $stdout.clone
64
+ $stdout.reopen(File.new('/dev/null', 'w'))
65
+ RubyFiglet::Figlet.new('Text', font)
66
+ true
67
+ rescue SystemExit, NoMethodError
68
+ false
69
+ ensure
70
+ $stdout.reopen(original_stdout)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -1,3 +1,3 @@
1
1
  module WhirledPeas
2
- VERSION = '0.2.0'
2
+ VERSION = '0.6.0'
3
3
  end
@@ -0,0 +1 @@
1
+ [?25lTOP LEFTBOTTOM LEFT TOP RIGHT  BOTTOM RIGHT[?25h
@@ -0,0 +1,20 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ composer.add_box('Container') do |composer, settings|
7
+ composer.add_box do |composer, settings|
8
+ settings.flow = :t2b
9
+ composer.add_box('TopLeft') { "TOP LEFT" }
10
+ composer.add_box('BottomLeft') { "BOTTOM LEFT" }
11
+ end
12
+ composer.add_box do |composer, settings|
13
+ settings.flow = :t2b
14
+ composer.add_box('TopRight') { " TOP RIGHT " }
15
+ composer.add_box('BottomRight') { " BOTTOM RIGHT" }
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━┳━━━━━━┳━━━━━━┓┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┣━━━━━━╋━━━━━━╋━━━━━━┫┃ ┃ ┃ ┃┗━━━━━━┻━━━━━━┻━━━━━━┛Item 0Item 1Item 2Item 3Item 4Item 5Item 6[?25h
@@ -0,0 +1,13 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ composer.add_grid('Grid') do |_, settings|
7
+ settings.num_cols = 3
8
+ settings.full_border
9
+ 7.times.map { |i| "Item #{i}" }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1 @@
1
+ [?25l--------------------------------------------------------------------------------[?25h
@@ -0,0 +1,9 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do
6
+ '-' * 1000
7
+ end
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ [?25lHello, World![?25h
@@ -0,0 +1,9 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ "Hello, World!"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ [?25lLine 1Line 2Line 3[?25h
@@ -0,0 +1,9 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
6
+ "Line 1\nLine 2\nLine 3"
7
+ end
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxdefault┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxleft┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxcenter┏━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━┛This is an aligned boxright[?25h
@@ -0,0 +1,24 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer|
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
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -0,0 +1,13 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer, settings|
6
+ settings.align = :center
7
+ settings.width = 50
8
+ settings.full_border
9
+ composer.add_text('Text1') { 'Thing 1' }
10
+ composer.add_text('Text2') { 'Thing 2' }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓┃ ┃┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛Thing 1Thing 2[?25h
@@ -0,0 +1,13 @@
1
+ require 'whirled_peas'
2
+
3
+ class TemplateFactory
4
+ def build(*)
5
+ WhirledPeas.template do |composer, settings|
6
+ settings.align = :left
7
+ settings.width = 50
8
+ settings.full_border
9
+ composer.add_text('Text1') { 'Thing 1' }
10
+ composer.add_text('Text2') { 'Thing 2' }
11
+ end
12
+ end
13
+ end