whirled_peas 0.2.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -18,11 +18,13 @@ Gem::Specification.new do |spec|
18
18
  # Specify which files should be added to the gem when it is released.
19
19
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
20
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|sandbox)/}) }
22
22
  end
23
+ spec.bindir = 'exe'
24
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
25
  spec.require_paths = ['lib']
24
26
 
25
27
  spec.add_runtime_dependency 'highline', '~> 2.0'
26
28
  spec.add_runtime_dependency 'json', '~> 2.5'
27
- spec.add_runtime_dependency 'tty-cursor', '~> 0.7'
29
+ spec.add_runtime_dependency 'ruby_figlet', '~> 0.6'
28
30
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whirled_peas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Collier
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-21 00:00:00.000000000 Z
11
+ date: 2021-01-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -39,23 +39,24 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.5'
41
41
  - !ruby/object:Gem::Dependency
42
- name: tty-cursor
42
+ name: ruby_figlet
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.7'
47
+ version: '0.6'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.7'
54
+ version: '0.6'
55
55
  description:
56
56
  email:
57
57
  - tcollier@gmail.com
58
- executables: []
58
+ executables:
59
+ - whirled_peas
59
60
  extensions: []
60
61
  extra_rdoc_files: []
61
62
  files:
@@ -70,26 +71,152 @@ files:
70
71
  - Rakefile
71
72
  - bin/console
72
73
  - bin/setup
74
+ - examples/intro.rb
75
+ - examples/scrolling.rb
76
+ - exe/whirled_peas
73
77
  - lib/whirled_peas.rb
78
+ - lib/whirled_peas/command_line.rb
79
+ - lib/whirled_peas/config.rb
80
+ - lib/whirled_peas/errors.rb
74
81
  - lib/whirled_peas/frame.rb
75
82
  - lib/whirled_peas/frame/consumer.rb
83
+ - lib/whirled_peas/frame/debug_consumer.rb
76
84
  - lib/whirled_peas/frame/event_loop.rb
77
85
  - lib/whirled_peas/frame/producer.rb
86
+ - lib/whirled_peas/graphics.rb
87
+ - lib/whirled_peas/graphics/box_painter.rb
88
+ - lib/whirled_peas/graphics/canvas.rb
89
+ - lib/whirled_peas/graphics/composer.rb
90
+ - lib/whirled_peas/graphics/container_coords.rb
91
+ - lib/whirled_peas/graphics/container_dimensions.rb
92
+ - lib/whirled_peas/graphics/container_painter.rb
93
+ - lib/whirled_peas/graphics/debugger.rb
94
+ - lib/whirled_peas/graphics/grid_painter.rb
95
+ - lib/whirled_peas/graphics/mock_screen.rb
96
+ - lib/whirled_peas/graphics/painter.rb
97
+ - lib/whirled_peas/graphics/renderer.rb
98
+ - lib/whirled_peas/graphics/screen.rb
99
+ - lib/whirled_peas/graphics/text_dimensions.rb
100
+ - lib/whirled_peas/graphics/text_painter.rb
78
101
  - lib/whirled_peas/null_logger.rb
79
- - lib/whirled_peas/ui.rb
80
- - lib/whirled_peas/ui/ansi.rb
81
- - lib/whirled_peas/ui/canvas.rb
82
- - lib/whirled_peas/ui/element.rb
83
- - lib/whirled_peas/ui/painter.rb
84
- - lib/whirled_peas/ui/screen.rb
85
- - lib/whirled_peas/ui/settings.rb
86
- - lib/whirled_peas/ui/stroke.rb
102
+ - lib/whirled_peas/settings.rb
103
+ - lib/whirled_peas/settings/bg_color.rb
104
+ - lib/whirled_peas/settings/border.rb
105
+ - lib/whirled_peas/settings/box_settings.rb
106
+ - lib/whirled_peas/settings/color.rb
107
+ - lib/whirled_peas/settings/container_settings.rb
108
+ - lib/whirled_peas/settings/debugger.rb
109
+ - lib/whirled_peas/settings/display_flow.rb
110
+ - lib/whirled_peas/settings/element_settings.rb
111
+ - lib/whirled_peas/settings/grid_settings.rb
112
+ - lib/whirled_peas/settings/margin.rb
113
+ - lib/whirled_peas/settings/padding.rb
114
+ - lib/whirled_peas/settings/position.rb
115
+ - lib/whirled_peas/settings/scrollbar.rb
116
+ - lib/whirled_peas/settings/spacing.rb
117
+ - lib/whirled_peas/settings/text_align.rb
118
+ - lib/whirled_peas/settings/text_color.rb
119
+ - lib/whirled_peas/settings/text_settings.rb
120
+ - lib/whirled_peas/utils.rb
121
+ - lib/whirled_peas/utils/ansi.rb
122
+ - lib/whirled_peas/utils/formatted_string.rb
123
+ - lib/whirled_peas/utils/title_font.rb
87
124
  - lib/whirled_peas/version.rb
88
- - sandbox/auto.rb
89
- - sandbox/box.rb
90
- - sandbox/grid.rb
91
- - sandbox/sandbox.rb
92
- - sandbox/text.rb
125
+ - screen_test/rendered/elements/box.frame
126
+ - screen_test/rendered/elements/box.rb
127
+ - screen_test/rendered/elements/grid.frame
128
+ - screen_test/rendered/elements/grid.rb
129
+ - screen_test/rendered/elements/screen_overflow.frame
130
+ - screen_test/rendered/elements/screen_overflow.rb
131
+ - screen_test/rendered/elements/text.frame
132
+ - screen_test/rendered/elements/text.rb
133
+ - screen_test/rendered/elements/text_multiline.frame
134
+ - screen_test/rendered/elements/text_multiline.rb
135
+ - screen_test/rendered/settings/align/box.frame
136
+ - screen_test/rendered/settings/align/box.rb
137
+ - screen_test/rendered/settings/align/children_center.frame
138
+ - screen_test/rendered/settings/align/children_center.rb
139
+ - screen_test/rendered/settings/align/children_left.frame
140
+ - screen_test/rendered/settings/align/children_left.rb
141
+ - screen_test/rendered/settings/align/children_right.frame
142
+ - screen_test/rendered/settings/align/children_right.rb
143
+ - screen_test/rendered/settings/align/grid.frame
144
+ - screen_test/rendered/settings/align/grid.rb
145
+ - screen_test/rendered/settings/ansi/bold.frame
146
+ - screen_test/rendered/settings/ansi/bold.rb
147
+ - screen_test/rendered/settings/ansi/color.frame
148
+ - screen_test/rendered/settings/ansi/color.rb
149
+ - screen_test/rendered/settings/ansi/underline.frame
150
+ - screen_test/rendered/settings/ansi/underline.rb
151
+ - screen_test/rendered/settings/border.frame
152
+ - screen_test/rendered/settings/border.rb
153
+ - screen_test/rendered/settings/flow/box_b2t.frame
154
+ - screen_test/rendered/settings/flow/box_b2t.rb
155
+ - screen_test/rendered/settings/flow/box_l2r.frame
156
+ - screen_test/rendered/settings/flow/box_l2r.rb
157
+ - screen_test/rendered/settings/flow/box_r2l.frame
158
+ - screen_test/rendered/settings/flow/box_r2l.rb
159
+ - screen_test/rendered/settings/flow/box_t2b.frame
160
+ - screen_test/rendered/settings/flow/box_t2b.rb
161
+ - screen_test/rendered/settings/flow/grid_b2t.frame
162
+ - screen_test/rendered/settings/flow/grid_b2t.rb
163
+ - screen_test/rendered/settings/flow/grid_l2r.frame
164
+ - screen_test/rendered/settings/flow/grid_l2r.rb
165
+ - screen_test/rendered/settings/flow/grid_r2l.frame
166
+ - screen_test/rendered/settings/flow/grid_r2l.rb
167
+ - screen_test/rendered/settings/flow/grid_t2b.frame
168
+ - screen_test/rendered/settings/flow/grid_t2b.rb
169
+ - screen_test/rendered/settings/height/box.frame
170
+ - screen_test/rendered/settings/height/box.rb
171
+ - screen_test/rendered/settings/height/grid.frame
172
+ - screen_test/rendered/settings/height/grid.rb
173
+ - screen_test/rendered/settings/height/overflow_box.frame
174
+ - screen_test/rendered/settings/height/overflow_box.rb
175
+ - screen_test/rendered/settings/height/overflow_box_l2r.frame
176
+ - screen_test/rendered/settings/height/overflow_box_l2r.rb
177
+ - screen_test/rendered/settings/height/overflow_box_t2b.frame
178
+ - screen_test/rendered/settings/height/overflow_box_t2b.rb
179
+ - screen_test/rendered/settings/height/overflow_grid.frame
180
+ - screen_test/rendered/settings/height/overflow_grid.rb
181
+ - screen_test/rendered/settings/margin.frame
182
+ - screen_test/rendered/settings/margin.rb
183
+ - screen_test/rendered/settings/padding.frame
184
+ - screen_test/rendered/settings/padding.rb
185
+ - screen_test/rendered/settings/position/box_left.frame
186
+ - screen_test/rendered/settings/position/box_left.rb
187
+ - screen_test/rendered/settings/position/box_left_negative.frame
188
+ - screen_test/rendered/settings/position/box_left_negative.rb
189
+ - screen_test/rendered/settings/position/box_top.frame
190
+ - screen_test/rendered/settings/position/box_top.rb
191
+ - screen_test/rendered/settings/position/box_top_negative.frame
192
+ - screen_test/rendered/settings/position/box_top_negative.rb
193
+ - screen_test/rendered/settings/position/grid_left.frame
194
+ - screen_test/rendered/settings/position/grid_left.rb
195
+ - screen_test/rendered/settings/position/grid_left_negative.frame
196
+ - screen_test/rendered/settings/position/grid_left_negative.rb
197
+ - screen_test/rendered/settings/position/grid_top.frame
198
+ - screen_test/rendered/settings/position/grid_top.rb
199
+ - screen_test/rendered/settings/position/grid_top_negative.frame
200
+ - screen_test/rendered/settings/position/grid_top_negative.rb
201
+ - screen_test/rendered/settings/scroll/horiz_box.frame
202
+ - screen_test/rendered/settings/scroll/horiz_box.rb
203
+ - screen_test/rendered/settings/scroll/vert_box.frame
204
+ - screen_test/rendered/settings/scroll/vert_box.rb
205
+ - screen_test/rendered/settings/title_font.frame
206
+ - screen_test/rendered/settings/title_font.rb
207
+ - screen_test/rendered/settings/width/box.frame
208
+ - screen_test/rendered/settings/width/box.rb
209
+ - screen_test/rendered/settings/width/grid.frame
210
+ - screen_test/rendered/settings/width/grid.rb
211
+ - screen_test/rendered/settings/width/overflow_box.frame
212
+ - screen_test/rendered/settings/width/overflow_box.rb
213
+ - screen_test/rendered/settings/width/overflow_box_l2r.frame
214
+ - screen_test/rendered/settings/width/overflow_box_l2r.rb
215
+ - screen_test/rendered/settings/width/overflow_box_t2b.frame
216
+ - screen_test/rendered/settings/width/overflow_box_t2b.rb
217
+ - screen_test/rendered/settings/width/overflow_grid.frame
218
+ - screen_test/rendered/settings/width/overflow_grid.rb
219
+ - screen_test/screen_tester.rb
93
220
  - whirled_peas.gemspec
94
221
  homepage: https://github.com/tcollier/whirled_peas
95
222
  licenses:
@@ -1,7 +0,0 @@
1
- require_relative 'ui/element'
2
- require_relative 'ui/screen'
3
-
4
- module WhirledPeas
5
- module UI
6
- end
7
- end
@@ -1,154 +0,0 @@
1
- module WhirledPeas
2
- module UI
3
- DEBUG_COLOR = ARGV.include?('--debug-color')
4
-
5
- module Ansi
6
- BOLD = 1
7
- UNDERLINE = 4
8
-
9
- BLACK = 30
10
- RED = 31
11
- GREEN = 32
12
- YELLOW = 33
13
- BLUE = 34
14
- MAGENTA = 35
15
- CYAN = 36
16
- WHITE = 37
17
-
18
- END_FORMATTING = 0
19
-
20
- class << self
21
- def format(str, codes)
22
- if str.empty? || codes.length == 0
23
- str
24
- else
25
- start_formatting = codes.map(&method(:esc_seq)).join
26
- "#{start_formatting}#{str}#{esc_seq(END_FORMATTING)}"
27
- end
28
- end
29
-
30
- def clear
31
- esc_seq(END_FORMATTING)
32
- end
33
-
34
- def hidden_width(line)
35
- return 0 if DEBUG_COLOR
36
- width = 0
37
- line.scan(/\033\[\d+m/).each { |f| width += f.length }
38
- width
39
- end
40
-
41
- def close_formatting(line)
42
- codes = line.scan(DEBUG_COLOR ? /<(\d+)>/ : /\033\[(\d+)m/)
43
- if codes.length > 0 && codes.last[0] != END_FORMATTING.to_s
44
- "#{line}#{esc_seq(END_FORMATTING)}"
45
- else
46
- line
47
- end
48
- end
49
-
50
- def first(str, num_visible_chars)
51
- return str if str.length <= num_visible_chars + hidden_width(str)
52
- result = ''
53
- in_format = false
54
- visible_len = 0
55
- str.chars.each do |char|
56
- in_format = true if !in_format && char == "\033"
57
- result += char
58
- visible_len += 1 if !in_format
59
- in_format = false if in_format && char == 'm'
60
- break if visible_len == num_visible_chars
61
- end
62
- close_formatting(result)
63
- end
64
-
65
- private
66
-
67
- def esc_seq(code)
68
- DEBUG_COLOR ? "<#{code}>" : "\033[#{code}m"
69
- end
70
- end
71
- end
72
-
73
- class Color
74
- BRIGHT_OFFSET = 60
75
- private_constant :BRIGHT_OFFSET
76
-
77
- def self.validate!(color)
78
- return unless color
79
- if color.is_a?(Symbol)
80
- error_message = "Unsupported #{self.name.split('::').last}: #{color}"
81
- match = color.to_s.match(/^(bright_)?(\w+)$/)
82
- begin
83
- color = self.const_get(match[2].upcase)
84
- raise ArgumentError, error_message unless color.is_a?(Color)
85
- if match[1]
86
- raise ArgumentError, error_message if color.bright?
87
- color.bright
88
- else
89
- color
90
- end
91
- rescue NameError
92
- raise ArgumentError, error_message
93
- end
94
- else
95
- color
96
- end
97
- end
98
-
99
- def initialize(code, bright=false)
100
- @code = code
101
- @bright = bright
102
- end
103
-
104
- def bright?
105
- @bright
106
- end
107
-
108
- def bright
109
- bright? ? self : self.class.new(@code + BRIGHT_OFFSET, true)
110
- end
111
-
112
- def to_s
113
- @code.to_s
114
- end
115
-
116
- def inspect
117
- "#{self.class.name.split('::').last}(code=#{@code}, bright=#{@bright})"
118
- end
119
- end
120
- private_constant :Color
121
-
122
- class BgColor < Color
123
- BG_OFFSET = 10
124
- private_constant :BG_OFFSET
125
-
126
- BLACK = new(Ansi::BLACK + BG_OFFSET)
127
- RED = new(Ansi::RED + BG_OFFSET)
128
- GREEN = new(Ansi::GREEN + BG_OFFSET)
129
- YELLOW = new(Ansi::YELLOW + BG_OFFSET)
130
- BLUE = new(Ansi::BLUE + BG_OFFSET)
131
- MAGENTA = new(Ansi::MAGENTA + BG_OFFSET)
132
- CYAN = new(Ansi::CYAN + BG_OFFSET)
133
- WHITE = new(Ansi::WHITE + BG_OFFSET)
134
- GRAY = BLACK.bright
135
- end
136
-
137
- class TextColor < Color
138
- BLACK = new(Ansi::BLACK)
139
- RED = new(Ansi::RED)
140
- GREEN = new(Ansi::GREEN)
141
- YELLOW = new(Ansi::YELLOW)
142
- BLUE = new(Ansi::BLUE)
143
- MAGENTA = new(Ansi::MAGENTA)
144
- CYAN = new(Ansi::CYAN)
145
- WHITE = new(Ansi::WHITE)
146
- GRAY = BLACK.bright
147
- end
148
-
149
- module TextFormat
150
- BOLD = Ansi::BOLD
151
- UNDERLINE = Ansi::UNDERLINE
152
- end
153
- end
154
- end
@@ -1,35 +0,0 @@
1
- require_relative 'stroke'
2
-
3
- module WhirledPeas
4
- module UI
5
- class Canvas
6
- attr_reader :left, :top, :width, :height
7
-
8
- def initialize(left, top, width, height)
9
- @left = left
10
- @top = top
11
- @width = width
12
- @height = height
13
- end
14
-
15
- def stroke(left, top, chars)
16
- if left >= self.left + self.width || left + chars.length <= self.left
17
- Stroke::EMPTY
18
- elsif top < self.top || top >= self.top + self.height
19
- Stroke::EMPTY
20
- else
21
- if left < self.left
22
- chars = chars[self.left - left..-1]
23
- left = self.left
24
- end
25
- num_chars = [self.left + self.width, left + chars.length].min - left
26
- Stroke.new(left, top, Ansi.first(chars, num_chars))
27
- end
28
- end
29
-
30
- def inspect
31
- "Canvas(left=#{left}, top=#{top}, width=#{width}, height=#{height})"
32
- end
33
- end
34
- end
35
- end
@@ -1,225 +0,0 @@
1
- require_relative 'settings'
2
-
3
- module WhirledPeas
4
- module UI
5
- STRINGALBE_CLASSES = [FalseClass, Float, Integer, NilClass, String, Symbol, TrueClass]
6
-
7
- class Element
8
- attr_accessor :preferred_width, :preferred_height
9
- attr_reader :name, :settings
10
-
11
- def initialize(name, settings)
12
- @name = name
13
- @settings = settings
14
- end
15
- end
16
- private_constant :Element
17
-
18
- class TextElement < Element
19
- attr_reader :value
20
-
21
- def initialize(name, settings)
22
- super(name, TextSettings.merge(settings))
23
- end
24
-
25
- def value=(val)
26
- unless STRINGALBE_CLASSES.include?(val.class)
27
- raise ArgmentError, "Unsupported type for TextElement: #{val.class}"
28
- end
29
- @value = val.to_s
30
- @preferred_width = settings.width || value.length
31
- @preferred_height = 1
32
- end
33
-
34
- def inspect(indent='')
35
- dims = unless preferred_width.nil?
36
- "#{indent + ' '}- Dimensions: #{preferred_width}x#{preferred_height}"
37
- end
38
- [
39
- "#{indent}+ #{name} [#{self.class.name}]",
40
- dims,
41
- "#{indent + ' '}- Settings",
42
- settings.inspect(indent + ' ')
43
- ].compact.join("\n")
44
- end
45
- end
46
-
47
- class ComposableElement < Element
48
- class << self
49
- def next_name
50
- @counter ||= 0
51
- @counter += 1
52
- "Element-#{@counter}"
53
- end
54
- end
55
-
56
- def initialize(name, settings)
57
- super
58
- end
59
-
60
- def children
61
- @children ||= []
62
- end
63
-
64
- def add_text(name=self.class.next_name, &block)
65
- element = TextElement.new(name, settings)
66
- element.value = yield nil, element.settings
67
- children << element
68
- end
69
-
70
- def add_box(name=self.class.next_name, &block)
71
- element = BoxElement.new(name, settings)
72
- value = yield element, element.settings
73
- children << element
74
- if element.children.empty? && STRINGALBE_CLASSES.include?(value.class)
75
- element.add_text { value.to_s }
76
- end
77
- end
78
-
79
- def add_grid(name=self.class.next_name, &block)
80
- element = GridElement.new(name, settings)
81
- values = yield element, element.settings
82
- children << element
83
- if element.children.empty? && values.is_a?(Array)
84
- values.each { |v| element.add_text { v.to_s } }
85
- end
86
- end
87
-
88
- def inspect(indent='')
89
- kids = children.map { |c| c.inspect(indent + ' ') }.join("\n")
90
- dims = unless preferred_width.nil?
91
- "#{indent + ' '}- Dimensions: #{preferred_width}x#{preferred_height}"
92
- end
93
- [
94
- "#{indent}+ #{name} [#{self.class.name}]",
95
- dims,
96
- "#{indent + ' '}- Settings",
97
- settings.inspect(indent + ' '),
98
- "#{indent + ' '}- Children",
99
- kids
100
- ].compact.join("\n")
101
- end
102
-
103
- private
104
-
105
- def margin_width
106
- settings.margin.left + settings.margin.right
107
- end
108
-
109
- def margin_height
110
- settings.margin.top + settings.margin.bottom
111
- end
112
-
113
- def outer_border_width
114
- (settings.border.left? ? 1 : 0) + (settings.border.right? ? 1 : 0)
115
- end
116
-
117
- def outer_border_height
118
- (settings.border.top? ? 1 : 0) + (settings.border.bottom? ? 1 : 0)
119
- end
120
-
121
- def inner_border_width
122
- settings.border.inner_vert? ? 1 : 0
123
- end
124
-
125
- def inner_border_height
126
- settings.border.inner_horiz? ? 1 : 0
127
- end
128
-
129
- def padding_width
130
- settings.padding.left + settings.padding.right
131
- end
132
-
133
- def padding_height
134
- settings.padding.top + settings.padding.bottom
135
- end
136
- end
137
-
138
- class Template < ComposableElement
139
- def initialize(settings=TemplateSettings.new)
140
- super('TEMPLATE', settings)
141
- end
142
- end
143
-
144
- class BoxElement < ComposableElement
145
- attr_writer :content_width, :content_height
146
-
147
- def initialize(name, settings)
148
- super(name, BoxSettings.merge(settings))
149
- end
150
-
151
- def self.from_template(template, width, height)
152
- box = new(template.name, template.settings)
153
- template.children.each { |c| box.children << c }
154
- box.content_width = box.preferred_width = width
155
- box.content_height = box.preferred_height = height
156
- box
157
- end
158
-
159
- def content_width
160
- @content_width ||= begin
161
- child_widths = children.map(&:preferred_width)
162
- width = settings.horizontal_flow? ? child_widths.sum : (child_widths.max || 0)
163
- [width, *settings.width].max
164
- end
165
- end
166
-
167
- def preferred_width
168
- @preferred_width ||=
169
- margin_width + outer_border_width + padding_width + content_width
170
- end
171
-
172
- def content_height
173
- @content_height ||= begin
174
- child_heights = children.map(&:preferred_height)
175
- settings.vertical_flow? ? child_heights.sum : (child_heights.max || 0)
176
- end
177
- end
178
-
179
- def preferred_height
180
- @preferred_height ||=
181
- margin_height + outer_border_height + padding_height + content_height
182
- end
183
- end
184
-
185
- class GridElement < ComposableElement
186
- def initialize(name, settings)
187
- super(name, GridSettings.merge(settings))
188
- end
189
-
190
- def col_width
191
- return @col_width if @col_width
192
- @col_width = 0
193
- children.each do |child|
194
- @col_width = child.preferred_width if child.preferred_width > @col_width
195
- end
196
- @col_width
197
- end
198
-
199
- def row_height
200
- return @row_height if @row_height
201
- @row_height = 0
202
- children.each do |child|
203
- @row_height = child.preferred_height if child.preferred_height > @row_height
204
- end
205
- @row_height
206
- end
207
-
208
-
209
- def preferred_width
210
- margin_width +
211
- outer_border_width +
212
- settings.num_cols * (padding_width + col_width) +
213
- (settings.num_cols - 1) * inner_border_width
214
- end
215
-
216
- def preferred_height
217
- num_rows = (children.length / settings.num_cols).ceil
218
- margin_height +
219
- outer_border_height +
220
- num_rows * (padding_height + row_height) +
221
- (num_rows - 1) * inner_border_height
222
- end
223
- end
224
- end
225
- end