Class: Redwood::ScrollMode
- Inherits:
-
Mode
show all
- Defined in:
- lib/sup/modes/scroll-mode.rb
Constant Summary
collapse
- COL_JUMP =
2
Instance Attribute Summary collapse
-
#botline ⇒ Object
readonly
we left leftcol and rightcol as the left and right columns of any content in the current view.
-
#leftcol ⇒ Object
readonly
we left leftcol and rightcol as the left and right columns of any content in the current view.
-
#status ⇒ Object
readonly
we left leftcol and rightcol as the left and right columns of any content in the current view.
-
#topline ⇒ Object
readonly
we left leftcol and rightcol as the left and right columns of any content in the current view.
Attributes inherited from Mode
#buffer
Instance Method Summary
collapse
Methods inherited from Mode
#blur, #cleanup, #focus, #handle_input, #help_text, keymap, keymaps, #killable?, load_all_modes, make_name, #name, #pipe_to_process, register_keymap, #resolve_input, #save_to_file, #unsaved?
Constructor Details
#initialize(opts = {}) ⇒ ScrollMode
Returns a new instance of ScrollMode.
33
34
35
36
37
38
39
40
41
42
|
# File 'lib/sup/modes/scroll-mode.rb', line 33
def initialize opts={}
@topline, @botline, @leftcol = 0, 0, 0
@slip_rows = opts[:slip_rows] || 0 @twiddles = opts.member?(:twiddles) ? opts[:twiddles] : true
@search_query = nil
@search_line = nil
@status = ""
super()
end
|
Instance Attribute Details
we left leftcol and rightcol as the left and right columns of any content in the current view. but since we’re operating in a line-centric fashion, rightcol is always leftcol + the buffer width. (whereas botline is topline + at most the buffer height, and can be == to topline in the case that there’s no content.)
13
14
15
|
# File 'lib/sup/modes/scroll-mode.rb', line 13
def botline
@botline
end
|
we left leftcol and rightcol as the left and right columns of any content in the current view. but since we’re operating in a line-centric fashion, rightcol is always leftcol + the buffer width. (whereas botline is topline + at most the buffer height, and can be == to topline in the case that there’s no content.)
13
14
15
|
# File 'lib/sup/modes/scroll-mode.rb', line 13
def leftcol
@leftcol
end
|
we left leftcol and rightcol as the left and right columns of any content in the current view. but since we’re operating in a line-centric fashion, rightcol is always leftcol + the buffer width. (whereas botline is topline + at most the buffer height, and can be == to topline in the case that there’s no content.)
13
14
15
|
# File 'lib/sup/modes/scroll-mode.rb', line 13
def status
@status
end
|
we left leftcol and rightcol as the left and right columns of any content in the current view. but since we’re operating in a line-centric fashion, rightcol is always leftcol + the buffer width. (whereas botline is topline + at most the buffer height, and can be == to topline in the case that there’s no content.)
13
14
15
|
# File 'lib/sup/modes/scroll-mode.rb', line 13
def topline
@topline
end
|
Instance Method Details
#at_bottom? ⇒ Boolean
130
|
# File 'lib/sup/modes/scroll-mode.rb', line 130
def at_bottom?; @botline == lines end
|
#at_top? ⇒ Boolean
129
|
# File 'lib/sup/modes/scroll-mode.rb', line 129
def at_top?; @topline == 0 end
|
#cancel_search! ⇒ Object
60
|
# File 'lib/sup/modes/scroll-mode.rb', line 60
def cancel_search!; @search_line = nil end
|
101
102
103
104
105
|
# File 'lib/sup/modes/scroll-mode.rb', line 101
def col_left
return unless @leftcol > 0
@leftcol -= COL_JUMP
buffer.mark_dirty
end
|
#col_right ⇒ Object
107
108
109
110
|
# File 'lib/sup/modes/scroll-mode.rb', line 107
def col_right
@leftcol += COL_JUMP
buffer.mark_dirty
end
|
#continue_search_in_buffer ⇒ Object
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/sup/modes/scroll-mode.rb', line 62
def continue_search_in_buffer
unless @search_query
BufferManager.flash "No current search!"
return
end
start = @search_line || search_start_line
line, col = find_text @search_query, start
if line.nil? && (start > 0)
line, col = find_text @search_query, 0
BufferManager.flash "Search wrapped to top!" if line
end
if line
@search_line = line + 1
search_goto_pos line, col, col + @search_query.display_length
buffer.mark_dirty
else
BufferManager.flash "Not found!"
end
end
|
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/sup/modes/scroll-mode.rb', line 46
def draw
ensure_mode_validity
(@topline ... @botline).each { |ln| draw_line ln }
((@botline - @topline) ... buffer.content_height).each do |ln|
if @twiddles
buffer.write ln, 0, "~", :color => :twiddle_color
else
buffer.write ln, 0, ""
end
end
@status = "lines #{@topline + 1}:#{@botline}/#{lines}"
end
|
#ensure_mode_validity ⇒ Object
141
142
143
144
|
# File 'lib/sup/modes/scroll-mode.rb', line 141
def ensure_mode_validity
@topline = @topline.clamp 0, [lines - 1, 0].max
@botline = [@topline + buffer.content_height, lines].min
end
|
#half_page_down ⇒ Object
136
|
# File 'lib/sup/modes/scroll-mode.rb', line 136
def half_page_down; jump_to_line @topline + buffer.content_height / 2; end
|
#half_page_up ⇒ Object
137
|
# File 'lib/sup/modes/scroll-mode.rb', line 137
def half_page_up; jump_to_line @topline - buffer.content_height / 2; end
|
#in_search? ⇒ Boolean
59
|
# File 'lib/sup/modes/scroll-mode.rb', line 59
def in_search?; @search_line end
|
#jump_to_col(col) ⇒ Object
112
113
114
115
116
|
# File 'lib/sup/modes/scroll-mode.rb', line 112
def jump_to_col col
col = col - (col % COL_JUMP)
buffer.mark_dirty unless @leftcol == col
@leftcol = col
end
|
#jump_to_end ⇒ Object
139
|
# File 'lib/sup/modes/scroll-mode.rb', line 139
def jump_to_end; jump_to_line lines - buffer.content_height; end
|
#jump_to_left ⇒ Object
118
|
# File 'lib/sup/modes/scroll-mode.rb', line 118
def jump_to_left; jump_to_col 0; end
|
#jump_to_line(l) ⇒ Object
121
122
123
124
125
126
127
|
# File 'lib/sup/modes/scroll-mode.rb', line 121
def jump_to_line l
l = l.clamp 0, lines - 1
return if @topline == l
@topline = l
@botline = [l + buffer.content_height, lines].min
buffer.mark_dirty
end
|
#jump_to_start ⇒ Object
138
|
# File 'lib/sup/modes/scroll-mode.rb', line 138
def jump_to_start; jump_to_line 0; end
|
#line_down ⇒ Object
132
|
# File 'lib/sup/modes/scroll-mode.rb', line 132
def line_down; jump_to_line @topline + 1; end
|
133
|
# File 'lib/sup/modes/scroll-mode.rb', line 133
def line_up; jump_to_line @topline - 1; end
|
#page_down ⇒ Object
134
|
# File 'lib/sup/modes/scroll-mode.rb', line 134
def page_down; jump_to_line @topline + buffer.content_height - @slip_rows; end
|
135
|
# File 'lib/sup/modes/scroll-mode.rb', line 135
def page_up; jump_to_line @topline - buffer.content_height + @slip_rows; end
|
#resize(*a) ⇒ Object
146
147
148
149
|
# File 'lib/sup/modes/scroll-mode.rb', line 146
def resize *a
super(*a)
ensure_mode_validity
end
|
44
|
# File 'lib/sup/modes/scroll-mode.rb', line 44
def rightcol; @leftcol + buffer.content_width; end
|
#search_goto_line(line) ⇒ Object
99
|
# File 'lib/sup/modes/scroll-mode.rb', line 99
def search_goto_line line; jump_to_line line end
|
#search_goto_pos(line, leftcol, rightcol) ⇒ Object
subclasses can override these three!
91
92
93
94
95
96
97
|
# File 'lib/sup/modes/scroll-mode.rb', line 91
def search_goto_pos line, leftcol, rightcol
search_goto_line line
if rightcol > self.rightcol jump_to_col [rightcol - buffer.content_width + 1, 0].max end
end
|
#search_in_buffer ⇒ Object
83
84
85
86
87
88
|
# File 'lib/sup/modes/scroll-mode.rb', line 83
def search_in_buffer
query = BufferManager.ask :search, "search in buffer: "
return if query.nil? || query.empty?
@search_query = Regexp.escape query
continue_search_in_buffer
end
|
#search_start_line ⇒ Object
98
|
# File 'lib/sup/modes/scroll-mode.rb', line 98
def search_start_line; @topline end
|