bash-visual 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/lib/bash-visual/horizontal_scroll.rb +58 -58
- data/lib/bash-visual/scroll.rb +107 -110
- data/lib/bash-visual/version.rb +1 -1
- data/lib/bash-visual/vertical_scroll.rb +43 -43
- metadata +1 -1
data/Gemfile.lock
CHANGED
@@ -1,69 +1,69 @@
|
|
1
|
-
|
1
|
+
module Bash_Visual
|
2
|
+
class HorizontalScroll < Scroll
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
DEFAULT_SEPARATOR = "\u2502"
|
6
|
-
|
7
|
-
def initialize options
|
8
|
-
super
|
9
|
-
@message_block_width = @message_block_size
|
4
|
+
DEFAULT_SEPARATOR = "\u2502"
|
10
5
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
@x + (@area_width - available_area_width)
|
21
|
-
else
|
22
|
-
@x + available_area_width - message_width
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def print_message message, font, available_area
|
27
|
-
|
28
|
-
available_area_width, available_area_height = available_area
|
29
|
-
avail_width = @message_block_width > available_area_width ? available_area_width : @message_block_width
|
30
|
-
|
31
|
-
|
32
|
-
(available_area_height - message.size).times {
|
33
|
-
message << ''
|
34
|
-
}
|
35
|
-
|
36
|
-
if @adapt_size_message
|
37
|
-
message_width = rows_wrap! message, available_area_width
|
38
|
-
else
|
39
|
-
rows_wrap! message, avail_width
|
40
|
-
message_width = avail_width
|
6
|
+
def initialize options
|
7
|
+
super
|
8
|
+
@message_block_width = @message_block_size
|
9
|
+
|
10
|
+
@separator =
|
11
|
+
if @separator == true; DEFAULT_SEPARATOR
|
12
|
+
elsif @separator.instance_of? String; @separator[0]
|
13
|
+
else nil
|
14
|
+
end
|
41
15
|
end
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
16
|
+
|
17
|
+
def get_x_position available_area_width, message_width = 0
|
18
|
+
if (@start == BEGINNING)
|
19
|
+
@x + (@area_width - available_area_width)
|
20
|
+
else
|
21
|
+
@x + available_area_width - message_width
|
22
|
+
end
|
47
23
|
end
|
48
|
-
|
49
|
-
|
24
|
+
|
25
|
+
def print_message message, font, available_area
|
26
|
+
|
27
|
+
available_area_width, available_area_height = available_area
|
28
|
+
avail_width = @message_block_width > available_area_width ? available_area_width : @message_block_width
|
29
|
+
|
30
|
+
|
31
|
+
(available_area_height - message.size).times {
|
32
|
+
message << ''
|
33
|
+
}
|
34
|
+
|
50
35
|
if @adapt_size_message
|
51
|
-
|
52
|
-
message.map! do |row|
|
53
|
-
row << @separator
|
54
|
-
end
|
55
|
-
message_width += 1
|
56
|
-
end
|
36
|
+
message_width = rows_wrap! message, available_area_width
|
57
37
|
else
|
58
|
-
message
|
59
|
-
|
38
|
+
rows_wrap! message, avail_width
|
39
|
+
message_width = avail_width
|
40
|
+
end
|
41
|
+
|
42
|
+
message = message.slice(0, available_area_height) if message.size > available_area_height
|
43
|
+
|
44
|
+
message.map! do |row|
|
45
|
+
row.strip.ljust(message_width)
|
46
|
+
end
|
47
|
+
|
48
|
+
if @separator and @separator.size.nonzero?
|
49
|
+
if @adapt_size_message
|
50
|
+
if message_width < available_area_width
|
51
|
+
message.map! do |row|
|
52
|
+
row << @separator
|
53
|
+
end
|
54
|
+
message_width += 1
|
55
|
+
end
|
56
|
+
else
|
57
|
+
message.each do |row|
|
58
|
+
row[message_width-1] = @separator
|
59
|
+
end
|
60
60
|
end
|
61
61
|
end
|
62
|
-
end
|
63
62
|
|
64
|
-
|
63
|
+
write(get_x_position(available_area_width, message_width), @y, message, font)
|
64
|
+
|
65
|
+
[available_area_width - message_width, available_area_height]
|
66
|
+
end
|
65
67
|
|
66
|
-
[available_area_width - message_width, available_area_height]
|
67
68
|
end
|
68
|
-
|
69
|
-
end
|
69
|
+
end
|
data/lib/bash-visual/scroll.rb
CHANGED
@@ -1,120 +1,117 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'console'
|
4
|
-
|
5
|
-
class Scroll
|
6
|
-
|
7
|
-
FORWARD = 1
|
8
|
-
BACKWARD = -1
|
9
|
-
|
10
|
-
BEGINNING = false
|
11
|
-
ENDING = true
|
12
|
-
|
13
|
-
attr_accessor :console
|
14
|
-
|
15
|
-
def initialize(options)
|
16
|
-
|
17
|
-
@x, @y = options[:coordinates]
|
18
|
-
@x = @x.to_i
|
19
|
-
@y = @y.to_i
|
20
|
-
|
21
|
-
raise ':window_size isn\'t array' unless options[:window_size].instance_of? Array
|
22
|
-
raise 'size :window_size must be great than 1' if options[:window_size].size < 2
|
23
|
-
|
24
|
-
@area_width, @area_height = options[:window_size]
|
25
|
-
@area_width = @area_width.to_i
|
26
|
-
@area_height = @area_height.to_i
|
27
|
-
|
28
|
-
@message_block_size = options[:message_block_size] ? options[:message_block_size].to_i : 1
|
29
|
-
@message_block_size = 1 if @message_block_size < 1
|
30
|
-
|
31
|
-
@prefix = options[:prefix] ? options[:prefix] : nil
|
32
|
-
|
33
|
-
@adapt_size_message = options[:adapt_size_message] ? options[:adapt_size_message] : false
|
34
|
-
|
35
|
-
@is_wrap = true
|
36
|
-
@start = options[:start] ? ENDING : BEGINNING
|
37
|
-
@separator = options[:separator] ? options[:separator] : false
|
38
|
-
@font = options[:font] ? options[:font] : nil
|
39
|
-
|
40
|
-
@stack = []
|
41
|
-
@console = Console.new @font,Console::OUTPUT_STRING
|
42
|
-
@mutex = Mutex.new
|
43
|
-
end
|
44
|
-
|
45
|
-
def scroll(positions = 1, direction = @direction * positions)
|
1
|
+
module Bash_Visual
|
2
|
+
class Scroll
|
46
3
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
4
|
+
FORWARD = 1
|
5
|
+
BACKWARD = -1
|
6
|
+
|
7
|
+
BEGINNING = false
|
8
|
+
ENDING = true
|
9
|
+
|
10
|
+
attr_accessor :console
|
11
|
+
|
12
|
+
def initialize(options)
|
13
|
+
|
14
|
+
@x, @y = options[:coordinates]
|
15
|
+
@x = @x.to_i
|
16
|
+
@y = @y.to_i
|
17
|
+
|
18
|
+
raise ':window_size isn\'t array' unless options[:window_size].instance_of? Array
|
19
|
+
raise 'size :window_size must be great than 1' if options[:window_size].size < 2
|
20
|
+
|
21
|
+
@area_width, @area_height = options[:window_size]
|
22
|
+
@area_width = @area_width.to_i
|
23
|
+
@area_height = @area_height.to_i
|
24
|
+
|
25
|
+
@message_block_size = options[:message_block_size] ? options[:message_block_size].to_i : 1
|
26
|
+
@message_block_size = 1 if @message_block_size < 1
|
27
|
+
|
28
|
+
@prefix = options[:prefix] ? options[:prefix] : nil
|
29
|
+
|
30
|
+
@adapt_size_message = options[:adapt_size_message] ? options[:adapt_size_message] : false
|
31
|
+
|
32
|
+
@is_wrap = true
|
33
|
+
@start = options[:start] ? ENDING : BEGINNING
|
34
|
+
@separator = options[:separator] ? options[:separator] : false
|
35
|
+
@font = options[:font] ? options[:font] : nil
|
36
|
+
|
37
|
+
@stack = []
|
38
|
+
@console = Console.new @font,Console::OUTPUT_STRING
|
39
|
+
@mutex = Mutex.new
|
53
40
|
end
|
54
|
-
|
55
|
-
@
|
56
|
-
|
57
|
-
font: font
|
58
|
-
}
|
59
|
-
|
60
|
-
redraw()
|
61
|
-
#@stack.slice!(-index, index)
|
62
|
-
end
|
63
|
-
|
64
|
-
def prefix= (prefix)
|
65
|
-
@prefix = prefix
|
66
|
-
end
|
67
|
-
|
68
|
-
def prefix
|
69
|
-
if (defined? @prefix.call)
|
70
|
-
@prefix[].to_s
|
71
|
-
else
|
72
|
-
''
|
41
|
+
|
42
|
+
def scroll(positions = 1, direction = @direction * positions)
|
43
|
+
|
73
44
|
end
|
74
|
-
end
|
75
45
|
|
76
|
-
|
46
|
+
def add (message, font = @font)
|
77
47
|
|
78
|
-
|
79
|
-
|
80
|
-
@stack.reverse.each do |item|
|
81
|
-
|
82
|
-
message = item[:message].dup.lines.to_a
|
83
|
-
font = item[:font]
|
84
|
-
unless font.background
|
85
|
-
font = Font.new font.font, font.foreground, @font.background
|
48
|
+
if @stack.size.zero?
|
49
|
+
print @console.draw_rectangle(@x + 1, @y + 1, @area_width, @area_height, font)
|
86
50
|
end
|
87
51
|
|
88
|
-
|
89
|
-
|
90
|
-
|
52
|
+
@stack << {
|
53
|
+
message: prefix() << message.to_s,
|
54
|
+
font: font
|
55
|
+
}
|
56
|
+
|
57
|
+
redraw()
|
58
|
+
#@stack.slice!(-index, index)
|
91
59
|
end
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
60
|
+
|
61
|
+
def prefix= (prefix)
|
62
|
+
@prefix = prefix
|
63
|
+
end
|
64
|
+
|
65
|
+
def prefix
|
66
|
+
if (defined? @prefix.call)
|
67
|
+
@prefix[].to_s
|
68
|
+
else
|
69
|
+
''
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def redraw
|
76
|
+
avail_area = [@area_width, @area_height]
|
77
|
+
@stack.reverse.each do |item|
|
78
|
+
|
79
|
+
message = item[:message].dup.lines.to_a
|
80
|
+
font = item[:font]
|
81
|
+
unless font.background
|
82
|
+
font = Font.new font.font, font.foreground, @font.background
|
83
|
+
end
|
84
|
+
|
85
|
+
avail_area = print_message(message, font, avail_area)
|
86
|
+
# выходим если закончилось место в области
|
87
|
+
return nil if avail_area[0] <= 0 or avail_area[1] <= 0
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# сделать переносы в массиве строк
|
92
|
+
def rows_wrap! arr, max_len
|
93
|
+
max_used_len = 1
|
94
|
+
arr.each_with_index do |row, i|
|
95
|
+
len = row.size
|
96
|
+
max_used_len = len if len > max_used_len
|
97
|
+
next if len <= max_len
|
98
|
+
tail = row.slice!(max_len, len-max_len)
|
99
|
+
arr.insert(i+1, tail)
|
100
|
+
end
|
101
|
+
max_used_len
|
103
102
|
end
|
104
|
-
max_used_len
|
105
|
-
end
|
106
|
-
|
107
|
-
def write (x, y, message, font)
|
108
|
-
|
109
|
-
|
110
|
-
string = ''
|
111
|
-
message.each_with_index { |text, i|
|
112
|
-
string << @console.write_to_position(x, y + i, text, font)
|
113
|
-
}
|
114
|
-
|
115
|
-
@mutex.synchronize {
|
116
|
-
print string
|
117
|
-
}
|
118
|
-
end
|
119
|
-
end
|
120
103
|
|
104
|
+
def write (x, y, message, font)
|
105
|
+
|
106
|
+
|
107
|
+
string = ''
|
108
|
+
message.each_with_index { |text, i|
|
109
|
+
string << @console.write_to_position(x, y + i, text, font)
|
110
|
+
}
|
111
|
+
|
112
|
+
@mutex.synchronize {
|
113
|
+
print string
|
114
|
+
}
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
data/lib/bash-visual/version.rb
CHANGED
@@ -1,54 +1,54 @@
|
|
1
|
-
|
1
|
+
module Bash_Visual
|
2
|
+
class VerticalScroll < Scroll
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
super
|
7
|
-
@message_block_height = @message_block_size
|
8
|
-
end
|
9
|
-
|
10
|
-
def get_y_position available_area_height, message_size = 0
|
11
|
-
if (@start == BEGINNING)
|
12
|
-
@y + (@area_height - available_area_height)
|
13
|
-
else
|
14
|
-
@y + available_area_height - message_size
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def print_message message, font, available_area
|
19
|
-
|
20
|
-
available_area_width, available_area_height = available_area
|
21
|
-
avail_height = @message_block_height > available_area_height ? available_area_height : @message_block_height
|
22
|
-
|
23
|
-
rows_wrap!(message, available_area_width) if @is_wrap
|
24
|
-
|
25
|
-
if @adapt_size_message
|
26
|
-
message = message.slice(0, available_area_height) if message.size > available_area_height
|
27
|
-
else
|
28
|
-
message = message.slice(0, avail_height) if message.size > avail_height
|
29
|
-
end
|
30
|
-
|
31
|
-
message.map! do |row|
|
32
|
-
row.strip.ljust(available_area_width)
|
4
|
+
def initialize options
|
5
|
+
super
|
6
|
+
@message_block_height = @message_block_size
|
33
7
|
end
|
34
8
|
|
35
|
-
|
36
|
-
|
37
|
-
|
9
|
+
def get_y_position available_area_height, message_size = 0
|
10
|
+
if (@start == BEGINNING)
|
11
|
+
@y + (@area_height - available_area_height)
|
12
|
+
else
|
13
|
+
@y + available_area_height - message_size
|
14
|
+
end
|
38
15
|
end
|
39
16
|
|
40
|
-
|
41
|
-
|
42
|
-
|
17
|
+
def print_message message, font, available_area
|
18
|
+
|
19
|
+
available_area_width, available_area_height = available_area
|
20
|
+
avail_height = @message_block_height > available_area_height ? available_area_height : @message_block_height
|
21
|
+
|
22
|
+
rows_wrap!(message, available_area_width) if @is_wrap
|
23
|
+
|
24
|
+
if @adapt_size_message
|
25
|
+
message = message.slice(0, available_area_height) if message.size > available_area_height
|
43
26
|
else
|
44
|
-
message
|
27
|
+
message = message.slice(0, avail_height) if message.size > avail_height
|
28
|
+
end
|
29
|
+
|
30
|
+
message.map! do |row|
|
31
|
+
row.strip.ljust(available_area_width)
|
32
|
+
end
|
33
|
+
|
34
|
+
if @separator == true
|
35
|
+
message[message.size-1] = Font.new(Font::UNDERLINE, font.foreground, font.background).to_bash +
|
36
|
+
message.last.ljust(available_area_width, ' ')
|
45
37
|
end
|
46
|
-
end
|
47
|
-
|
48
|
-
write(@x, get_y_position(available_area_height, message.size), message, font)
|
49
38
|
|
39
|
+
if (@separator.instance_of? String)
|
40
|
+
if (message.size > available_area_height)
|
41
|
+
message[message.size-1] = @separator[0] * available_area_width
|
42
|
+
else
|
43
|
+
message << @separator[0] * available_area_width
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
write(@x, get_y_position(available_area_height, message.size), message, font)
|
48
|
+
|
49
|
+
|
50
|
+
[available_area_width, available_area_height - message.size]
|
51
|
+
end
|
50
52
|
|
51
|
-
[available_area_width, available_area_height - message.size]
|
52
53
|
end
|
53
|
-
|
54
54
|
end
|