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



75
76
77
78
79
80
81
82
83
# File 'lib/git_crecord/ui/hunks_window.rb', line 75

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



152
153
154
# File 'lib/git_crecord/ui/hunks_window.rb', line 152

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

#commitObject



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

def commit
  QuitAction.new do |reverse|
    Git.stage_files(@files, reverse) && Git.commit
  end
end

#content_height(width) ⇒ Object



51
52
53
# File 'lib/git_crecord/ui/hunks_window.rb', line 51

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

#expandObject



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

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

#help_windowObject



177
178
179
180
# File 'lib/git_crecord/ui/hunks_window.rb', line 177

def help_window
  HelpWindow.show
  refresh
end

#highlight_firstObject



130
131
132
# File 'lib/git_crecord/ui/hunks_window.rb', line 130

def highlight_first
  move_highlight(@visibles[0])
end

#highlight_lastObject



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

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

#highlight_nextObject



122
123
124
# File 'lib/git_crecord/ui/hunks_window.rb', line 122

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

#highlight_next_hunkObject



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

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

#highlight_positionObject



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

def highlight_position
  "#{@visibles.index(@highlighted) + 1}/#{@visibles.size}"
end

#highlight_previousObject



126
127
128
# File 'lib/git_crecord/ui/hunks_window.rb', line 126

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

#highlight_previous_hunkObject



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

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



65
66
67
68
69
70
71
72
73
# File 'lib/git_crecord/ui/hunks_window.rb', line 65

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


85
86
87
88
89
90
91
92
93
94
# File 'lib/git_crecord/ui/hunks_window.rb', line 85

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



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

def quit
  :quit
end

#redrawObject



36
37
38
39
40
# File 'lib/git_crecord/ui/hunks_window.rb', line 36

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

#refreshObject



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

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

#resizeObject



42
43
44
45
46
47
48
49
# File 'lib/git_crecord/ui/hunks_window.rb', line 42

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

  @win.resize(new_height, new_width)
  redraw
end

#scroll_positionObject



55
56
57
58
59
60
61
62
63
# File 'lib/git_crecord/ui/hunks_window.rb', line 55

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



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

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

#toggle_all_selectionsObject



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

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

#toggle_foldObject



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

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

#toggle_selectionObject



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

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

#update_visiblesObject



96
97
98
99
100
101
102
103
104
105
106
# File 'lib/git_crecord/ui/hunks_window.rb', line 96

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