Making windows explicitly default to the height/width of the terminal, instead of...
[nfoiled.git] / lib / nfoiled / window.rb
blobf02ba7a7eb77fe6a06ab9f4e281798ebf131258d
1 module Nfoiled
2   ##
3   # An `Nfoiled::Window` is a "box" in the terminal to which output can be
4   # printed and from which input can be received. A basic Nfoiled application
5   # will utilize only one of these, a single `Window` covering the entirety
6   # of the `Terminal`'s available area.
7   class Window
8     
9     class <<self
10       # This is simply an accessor for all the windows on the current Terminal.
11       attr_reader :windows
12       def windows; Terminal.current.windows; end
13     end
14     
15     # The Y co-ordinate of the top left corner of this `Window`'s bounding box
16     attr_reader :top
17     # The X co-ordinate of the top left corner of this `Window`'s bounding box
18     attr_reader :left
19     # The height in lines of this `Window`'s bounding box
20     attr_reader :height
21     # The width in columns of this `Window`'s bounding box
22     attr_reader :width
23     
24     # The actual window object as returned by Ncurses
25     attr_reader :wrapee
26     
27     # The `Terminal` that this `Window` pertains to
28     attr_reader :owner
29     
30     ##
31     # Responsible for creating a new `Window`, this will also take care of
32     # initializing Ncurses if necessary.
33     def initialize opts = Hash.new
34       Nfoiled::initialize
35       
36       @wrapee = ::Ncurses.newwin(
37         opts[:height] ? @height = opts[:height] : ::Ncurses.LINES,
38         opts[:width]  ? @width =  opts[:width]  : ::Ncurses.COLS,
39         opts[:top]    ? @top =    opts[:top]    : 0,
40         opts[:left]   ? @left =   opts[:left]   : 0)
41       
42       (@owner = Terminal.current).windows << self
43     end
44     
45     ##
46     # Prints a string to the window
47     def print string
48       @wrapee.printw string
49       @wrapee.wnoutrefresh
50     end
51     
52     ##
53     # Prints a string, followed by a newline, to the window
54     def puts string
55       self.print string.to_s + "\n"
56     end
57     
58     ##
59     # Destroys the `wrapee` of this `Window`, and removes this `Window`
60     # from its owning `Terminal`'s `#windows`.
61     def destroy!
62       ::Ncurses.delwin(@wrapee)
63       @wrapee = nil
64       @owner.windows.delete self
65     end
66   end
67 end