*
* To bring-up the GUI:
* --------------------
*
* 1. Construct a Gui object.
* 2. Your application must call Gui::TimerOneSecond() (see note).
* 3. Your application must handle mouse events and pass them to Gui::MouseEvent().
* 4. Add a call to Gui::ReshapeViewport() in your system-specific (eg OpenGL)
* reshape function so that the GUI object can adjust accordingly.
* 5. Add a call to Gui::Draw() in your system-specific drawing routine
* to draw the GUI. The call should be one of the last drawing commands
* so that the GUI will appear over everything else.
* 6. Call GUI::NewScreen() (not GuiScreen::GuiScreen() ) to make a new screen.
* A "screen" is just a set of GUI components that are blended over the viewport.
* Screens can be flipped like pages in a book, and multiple screens can be
* shown at the same time (overlay).
*
* Notes:
* ------
* Timer management is delegated to the application. This class doesn't use
* its own timer. The reason is that multiple timers would very likely cause
* concurrency issues. On OpenGL, using a single timer is strongly suggested.
*
* To use GUI objects:
* -------------------
*
* 1. Construct GUI objects via a GuiScreen object rather than directly.
* The reasoning is that GUI objects belong to and are managed by
* a GuiScreen object. Eg, to make a new button, call GuiScreen::NewButton().
*
* Screens:
* --------
*
* A screen's visibility can be changed by GuiScreen::SetVisi().
* If the screen isn't visible, none of its objects will be drawn.
* Multiple screens are allowed to be visible at the same time.
*
* Printing in a screen:
* ---------------------
*
* In your draw routine, put calls to GuiScreen::Print() to display text.
* Print() must be called every frame.
*
* However, GuiScreen::PrintTimer() is intended to be called once. Thereafter,
* the GuiScreen class will automatically print it until its timer expires.
*
* GuiScreen::Push/PopPrint() are provided to facilitate changing fonts while printing.
* PushPrint() is a push-then-change operation.
*
* MyDrawMainRoutine()
* {
* screen->PushPrint();
* screen->Print(); [...]
* ...
* MyDrawSubroutine1();
* MyDrawSubroutine2();
* ...
* screen->PopPrint();
* }
*
* MyDrawSubroutine1()
* {
* screen->PushPrint();
* screen->Print();
* screen->PopPrint();
* }
*
* Buttons:
* --------
*
* A callback is called whenever a GuiButton is clicked.
* Your callback can call GuiButton::SetText() to change
* the text shown in the button.
*
*