Class: RubyText::Window
- Inherits:
-
Object
- Object
- RubyText::Window
- Defined in:
- lib/color.rb,
lib/output.rb,
lib/window.rb,
lib/rubytext.rb,
lib/navigation.rb
Instance Attribute Summary collapse
-
#bg ⇒ Object
Returns the value of attribute bg.
-
#c0 ⇒ Object
readonly
Returns the value of attribute c0.
-
#cols ⇒ Object
readonly
Returns the value of attribute cols.
-
#cwin ⇒ Object
readonly
Returns the value of attribute cwin.
-
#fg ⇒ Object
Returns the value of attribute fg.
-
#height ⇒ Object
readonly
Returns the value of attribute height.
-
#r0 ⇒ Object
readonly
Returns the value of attribute r0.
-
#rows ⇒ Object
readonly
Returns the value of attribute rows.
-
#scrolling(flag = true) ⇒ Object
readonly
FIXME refactor bad code.
-
#width ⇒ Object
readonly
Returns the value of attribute width.
Class Method Summary collapse
- .clear(win) ⇒ Object
- .colorize!(win, fg, bg) ⇒ Object
- .main(fg: White, bg: Blue, scroll: false) ⇒ Object
- .make(cwin, high, wide, r0, c0, border: true, fg: White, bg: Black, scroll: false) ⇒ Object
Instance Method Summary collapse
- #[](r, c) ⇒ Object
- #[]=(r, c, char) ⇒ Object
- #_putch(ch) ⇒ Object
- #bottom ⇒ Object
- #boxme ⇒ Object
- #center(str) ⇒ Object
- #clear ⇒ Object
- #colorize!(fg, bg) ⇒ Object
- #coords(r, c) ⇒ Object
-
#crlf ⇒ Object
Technically not output…
- #delegate_output(sym, *args) ⇒ Object
- #down(n = 1) ⇒ Object
- #down! ⇒ Object
-
#effect?(arg) ⇒ Boolean
FIXME Please refactor the Hal out of this.
- #go(r0, c0) ⇒ Object
- #home ⇒ Object
-
#initialize(high = nil, wide = nil, r0 = 1, c0 = 1, border = false, fg = White, bg = Blue, scroll = false) ⇒ Window
constructor
Better to use Window.window IRL.
- #left(n = 1) ⇒ Object
- #left! ⇒ Object
- #noscroll ⇒ Object
- #output(&block) ⇒ Object
- #p(*args) ⇒ Object
- #print(*args) ⇒ Object
- #putch(ch, r: nil, c: nil, fx: nil) ⇒ Object
- #puts(*args) ⇒ Object
-
#rc ⇒ Object
def crlf r, c = rc go r+1, 0 end.
- #rcprint(r, c, *args) ⇒ Object
- #rcprint!(r, c, *args) ⇒ Object
- #refresh ⇒ Object
- #restback(high, wide, r, c) ⇒ Object
- #right(n = 1) ⇒ Object
- #right! ⇒ Object
- #saveback(high, wide, r, c) ⇒ Object
- #screen_text(file = nil) ⇒ Object
- #scroll(n = 1) ⇒ Object
- #set_colors(fg, bg) ⇒ Object
- #top ⇒ Object
- #up(n = 1) ⇒ Object
- #up! ⇒ Object
Constructor Details
#initialize(high = nil, wide = nil, r0 = 1, c0 = 1, border = false, fg = White, bg = Blue, scroll = false) ⇒ Window
Better to use Window.window IRL
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/window.rb', line 10 def initialize(high=nil, wide=nil, r0=1, c0=1, border=false, fg=White, bg=Blue, scroll=false) @wide, @high, @r0, @c0 = wide, high, r0, c0 @border, @fg, @bg = border, fg, bg @cwin = X::Window.new(high, wide, r0, c0) colorize!(fg, bg) if @border @cwin.box(Vert, Horiz) @outer = @cwin @outer.refresh @cwin = X::Window.new(high-2, wide-2, r0+1, c0+1) colorize!(fg, bg) else @outer = @cwin end @rows, @cols = @cwin.maxy, @cwin.maxx # unnecessary really... @width, @height = @cols + 2, @rows + 2 if @border @scrolling = scroll @cwin.scrollok(scroll) @cwin.refresh end |
Instance Attribute Details
#bg ⇒ Object
Returns the value of attribute bg.
6 7 8 |
# File 'lib/window.rb', line 6 def bg @bg end |
#c0 ⇒ Object (readonly)
Returns the value of attribute c0.
5 6 7 |
# File 'lib/window.rb', line 5 def c0 @c0 end |
#cols ⇒ Object (readonly)
Returns the value of attribute cols.
4 5 6 |
# File 'lib/window.rb', line 4 def cols @cols end |
#cwin ⇒ Object (readonly)
Returns the value of attribute cwin.
4 5 6 |
# File 'lib/window.rb', line 4 def cwin @cwin end |
#fg ⇒ Object
Returns the value of attribute fg.
6 7 8 |
# File 'lib/window.rb', line 6 def fg @fg end |
#height ⇒ Object (readonly)
Returns the value of attribute height.
4 5 6 |
# File 'lib/window.rb', line 4 def height @height end |
#r0 ⇒ Object (readonly)
Returns the value of attribute r0.
5 6 7 |
# File 'lib/window.rb', line 5 def r0 @r0 end |
#rows ⇒ Object (readonly)
Returns the value of attribute rows.
4 5 6 |
# File 'lib/window.rb', line 4 def rows @rows end |
#scrolling(flag = true) ⇒ Object (readonly)
FIXME refactor bad code
58 59 60 |
# File 'lib/window.rb', line 58 def scrolling @scrolling end |
#width ⇒ Object (readonly)
Returns the value of attribute width.
4 5 6 |
# File 'lib/window.rb', line 4 def width @width end |
Class Method Details
.clear(win) ⇒ Object
107 108 109 110 111 112 113 |
# File 'lib/output.rb', line 107 def self.clear(win) num = win.maxx * win.maxy win.setpos(0, 0) win.addstr(' '*num) win.setpos(0, 0) win.refresh end |
.colorize!(win, fg, bg) ⇒ Object
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/color.rb', line 35 def self.colorize!(win, fg, bg) File.open("/tmp/cize.out", "w") do |f| f.puts "colorize: fg, bg = #{[fg, bg].inspect}" end cp = RubyText::Color.pair(fg, bg) win.color_set(cp) num = win.maxx * win.maxy win.setpos 0,0 win.addstr(' '*num) win.setpos 0,0 win.refresh rescue => err File.open("/tmp/#{__method__}.out", "w") do |f| f.puts err f.puts err.backtrace end end |
.main(fg: White, bg: Blue, scroll: false) ⇒ Object
31 32 33 34 35 36 37 38 39 40 |
# File 'lib/window.rb', line 31 def self.main(fg: White, bg: Blue, scroll: false) main_win = X.init_screen X.start_color self.colorize!(main_win, fg, bg) rows, cols = main_win.maxy, main_win.maxx self.make(main_win, rows, cols, 0, 0, border: false, fg: fg, bg: bg, scroll: scroll) rescue => err File.open("/tmp/main.out", "w") {|f| f.puts err.inspect; f.puts err.backtrace } end |
.make(cwin, high, wide, r0, c0, border: true, fg: White, bg: Black, scroll: false) ⇒ Object
42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/window.rb', line 42 def self.make(cwin, high, wide, r0, c0, border: true, fg: White, bg: Black, scroll: false) obj = self.allocate obj.instance_eval do @outer = @cwin = cwin @wide, @high, @r0, @c0 = wide, high, r0, c0 @fg, @bg = fg, bg @border = border @rows, @cols = high, wide @width, @height = @cols + 2, @rows + 2 if @border end obj.scrolling(scroll) obj end |
Instance Method Details
#[](r, c) ⇒ Object
129 130 131 132 133 134 |
# File 'lib/output.rb', line 129 def [](r, c) ch = nil go(r, c) { ch = @cwin.inch } debug "ch = #{ch} ch.chr = #{ch.chr}" ch.chr end |
#[]=(r, c, char) ⇒ Object
136 137 138 139 140 |
# File 'lib/output.rb', line 136 def []=(r, c, char) @cwin.setpos(r, c) @cwin.addch(char[0]) @cwin.refresh end |
#_putch(ch) ⇒ Object
66 67 68 |
# File 'lib/output.rb', line 66 def _putch(ch) @cwin.addch(ch) end |
#bottom ⇒ Object
63 64 65 66 67 |
# File 'lib/navigation.rb', line 63 def bottom r, c = rc rmax = self.rows - 1 go rmax, c end |
#boxme ⇒ Object
142 143 144 145 |
# File 'lib/output.rb', line 142 def boxme @outer.box(Vert, Horiz) @outer.refresh end |
#center(str) ⇒ Object
4 5 6 7 8 9 |
# File 'lib/output.rb', line 4 def center(str) r, c = self.rc n = @cwin.maxx - str.length go r, n/2 self.puts str end |
#clear ⇒ Object
115 116 117 118 119 120 121 |
# File 'lib/output.rb', line 115 def clear num = @cwin.maxx * @cwin.maxy home @cwin.addstr(' '*num) home @cwin.refresh end |
#colorize!(fg, bg) ⇒ Object
58 59 60 61 62 63 64 |
# File 'lib/color.rb', line 58 def colorize!(fg, bg) set_colors(fg, bg) num = @cwin.maxx * @cwin.maxy self.home self.go(0, 0) { @cwin.addstr(' '*num) } @cwin.refresh end |
#coords(r, c) ⇒ Object
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/navigation.rb', line 3 def coords(r, c) r = case when r == :center self.rows / 2 when r == :top 0 when r == :bottom self.rows - 1 else r end c = case when c == :center self.cols / 2 when c == :left 0 when c == :right self.cols - 1 else c end [r, c] end |
#crlf ⇒ Object
Technically not output…
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/output.rb', line 89 def crlf # Technically not output... r, c = rc if @scrolling if r == @rows - 1 # bottom row scroll left! else go r+1, 0 end else if r == @rows - 1 # bottom row left! else go r+1, 0 end end end |
#delegate_output(sym, *args) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/output.rb', line 17 def delegate_output(sym, *args) self.cwin.attrset(0) args = [""] if args.empty? args += ["\n"] if sym == :puts set_colors(@fg, @bg) debug " set colors: #{[@fg, @bg].inspect}" if sym == :p args.map! {|x| effect?(x) ? x : x.inspect } else args.map! {|x| effect?(x) ? x : x.to_s } end args.each do |arg| if arg.is_a?(RubyText::Effects) arg.set(self) elsif arg.respond_to? :effect arg.effect.set(self) arg.each_char {|ch| ch == "\n" ? crlf : @cwin.addch(ch) } @cwin.refresh else arg.each_char {|ch| ch == "\n" ? crlf : @cwin.addch(ch) } @cwin.refresh end end crlf if sym == :p set_colors(@fg, @bg) @cwin.refresh end |
#down(n = 1) ⇒ Object
43 44 45 46 |
# File 'lib/navigation.rb', line 43 def down(n=1) r, c = rc go r+n, c end |
#down! ⇒ Object
73 74 75 |
# File 'lib/navigation.rb', line 73 def down! bottom end |
#effect?(arg) ⇒ Boolean
FIXME Please refactor the Hal out of this.
13 14 15 |
# File 'lib/output.rb', line 13 def effect?(arg) arg.is_a?(RubyText::Effects) end |
#go(r0, c0) ⇒ Object
27 28 29 30 31 32 33 34 35 36 |
# File 'lib/navigation.rb', line 27 def go(r0, c0) r, c = coords(r0, c0) debug("go: #{[r0, c0].inspect} => #{[r, c].inspect}") save = self.rc @cwin.setpos(r, c) if block_given? yield go(*save) # No block here! end end |
#home ⇒ Object
88 89 90 |
# File 'lib/navigation.rb', line 88 def home go 0, 0 end |
#left(n = 1) ⇒ Object
48 49 50 51 |
# File 'lib/navigation.rb', line 48 def left(n=1) r, c = rc go r, c-n end |
#left! ⇒ Object
77 78 79 80 |
# File 'lib/navigation.rb', line 77 def left! r, c = rc go r, 0 end |
#noscroll ⇒ Object
63 64 65 66 |
# File 'lib/window.rb', line 63 def noscroll @scrolling = false @cwin.scrollok(false) end |
#output(&block) ⇒ Object
123 124 125 126 127 |
# File 'lib/output.rb', line 123 def output(&block) $stdscr = self block.call $stdscr = STDSCR end |
#p(*args) ⇒ Object
53 54 55 |
# File 'lib/output.rb', line 53 def p(*args) delegate_output(:p, *args) end |
#print(*args) ⇒ Object
49 50 51 |
# File 'lib/output.rb', line 49 def print(*args) delegate_output(:print, *args) end |
#putch(ch, r: nil, c: nil, fx: nil) ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/output.rb', line 70 def putch(ch, r: nil, c: nil, fx: nil) debug("putch: #{[ch, r, c, fx].inspect}") if r.nil? && c.nil? && fx.nil? _putch(ch) else r0, c0 = self.rc r ||= r0 c ||= c0 go(r, c) do fx.set(self) if fx val = fx.value rescue 0 @cwin.addch(ch.ord|val) # @cwin.addch(ch) end fx.reset(self) if fx end @cwin.refresh end |
#puts(*args) ⇒ Object
45 46 47 |
# File 'lib/output.rb', line 45 def puts(*args) delegate_output(:puts, *args) end |
#rc ⇒ Object
def crlf
r, c = rc
go r+1, 0
end
97 98 99 |
# File 'lib/navigation.rb', line 97 def rc [@cwin.cury, @cwin.curx] end |
#rcprint(r, c, *args) ⇒ Object
57 58 59 |
# File 'lib/output.rb', line 57 def rcprint(r, c, *args) self.go(r, c) { self.print *args } end |
#rcprint!(r, c, *args) ⇒ Object
61 62 63 64 |
# File 'lib/output.rb', line 61 def rcprint!(r, c, *args) self.go(r, c) # Cursor isn't restored self.print *args end |
#refresh ⇒ Object
147 148 149 |
# File 'lib/output.rb', line 147 def refresh @cwin.refresh end |
#restback(high, wide, r, c) ⇒ Object
106 107 108 109 110 111 112 113 114 |
# File 'lib/window.rb', line 106 def restback(high, wide, r, c) 0.upto(high-1) do |h| 0.upto(wide-1) do |w| self[h+r-1, w+c-1] = @save.shift end end self.go *@pos @cwin.refresh end |
#right(n = 1) ⇒ Object
53 54 55 56 |
# File 'lib/navigation.rb', line 53 def right(n=1) r, c = rc go r, c+n end |
#right! ⇒ Object
82 83 84 85 86 |
# File 'lib/navigation.rb', line 82 def right! r, c = rc cmax = self.cols - 1 go r, cmax end |
#saveback(high, wide, r, c) ⇒ Object
96 97 98 99 100 101 102 103 104 |
# File 'lib/window.rb', line 96 def saveback(high, wide, r, c) @pos = self.rc @save = [] 0.upto(high-1) do |h| 0.upto(wide-1) do |w| @save << self[h+r-1, w+c-1] end end end |
#screen_text(file = nil) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/window.rb', line 83 def screen_text(file = nil) lines = [] 0.upto(self.rows-1) do |r| line = "" 0.upto(self.cols-1) do |c| line << self[r, c] end lines << line end File.open(file, "w") {|f| f.puts lines } if file lines end |
#scroll(n = 1) ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/window.rb', line 68 def scroll(n=1) if n < 0 @cwin.scrl(n) (-n).times {|i| rcprint i, 0, (' '*@cols) } else n.times do |i| @cwin.scroll scrolling(false) rcprint @rows-1, 0, (' '*@cols) scrolling end end @cwin.refresh end |
#set_colors(fg, bg) ⇒ Object
53 54 55 56 |
# File 'lib/color.rb', line 53 def set_colors(fg, bg) cp = RubyText::Color.pair(fg, bg) @cwin.color_set(cp) end |
#top ⇒ Object
58 59 60 61 |
# File 'lib/navigation.rb', line 58 def top r, c = rc go 0, c end |
#up(n = 1) ⇒ Object
38 39 40 41 |
# File 'lib/navigation.rb', line 38 def up(n=1) r, c = rc go r-n, c end |
#up! ⇒ Object
69 70 71 |
# File 'lib/navigation.rb', line 69 def up! top end |