whirled_peas 0.10.0 → 0.11.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 +4 -0
- data/README.md +88 -24
- data/examples/components.rb +35 -0
- data/examples/scrolling.rb +8 -19
- data/lib/whirled_peas.rb +30 -16
- data/lib/whirled_peas/command/config_command.rb +3 -2
- data/lib/whirled_peas/command/play.rb +3 -2
- data/lib/whirled_peas/command/themes.rb +3 -2
- data/lib/whirled_peas/component.rb +35 -0
- data/lib/whirled_peas/component/list_with_active.rb +88 -0
- data/lib/whirled_peas/graphics/box_painter.rb +4 -4
- data/lib/whirled_peas/graphics/composer.rb +4 -0
- data/lib/whirled_peas/graphics/container_coords.rb +24 -2
- data/lib/whirled_peas/graphics/container_painter.rb +9 -119
- data/lib/whirled_peas/graphics/debugger.rb +1 -7
- data/lib/whirled_peas/graphics/scrollbar_helper.rb +124 -0
- data/lib/whirled_peas/null_logger.rb +0 -1
- data/lib/whirled_peas/settings/container_settings.rb +12 -5
- data/lib/whirled_peas/settings/debugger.rb +1 -1
- data/lib/whirled_peas/settings/position.rb +17 -5
- data/lib/whirled_peas/version.rb +1 -1
- data/screen_test/components/list_with_active/l2r_active_color.frame +1 -0
- data/screen_test/components/list_with_active/l2r_active_color.rb +18 -0
- data/screen_test/components/list_with_active/l2r_position_end.frame +1 -0
- data/screen_test/components/list_with_active/l2r_position_end.rb +16 -0
- data/screen_test/components/list_with_active/l2r_position_middle.frame +1 -0
- data/screen_test/components/list_with_active/l2r_position_middle.rb +16 -0
- data/screen_test/components/list_with_active/l2r_position_start.frame +1 -0
- data/screen_test/components/list_with_active/l2r_position_start.rb +16 -0
- data/screen_test/components/list_with_active/l2r_separator.frame +1 -0
- data/screen_test/components/list_with_active/l2r_separator.rb +17 -0
- data/screen_test/components/list_with_active/t2b_active_color.frame +1 -0
- data/screen_test/components/list_with_active/t2b_active_color.rb +19 -0
- data/screen_test/components/list_with_active/t2b_position_end.frame +1 -0
- data/screen_test/components/list_with_active/t2b_position_end.rb +17 -0
- data/screen_test/components/list_with_active/t2b_position_middle.frame +1 -0
- data/screen_test/components/list_with_active/t2b_position_middle.rb +17 -0
- data/screen_test/components/list_with_active/t2b_position_start.frame +1 -0
- data/screen_test/components/list_with_active/t2b_position_start.rb +17 -0
- data/screen_test/components/list_with_active/t2b_separator.frame +1 -0
- data/screen_test/components/list_with_active/t2b_separator.rb +18 -0
- data/screen_test/elements/theme.rb +1 -1
- data/screen_test/settings/{position/box_top_negative.frame → content_start/box_bottom.frame} +0 -0
- data/screen_test/settings/content_start/box_bottom.rb +17 -0
- data/screen_test/settings/{position → content_start}/box_left.frame +0 -0
- data/screen_test/settings/{position/box_top.rb → content_start/box_left.rb} +1 -1
- data/screen_test/settings/{position → content_start}/box_left_negative.frame +0 -0
- data/screen_test/settings/{position → content_start}/box_left_negative.rb +1 -1
- data/screen_test/settings/content_start/box_right.frame +1 -0
- data/screen_test/settings/content_start/box_right.rb +17 -0
- data/screen_test/settings/{position → content_start}/box_top.frame +0 -0
- data/screen_test/settings/{position/box_left.rb → content_start/box_top.rb} +1 -1
- data/screen_test/settings/content_start/box_top_negative.frame +1 -0
- data/screen_test/settings/{position → content_start}/box_top_negative.rb +1 -1
- data/screen_test/settings/{position → content_start}/grid_left.frame +0 -0
- data/screen_test/settings/{position → content_start}/grid_left.rb +1 -1
- data/screen_test/settings/{position → content_start}/grid_left_negative.frame +0 -0
- data/screen_test/settings/{position → content_start}/grid_left_negative.rb +1 -1
- data/screen_test/settings/{position → content_start}/grid_top.frame +0 -0
- data/screen_test/settings/{position → content_start}/grid_top.rb +1 -1
- data/screen_test/settings/{position → content_start}/grid_top_negative.frame +0 -0
- data/screen_test/settings/{position → content_start}/grid_top_negative.rb +1 -1
- data/screen_test/settings/scroll/horiz_box.frame +1 -1
- data/screen_test/settings/scroll/horiz_box.rb +2 -4
- data/screen_test/settings/scroll/horiz_box_align_center.rb +2 -4
- data/screen_test/settings/scroll/horiz_box_align_right.rb +2 -4
- data/screen_test/settings/scroll/vert_box.frame +1 -1
- data/screen_test/settings/scroll/vert_box.rb +5 -7
- metadata +46 -18
@@ -55,8 +55,8 @@ module WhirledPeas
|
|
55
55
|
private
|
56
56
|
|
57
57
|
def paint_horizontally(canvas, canvas_coords, &block)
|
58
|
-
stroke_left = canvas_coords.
|
59
|
-
stroke_top = canvas_coords.
|
58
|
+
stroke_left = canvas_coords.offset_content_left
|
59
|
+
stroke_top = canvas_coords.offset_content_top
|
60
60
|
children_width = 0
|
61
61
|
each_child { |c| children_width += c.dimensions.outer_width }
|
62
62
|
left_offset, spacing_offset = horiz_justify_offset(children_width)
|
@@ -76,8 +76,8 @@ module WhirledPeas
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def paint_vertically(canvas, canvas_coords, &block)
|
79
|
-
stroke_left = canvas_coords.
|
80
|
-
stroke_top = canvas_coords.
|
79
|
+
stroke_left = canvas_coords.offset_content_left
|
80
|
+
stroke_top = canvas_coords.offset_content_top
|
81
81
|
children_height = 0
|
82
82
|
each_child { |c| children_height += c.dimensions.outer_height }
|
83
83
|
top_offset, spacing_offset = vert_justify_offset(children_height)
|
@@ -71,6 +71,10 @@ module WhirledPeas
|
|
71
71
|
painter.add_child(child)
|
72
72
|
end
|
73
73
|
|
74
|
+
def add_component(component)
|
75
|
+
component.compose(self, settings)
|
76
|
+
end
|
77
|
+
|
74
78
|
def add_box(name=self.class.next_name, &block)
|
75
79
|
child_settings = Settings::BoxSettings.inherit(painter.settings)
|
76
80
|
child = BoxPainter.new(name, child_settings)
|
@@ -9,11 +9,11 @@ module WhirledPeas
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def left
|
12
|
-
start_left
|
12
|
+
start_left
|
13
13
|
end
|
14
14
|
|
15
15
|
def top
|
16
|
-
start_top
|
16
|
+
start_top
|
17
17
|
end
|
18
18
|
|
19
19
|
def border_left
|
@@ -36,10 +36,32 @@ module WhirledPeas
|
|
36
36
|
padding_left + settings.padding.left + col_index * grid_width
|
37
37
|
end
|
38
38
|
|
39
|
+
def offset_content_left(col_index=0)
|
40
|
+
if settings.content_start.left
|
41
|
+
content_left(col_index) + settings.content_start.left
|
42
|
+
elsif settings.content_start.right
|
43
|
+
left_offset = dimensions.content_width - dimensions.children_width
|
44
|
+
content_left(col_index) + left_offset - settings.content_start.right
|
45
|
+
else
|
46
|
+
content_left(col_index)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
39
50
|
def content_top(row_index=0)
|
40
51
|
padding_top + settings.padding.top + row_index * grid_height
|
41
52
|
end
|
42
53
|
|
54
|
+
def offset_content_top(row_index=0)
|
55
|
+
if settings.content_start.top
|
56
|
+
content_top(row_index) + settings.content_start.top
|
57
|
+
elsif settings.content_start.bottom
|
58
|
+
top_offset = dimensions.content_height - dimensions.children_height
|
59
|
+
content_top(row_index) + top_offset - settings.content_start.bottom
|
60
|
+
else
|
61
|
+
content_top(row_index)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
43
65
|
def inner_grid_width
|
44
66
|
settings.padding.left +
|
45
67
|
dimensions.content_width +
|
@@ -2,6 +2,7 @@ require 'whirled_peas/utils/formatted_string'
|
|
2
2
|
|
3
3
|
require_relative 'container_coords'
|
4
4
|
require_relative 'painter'
|
5
|
+
require_relative 'scrollbar_helper'
|
5
6
|
|
6
7
|
module WhirledPeas
|
7
8
|
module Graphics
|
@@ -216,16 +217,12 @@ module WhirledPeas
|
|
216
217
|
settings.border.style.right_vert,
|
217
218
|
) do
|
218
219
|
if settings.scrollbar.vert?
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
-children.first.settings.position.top,
|
226
|
-
row_within_cell
|
227
|
-
)
|
228
|
-
end
|
220
|
+
scrollbar_char = ScrollbarHelper.vert_char(
|
221
|
+
dimensions.children_height + dimensions.padding_height,
|
222
|
+
canvas_coords.inner_grid_height,
|
223
|
+
canvas_coords.top - canvas_coords.offset_content_top,
|
224
|
+
row_within_cell
|
225
|
+
)
|
229
226
|
PADDING * canvas_coords.inner_grid_width + scrollbar_char
|
230
227
|
else
|
231
228
|
PADDING * canvas_coords.inner_grid_width
|
@@ -241,122 +238,15 @@ module WhirledPeas
|
|
241
238
|
settings.border.style.right_vert,
|
242
239
|
) do
|
243
240
|
canvas_coords.inner_grid_width.times.map do |col_within_cell|
|
244
|
-
|
241
|
+
ScrollbarHelper.horiz_char(
|
245
242
|
dimensions.children_width + dimensions.padding_width,
|
246
243
|
canvas_coords.inner_grid_width,
|
247
|
-
-
|
244
|
+
canvas_coords.left - canvas_coords.offset_content_left,
|
248
245
|
col_within_cell
|
249
246
|
)
|
250
247
|
end.join
|
251
248
|
end
|
252
249
|
end
|
253
|
-
|
254
|
-
# Contants to paint scrollbars
|
255
|
-
GUTTER = ' '
|
256
|
-
HORIZONTAL = %w[▗ ▄ ▖]
|
257
|
-
VERTICAL = %w[
|
258
|
-
▗
|
259
|
-
▐
|
260
|
-
▝
|
261
|
-
]
|
262
|
-
|
263
|
-
# Determine the character to paint the horizontal scroll bar with for the given column
|
264
|
-
#
|
265
|
-
# @see #scroll_char for more details
|
266
|
-
def horiz_scroll_char(col_count, viewable_col_count, first_visible_col, curr_col)
|
267
|
-
scroll_char(col_count, viewable_col_count, first_visible_col, curr_col, HORIZONTAL)
|
268
|
-
end
|
269
|
-
|
270
|
-
# Determine the character to paint the vertical scroll bar with for the given row
|
271
|
-
#
|
272
|
-
# @see #scroll_char for more details
|
273
|
-
def vert_scroll_char(row_count, viewable_row_count, first_visible_row, curr_row)
|
274
|
-
scroll_char(row_count, viewable_row_count, first_visible_row, curr_row, VERTICAL)
|
275
|
-
end
|
276
|
-
|
277
|
-
private
|
278
|
-
|
279
|
-
# Determine which character to paint a for a scrollbar
|
280
|
-
#
|
281
|
-
# @param total_count [Integer] total number of rows/columns in the content
|
282
|
-
# @param viewable_count [Integer] number of rows/columns visible in the viewport
|
283
|
-
# @param first_visible [Integer] zero-based index of the first row/column that is visible
|
284
|
-
# in the viewport
|
285
|
-
# @param curr [Integer] zero-based index of the row/column (relative to the first visible
|
286
|
-
# row/column) that the painted character is being requested for
|
287
|
-
# @param chars [Array<String>] an array with three 1-character strings, the frist is the
|
288
|
-
# "second half" scrollbar character, the second is the "full" scrollbar character, and
|
289
|
-
# the third is the "first half" scrollbar character.
|
290
|
-
def scroll_char(total_count, viewable_count, first_visible, curr, chars)
|
291
|
-
return GUTTER unless total_count > 0 && viewable_count > 0
|
292
|
-
# The scroll handle has the exact same relative size and position in the scroll gutter
|
293
|
-
# that the viewable content has in the total content area. For example, a content area
|
294
|
-
# that is 50 columns wide with a view port that is 20 columns wide might look like
|
295
|
-
#
|
296
|
-
# +---------1-----****2*********3******---4---------+
|
297
|
-
# | * * |
|
298
|
-
# | hidden * viewable * hidden |
|
299
|
-
# | * * |
|
300
|
-
# +---------1-----****2*********3******---4---------+
|
301
|
-
#
|
302
|
-
# The scoll gutter, would look like
|
303
|
-
#
|
304
|
-
# |......********.....|
|
305
|
-
#
|
306
|
-
# Scrolling all the way to the right results in
|
307
|
-
#
|
308
|
-
# +---------1---------2---------3*********4*********+
|
309
|
-
# | * *
|
310
|
-
# | hidden * viewable *
|
311
|
-
# | * *
|
312
|
-
# +---------1---------2---------3*********4*********+
|
313
|
-
# |...........********|
|
314
|
-
#
|
315
|
-
# Returning to the first example, we can match up the arguments to this method to the
|
316
|
-
# diagram
|
317
|
-
#
|
318
|
-
# total_count = 50
|
319
|
-
# |<----------------------------------------------->|
|
320
|
-
# | |
|
321
|
-
# | veiwable_count = 20 |
|
322
|
-
# | |<----------------->| |
|
323
|
-
# ↓ ↓ ↓ ↓
|
324
|
-
# +---------1-----****2*********3******---4---------+
|
325
|
-
# | * * |
|
326
|
-
# | hidden * viewable * hidden |
|
327
|
-
# | * * |
|
328
|
-
# +---------1-----****2*********3******---4---------+
|
329
|
-
# |......****?***.....|
|
330
|
-
# ↑ ↑
|
331
|
-
# first_visible = 16 |
|
332
|
-
# curr = 11
|
333
|
-
|
334
|
-
# The first task of determining how much of the handle is visible in a row/column is to
|
335
|
-
# calculate the range (as a precentage of the total) of viewable items
|
336
|
-
viewable_start = first_visible.to_f / total_count
|
337
|
-
viewable_end = (first_visible + viewable_count).to_f / total_count
|
338
|
-
|
339
|
-
# Always use the same length for the scroll bar so it does not give an inchworm effect
|
340
|
-
# as it scrolls along.
|
341
|
-
#
|
342
|
-
# Also, double the value now to get granularity for half width
|
343
|
-
# scrollbar characters.
|
344
|
-
scrollbar_length = ((2 * viewable_count ** 2).to_f / total_count).ceil
|
345
|
-
scrollbar_start = ((2 * first_visible * viewable_count).to_f / total_count).floor
|
346
|
-
|
347
|
-
first_half = (scrollbar_start...scrollbar_start + scrollbar_length).include?(2 * curr)
|
348
|
-
second_half = (scrollbar_start...scrollbar_start + scrollbar_length).include?(2 * curr + 1)
|
349
|
-
|
350
|
-
if first_half && second_half
|
351
|
-
chars[1]
|
352
|
-
elsif first_half
|
353
|
-
chars[2]
|
354
|
-
elsif second_half
|
355
|
-
chars[0]
|
356
|
-
else
|
357
|
-
GUTTER
|
358
|
-
end
|
359
|
-
end
|
360
250
|
end
|
361
251
|
private_constant :ContainerPainter
|
362
252
|
end
|
@@ -18,13 +18,7 @@ module WhirledPeas
|
|
18
18
|
info << "#{indent + ' '}- Settings"
|
19
19
|
info << Settings::Debugger.new(painter.settings).debug(indent + ' ')
|
20
20
|
if painter.is_a?(TextPainter)
|
21
|
-
content =
|
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
|
21
|
+
content = painter.content
|
28
22
|
info << "#{indent + ' '}- Content(value=#{content})"
|
29
23
|
elsif painter.is_a?(ContainerPainter)
|
30
24
|
info << "#{indent + ' '}- Children"
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module WhirledPeas
|
2
|
+
module Graphics
|
3
|
+
module ScrollbarHelper
|
4
|
+
# Contants to paint scrollbars
|
5
|
+
HORIZONTAL = [' ', '▗', '▖', '▄']
|
6
|
+
VERTICAL = [
|
7
|
+
' ',
|
8
|
+
'▗',
|
9
|
+
'▝',
|
10
|
+
'▐'
|
11
|
+
]
|
12
|
+
|
13
|
+
# The number of units of scrollbar a single character can be divided into
|
14
|
+
SCROLL_HANDLE_SCALE = 2
|
15
|
+
private_constant :SCROLL_HANDLE_SCALE
|
16
|
+
|
17
|
+
class << self
|
18
|
+
# Determine the character to paint the horizontal scroll bar with for the given column
|
19
|
+
#
|
20
|
+
# @see #scroll_char for more details
|
21
|
+
def horiz_char(col_count, viewable_col_count, first_visible_col, curr_col)
|
22
|
+
scroll_char(col_count, viewable_col_count, first_visible_col, curr_col, HORIZONTAL)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Determine the character to paint the vertical scroll bar with for the given row
|
26
|
+
#
|
27
|
+
# @see #scroll_char for more details
|
28
|
+
def vert_char(row_count, viewable_row_count, first_visible_row, curr_row)
|
29
|
+
scroll_char(row_count, viewable_row_count, first_visible_row, curr_row, VERTICAL)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# Determine which character to paint a for a scrollbar
|
35
|
+
#
|
36
|
+
# @param total_count [Integer] total number of rows/columns in the content
|
37
|
+
# @param viewable_count [Integer] number of rows/columns visible in the viewport
|
38
|
+
# @param first_visible [Integer] zero-based index of the first row/column that is visible
|
39
|
+
# in the viewport
|
40
|
+
# @param curr [Integer] zero-based index of the row/column (relative to the first visible
|
41
|
+
# row/column) that the painted character is being requested for
|
42
|
+
# @param chars [Array<String>] an array with three 1-character strings, the frist is the
|
43
|
+
# "second half" scrollbar character, the second is the "full" scrollbar character, and
|
44
|
+
# the third is the "first half" scrollbar character.
|
45
|
+
def scroll_char(total_count, viewable_count, first_visible, curr, chars)
|
46
|
+
return chars[0] if total_count == 0
|
47
|
+
return chars[0] if viewable_count == 0
|
48
|
+
return chars[0] if viewable_count >= total_count
|
49
|
+
|
50
|
+
# The scroll handle has the exact same relative size and position in the scroll gutter
|
51
|
+
# that the viewable content has in the total content area. For example, a content area
|
52
|
+
# that is 50 columns wide with a view port that is 20 columns wide might look like
|
53
|
+
#
|
54
|
+
# +---------1-----****2*********3******---4---------+
|
55
|
+
# | * * |
|
56
|
+
# | hidden * viewable * hidden |
|
57
|
+
# | * * |
|
58
|
+
# +---------1-----****2*********3******---4---------+
|
59
|
+
#
|
60
|
+
# The scoll gutter, would look like
|
61
|
+
#
|
62
|
+
# |......********.....|
|
63
|
+
#
|
64
|
+
# Scrolling all the way to the right results in
|
65
|
+
#
|
66
|
+
# +---------1---------2---------3*********4*********+
|
67
|
+
# | * *
|
68
|
+
# | hidden * viewable *
|
69
|
+
# | * *
|
70
|
+
# +---------1---------2---------3*********4*********+
|
71
|
+
# |...........********|
|
72
|
+
#
|
73
|
+
# Returning to the first example, we can match up the arguments to this method to the
|
74
|
+
# diagram
|
75
|
+
#
|
76
|
+
# total_count = 50
|
77
|
+
# |<----------------------------------------------->|
|
78
|
+
# | |
|
79
|
+
# | veiwable_count = 20 |
|
80
|
+
# | |<----------------->| |
|
81
|
+
# ↓ ↓ ↓ ↓
|
82
|
+
# +---------1-----****2*********3******---4---------+
|
83
|
+
# | * * |
|
84
|
+
# | hidden * viewable * hidden |
|
85
|
+
# | * * |
|
86
|
+
# +---------1-----****2*********3******---4---------+
|
87
|
+
# |......****?***.....|
|
88
|
+
# ↑ ↑
|
89
|
+
# first_visible = 16 |
|
90
|
+
# curr = 11
|
91
|
+
|
92
|
+
# Always use the same length for the scrollbar so it does not give an inchworm effect
|
93
|
+
# as it scrolls along. This will calculate the "ideal" length of the scroll bar if we
|
94
|
+
# could infinitely divide a character.
|
95
|
+
scrollbar_length = (viewable_count ** 2).to_f / total_count
|
96
|
+
|
97
|
+
# Round the length to the nearst "scaled" value
|
98
|
+
scrollbar_length = (SCROLL_HANDLE_SCALE * scrollbar_length).round.to_f / SCROLL_HANDLE_SCALE
|
99
|
+
|
100
|
+
# Ensure we have a scrollbar!
|
101
|
+
scrollbar_length = 1.0 / SCROLL_HANDLE_SCALE if scrollbar_length == 0
|
102
|
+
|
103
|
+
# Find the "ideal" position of where the scrollbar should start.
|
104
|
+
scrollbar_start = first_visible * viewable_count.to_f / total_count
|
105
|
+
|
106
|
+
# Round the start to the nearest "scaled" value
|
107
|
+
scrollbar_start = (SCROLL_HANDLE_SCALE * scrollbar_start).round.to_f / SCROLL_HANDLE_SCALE
|
108
|
+
|
109
|
+
# Make sure we didn't scroll off the page!
|
110
|
+
scrollbar_start -= scrollbar_length if scrollbar_start == viewable_count
|
111
|
+
|
112
|
+
# Create "scaled" indexes for the subdivided current character
|
113
|
+
curr_0 = curr
|
114
|
+
curr_1 = curr + 1.0 / SCROLL_HANDLE_SCALE
|
115
|
+
|
116
|
+
first_half = scrollbar_start <= curr_0 && curr_0 < scrollbar_start + scrollbar_length ? 2 : 0
|
117
|
+
second_half = scrollbar_start <= curr_1 && curr_1 < scrollbar_start + scrollbar_length ? 1 : 0
|
118
|
+
|
119
|
+
chars[second_half | first_half]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -175,13 +175,20 @@ module WhirledPeas
|
|
175
175
|
@_padding ||= Padding.new
|
176
176
|
end
|
177
177
|
|
178
|
-
def
|
179
|
-
|
180
|
-
|
178
|
+
def set_content_start(left: nil, top: nil, right: nil, bottom: nil)
|
179
|
+
if left && right
|
180
|
+
raise ArgumentError, 'Setting left and right content_start is not supported'
|
181
|
+
elsif top && bottom
|
182
|
+
raise ArgumentError, 'Setting top and bottom content_start is not supported'
|
183
|
+
end
|
184
|
+
content_start.left = left if left
|
185
|
+
content_start.top = top if top
|
186
|
+
content_start.right = right if right
|
187
|
+
content_start.bottom = bottom if bottom
|
181
188
|
end
|
182
189
|
|
183
|
-
def
|
184
|
-
@
|
190
|
+
def content_start
|
191
|
+
@_content_start ||= Position.new
|
185
192
|
end
|
186
193
|
|
187
194
|
def set_scrollbar(horiz: nil, vert: nil)
|
@@ -1,14 +1,26 @@
|
|
1
1
|
module WhirledPeas
|
2
2
|
module Settings
|
3
3
|
class Position
|
4
|
-
|
4
|
+
attr_reader :left, :top, :right, :bottom
|
5
5
|
|
6
|
-
def left
|
7
|
-
@
|
6
|
+
def left=(value)
|
7
|
+
@right = nil
|
8
|
+
@left = value
|
8
9
|
end
|
9
10
|
|
10
|
-
def top
|
11
|
-
@
|
11
|
+
def top=(value)
|
12
|
+
@bottom = nil
|
13
|
+
@top = value
|
14
|
+
end
|
15
|
+
|
16
|
+
def right=(value)
|
17
|
+
@left = nil
|
18
|
+
@right = value
|
19
|
+
end
|
20
|
+
|
21
|
+
def bottom=(value)
|
22
|
+
@top = nil
|
23
|
+
@bottom = value
|
12
24
|
end
|
13
25
|
end
|
14
26
|
end
|