Module: RubyText
- Defined in:
- lib/rubytext.rb,
lib/menu.rb,
lib/color.rb,
lib/version.rb,
lib/widgets.rb,
lib/rubytext.rb,
lib/settings.rb
Overview
Skeleton… Can’t put classes at top because of #initalize
Defined Under Namespace
Modules: Keys Classes: Effects, Window
Constant Summary collapse
- Colors =
[Black, Blue, Cyan, Green, Magenta, Red, White, Yellow]
- VERSION =
"0.0.61"- Path =
File.(File.join(File.dirname(__FILE__)))
Class Method Summary collapse
-
.flags ⇒ Object
Hmm, all these are module-level.
- .hide_cursor ⇒ Object
-
.inverse_flag(flag) ⇒ Object
FIXME Refactor the Hal out of this.
- .menu(r: 0, c: 0, items:, curr: 0) ⇒ Object
-
.method_missing(name, *args) ⇒ Object
For passing through arbitrary method calls to the lower level…
- .reset ⇒ Object
- .rest_flags ⇒ Object
- .restback(high, wide, r, c) ⇒ Object
- .save_flags ⇒ Object
- .saveback(high, wide, r, c) ⇒ Object
-
.set(*args) ⇒ Object
Allow a block?.
- .show_cursor ⇒ Object
- .show_cursor! ⇒ Object
- .start(*args, log: nil, fg: nil, bg: nil, scroll: false) ⇒ Object
- .stop ⇒ Object
- .ticker(row: STDSCR.rows-1, col: 0, width: STDSCR.cols, fg: White, bg: Blue, text:, delay: 0.1) ⇒ Object
- .window(high, wide, r0, c0, border: true, fg: nil, bg: nil, scroll: false) ⇒ Object
Instance Method Summary collapse
Class Method Details
.flags ⇒ Object
Hmm, all these are module-level.
4 5 6 7 |
# File 'lib/settings.rb', line 4 def self.flags @flags.uniq! @flags end |
.hide_cursor ⇒ Object
106 107 108 |
# File 'lib/settings.rb', line 106 def self.hide_cursor X.curs_set(0) end |
.inverse_flag(flag) ⇒ Object
FIXME Refactor the Hal out of this.
11 12 13 14 15 16 17 18 |
# File 'lib/settings.rb', line 11 def self.inverse_flag(flag) sflag = flag.to_s if sflag[0] == "_" sflag[1..-1].to_sym else ("_" + sflag).to_sym end end |
.menu(r: 0, c: 0, items:, curr: 0) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/menu.rb', line 23 def self.(r: 0, c: 0, items:, curr: 0) high = items.size + 2 wide = items.map(&:length).max + 4 saveback(high, wide, r, c) win = RubyText.window(high, wide, r, c, fg: White, bg: Blue) RubyText.set(:raw) X.stdscr.keypad(true) RubyText.hide_cursor sel = curr max = items.size - 1 loop do items.each.with_index do |item, row| win.go row, 0 color = sel == row ? Yellow : White win.puts color, " #{item} " end ch = getch case ch when X::KEY_UP sel -= 1 if sel > 0 when X::KEY_DOWN sel += 1 if sel < max when 27 restback(high, wide, r, c) return [nil, nil] when 10 restback(high, wide, r, c) return [sel, items[sel]] end end end |
.method_missing(name, *args) ⇒ Object
For passing through arbitrary method calls to the lower level…
93 94 95 96 97 98 99 100 |
# File 'lib/settings.rb', line 93 def self.method_missing(name, *args) debug "method_missing: #{name} #{args.inspect}" if name[0] == '_' X.send(name[1..-1], *args) else raise "#{name} #{args.inspect}" # NoMethodError end end |
.reset ⇒ Object
56 57 58 |
# File 'lib/settings.rb', line 56 def self.reset rest_flags end |
.rest_flags ⇒ Object
66 67 68 69 70 71 |
# File 'lib/settings.rb', line 66 def self.rest_flags @flags = @fstack.pop @flags.uniq! rescue @flags = @defaults end |
.restback(high, wide, r, c) ⇒ Object
13 14 15 16 17 18 19 20 21 |
# File 'lib/menu.rb', line 13 def self.restback(high, wide, r, c) 0.upto(high) do |h| 0.upto(wide) do |w| STDSCR[h+r, w+c] = @save.shift end end STDSCR.go *@pos STDSCR.refresh end |
.save_flags ⇒ Object
60 61 62 63 64 |
# File 'lib/settings.rb', line 60 def self.save_flags @fstack ||= [] @flags.uniq! @fstack.push @flags end |
.saveback(high, wide, r, c) ⇒ Object
3 4 5 6 7 8 9 10 11 |
# File 'lib/menu.rb', line 3 def self.saveback(high, wide, r, c) @pos = STDSCR.rc @save = [] 0.upto(high) do |h| 0.upto(wide) do |w| @save << STDSCR[h+r, w+c] end end end |
.set(*args) ⇒ Object
Allow a block?
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/settings.rb', line 20 def self.set(*args) # Allow a block? standard = [:cbreak, :raw, :echo, :keypad] @defaults = [:cbreak, :echo, :keypad, :cursor, :_raw] @flags = @defaults.dup save_flags args.each do |arg| @flags += [arg] inv = inverse_flag(arg) @flags -= [inv] @flags.uniq! flag = arg.to_s if standard.include?(flag.to_sym) || standard.include?(flag.sub(/no/, "_").to_sym) X.send(flag) elsif flag[0] == "_" && standard.include?(flag[1..-1].to_sym) flag.sub!(/^_/, "no") X.send(flag) else case flag.to_sym when :cursor X.curs_set(1) when :_cursor, :nocursor X.curs_set(0) else self.stop rest_flags # prevent propagating error in test raise RTError("flag = #{flag.inspect}") end end end if block_given? yield rest_flags end end |
.show_cursor ⇒ Object
110 111 112 |
# File 'lib/settings.rb', line 110 def self.show_cursor X.curs_set(1) end |
.show_cursor! ⇒ Object
114 115 116 |
# File 'lib/settings.rb', line 114 def self.show_cursor! X.curs_set(2) # Doesn't work? Device-dependent? end |
.start(*args, log: nil, fg: nil, bg: nil, scroll: false) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/settings.rb', line 73 def self.start(*args, log: nil, fg: nil, bg: nil, scroll: false) $debug = File.new(log, "w") if log Object.const_set(:STDSCR, RubyText::Window.main(fg: fg, bg: bg, scroll: scroll)) $stdscr = STDSCR fg, bg, cp = fb2cp(fg, bg) self.set(:_echo, :cbreak, :raw) # defaults self.set(*args) # override defaults rescue => err debug(err.inspect) debug(err.backtrace) raise RTError("#{err}") end |
.stop ⇒ Object
86 87 88 |
# File 'lib/settings.rb', line 86 def self.stop X.close_screen end |
.ticker(row: STDSCR.rows-1, col: 0, width: STDSCR.cols, fg: White, bg: Blue, text:, delay: 0.1) ⇒ Object
2 3 4 5 6 7 8 9 10 11 12 13 14 |
# File 'lib/widgets.rb', line 2 def self.ticker(row: STDSCR.rows-1, col: 0, width: STDSCR.cols, fg: White, bg: Blue, text:, delay: 0.1) text = text.gsub("\n", " ") + " " win = RubyText.window(1, width, row, col, border: false, fg: fg, bg: bg) leader = " "*width + text leader = text.chars.cycle.each_cons(width) width.times { win.rcprint 0, 0, leader.next.join } repeat = text.chars.cycle.each_cons(width) loop do # Warning: loops forever win.rcprint 0, 0, repeat.next.join sleep delay end end |
.window(high, wide, r0, c0, border: true, fg: nil, bg: nil, scroll: false) ⇒ Object
102 103 104 |
# File 'lib/settings.rb', line 102 def self.window(high, wide, r0, c0, border: true, fg: nil, bg: nil, scroll: false) RubyText::Window.new(high, wide, r0, c0, border, fg, bg, scroll) end |
Instance Method Details
#selector(r: 0, c: 0, rows: 10, cols: 20, items:, win:, callback:, quit: "q") ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/menu.rb', line 55 def selector(r: 0, c: 0, rows: 10, cols: 20, items:, win:, callback:, quit: "q") high = rows wide = cols saveback(high, wide, r, c) = RubyText.window(high, wide, r, c, fg: White, bg: Blue) win2 = win handler = callback RubyText.set(:raw) X.stdscr.keypad(true) RubyText.hide_cursor sel = 0 max = items.size - 1 handler.call(0, items[0]) loop do items.each.with_index do |item, row| .go row, 0 color = sel == row ? Yellow : White .puts color, " #{item} " end ch = getch case ch when X::KEY_UP if sel > 0 sel -= 1 handler.call(sel, items[sel]) end when X::KEY_DOWN if sel < max sel += 1 handler.call(sel, items[sel]) end when quit # parameter exit end end end |