Class: RubyText::Window

Inherits:
Object
  • Object
show all
Defined in:
lib/color.rb,
lib/output.rb,
lib/window.rb,
lib/rubytext.rb,
lib/navigation.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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

#bgObject

Returns the value of attribute bg.



6
7
8
# File 'lib/window.rb', line 6

def bg
  @bg
end

#c0Object (readonly)

Returns the value of attribute c0.



5
6
7
# File 'lib/window.rb', line 5

def c0
  @c0
end

#colsObject (readonly)

Returns the value of attribute cols.



4
5
6
# File 'lib/window.rb', line 4

def cols
  @cols
end

#cwinObject (readonly)

Returns the value of attribute cwin.



4
5
6
# File 'lib/window.rb', line 4

def cwin
  @cwin
end

#fgObject

Returns the value of attribute fg.



6
7
8
# File 'lib/window.rb', line 6

def fg
  @fg
end

#heightObject (readonly)

Returns the value of attribute height.



4
5
6
# File 'lib/window.rb', line 4

def height
  @height
end

#r0Object (readonly)

Returns the value of attribute r0.



5
6
7
# File 'lib/window.rb', line 5

def r0
  @r0
end

#rowsObject (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

#widthObject (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

#bottomObject



63
64
65
66
67
# File 'lib/navigation.rb', line 63

def bottom 
  r, c = rc
  rmax = self.rows - 1
  go rmax, c
end

#boxmeObject



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

#clearObject



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

#crlfObject

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.

Returns:

  • (Boolean)


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

#homeObject



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

#noscrollObject



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


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

#rcObject

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

#refreshObject



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

#topObject



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