class Efm::Manager

Constants

FIRST_LINE

Public Class Methods

init_screen() click to toggle source
# File lib/efm/manager.rb, line 8
def self.init_screen
  Curses.init_screen
  Curses.noecho
  Curses.curs_set(0)
  Curses.start_color
  [Curses::COLOR_GREEN, Curses::COLOR_WHITE].each do |c|
    Curses.init_pair c, c, Curses::COLOR_BLACK
  end

  new
end
new() click to toggle source
# File lib/efm/manager.rb, line 20
def initialize
  @header = Curses::Window.new(1, Curses.cols, 0, 0)
  @main = Curses::Window.new(Curses.lines - 1, Curses.cols, 1, 0)
end

Public Instance Methods

run() click to toggle source
# File lib/efm/manager.rb, line 25
def run
  init_position
  cd
  ls
  update_header

  begin
    loop do
      case c = @main.getch
      when Curses::KEY_CTRL_N
        down
      when Curses::KEY_CTRL_P
        up
      when Curses::KEY_CTRL_H, Curses::KEY_CTRL_B, 127
        left
        ls
      when Curses::KEY_CTRL_F, 10, 13
        if @current_item.dir?
          cd(@current_item.name)
        else
          open
        end
        ls
      when 'q'
        break
      end

      update_header
    end
  ensure
    Curses.close_screen
  end
end

Private Instance Methods

cd(dir = '.') click to toggle source
# File lib/efm/manager.rb, line 150
def cd(dir = '.')
  Dir.chdir(dir)
  @items = Item.all
  @page = 0
  @last_page = @items.count / maxy
end
clear_screen() click to toggle source
# File lib/efm/manager.rb, line 70
def clear_screen
  @main.clear
end
decorate_current_item() click to toggle source
# File lib/efm/manager.rb, line 133
def decorate_current_item
  @main.clrtoeol
  @main.attron(@current_item.color | Curses::A_STANDOUT) do
    @main.addstr(@current_item.name)
  end
end
display_line(item) click to toggle source
# File lib/efm/manager.rb, line 140
def display_line(item)
  @main.attron(item.color | Curses::A_NORMAL) do
    @main.addstr(item.name)
  end
end
down() click to toggle source
# File lib/efm/manager.rb, line 102
def down
  if @y >= @last_line && @page != @last_page
    @page = @page + 1
    ls
  elsif @y >= @last_line && @page == @last_page
    @page = 0
    ls
  else
    init_prev_item
    @y = @y + 1
  end

  @current_item = @display_items[@y]
  @main.setpos(@y, @x)
  decorate_current_item
end
init_position() click to toggle source
# File lib/efm/manager.rb, line 74
def init_position
  @x = 0
  @y = 0

  @main.setpos(@y, @x)
end
init_prev_item() click to toggle source
# File lib/efm/manager.rb, line 128
def init_prev_item
  @main.setpos(@y, @x)
  display_line(@current_item)
end
left() click to toggle source
# File lib/efm/manager.rb, line 119
def left
  cd('..')
end
ls() click to toggle source
# File lib/efm/manager.rb, line 157
def ls
  clear_screen
  init_position

  @display_items = @items[@page * maxy, maxy]
  @current_item = @display_items.first

  @display_items.each do |item|
    @main.setpos(@y, @x)
    display_line(item)
    @y = @y + 1
  end

  init_position
  decorate_current_item
  @main.refresh

  @last_line = @display_items.count - 1
end
maxy() click to toggle source
# File lib/efm/manager.rb, line 146
def maxy
  @main.maxy
end
open() click to toggle source
# File lib/efm/manager.rb, line 123
def open
  editor = ENV['EDITOR'] || 'vi'
  system "#{editor} #{@current_item.name}"
end
up() click to toggle source
# File lib/efm/manager.rb, line 81
def up
  if @y <= FIRST_LINE && 0 == @page
    @page = @items.count / (maxy + 1)
    ls
    init_prev_item
    @y = (@items.count - 1) % maxy
  elsif @y <= FIRST_LINE && 0 < @page
    @page = @page - 1
    ls
    init_prev_item
    @y = maxy - 1
  else
    init_prev_item
    @y = @y - 1
  end

  @current_item = @display_items[@y]
  @main.setpos(@y, @x)
  decorate_current_item
end
update_header() click to toggle source
# File lib/efm/manager.rb, line 61
def update_header
  @header.setpos(0, 0)
  @header.clrtoeol
  @header.attron(Curses.color_pair(Curses::COLOR_GREEN) | Curses::A_NORMAL) do
    @header.addstr(File.expand_path(@current_item.name))
  end
  @header.refresh
end