#!/usr/bin/ruby require 'curses' require_relative 'bludiste' include Curses STATUS_LINE = 0 class Program def write(line, column, text) setpos line, column addstr text end def get_mode mod = nil while mod.nil? clear write(STATUS_LINE, 0, "Mod? (1 - 4)") mod = case Curses.getch.downcase when ?1 1 when ?2 2 when ?3 3 when ?4 4 else nil end end mod end def edit_mode clear write(STATUS_LINE, 0, "Soubor (nic => konec) ? ") str = getstr if str.length == 0 return end @bludiste = Bludiste.new @bludiste.load str clear write(0, 0, "Q = konec") write(1, 0, @bludiste.render) while true case Curses.getch when ?q break when ?Q break end end end def draw_search_result clear st = @result[@pozice] if !@result.nil? write(1, 0, @bludiste.render(st)) text = "Z=#{@zvedove} P=#{@prochazeni} D=#{@delka} " if @result.nil? text << "Cesta neexistuje." else text << "Delka cesty (vc. zacatku): #{@result.length}" if @delka == :pruchody text << " " end end write(0, 0, text) write(1 + @bludiste.height, 0, "Posun: sipky vlevo, vpravo; Q = konec") write(2 + @bludiste.height, 0, "Pozice: #{@pozice}") end def set_mode(m) case m when 1 zvedove = false prochazeni = false delka = :slapnuti when 2 zvedove = false prochazeni = true delka = :pruchody when 3 zvedove = true prochazeni = false delka = :slapnuti when 4 zvedove = true prochazeni = true delka = :pruchody else raise "Unknown mode: #{m}" end @zvedove = zvedove @prochazeni = prochazeni @delka = delka end def do_search clear write(0,0,"Hledam reseni...") write(1, 0, @bludiste.render) @result = @bludiste.search @zvedove, @prochazeni, @delka @pozice = 0 draw_search_result while true case Curses.getch when Curses::Key::LEFT @pozice -= 1 @pozice = 0 if @pozice < 0 draw_search_result when Curses::Key::RIGHT if !@result.nil? @pozice += 1 @pozice = @result.length - 1 if @pozice >= @result.length end draw_search_result when ?q break when ?Q break end end end def search_mode clear write(STATUS_LINE, 0, "Soubor (nic => konec) ? ") str = getstr if str.length == 0 return end @bludiste = Bludiste.new @bludiste.load str set_mode get_mode do_search end def main_prompt refresh clear write(STATUS_LINE, 0, "H = hledat, E = editovat, Q = quit") case Curses.getch.downcase when ?h begin search_mode return end when ?e begin edit_mode return end when ?q begin @run = false return end end end def main @run = true Curses.init_screen Curses.stdscr.keypad(true) if ARGV.length == 0 main_prompt while @run else set_mode ARGV[0].to_i @bludiste = Bludiste.load ARGV[1] do_search end Curses.close_screen end end Program.new.main