Class: Eclair::Grid

Inherits:
Object
  • Object
show all
Defined in:
lib/eclair/grid.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(keyword = "") ⇒ Grid

Returns a new instance of Grid.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/eclair/grid.rb', line 9

def initialize keyword = ""
  case config.provider
  when :ec2
    require "eclair/providers/ec2"
    @provider = EC2Provider
  when :k8s
    require "eclair/providers/k8s"
    @provider = K8sProvider
  when :gce
    require "eclair/providers/gce"
    @provider = GCEProvider
  end
  @item_class = @provider.item_class

  @scroll = config.columns.times.map{0}
  @header_rows = 4
  @cursor = [0,0]
  @cell_width = Curses.stdscr.maxx/config.columns
  @maxy = Curses.stdscr.maxy - @header_rows
  @mode = :assign
  @search_buffer = ""

  @provider.prepare keyword
  assign
  at(*@cursor).select(true)
  draw_all
  transit_mode(:nav)
end

Instance Attribute Details

#modeObject (readonly)

Returns the value of attribute mode.



7
8
9
# File 'lib/eclair/grid.rb', line 7

def mode
  @mode
end

Instance Method Details

#actionObject



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/eclair/grid.rb', line 83

def action
  targets = @provider.items.select{|i| i.selected && i.connectable?}

  return if targets.empty?
  Curses.close_screen

  if targets.length == 1
    cmd = targets.first.command
  else
    cmds = []
    target_cmd = ""

    targets.each_with_index do |target, i|
      if i == 0
        if ENV['TMUX'] # Eclair called inside of tmux
          # Create new session and save window id
          window_name = `tmux new-window -P -- '#{target.command}'`.strip
          target_cmd = "-t #{window_name}"
        else # Eclair called from outside of tmux
          # Create new session and save session
          session_name = "eclair#{Time.now.to_i}"
          target_cmd = "-t #{session_name}"
          `tmux new-session -d -s #{session_name} -- '#{target.command}'`
        end
      else # Split layout and
        cmds << "split-window #{target_cmd} -- '#{target.command}'"
        cmds << "select-layout #{target_cmd} tiled"
      end
    end
    cmds << "set-window-option #{target_cmd} synchronize-panes on"
    cmds << "attach #{target_cmd}" unless ENV['TMUX']
    cmd = "tmux #{cmds.join(" \\; ")}"
  end
  system(cmd)
  exit()
  resize
end

#append_search(key) ⇒ Object



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/eclair/grid.rb', line 172

def append_search key
  return unless key

  if @search_buffer.length > 0 && key == 127 # backspace
    @search_buffer = @search_buffer.chop
  elsif key.to_s.length == 1
    begin
      @search_buffer = @search_buffer + key.to_s
    rescue
      return
    end
  else
    return
  end

  update_search
end

#clear_searchObject



167
168
169
170
# File 'lib/eclair/grid.rb', line 167

def clear_search
  @search_buffer = ""
  update_search
end

#end_searchObject



159
160
161
162
163
164
165
# File 'lib/eclair/grid.rb', line 159

def end_search
  if @provider.items.any?{|i| i.selected}
    transit_mode(:sel)
  else
    transit_mode(:nav)
  end
end

#move(key) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/eclair/grid.rb', line 38

def move key
  return unless at(*@cursor)
  x,y = @cursor
  mx,my = {
    Curses::KEY_UP => [0,-1],
    ?k => [0,-1],
    Curses::KEY_DOWN => [0,1],
    ?j => [0,1],
    Curses::KEY_LEFT => [-1,0],
    ?h => [-1,0],
    Curses::KEY_RIGHT => [1,0],
    ?l => [1,0],
  }[key]

  newx = x
  loop do
    newx = (newx + mx) % @grid.length
    break if @grid[newx].length > 0
  end
  newy = (y + my - @scroll[x] + @scroll[newx])
  if my != 0
    newy %= @grid[newx].length
  end
  if newy >= @grid[newx].length
    newy = @grid[newx].length-1
  end

  move_cursor(newx, newy)
end

#resizeObject



121
122
123
124
125
126
127
128
# File 'lib/eclair/grid.rb', line 121

def resize
  Curses.clear
  @scroll.fill(0)
  @cell_width = Curses.stdscr.maxx/config.columns
  @maxy = Curses.stdscr.maxy - @header_rows
  rescroll(*@cursor)
  draw_all
end

#spaceObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/eclair/grid.rb', line 68

def space
  if @mode == :nav
    transit_mode(:sel)
  end

  at(*@cursor)&.toggle_select

  if @mode == :sel && @provider.items.all?{|i| !i.selected}
    transit_mode(:nav)
  end


  draw(*@cursor)
end

#start_searchObject



155
156
157
# File 'lib/eclair/grid.rb', line 155

def start_search
  transit_mode(:search)
end

#transit_mode(to) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/eclair/grid.rb', line 130

def transit_mode to
  return if to == @mode

  case @mode
  when :nav
    at(*@cursor)&.select(false)
  when :sel
  when :search
  when :assign
  end

  @mode = to

  case @mode
  when :nav
    at(*@cursor)&.select(true)
  when :sel
  when :search
  when :assign
    move_cursor(0,0)
  end

  draw_all
end