Class: Redwood::ScrollMode

Inherits:
Mode show all
Defined in:
lib/sup/modes/scroll-mode.rb

Direct Known Subclasses

CompletionMode, LineCursorMode, TextMode

Constant Summary

COL_JUMP =
2

Instance Attribute Summary collapse

Attributes inherited from Mode

#buffer

Instance Method Summary collapse

Methods inherited from Mode

#blur, #cleanup, #focus, #handle_input, #help_text, #killable?, load_all_modes, make_name, #name, #pipe_to_process, register_keymap, #resolve_input, #save_to_file

Constructor Details

#initialize(opts = {}) ⇒ 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 # when we pgup/pgdown,
                                     # how many lines do we keep?
  @twiddles = opts.member?(:twiddles) ? opts[:twiddles] : true
  @search_query = nil
  @search_line = nil
  @status = ""
  super()
end

Instance Attribute Details

#botlineObject (readonly)

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

#leftcolObject (readonly)

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

#statusObject (readonly)

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

#toplineObject (readonly)

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

#col_leftObject



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_rightObject



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_bufferObject



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.length
    buffer.mark_dirty
  else
    BufferManager.flash "Not found!"
  end
end

#drawObject



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_validityObject



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_downObject



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_upObject



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_endObject



139
# File 'lib/sup/modes/scroll-mode.rb', line 139

def jump_to_end; jump_to_line lines - buffer.content_height; end

#jump_to_leftObject



118
# File 'lib/sup/modes/scroll-mode.rb', line 118

def jump_to_left; jump_to_col 0; end

#jump_to_line(l) ⇒ Object

set top line to l



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_startObject



138
# File 'lib/sup/modes/scroll-mode.rb', line 138

def jump_to_start; jump_to_line 0; end

#line_downObject



132
# File 'lib/sup/modes/scroll-mode.rb', line 132

def line_down; jump_to_line @topline + 1; end

#line_upObject



133
# File 'lib/sup/modes/scroll-mode.rb', line 133

def line_up;  jump_to_line @topline - 1; end

#page_downObject



134
# File 'lib/sup/modes/scroll-mode.rb', line 134

def page_down; jump_to_line @topline + buffer.content_height - @slip_rows; end

#page_upObject



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

#rightcolObject



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 # if it's occluded...
    jump_to_col [rightcol - buffer.content_width + 1, 0].max # move right
  end
end

#search_in_bufferObject



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_lineObject



98
# File 'lib/sup/modes/scroll-mode.rb', line 98

def search_start_line; @topline end