whirled_peas 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -1
- data/README.md +315 -43
- data/Rakefile +8 -18
- data/lib/whirled_peas/graphics.rb +14 -0
- data/lib/whirled_peas/graphics/box_painter.rb +39 -46
- data/lib/whirled_peas/graphics/canvas.rb +22 -11
- data/lib/whirled_peas/graphics/container_coords.rb +6 -5
- data/lib/whirled_peas/graphics/container_dimensions.rb +26 -8
- data/lib/whirled_peas/graphics/container_painter.rb +42 -4
- data/lib/whirled_peas/graphics/grid_painter.rb +11 -10
- data/lib/whirled_peas/graphics/painter.rb +5 -1
- data/lib/whirled_peas/graphics/renderer.rb +6 -1
- data/lib/whirled_peas/graphics/text_painter.rb +2 -2
- data/lib/whirled_peas/settings/alignment.rb +24 -0
- data/lib/whirled_peas/settings/bg_color.rb +2 -0
- data/lib/whirled_peas/settings/border.rb +16 -16
- data/lib/whirled_peas/settings/color.rb +13 -14
- data/lib/whirled_peas/settings/container_settings.rb +126 -42
- data/lib/whirled_peas/settings/display_flow.rb +13 -11
- data/lib/whirled_peas/settings/element_settings.rb +3 -3
- data/lib/whirled_peas/settings/grid_settings.rb +5 -1
- data/lib/whirled_peas/settings/sizing.rb +19 -0
- data/lib/whirled_peas/settings/spacing.rb +34 -0
- data/lib/whirled_peas/settings/text_color.rb +2 -0
- data/lib/whirled_peas/settings/vert_alignment.rb +24 -0
- data/lib/whirled_peas/utils/title_font.rb +1 -1
- data/lib/whirled_peas/version.rb +1 -1
- data/screen_test/{rendered/elements → elements}/box.frame +1 -1
- data/screen_test/{rendered/elements → elements}/box.rb +0 -0
- data/screen_test/elements/grid.frame +1 -0
- data/screen_test/{rendered/elements → elements}/grid.rb +0 -0
- data/screen_test/elements/screen_overflow_x.frame +1 -0
- data/screen_test/{rendered/elements/screen_overflow.rb → elements/screen_overflow_x.rb} +0 -0
- data/screen_test/elements/screen_overflow_y.frame +1 -0
- data/screen_test/elements/screen_overflow_y.rb +9 -0
- data/screen_test/elements/text.frame +1 -0
- data/screen_test/{rendered/elements → elements}/text.rb +0 -0
- data/screen_test/elements/text_multiline.frame +1 -0
- data/screen_test/{rendered/elements → elements}/text_multiline.rb +0 -0
- data/screen_test/settings/align/box_around.frame +1 -0
- data/screen_test/settings/align/box_around.rb +16 -0
- data/screen_test/settings/align/box_between.frame +1 -0
- data/screen_test/settings/align/box_between.rb +16 -0
- data/screen_test/settings/align/box_center.frame +1 -0
- data/screen_test/{rendered/settings/align/grid.rb → settings/align/box_center.rb} +7 -6
- data/screen_test/settings/align/box_default.frame +1 -0
- data/screen_test/settings/align/box_default.rb +20 -0
- data/screen_test/settings/align/box_evenly.frame +1 -0
- data/screen_test/settings/align/box_evenly.rb +16 -0
- data/screen_test/settings/align/box_left.frame +1 -0
- data/screen_test/settings/align/box_left.rb +21 -0
- data/screen_test/settings/align/box_right.frame +1 -0
- data/screen_test/settings/align/box_right.rb +21 -0
- data/screen_test/settings/align/children_center.frame +1 -0
- data/screen_test/settings/align/children_center.rb +15 -0
- data/screen_test/settings/align/children_left.frame +1 -0
- data/screen_test/settings/align/children_left.rb +15 -0
- data/screen_test/settings/align/children_right.frame +1 -0
- data/screen_test/settings/align/children_right.rb +15 -0
- data/screen_test/settings/align/grid_center.frame +1 -0
- data/screen_test/settings/align/grid_center.rb +18 -0
- data/screen_test/settings/align/grid_default.frame +1 -0
- data/screen_test/settings/align/grid_default.rb +17 -0
- data/screen_test/settings/align/grid_left.frame +1 -0
- data/screen_test/settings/align/grid_left.rb +18 -0
- data/screen_test/settings/align/grid_right.frame +1 -0
- data/screen_test/settings/align/grid_right.rb +18 -0
- data/screen_test/settings/ansi/bold.frame +1 -0
- data/screen_test/{rendered/settings/height/overflow_box_t2b.rb → settings/ansi/bold.rb} +4 -4
- data/screen_test/{rendered/settings → settings}/ansi/color.frame +1 -1
- data/screen_test/{rendered/settings → settings}/ansi/color.rb +0 -0
- data/screen_test/settings/ansi/underline.frame +1 -0
- data/screen_test/{rendered/settings → settings}/ansi/underline.rb +4 -5
- data/screen_test/{rendered/settings → settings}/border.frame +1 -1
- data/screen_test/{rendered/settings → settings}/border.rb +1 -1
- data/screen_test/settings/flow/box_b2t.frame +1 -0
- data/screen_test/settings/flow/box_b2t.rb +26 -0
- data/screen_test/settings/flow/box_l2r.frame +1 -0
- data/screen_test/settings/flow/box_l2r.rb +26 -0
- data/screen_test/settings/flow/box_r2l.frame +1 -0
- data/screen_test/settings/flow/box_r2l.rb +26 -0
- data/screen_test/settings/flow/box_t2b.frame +1 -0
- data/screen_test/settings/flow/box_t2b.rb +26 -0
- data/screen_test/settings/flow/grid_b2t.frame +1 -0
- data/screen_test/{rendered/settings → settings}/flow/grid_b2t.rb +0 -0
- data/screen_test/settings/flow/grid_l2r.frame +1 -0
- data/screen_test/{rendered/settings → settings}/flow/grid_l2r.rb +0 -0
- data/screen_test/settings/flow/grid_r2l.frame +1 -0
- data/screen_test/{rendered/settings → settings}/flow/grid_r2l.rb +0 -0
- data/screen_test/settings/flow/grid_t2b.frame +1 -0
- data/screen_test/{rendered/settings → settings}/flow/grid_t2b.rb +0 -0
- data/screen_test/settings/height/box.frame +1 -0
- data/screen_test/{rendered/settings → settings}/height/box.rb +0 -0
- data/screen_test/settings/height/box_border_sizing.frame +1 -0
- data/screen_test/settings/height/box_border_sizing.rb +15 -0
- data/screen_test/settings/height/grid.frame +1 -0
- data/screen_test/{rendered/settings → settings}/height/grid.rb +0 -0
- data/screen_test/settings/height/overflow_box.frame +1 -0
- data/screen_test/settings/height/overflow_box.rb +13 -0
- data/screen_test/settings/height/overflow_box_l2r.frame +1 -0
- data/screen_test/settings/height/overflow_box_l2r.rb +17 -0
- data/screen_test/settings/height/overflow_box_t2b.frame +1 -0
- data/screen_test/settings/height/overflow_box_t2b.rb +16 -0
- data/screen_test/settings/height/overflow_grid.frame +1 -0
- data/screen_test/{rendered/settings → settings}/height/overflow_grid.rb +0 -0
- data/screen_test/settings/margin.frame +1 -0
- data/screen_test/settings/margin.rb +16 -0
- data/screen_test/settings/padding.frame +1 -0
- data/screen_test/settings/padding.rb +13 -0
- data/screen_test/settings/position/box_left.frame +1 -0
- data/screen_test/{rendered/settings → settings}/position/box_left.rb +2 -2
- data/screen_test/settings/position/box_left_negative.frame +1 -0
- data/screen_test/{rendered/settings → settings}/position/box_left_negative.rb +2 -2
- data/screen_test/settings/position/box_top.frame +1 -0
- data/screen_test/{rendered/settings → settings}/position/box_top.rb +1 -1
- data/screen_test/settings/position/box_top_negative.frame +1 -0
- data/screen_test/{rendered/settings → settings}/position/box_top_negative.rb +2 -2
- data/screen_test/settings/position/grid_left.frame +1 -0
- data/screen_test/{rendered/settings → settings}/position/grid_left.rb +1 -1
- data/screen_test/settings/position/grid_left_negative.frame +1 -0
- data/screen_test/{rendered/settings → settings}/position/grid_left_negative.rb +1 -1
- data/screen_test/settings/position/grid_top.frame +1 -0
- data/screen_test/{rendered/settings → settings}/position/grid_top.rb +1 -1
- data/screen_test/settings/position/grid_top_negative.frame +1 -0
- data/screen_test/{rendered/settings → settings}/position/grid_top_negative.rb +1 -1
- data/screen_test/settings/scroll/horiz_box.frame +1 -0
- data/screen_test/settings/scroll/horiz_box.rb +17 -0
- data/screen_test/settings/scroll/horiz_box_align_center.rb +18 -0
- data/screen_test/settings/scroll/horiz_box_align_right.rb +18 -0
- data/screen_test/settings/scroll/vert_box.frame +1 -0
- data/screen_test/settings/scroll/vert_box.rb +20 -0
- data/screen_test/settings/title_font.frame +1 -0
- data/screen_test/{rendered/settings → settings}/title_font.rb +1 -1
- data/screen_test/settings/valign/box_around.frame +1 -0
- data/screen_test/settings/valign/box_around.rb +17 -0
- data/screen_test/settings/valign/box_between.frame +1 -0
- data/screen_test/settings/valign/box_between.rb +17 -0
- data/screen_test/settings/valign/box_bottom.frame +1 -0
- data/screen_test/settings/valign/box_bottom.rb +17 -0
- data/screen_test/settings/valign/box_default.frame +1 -0
- data/screen_test/settings/valign/box_default.rb +16 -0
- data/screen_test/settings/valign/box_evenly.frame +1 -0
- data/screen_test/settings/valign/box_evenly.rb +17 -0
- data/screen_test/settings/valign/box_middle.frame +1 -0
- data/screen_test/settings/valign/box_middle.rb +17 -0
- data/screen_test/settings/valign/box_top.frame +1 -0
- data/screen_test/settings/valign/box_top.rb +17 -0
- data/screen_test/settings/valign/grid_bottom.frame +1 -0
- data/screen_test/settings/valign/grid_bottom.rb +15 -0
- data/screen_test/settings/valign/grid_default.frame +1 -0
- data/screen_test/settings/valign/grid_default.rb +14 -0
- data/screen_test/settings/valign/grid_middle.frame +1 -0
- data/screen_test/settings/valign/grid_middle.rb +15 -0
- data/screen_test/settings/valign/grid_top.frame +1 -0
- data/screen_test/settings/valign/grid_top.rb +15 -0
- data/screen_test/settings/width/box_border_sizing.frame +1 -0
- data/screen_test/settings/width/box_border_sizing.rb +15 -0
- data/screen_test/settings/width/box_content.frame +1 -0
- data/screen_test/settings/width/box_content.rb +15 -0
- data/screen_test/settings/width/box_default.frame +1 -0
- data/screen_test/{rendered/settings/width/box.rb → settings/width/box_default.rb} +3 -2
- data/screen_test/settings/width/grid.frame +1 -0
- data/screen_test/{rendered/settings → settings}/width/grid.rb +2 -2
- data/screen_test/settings/width/overflow_align_center.frame +1 -0
- data/screen_test/settings/width/overflow_align_center.rb +14 -0
- data/screen_test/settings/width/overflow_align_right.frame +1 -0
- data/screen_test/settings/width/overflow_align_right.rb +14 -0
- data/screen_test/settings/width/overflow_box.frame +1 -0
- data/screen_test/settings/width/overflow_box.rb +13 -0
- data/screen_test/settings/width/overflow_box_l2r.frame +1 -0
- data/screen_test/settings/width/overflow_box_l2r.rb +16 -0
- data/screen_test/settings/width/overflow_box_t2b.frame +1 -0
- data/screen_test/settings/width/overflow_box_t2b.rb +17 -0
- data/screen_test/settings/width/overflow_grid.frame +1 -0
- data/screen_test/{rendered/settings → settings}/width/overflow_grid.rb +0 -0
- data/tools/whirled_peas/tools/screen_tester.rb +233 -0
- metadata +154 -98
- data/lib/whirled_peas/settings/text_align.rb +0 -19
- data/screen_test/rendered/elements/grid.frame +0 -1
- data/screen_test/rendered/elements/screen_overflow.frame +0 -1
- data/screen_test/rendered/elements/text.frame +0 -1
- data/screen_test/rendered/elements/text_multiline.frame +0 -1
- data/screen_test/rendered/settings/align/box.frame +0 -1
- data/screen_test/rendered/settings/align/box.rb +0 -24
- data/screen_test/rendered/settings/align/children_center.frame +0 -1
- data/screen_test/rendered/settings/align/children_center.rb +0 -13
- data/screen_test/rendered/settings/align/children_left.frame +0 -1
- data/screen_test/rendered/settings/align/children_left.rb +0 -13
- data/screen_test/rendered/settings/align/children_right.frame +0 -1
- data/screen_test/rendered/settings/align/children_right.rb +0 -13
- data/screen_test/rendered/settings/align/grid.frame +0 -1
- data/screen_test/rendered/settings/ansi/bold.frame +0 -1
- data/screen_test/rendered/settings/ansi/bold.rb +0 -15
- data/screen_test/rendered/settings/ansi/underline.frame +0 -1
- data/screen_test/rendered/settings/flow/box_b2t.frame +0 -1
- data/screen_test/rendered/settings/flow/box_b2t.rb +0 -24
- data/screen_test/rendered/settings/flow/box_l2r.frame +0 -1
- data/screen_test/rendered/settings/flow/box_l2r.rb +0 -24
- data/screen_test/rendered/settings/flow/box_r2l.frame +0 -1
- data/screen_test/rendered/settings/flow/box_r2l.rb +0 -24
- data/screen_test/rendered/settings/flow/box_t2b.frame +0 -1
- data/screen_test/rendered/settings/flow/box_t2b.rb +0 -24
- data/screen_test/rendered/settings/flow/grid_b2t.frame +0 -1
- data/screen_test/rendered/settings/flow/grid_l2r.frame +0 -1
- data/screen_test/rendered/settings/flow/grid_r2l.frame +0 -1
- data/screen_test/rendered/settings/flow/grid_t2b.frame +0 -1
- data/screen_test/rendered/settings/height/box.frame +0 -1
- data/screen_test/rendered/settings/height/grid.frame +0 -1
- data/screen_test/rendered/settings/height/overflow_box.frame +0 -1
- data/screen_test/rendered/settings/height/overflow_box.rb +0 -13
- data/screen_test/rendered/settings/height/overflow_box_l2r.frame +0 -1
- data/screen_test/rendered/settings/height/overflow_box_l2r.rb +0 -15
- data/screen_test/rendered/settings/height/overflow_box_t2b.frame +0 -1
- data/screen_test/rendered/settings/height/overflow_grid.frame +0 -1
- data/screen_test/rendered/settings/margin.frame +0 -1
- data/screen_test/rendered/settings/margin.rb +0 -14
- data/screen_test/rendered/settings/padding.frame +0 -1
- data/screen_test/rendered/settings/padding.rb +0 -11
- data/screen_test/rendered/settings/position/box_left.frame +0 -1
- data/screen_test/rendered/settings/position/box_left_negative.frame +0 -1
- data/screen_test/rendered/settings/position/box_top.frame +0 -1
- data/screen_test/rendered/settings/position/box_top_negative.frame +0 -1
- data/screen_test/rendered/settings/position/grid_left.frame +0 -1
- data/screen_test/rendered/settings/position/grid_left_negative.frame +0 -1
- data/screen_test/rendered/settings/position/grid_top.frame +0 -1
- data/screen_test/rendered/settings/position/grid_top_negative.frame +0 -1
- data/screen_test/rendered/settings/scroll/horiz_box.frame +0 -1
- data/screen_test/rendered/settings/scroll/horiz_box.rb +0 -15
- data/screen_test/rendered/settings/scroll/vert_box.frame +0 -1
- data/screen_test/rendered/settings/scroll/vert_box.rb +0 -18
- data/screen_test/rendered/settings/title_font.frame +0 -1
- data/screen_test/rendered/settings/width/box.frame +0 -1
- data/screen_test/rendered/settings/width/grid.frame +0 -1
- data/screen_test/rendered/settings/width/overflow_box.frame +0 -1
- data/screen_test/rendered/settings/width/overflow_box.rb +0 -11
- data/screen_test/rendered/settings/width/overflow_box_l2r.frame +0 -1
- data/screen_test/rendered/settings/width/overflow_box_l2r.rb +0 -14
- data/screen_test/rendered/settings/width/overflow_box_t2b.frame +0 -1
- data/screen_test/rendered/settings/width/overflow_box_t2b.rb +0 -15
- data/screen_test/rendered/settings/width/overflow_grid.frame +0 -1
- data/screen_test/screen_tester.rb +0 -201
data/Rakefile
CHANGED
@@ -5,37 +5,27 @@ RSpec::Core::RakeTask.new(:spec)
|
|
5
5
|
|
6
6
|
def screen_test(file, method)
|
7
7
|
raise ArgumentError, 'Missing argument: file' unless file
|
8
|
-
|
9
|
-
|
10
|
-
require 'whirled_peas'
|
11
|
-
require_relative 'screen_test/screen_tester'
|
12
|
-
|
13
|
-
WhirledPeas::ScreenTester.new(file).send(method)
|
8
|
+
require_relative 'tools/whirled_peas/tools/screen_tester'
|
9
|
+
WhirledPeas::Tools::ScreenTester.new(file).send(method)
|
14
10
|
end
|
15
11
|
|
16
12
|
namespace :screen_test do
|
17
|
-
%i[template view run save debug].each do |t|
|
13
|
+
%i[template view run save update debug].each do |t|
|
18
14
|
task t, [:file] do |_, args|
|
19
15
|
screen_test(args[:file], t)
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|
23
19
|
task :update_all do
|
24
|
-
|
25
|
-
|
26
|
-
require_relative 'screen_test/screen_tester'
|
27
|
-
|
28
|
-
WhirledPeas::ScreenTester.update_all
|
20
|
+
require_relative 'tools/whirled_peas/tools/screen_tester'
|
21
|
+
WhirledPeas::Tools::ScreenTester.update_all
|
29
22
|
end
|
30
23
|
end
|
31
24
|
|
32
25
|
task :screen_test do
|
33
|
-
|
34
|
-
|
35
|
-
require_relative 'screen_test/screen_tester'
|
36
|
-
|
37
|
-
WhirledPeas::ScreenTester.run_all
|
26
|
+
require_relative 'tools/whirled_peas/tools/screen_tester'
|
27
|
+
WhirledPeas::Tools::ScreenTester.run_all
|
38
28
|
end
|
39
29
|
|
40
30
|
task default: :ci
|
41
|
-
task ci: [
|
31
|
+
task ci: %i[spec screen_test]
|
@@ -1,5 +1,19 @@
|
|
1
1
|
module WhirledPeas
|
2
2
|
module Graphics
|
3
|
+
class << self
|
4
|
+
attr_accessor :debug
|
5
|
+
|
6
|
+
def debugger(string_or_proc)
|
7
|
+
return unless @debug
|
8
|
+
@debugger ||= Logger.new(STDOUT, level: Logger::DEBUG)
|
9
|
+
if string_or_proc.is_a?(Proc)
|
10
|
+
string = string_or_proc.call
|
11
|
+
else
|
12
|
+
string = string_or_proc
|
13
|
+
end
|
14
|
+
@debugger.debug(string)
|
15
|
+
end
|
16
|
+
end
|
3
17
|
end
|
4
18
|
private_constant :Graphics
|
5
19
|
end
|
@@ -4,13 +4,20 @@ require_relative 'container_dimensions'
|
|
4
4
|
module WhirledPeas
|
5
5
|
module Graphics
|
6
6
|
class BoxPainter < ContainerPainter
|
7
|
-
def paint(canvas, &block)
|
7
|
+
def paint(canvas, left, top, &block)
|
8
8
|
super
|
9
|
-
|
9
|
+
canvas_coords = coords(left, top)
|
10
|
+
content_canvas = canvas.child(
|
11
|
+
canvas_coords.content_left,
|
12
|
+
canvas_coords.content_top,
|
13
|
+
dimensions.content_width,
|
14
|
+
dimensions.content_height
|
15
|
+
)
|
16
|
+
return unless content_canvas.writable?
|
10
17
|
if settings.horizontal_flow?
|
11
|
-
paint_horizontally(
|
18
|
+
paint_horizontally(content_canvas, canvas_coords, &block)
|
12
19
|
else
|
13
|
-
paint_vertically(
|
20
|
+
paint_vertically(content_canvas, canvas_coords, &block)
|
14
21
|
end
|
15
22
|
end
|
16
23
|
|
@@ -47,59 +54,45 @@ module WhirledPeas
|
|
47
54
|
|
48
55
|
private
|
49
56
|
|
50
|
-
def paint_horizontally(canvas, &block)
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
each_child { |c|
|
55
|
-
|
56
|
-
|
57
|
-
elsif settings.align_right?
|
58
|
-
stroke_left += dimensions.content_width - total_child_width
|
59
|
-
end
|
60
|
-
given_width = 0
|
57
|
+
def paint_horizontally(canvas, canvas_coords, &block)
|
58
|
+
stroke_left = canvas_coords.content_left
|
59
|
+
stroke_top = canvas_coords.content_top
|
60
|
+
children_width = 0
|
61
|
+
each_child { |c| children_width += c.dimensions.outer_width }
|
62
|
+
left_offset, spacing_offset = horiz_justify_offset(children_width)
|
63
|
+
stroke_left += left_offset
|
61
64
|
each_child do |child|
|
62
|
-
|
63
|
-
|
64
|
-
dimensions.content_width - given_width
|
65
|
-
].min
|
65
|
+
top_offset, _ = vert_justify_offset(child.dimensions.outer_height)
|
66
|
+
child_width = child.dimensions.outer_width
|
66
67
|
child_canvas = canvas.child(
|
67
|
-
stroke_left
|
68
|
-
stroke_top,
|
68
|
+
stroke_left,
|
69
|
+
stroke_top + top_offset,
|
69
70
|
child_width,
|
70
|
-
|
71
|
+
child.dimensions.outer_height
|
71
72
|
)
|
72
|
-
child.paint(child_canvas, &block)
|
73
|
-
|
74
|
-
break if given_width == dimensions.content_width
|
73
|
+
child.paint(child_canvas, stroke_left, stroke_top + top_offset, &block)
|
74
|
+
stroke_left += child_width + spacing_offset
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
-
def paint_vertically(canvas, &block)
|
79
|
-
|
80
|
-
|
81
|
-
|
78
|
+
def paint_vertically(canvas, canvas_coords, &block)
|
79
|
+
stroke_left = canvas_coords.content_left
|
80
|
+
stroke_top = canvas_coords.content_top
|
81
|
+
children_height = 0
|
82
|
+
each_child { |c| children_height += c.dimensions.outer_height }
|
83
|
+
top_offset, spacing_offset = vert_justify_offset(children_height)
|
84
|
+
stroke_top += top_offset
|
82
85
|
each_child do |child|
|
83
|
-
|
84
|
-
|
85
|
-
elsif settings.align_right?
|
86
|
-
justify_offset = dimensions.content_width - child.dimensions.outer_width
|
87
|
-
else
|
88
|
-
justify_offset = 0
|
89
|
-
end
|
90
|
-
child_height = [
|
91
|
-
child.dimensions.outer_height,
|
92
|
-
dimensions.content_height - given_height
|
93
|
-
].min
|
86
|
+
left_offset, _ = horiz_justify_offset(child.dimensions.outer_width)
|
87
|
+
child_height = child.dimensions.outer_height
|
94
88
|
child_canvas = canvas.child(
|
95
|
-
stroke_left +
|
96
|
-
stroke_top
|
97
|
-
|
89
|
+
stroke_left + left_offset,
|
90
|
+
stroke_top ,
|
91
|
+
child.dimensions.outer_width,
|
98
92
|
child_height
|
99
93
|
)
|
100
|
-
child.paint(child_canvas, &block)
|
101
|
-
|
102
|
-
break if given_height == dimensions.content_height
|
94
|
+
child.paint(child_canvas, stroke_left + left_offset, stroke_top, &block)
|
95
|
+
stroke_top += child_height + spacing_offset
|
103
96
|
end
|
104
97
|
end
|
105
98
|
end
|
@@ -4,28 +4,29 @@ module WhirledPeas
|
|
4
4
|
module Graphics
|
5
5
|
# Canvas represent the area of the screen a painter can paint on.
|
6
6
|
class Canvas
|
7
|
-
attr_reader :left, :top, :width, :height
|
7
|
+
attr_reader :left, :top, :width, :height
|
8
8
|
|
9
9
|
def self.unwritable
|
10
|
-
new(-1, -1, 0, 0
|
10
|
+
new(-1, -1, 0, 0)
|
11
11
|
end
|
12
12
|
|
13
|
-
def initialize(left, top, width, height
|
13
|
+
def initialize(left, top, width, height)
|
14
14
|
@left = left
|
15
15
|
@top = top
|
16
16
|
@width = width
|
17
17
|
@height = height
|
18
|
-
@start_left = start_left
|
19
|
-
@start_top = start_top
|
20
18
|
end
|
21
19
|
|
22
20
|
def writable?
|
23
21
|
width > 0 || height > 0
|
24
22
|
end
|
25
23
|
|
26
|
-
def child(
|
27
|
-
|
28
|
-
|
24
|
+
def child(child_left, child_top, child_width, child_height)
|
25
|
+
Graphics.debugger(
|
26
|
+
proc do
|
27
|
+
"Create child: #{self.inspect}.child(left=#{child_left}, top=#{child_top}, width=#{child_width}, height=#{child_height})"
|
28
|
+
end
|
29
|
+
)
|
29
30
|
if child_left >= left + width
|
30
31
|
self.class.unwritable
|
31
32
|
elsif child_left + child_width <= left
|
@@ -45,20 +46,25 @@ module WhirledPeas
|
|
45
46
|
child_top = top
|
46
47
|
end
|
47
48
|
child_height = [height - (child_top - top), child_height].min
|
48
|
-
self.class.new(
|
49
|
+
child_canvas = self.class.new(
|
49
50
|
child_left,
|
50
51
|
child_top,
|
51
52
|
child_width,
|
52
53
|
child_height,
|
53
|
-
start_left,
|
54
|
-
start_top
|
55
54
|
)
|
55
|
+
Graphics.debugger(proc { " -> #{child_canvas.inspect}" })
|
56
|
+
child_canvas
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
59
60
|
# Yields a single line of formatted characters positioned on the canvas,
|
60
61
|
# verifying only characters within the canvas are included.
|
61
62
|
def stroke(stroke_left, stroke_top, raw, formatting=[], &block)
|
63
|
+
Graphics.debugger(
|
64
|
+
proc do
|
65
|
+
"Stroke: #{self.inspect}.stroke(left=#{stroke_left}, top=#{stroke_top}, length=#{raw.length})"
|
66
|
+
end
|
67
|
+
)
|
62
68
|
if stroke_left >= left + width
|
63
69
|
# The stroke starts to the right of the canvas
|
64
70
|
fstring = Utils::FormattedString.blank
|
@@ -88,6 +94,11 @@ module WhirledPeas
|
|
88
94
|
end_index = start_index + visible_length - 1
|
89
95
|
fstring = Utils::FormattedString.new(raw[start_index..end_index], formatting)
|
90
96
|
end
|
97
|
+
Graphics.debugger(
|
98
|
+
proc do
|
99
|
+
" -> Stroke(left=#{stroke_left}, top=#{stroke_top}, length=#{fstring.length})"
|
100
|
+
end
|
101
|
+
)
|
91
102
|
yield stroke_left, stroke_top, fstring
|
92
103
|
end
|
93
104
|
|
@@ -1,18 +1,19 @@
|
|
1
1
|
module WhirledPeas
|
2
2
|
module Graphics
|
3
3
|
class ContainerCoords
|
4
|
-
def initialize(
|
5
|
-
@canvas = canvas
|
4
|
+
def initialize(dimensions, settings, start_left, start_top)
|
6
5
|
@dimensions = dimensions
|
7
6
|
@settings = settings
|
7
|
+
@start_left = start_left
|
8
|
+
@start_top = start_top
|
8
9
|
end
|
9
10
|
|
10
11
|
def left
|
11
|
-
|
12
|
+
start_left + settings.position.left
|
12
13
|
end
|
13
14
|
|
14
15
|
def top
|
15
|
-
|
16
|
+
start_top + settings.position.top
|
16
17
|
end
|
17
18
|
|
18
19
|
def border_left
|
@@ -65,7 +66,7 @@ module WhirledPeas
|
|
65
66
|
|
66
67
|
private
|
67
68
|
|
68
|
-
attr_reader :
|
69
|
+
attr_reader :settings, :dimensions, :start_left, :start_top
|
69
70
|
end
|
70
71
|
end
|
71
72
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module WhirledPeas
|
2
2
|
module Graphics
|
3
3
|
class ContainerDimensions
|
4
|
-
attr_reader :
|
4
|
+
attr_reader :children_width, :children_height, :num_cols, :num_rows
|
5
5
|
|
6
6
|
def initialize(settings, content_width, content_height, num_cols=1, num_rows=1)
|
7
|
-
@
|
8
|
-
@
|
7
|
+
@orig_content_width = content_width
|
8
|
+
@orig_content_height = content_height
|
9
9
|
@children_width = content_width
|
10
10
|
@children_height = content_height
|
11
11
|
@num_cols = num_cols
|
@@ -13,17 +13,35 @@ module WhirledPeas
|
|
13
13
|
@settings = settings
|
14
14
|
end
|
15
15
|
|
16
|
+
def content_width
|
17
|
+
return orig_content_width unless settings.width
|
18
|
+
if settings.border_sizing?
|
19
|
+
settings.width - outer_border_width - scrollbar_width - padding_width
|
20
|
+
else
|
21
|
+
settings.width
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def content_height
|
26
|
+
return orig_content_height unless settings.height
|
27
|
+
if settings.border_sizing?
|
28
|
+
settings.height - outer_border_height - scrollbar_height - padding_height
|
29
|
+
else
|
30
|
+
settings.height
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
16
34
|
def outer_width
|
17
35
|
@outer_width ||= margin_width +
|
18
36
|
outer_border_width +
|
19
|
-
num_cols * (padding_width + content_width +
|
37
|
+
num_cols * (padding_width + content_width + scrollbar_width) +
|
20
38
|
(num_cols - 1) * inner_border_width
|
21
39
|
end
|
22
40
|
|
23
41
|
def outer_height
|
24
42
|
@outer_height ||= margin_height +
|
25
43
|
outer_border_height +
|
26
|
-
num_rows * (padding_height + content_height +
|
44
|
+
num_rows * (padding_height + content_height + scrollbar_height) +
|
27
45
|
(num_rows - 1) * inner_border_height
|
28
46
|
end
|
29
47
|
|
@@ -59,17 +77,17 @@ module WhirledPeas
|
|
59
77
|
settings.padding.top + settings.padding.bottom
|
60
78
|
end
|
61
79
|
|
62
|
-
def
|
80
|
+
def scrollbar_width
|
63
81
|
settings.scrollbar.vert? ? 1 : 0
|
64
82
|
end
|
65
83
|
|
66
|
-
def
|
84
|
+
def scrollbar_height
|
67
85
|
settings.scrollbar.horiz? ? 1 : 0
|
68
86
|
end
|
69
87
|
|
70
88
|
private
|
71
89
|
|
72
|
-
attr_reader :settings
|
90
|
+
attr_reader :settings, :orig_content_width, :orig_content_height
|
73
91
|
end
|
74
92
|
end
|
75
93
|
end
|
@@ -13,10 +13,10 @@ module WhirledPeas
|
|
13
13
|
@children = []
|
14
14
|
end
|
15
15
|
|
16
|
-
def paint(canvas, &block)
|
16
|
+
def paint(canvas, left, top, &block)
|
17
17
|
return unless canvas.writable?
|
18
18
|
return unless needs_printing?
|
19
|
-
canvas_coords = coords(
|
19
|
+
canvas_coords = coords(left, top)
|
20
20
|
stroke_left = canvas_coords.border_left
|
21
21
|
stroke_top = canvas_coords.border_top
|
22
22
|
formatting = [*settings.border.color, *settings.bg_color]
|
@@ -73,8 +73,46 @@ module WhirledPeas
|
|
73
73
|
settings.scrollbar.horiz? || settings.scrollbar.vert?
|
74
74
|
end
|
75
75
|
|
76
|
-
def coords(
|
77
|
-
ContainerCoords.new(
|
76
|
+
def coords(left, top)
|
77
|
+
ContainerCoords.new(dimensions, settings, left, top)
|
78
|
+
end
|
79
|
+
|
80
|
+
def horiz_justify_offset(containing_width)
|
81
|
+
if settings.align_center?
|
82
|
+
[(dimensions.content_width - containing_width) / 2, 0]
|
83
|
+
elsif settings.align_right?
|
84
|
+
[dimensions.content_width - containing_width, 0]
|
85
|
+
elsif settings.align_between?
|
86
|
+
return [0, 0] if num_children == 1
|
87
|
+
[0, (dimensions.content_width - containing_width) / (num_children - 1)]
|
88
|
+
elsif settings.align_around?
|
89
|
+
full_spacing = (dimensions.content_width - containing_width) / num_children
|
90
|
+
[full_spacing / 2, full_spacing]
|
91
|
+
elsif settings.align_evenly?
|
92
|
+
spacing = (dimensions.content_width - containing_width) / (num_children + 1)
|
93
|
+
[spacing, spacing]
|
94
|
+
else
|
95
|
+
[0, 0]
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def vert_justify_offset(containing_height)
|
100
|
+
if settings.valign_middle?
|
101
|
+
[(dimensions.content_height - containing_height) / 2, 0]
|
102
|
+
elsif settings.valign_bottom?
|
103
|
+
[dimensions.content_height - containing_height, 0]
|
104
|
+
elsif settings.valign_between?
|
105
|
+
return [0, 0] if num_children == 1
|
106
|
+
[0, (dimensions.content_height - containing_height) / (num_children - 1)]
|
107
|
+
elsif settings.valign_around?
|
108
|
+
full_spacing = (dimensions.content_height - containing_height) / num_children
|
109
|
+
[full_spacing / 2, full_spacing]
|
110
|
+
elsif settings.valign_evenly?
|
111
|
+
spacing = (dimensions.content_height - containing_height) / (num_children + 1)
|
112
|
+
[spacing, spacing]
|
113
|
+
else
|
114
|
+
[0, 0]
|
115
|
+
end
|
78
116
|
end
|
79
117
|
|
80
118
|
def line_stroke(left_border, junc_border, right_border, &block)
|
@@ -4,24 +4,25 @@ require_relative 'container_painter'
|
|
4
4
|
module WhirledPeas
|
5
5
|
module Graphics
|
6
6
|
class GridPainter < ContainerPainter
|
7
|
-
def paint(canvas, &block)
|
7
|
+
def paint(canvas, left, top, &block)
|
8
8
|
super
|
9
9
|
return unless canvas.writable?
|
10
10
|
each_child.with_index do |child, index|
|
11
11
|
col_index, row_index = grid_cell(index)
|
12
|
-
|
13
|
-
|
14
|
-
content_left += (dimensions.content_width - child.dimensions.outer_width) / 2
|
15
|
-
elsif settings.align_right?
|
16
|
-
content_left += dimensions.content_width - child.dimensions.outer_width
|
17
|
-
end
|
12
|
+
left_offset, _ = horiz_justify_offset(child.dimensions.outer_width)
|
13
|
+
top_offset, _ = vert_justify_offset(child.dimensions.outer_height)
|
18
14
|
child_canvas = canvas.child(
|
19
|
-
content_left,
|
20
|
-
coords(
|
15
|
+
coords(left, top).content_left(col_index) + left_offset,
|
16
|
+
coords(left, top).content_top(row_index) + top_offset,
|
21
17
|
[dimensions.content_width, child.dimensions.outer_width].min,
|
22
18
|
[dimensions.content_height, child.dimensions.outer_height].min
|
23
19
|
)
|
24
|
-
child.paint(
|
20
|
+
child.paint(
|
21
|
+
child_canvas,
|
22
|
+
coords(left, top).content_left(col_index) + left_offset,
|
23
|
+
coords(left, top).content_top(row_index) + top_offset,
|
24
|
+
&block
|
25
|
+
)
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|