Class: GitCrecord::UI::HunksWindow

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/git_crecord/ui/hunks_window.rb

Instance Method Summary collapse

Constructor Details

#initialize(win, files) ⇒ HunksWindow

Returns a new instance of HunksWindow.



15
16
17
18
19
20
21
22
23
# File 'lib/git_crecord/ui/hunks_window.rb', line 15

def initialize(win, files)
  @win = win
  @files = files
  @visibles = @files
  @highlighted = @files[0]
  @scroll_position = 0

  resize
end

Instance Method Details

#addstr(str, y_pos = nil, x_pos = 0, attr: 0, fill: false) ⇒ Object



71
72
73
74
75
76
77
78
79
# File 'lib/git_crecord/ui/hunks_window.rb', line 71

def addstr(str, y_pos = nil, x_pos = 0, attr: 0, fill: false)
  @win.setpos(y_pos, x_pos) unless y_pos.nil?
  @win.attrset(attr)
  @win.addstr(str)
  fill_size = width - @win.curx
  return unless fill && fill_size.positive?

  @win.addstr((fill * fill_size)[0..fill_size])
end

#collapseObject



146
147
148
# File 'lib/git_crecord/ui/hunks_window.rb', line 146

def collapse
  toggle_fold if !@highlighted.subs.empty? && @highlighted.expanded
end

#commitObject



112
113
114
# File 'lib/git_crecord/ui/hunks_window.rb', line 112

def commit
  QuitAction.new { |reverse| Git.stage(@files, reverse) && Git.commit }
end

#content_height(width) ⇒ Object



47
48
49
# File 'lib/git_crecord/ui/hunks_window.rb', line 47

def content_height(width)
  @files.reduce(@files.size) { |a, e| a + e.max_height(width) }
end

#expandObject



150
151
152
# File 'lib/git_crecord/ui/hunks_window.rb', line 150

def expand
  toggle_fold if !@highlighted.subs.empty? && !@highlighted.expanded
end

#help_windowObject



171
172
173
174
# File 'lib/git_crecord/ui/hunks_window.rb', line 171

def help_window
  HelpWindow.show
  refresh
end

#highlight_firstObject



124
125
126
# File 'lib/git_crecord/ui/hunks_window.rb', line 124

def highlight_first
  move_highlight(@visibles[0])
end

#highlight_lastObject



128
129
130
# File 'lib/git_crecord/ui/hunks_window.rb', line 128

def highlight_last
  move_highlight(@visibles[-1])
end

#highlight_nextObject



116
117
118
# File 'lib/git_crecord/ui/hunks_window.rb', line 116

def highlight_next
  move_highlight(@visibles[@visibles.index(@highlighted) + 1])
end

#highlight_next_hunkObject



132
133
134
135
136
137
# File 'lib/git_crecord/ui/hunks_window.rb', line 132

def highlight_next_hunk
  index = @visibles.index(@highlighted)
  move_highlight(
    @visibles[(index + 1)..-1].find { |entry| !entry.subs.empty? }
  )
end

#highlight_previousObject



120
121
122
# File 'lib/git_crecord/ui/hunks_window.rb', line 120

def highlight_previous
  move_highlight(@visibles[[@visibles.index(@highlighted) - 1, 0].max])
end

#highlight_previous_hunkObject



139
140
141
142
143
144
# File 'lib/git_crecord/ui/hunks_window.rb', line 139

def highlight_previous_hunk
  index = @visibles.index(@highlighted)
  move_highlight(
    @visibles[0...index].reverse_each.find { |entry| !entry.subs.empty? }
  )
end

#move_highlight(to) ⇒ Object



61
62
63
64
65
66
67
68
69
# File 'lib/git_crecord/ui/hunks_window.rb', line 61

def move_highlight(to)
  return if to == @highlighted || to.nil?

  from = @highlighted
  @highlighted = to
  from.print(self, from.y1 - 1, false)
  to.print(self, to.y1 - 1, true)
  refresh
end


81
82
83
84
85
86
87
88
89
90
# File 'lib/git_crecord/ui/hunks_window.rb', line 81

def print_list(list, line_number = -1)
  list.each do |entry|
    line_number = entry.print(self, line_number, entry == @highlighted)
    next unless entry.expanded

    line_number = print_list(entry.subs, line_number)
    addstr('', line_number += 1, fill: '_') if entry.is_a?(Diff::File)
  end
  line_number
end

#quitObject



104
105
106
# File 'lib/git_crecord/ui/hunks_window.rb', line 104

def quit
  :quit
end

#redrawObject



32
33
34
35
36
# File 'lib/git_crecord/ui/hunks_window.rb', line 32

def redraw
  @win.clear
  print_list(@files)
  refresh
end

#refreshObject



28
29
30
# File 'lib/git_crecord/ui/hunks_window.rb', line 28

def refresh
  @win.refresh(scroll_position, 0, 0, 0, Curses.lines - 1, width)
end

#resizeObject



38
39
40
41
42
43
44
45
# File 'lib/git_crecord/ui/hunks_window.rb', line 38

def resize
  new_width = Curses.cols
  new_height = [Curses.lines, content_height(new_width)].max
  return if width == new_width && @win.maxy == new_height

  @win.resize(new_height, new_width)
  redraw
end

#scroll_positionObject



51
52
53
54
55
56
57
58
59
# File 'lib/git_crecord/ui/hunks_window.rb', line 51

def scroll_position
  upper_position = @highlighted.y1 - 3
  if @scroll_position > upper_position
    @scroll_position = upper_position
  elsif @scroll_position <= @highlighted.y2 + 4 - Curses.lines
    @scroll_position = [@highlighted.y2 + 4, @win.maxy].min - Curses.lines
  end
  @scroll_position
end

#stageObject



108
109
110
# File 'lib/git_crecord/ui/hunks_window.rb', line 108

def stage
  QuitAction.new { |reverse| Git.stage(@files, reverse) }
end

#toggle_all_selectionsObject



165
166
167
168
169
# File 'lib/git_crecord/ui/hunks_window.rb', line 165

def toggle_all_selections
  new_selected = @files[0].selected == false
  @files.each { |file| file.selected = new_selected }
  redraw
end

#toggle_foldObject



154
155
156
157
158
# File 'lib/git_crecord/ui/hunks_window.rb', line 154

def toggle_fold
  @highlighted.expanded = !@highlighted.expanded
  update_visibles
  redraw
end

#toggle_selectionObject



160
161
162
163
# File 'lib/git_crecord/ui/hunks_window.rb', line 160

def toggle_selection
  @highlighted.selected = !@highlighted.selected
  redraw
end

#update_visiblesObject



92
93
94
95
96
97
98
99
100
101
102
# File 'lib/git_crecord/ui/hunks_window.rb', line 92

def update_visibles
  @visibles = @files.each_with_object([]) do |entry, vs|
    vs << entry
    next unless entry.expanded

    entry.selectable_subs.each do |entryy|
      vs << entryy
      vs.concat(entryy.selectable_subs) if entryy.expanded
    end
  end
end