class Henge::Runner
Constants
- DIRECT_KEYS
Public Class Methods
new()
click to toggle source
# File lib/henge/runner.rb, line 6 def initialize @o = [40, 18] @circles_dir = File.join(__dir__, '../../data/circles') Curses.timeout = 200 end
Public Instance Methods
draw_center_label(index, marker)
click to toggle source
# File lib/henge/runner.rb, line 249 def draw_center_label(index, marker) if marker Curses.attron(Curses::A_REVERSE) else Curses.attroff(Curses::A_REVERSE) end Curses.setpos(@o[1], @o[0]) key = DIRECT_KEYS[index] # Curses.addstr("#{@pattern}:#{key}") Curses.addstr("#{@pattern}") Curses.attroff(Curses::A_REVERSE) end
draw_dictionary()
click to toggle source
# File lib/henge/runner.rb, line 167 def draw_dictionary Curses.clear() Curses.setpos(5, 0) Curses.addstr(%x{osx-dictionary #{Shellwords.shellescape(@words[@cursor])}}) Curses.refresh end
draw_moved_cursor()
click to toggle source
# File lib/henge/runner.rb, line 157 def draw_moved_cursor unless @last_cursor.nil? draw_word(@last_cursor, false) end draw_word(@cursor, true) draw_center_label(@cursor, false) Curses.refresh end
draw_word(index, marker)
click to toggle source
# File lib/henge/runner.rb, line 192 def draw_word(index, marker) word = @words[index] rad = index * @unit - Math::PI / 2 x = 32 * Math.cos(rad) + @o[0] y = 16 * Math.sin(rad) + @o[1] if marker Curses.attron(Curses::A_REVERSE) else Curses.attroff(Curses::A_REVERSE) end Curses.setpos(y.to_i, x.to_i) Curses.addstr(word) Curses.attroff(Curses::A_REVERSE) @visible_words[index] = true end
erase_all_words()
click to toggle source
# File lib/henge/runner.rb, line 183 def erase_all_words @cursor = -1 @last_cursor = nil @visible_words = [] Curses.clear() Curses.refresh draw_center_label(0, false) end
get_key_input()
click to toggle source
# File lib/henge/runner.rb, line 49 def get_key_input Curses.noecho() c = Curses.getch Curses.echo() @key = nil if c == 'q' @key = :quit return end if @cursor.nil? # First key pressed @words.length.times {|i| draw_word(i, false) } @cursor = 0 @last_cursor = nil @key = :cursor return end if c == 'j' @key = :cursor move_cursor(@cursor + 1) elsif c == 'k' @key = :cursor move_cursor(@cursor - 1) elsif DIRECT_KEYS.include?(c) @key = :cursor move_cursor(DIRECT_KEYS.index(c)) elsif c == ' ' @key = :dictionary elsif c == 'c' @key = :erase elsif c == 'p' @key = :play elsif c == 'a' @key = :say_all elsif c == 'r' @key = :reload elsif c == 'i' @key = :image end end
init()
click to toggle source
# File lib/henge/runner.rb, line 93 def init load_words Curses.clear() Curses.curs_set(0) @cursor = nil @key = nil @screen_mode = nil @last_cursor = nil @visible_words = [] intro(false) end
intro(say_word)
click to toggle source
# File lib/henge/runner.rb, line 29 def intro(say_word) @words.each.with_index do |w, i| move_cursor(i) draw_word(@cursor, @cursor % @square == 0) draw_center_label(@cursor, @cursor % @square == 0) Curses.refresh say if say_word end move_cursor(0) end
load_words()
click to toggle source
# File lib/henge/runner.rb, line 12 def load_words if ARGV[0] @pattern = ARGV[0] ARGV[0] = nil else Dir.chdir(@circles_dir) do file = Dir.glob('*.yml').shuffle.first @pattern = file[/(.+)\.yml/, 1] end end file = File.join(@circles_dir, "#{@pattern}.yml") @words = YAML.load(File.read(file)) @unit = Math::PI * 2 / @words.length @square = @words.length / 4 end
move_cursor(index)
click to toggle source
# File lib/henge/runner.rb, line 40 def move_cursor(index) @cursor = index if @cursor < 0 @cursor = @words.length - 1 elsif @cursor >= @words.length @cursor = @cursor - @words.length end end
open_image()
click to toggle source
# File lib/henge/runner.rb, line 238 def open_image word = Shellwords.shellescape(@words[@cursor]) %x{open 'https://www.google.co.jp/search?q=#{word}&tbm=isch'} # @words.each do |word| # word = Shellwords.shellescape(word) # %x{open 'https://www.google.co.jp/search?q=#{word}&tbm=isch'} # sleep 0.5 # end end
redraw_words()
click to toggle source
# File lib/henge/runner.rb, line 174 def redraw_words Curses.clear() @visible_words.each.with_index do |visible, i| draw_word(i, @cursor == i) if visible end draw_center_label(@cursor.to_i, false) Curses.refresh end
run()
click to toggle source
# File lib/henge/runner.rb, line 108 def run begin Curses.init_screen init loop do get_key_input if @key.nil? next elsif @key == :quit break elsif @key == :erase erase_all_words next elsif @key == :play erase_all_words intro(true) elsif @key == :dictionary if @screen_mode == :dictionary @screen_mode = :circle redraw_words say else @screen_mode = :dictionary draw_dictionary say end elsif @key == :cursor if @screen_mode == :dictionary draw_dictionary @visible_words[@cursor] = true else draw_moved_cursor end say @last_cursor = @cursor elsif @key == :say_all say_all elsif @key == :reload init elsif @key == :image open_image end end ensure Curses.close_screen end end
say()
click to toggle source
# File lib/henge/runner.rb, line 212 def say %x{say #{Shellwords.shellescape(@words[@cursor])}} end
say_all()
click to toggle source
# File lib/henge/runner.rb, line 216 def say_all text = '' unit = @words.length / 4 unit = 4 if unit == 2 @words.each_with_index do |w, i| text += w if i != @words.length - 1 if i != 0 && (i + 1) % unit == 0 text += ', ' else text += ' ' end end end # puts text # text = @words.join(' ') %x{say #{Shellwords.shellescape(text)}} end