PLIB 1.8.5+ r2173 from http://plib.svn.sourceforge.net/svnroot/plib/trunk
This commit is contained in:
636
doc/pui/BasicPUI.html
Normal file
636
doc/pui/BasicPUI.html
Normal file
@@ -0,0 +1,636 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="John F. Fay">
|
||||
<meta name="GENERATOR" content="Mozilla/4.75 [en] (Win98; U) [Netscape]">
|
||||
<meta name="keywords" content="PUI, PLIB, OpenGL, UI, user, interface, library, portable, picoscopic, widget, GUI, fast, GLUT, introduction, callback, puButton, puButtonBox, puFrame, puInput, puMenuBar, puOneShot, puText, puInit">
|
||||
<meta name="description" content="The PLIB Picoscopic User Interface (PUI) Library is designed to be a simple, easy-to-use graphical user interface. It is based on the OpenGL graphics language and requires a windowing system, either the OpenGL Utility Toolkit (GLUT) or another similar one. This document's purpose is to provide an introduction to the basics of PUI.">
|
||||
<title>BasicPUI</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
Introduction to Using the Picoscopic User Interface</h1></center>
|
||||
|
||||
<center>
|
||||
<h1>
|
||||
John F. Fay</h1></center>
|
||||
|
||||
<center>
|
||||
<h1>October 18, 2000</h1>
|
||||
(Updated by <a href="mailto:ude@handshake.de">Sebastian Ude</a> on October 02, 2001)
|
||||
</center>
|
||||
|
||||
<h2>
|
||||
Contents</h2>
|
||||
|
||||
<table>
|
||||
|
||||
<tr>
|
||||
<td>1.</td>
|
||||
<td><a href="#Introduction: Graphical User Interfaces and">Introduction:
|
||||
Graphical User Interfaces and Windowed Programs</a></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>2.</td>
|
||||
<td><a href="#Elementary PUI">Elementary PUI</a></td>
|
||||
</tr>
|
||||
|
||||
<tr><td></td>
|
||||
<td>2.1 <a href="#Creating User Interface Widgets">Creating User Interface
|
||||
Widgets</a></td>
|
||||
</tr>
|
||||
|
||||
<tr><td></td>
|
||||
<td>2.2 <a href="#Invoking PUI">Invoking PUI</a></td>
|
||||
</tr>
|
||||
|
||||
<tr><td></td>
|
||||
<td>2.3 <a href="#Widget Callbacks">Widget Callbacks</a></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>3.</td>
|
||||
<td><a href="#Conclusion">Conclusion</a></td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h2>
|
||||
<a NAME="Introduction: Graphical User Interfaces and"></a>1. Introduction:
|
||||
Graphical User Interfaces and Windowed Programs</h2>
|
||||
The Picoscopic User Interface (PUI) is designed to be a simple, easy-to-use
|
||||
graphical user interface. It is based on the OpenGL graphics language
|
||||
and requires a windowing system, either the OpenGL Utility Toolkit (GLUT)
|
||||
or another similar one. The gentle reader is assumed either to be
|
||||
familiar with OpenGL and his windowing system or at least to have their
|
||||
manuals at hand.
|
||||
<p>Basic to a GUI is the idea of a widget. A widget is something
|
||||
that appears on the computer screen and which transfers data from the user
|
||||
to the program or from the program to the user. The user can activate
|
||||
a widget by pressing a key, clicking a mouse button, or by using some other
|
||||
input device. This lets the user send information to the program.
|
||||
A widget can also display text or a graphic, allowing the program to transfer
|
||||
information to the user.
|
||||
<p>A windowing system requires a specific style of program which differs
|
||||
from a text-based program in several fundamental ways. First, instead
|
||||
of starting at the beginning of a problem and stopping at the end, a windowed
|
||||
program starts by creating the windows and then enters an infinite loop
|
||||
in which it responds to user inputs. Second, instead of having a
|
||||
self-contained hierarchy of functions which call each other, a windowed
|
||||
program is controlled by the windowing system which calls functions as
|
||||
it sees fit. The following diagram shows the structure of a typical
|
||||
windowed program.
|
||||
<pre>
|
||||
|
||||
+------------------+
|
||||
| Main Program | The application developer
|
||||
| Set up window(s) | supplies this.
|
||||
| and widget(s) |
|
||||
+------------------+
|
||||
|
|
||||
V
|
||||
+----------------+
|
||||
| Window Manager | The window manager library
|
||||
| (like GLUT) | supplies this.
|
||||
+----------------+
|
||||
|
|
||||
+------+--------+---------------+---------------+----> etc.
|
||||
| | | |
|
||||
V V V V
|
||||
+----------+ +----------+ +----------+ +----------+
|
||||
| Window | | Window | | Window | | Window | The application
|
||||
| Mouse | | Keyboard | | Idle | | Display | developer
|
||||
| Callback | | Callback | | Callback | | Callback | supplies these.
|
||||
+----------+ +----------+ +----------+ +----------+
|
||||
| | | |
|
||||
V V V V
|
||||
+----------+ +----------+ May call +----------+
|
||||
| PUI | | PUI | PUI functions | PUI | PUI
|
||||
| Mouse | | Keyboard | for default | Display | supplies
|
||||
| Function | | Function | behaviors | Function | these.
|
||||
+----------+ +----------+ +----------+
|
||||
| |
|
||||
+-------+-------+
|
||||
|
|
||||
+-------+-------+---------------+------> etc.
|
||||
| | |
|
||||
V V V
|
||||
+----------+ +----------+ +----------+
|
||||
| Widget 1 | | Widget 2 | | Widget 3 | The application developer
|
||||
| Callback | | Callback | | Callback | supplies these.
|
||||
+----------+ +----------+ +----------+
|
||||
|
||||
</pre>
|
||||
<p>The functions that the application developer supplies are called "callbacks"
|
||||
because the windowing system or user interface system "calls back" into
|
||||
the application.
|
||||
<p>A windowed program with a user interface, then, consists of a main program
|
||||
and a set of callbacks. The callbacks may invoke other function in
|
||||
turn, but these are all arranged in hierarchical trees underneath the callbacks.
|
||||
<p>A windowed program executes differently from a typical hierarchical
|
||||
program as well. It begins with the main program setting up the window(s)
|
||||
and the user interface. The main program then calls the window manager,
|
||||
which contains an infinite loop and never returns control to the main program.
|
||||
(GLUT in particular has this behavior; I cannot speak for all window managers.)
|
||||
When the window manager needs to redraw the display that is shown on the
|
||||
screen, it calls the application's Window Display Callback. When
|
||||
the user moves the mouse or clicks a mouse button, the window manager calls
|
||||
the application's Window Mouse Callback. When the user presses a
|
||||
key on the keyboard, the window manager calls the application's Window
|
||||
Keyboard Callback. Other input devices cause the window manager to
|
||||
call other callbacks in the application. Finally, if the user hasn't
|
||||
done anything for a while, the window manager will call the application's
|
||||
Window Idle Callback.
|
||||
<p>In building a window callback, the application developer must be sure
|
||||
to call the appropriate PUI functions. The applications's Window
|
||||
Mouse Callback, for example, must call the PUI mouse function "puMouse"
|
||||
if the user interface is to process a mouse click. The application's
|
||||
Window Display Callback, besides rendering any graphics in the window,
|
||||
must also call the PUI display function "puDisplay" in order to display
|
||||
the widgets in the user interface.
|
||||
<p>When the application developer's window callback calls the appropriate
|
||||
PUI function, PUI determines which (if any) widget the user has just activated
|
||||
with his mouse, keyboard, or other input device. PUI then calls that
|
||||
widget's callback function which the application developer must supply
|
||||
and which provides the actual heart of the interface. The callback
|
||||
for an input widget will probably read the text that the user has typed
|
||||
there and pass it on to the application. The callback for a button
|
||||
widget may turn something in the program on or off. What a callback
|
||||
does is limited only by the application developer's imagination.
|
||||
<h2>
|
||||
<a NAME="Elementary PUI"></a>2. Elementary PUI</h2>
|
||||
Using the Picoscopic User Interface on an elementary level requires three
|
||||
things: setting up the user interface widgets, invoking PUI from
|
||||
the window callbacks, and supplying the widget callbacks.
|
||||
<p>PUI was written in C++, designed to be invoked from C++ programs.
|
||||
The following text and examples will assume a program written in C++.
|
||||
<h3>
|
||||
<a NAME="Creating User Interface Widgets"></a>2.1 Creating User Interface
|
||||
Widgets</h3>
|
||||
Most (or all) widgets have certain properties in common. These are:
|
||||
<ul>
|
||||
<li>
|
||||
position - the x- and y-coordinates, in pixels, of the lower left-hand
|
||||
corner of the widget relative to the lower left-hand corner of the window</li>
|
||||
|
||||
<li>
|
||||
size - the width and height of the widget, in pixels</li>
|
||||
|
||||
<li>
|
||||
callback - the application program's function which is called when the
|
||||
widget is activated</li>
|
||||
|
||||
<li>
|
||||
value - a number or character string that is associated with the widget</li>
|
||||
|
||||
<li>
|
||||
label - text that is printed next to the widget</li>
|
||||
|
||||
<li>
|
||||
legend - text that is printed inside the widget (some widgets only)</li>
|
||||
</ul>
|
||||
PUI supports other widget properties, but these are enough to allow the
|
||||
application developer to create a simple user interface.
|
||||
<p>Each widget in the Picoscopic User Interface is an object in C++.
|
||||
The application developer creates a widget by defining a variable to point
|
||||
to the object and creating a new object:
|
||||
<pre>
|
||||
|
||||
puButton *button = new puButton ( 10, 10, 100, 30 ) ;
|
||||
|
||||
</pre>
|
||||
<p>To set the properties of a widget, the application developer calls methods
|
||||
in the object:
|
||||
<pre>
|
||||
|
||||
button->setPosition ( x, y ) ; // Sets the position of the widget to
|
||||
(x, y)
|
||||
button->setSize ( w, h ) ; // Sets the size of the widget to (w, h)
|
||||
button->setCallback ( widget_cb ) ; // Sets the callback to
|
||||
"void widget_cb ( puObject *ob )"
|
||||
button->setLegend ( "Press Me" ) ; // Sets the legend
|
||||
button->setLabel ( "A Button:" ) ; // Sets the label
|
||||
button->setLabelPlace ( PUPLACE_LOWER_LEFT ) ; // Makes the label print on the button's
|
||||
left
|
||||
|
||||
</pre>
|
||||
<p>Other allowed values for the label position are:
|
||||
|
||||
<ul>
|
||||
<li>PUPLACE_ABOVE_LEFT
|
||||
<li>PUPLACE_ABOVE_RIGHT
|
||||
<li>PUPLACE_TOP_LEFT
|
||||
<li>PUPLACE_TOP_CENTERED
|
||||
<li>PUPLACE_TOP_RIGHT
|
||||
<li>PUPLACE_UPPER_LEFT
|
||||
<li>PUPLACE_UPPER_RIGHT
|
||||
<li>PUPLACE_CENTERED_LEFT
|
||||
<li>PUPLACE_CENTERED_RIGHT
|
||||
<li>PUPLACE_LOWER_LEFT
|
||||
<li>PUPLACE_LOWER_RIGHT (default)
|
||||
<li>PUPLACE_BOTTOM_LEFT
|
||||
<li>PUPLACE_BOTTOM_CENTERED
|
||||
<li>PUPLACE_BOTTOM_RIGHT
|
||||
<li>PUPLACE_BELOW_LEFT
|
||||
<li>PUPLACE_BELOW_RIGHT
|
||||
</ul>
|
||||
<p>For a detailed description of these have a look at the
|
||||
<a href="http://plib.sf.net/pui/">PUI Programmers Guide</a>.
|
||||
<p>All of these calls are optional. If the application developer
|
||||
does not want to label a widget, he simply does not call "setLabel" or
|
||||
"setLabelPlace". Similarly, if he has set the widget's position and
|
||||
size while creating the widget, there is no need to call "setPosition"
|
||||
or "setSize".
|
||||
<p>The following subsections describe some of the widget types that PUI
|
||||
supports.
|
||||
<h4>
|
||||
2.1.1 Button</h4>
|
||||
The button ("puButton") is a rectangle, usually containing a legend, which
|
||||
is activated when the user clicks the mouse on it. It has two possible
|
||||
values, off and on; its actual value changes each time the user clicks
|
||||
on it.
|
||||
<p>The button has two possible methods of construction:
|
||||
<ul>
|
||||
<li>
|
||||
puButton ( x1, y1, x2, y2 ) - creates a button with lower left-hand coordinates
|
||||
of (x1, y1) and with upper right-hand coordinates of (x2, y2)</li>
|
||||
|
||||
<li>
|
||||
puButton ( x1, y1, "text" ) - creates a button with lower left-hand coordinates
|
||||
of (x1, y1) and containing the text "text". The size is set by the
|
||||
size of the text.</li>
|
||||
</ul>
|
||||
|
||||
<h4>
|
||||
2.1.2 Button Box</h4>
|
||||
The button box ("puButtonBox") is a large rectangle containing a set of
|
||||
buttons, each with text next to it, which the user can select. It
|
||||
is sometimes called a radio button. It is created by creating a null-terminated
|
||||
list of labels and then by calling the constructor function:
|
||||
<pre>
|
||||
|
||||
char **labels = { "Label1", "Label2", "This is Label3", "Four", NULL } ;
|
||||
puButtonBox my_box = new puButtonBox ( x1, x2, y1, y2, labels, <0|1> ) ;
|
||||
|
||||
</pre>
|
||||
<p>This creates a button box with lower left-hand coordinates of (x1, y1)
|
||||
and upper right-hand coordinates (x2, y2). The number of buttons
|
||||
is specified by the number of entries in the "labels" array; each string
|
||||
before the NULL gets a button. The final argument in the constructor
|
||||
specifies whether the user can select multiple buttons (0) or whether selecting
|
||||
a new button will deactivate the previously-selected button (1).
|
||||
<p>The button box should not be given a legend.
|
||||
<h4>
|
||||
2.1.3 Frame</h4>
|
||||
The frame ("puFrame") is a rectangular area that provides a background
|
||||
for other widgets. It should be defined before any other widgets
|
||||
that go inside it or else it will cover them up. It is constructed
|
||||
by the following function call:
|
||||
<ul>
|
||||
<li>
|
||||
puFrame ( x1, y1, x2, y2 ) - creates a frame with lower left-hand coordinates
|
||||
of (x1, y1) and with upper right-hand coordinates of (x2, y2)</li>
|
||||
</ul>
|
||||
The frame should not be given a legend. It does not support a callback
|
||||
either.
|
||||
<h4>
|
||||
2.1.4 Input Box</h4>
|
||||
The input box ("puInput") is a rectangular area into which the user can
|
||||
type text. The user must first click the mouse inside the area and
|
||||
then type the text. He concludes by pressing <Enter> or <Tab>
|
||||
or by clicking the mouse outside the input box.
|
||||
<p>An input box is constructed by the following function call:
|
||||
<ul>
|
||||
<li>
|
||||
puInput ( x1, y1, x2, y2 ) - creates an input box with lower left-hand
|
||||
coordinates of (x1, y1) and with upper right-hand coordinates of (x2, y2)</li>
|
||||
</ul>
|
||||
The input box should not be given a legend.
|
||||
<h4>
|
||||
2.1.5 Menu Bar</h4>
|
||||
The menu bar ("puMenuBar") is easily the most complicated widget written
|
||||
up here. It consists of a horizontal bar containing buttons which
|
||||
the user can click on. The bar is always situated on the left-hand
|
||||
edge of the window and is usually in the upper left-hand corner.
|
||||
It is constructed by the following function call:
|
||||
<br>
|
||||
<ul>
|
||||
<li>
|
||||
puMenuBar *menu = puMenuBar ( y ) - creates a menu bar with the lower left-hand
|
||||
corner "y" pixels above the lower left-hand corner of the window.
|
||||
A value of -1 for "y" will put the menu bar in the upper left-hand corner
|
||||
of the window.</li>
|
||||
</ul>
|
||||
|
||||
<p><br>Once the menu bar has been constructed, it must be loaded with its
|
||||
entries and submenus. A submenu is the list that drops down when
|
||||
the user clicks on an entry in the menu. A typical menu bar will
|
||||
have the entries "File", "Edit", "Search", and "Help". Under the
|
||||
"File" entry is a submenu with entries "New", "Open", "Save", "Save As",
|
||||
a separator, "Page Setup", "Print", another separator, and "Exit".
|
||||
Each entry in the submenu has its own widget callback function. To
|
||||
create a submenu, the application developer must first create two null-terminated
|
||||
lists of character strings and callback functions:
|
||||
<pre>
|
||||
|
||||
char *file_submenu [] = { "Exit", "-----", "Print", "Page Setup", "-----",
|
||||
"Save As", "Save", "Open", "New", NULL } ;
|
||||
puCallback file_submenu_cb[] = { exit_cb, NULL, print_cb, page_setup_cb, NULL,
|
||||
save_as_cb, save_cb, open_cb, new_cb, NULL } ;
|
||||
|
||||
</pre>
|
||||
<p>Notice here that the submenu entries are placed in the list from bottom
|
||||
to top. After the last character string is a NULL entry; this tells
|
||||
PUI that there aren't any more entries in the submenu. The callbacks
|
||||
for the separators are also null, indicating that there is no callback
|
||||
for the separator. The submenu is added to the menu bar with a call
|
||||
to the "add_submenu" function:
|
||||
<pre>
|
||||
|
||||
menu->add_submenu ( "File", file_submenu, file_submenu_cb ) ;
|
||||
|
||||
</pre>
|
||||
<p>Further calls to "add_submenu" add the other submenus:
|
||||
<pre>
|
||||
|
||||
char *edit_submenu [] = { "Select All", "-----", "Paste", "Copy", "Cut",
|
||||
"-----", "Undo", NULL } ;
|
||||
puCallback edit_submenu_cb[] = { select_all_cb, NULL, paste_cb, copy_cb, cut_cb,
|
||||
NULL, undo_cb, NULL } ;
|
||||
menu->add_submenu ( "Edit", edit_submenu, edit_submenu_cb ) ;
|
||||
|
||||
char *search_submenu [] = { "Find Next", "Find", NULL } ;
|
||||
puCallback search_submenu_cb[] = { find_next_cb, find_cb, NULL } ;
|
||||
menu->add_submenu ( "Search", search_submenu, search_submenu_cb ) ;
|
||||
|
||||
char *help_submenu [] = { "About", "Help", NULL } ;
|
||||
puCallback help_submenu_cb[] = { about_cb, help_cb, NULL } ;
|
||||
menu->add_submenu ( "Help", help_submenu, help_submenu_cb ) ;
|
||||
|
||||
</pre>
|
||||
<p>When the last submenu has been added, the application developer must
|
||||
close the menu bar:
|
||||
<pre>
|
||||
|
||||
menu->close() ;
|
||||
|
||||
</pre>
|
||||
<p>This is absolutely necessary or else PUI will think that any widgets
|
||||
the application defines later are supposed to go into the menu bar.
|
||||
<p>The menu bar does not support a legend. It does not support a
|
||||
callback itself, although all the entries in the submenus certainly do
|
||||
support callbacks. Repositioning and resizing a menu bar will be
|
||||
problematic as well. There may be an occasion when a menu bar can
|
||||
take a label, but this would be rare.
|
||||
<h4>
|
||||
2.1.6 One-Shot Button</h4>
|
||||
The one-shot button ("puOneShot") is a button whose value is always reset
|
||||
immediately to zero after it has been activated. In all other respects
|
||||
it is the same as the regular button. It is created in the same way
|
||||
as the button:
|
||||
<ul>
|
||||
<li>
|
||||
puOneShot ( x1, y1, x2, y2 ) - creates a one-shot button with lower left-hand
|
||||
coordinates of (x1, y1) and with upper right-hand coordinates of (x2, y2)</li>
|
||||
|
||||
<li>
|
||||
puOneShot ( x1, y1, "text" ) - creates a one-shot button with lower left-hand
|
||||
coordinates of (x1, y1) and containing the text "text". The size
|
||||
is set by the size of the text.</li>
|
||||
</ul>
|
||||
|
||||
<h4>
|
||||
2.1.7 Text Box</h4>
|
||||
The text box ("puText") is an output-only widget which displays a character
|
||||
string. It is created by the following constructor:
|
||||
<ul>
|
||||
<li>
|
||||
puText ( x, y ) - creates a text box at the point (x, y) in the window</li>
|
||||
</ul>
|
||||
The application actually adds the text by assigning a label and a label
|
||||
place to the text box. The label place will determine where relative
|
||||
to the position of the text box the text itself will appear.
|
||||
<h3>
|
||||
<a NAME="Invoking PUI"></a>2.2 Invoking PUI</h3>
|
||||
The summary of invoking PUI is very simple:
|
||||
<ul>
|
||||
<li>
|
||||
At the beginning of the program, before creating any widgets, the application
|
||||
must call the function "puInit ()".</li>
|
||||
|
||||
<li>
|
||||
If the application developer wants PUI to process a mouse click, he must
|
||||
have the application call the function "puMouse ( button, updown, x, y
|
||||
)".</li>
|
||||
|
||||
<li>
|
||||
If the application developer wants PUI to process a mouse motion, he must
|
||||
have the application call the function "puMouse ( x, y )".</li>
|
||||
|
||||
<li>
|
||||
If the application developer wants PUI to process a key from the keyboard,
|
||||
he must have the application call the function "puKeyboard ( key, updown
|
||||
)".</li>
|
||||
|
||||
<li>
|
||||
If the application developer wants PUI to display the user interface, he
|
||||
must have the application call the function "puDisplay ()".</li>
|
||||
</ul>
|
||||
The application developer must create window callbacks for the window manager
|
||||
to call when the user interacts with the computer. The following
|
||||
are taken from GLUT, but another window manager will have similar callback
|
||||
requirements.
|
||||
<h4>
|
||||
2.2.1 Main Program Code</h4>
|
||||
In the main program, the application developer usually places the following
|
||||
or similar statements:
|
||||
<pre>
|
||||
|
||||
// Create the GLUT window and the OpenGL context
|
||||
|
||||
glutCreateWindow ( "PUI Application" ) ;
|
||||
|
||||
// Set up the GLUT window callbacks
|
||||
|
||||
glutDisplayFunc ( displayfn ) ; // display the window
|
||||
glutMouseFunc ( mousefn ) ; // process mouse clicks
|
||||
glutMotionFunc ( motionfn ) ; // process mouse moves
|
||||
glutPassiveMotionFunc ( motionfn ) ;
|
||||
glutKeyboardFunc ( keyboardfn ) ; // process key presses
|
||||
glutIdleFunc ( displayfn ) ; // what to do when nothing's happening
|
||||
|
||||
// Initialize PUI
|
||||
|
||||
puInit () ;
|
||||
|
||||
// Set up the widgets here
|
||||
</pre>
|
||||
<h4>
|
||||
2.2.2 Window Callbacks</h4>
|
||||
The application's window callbacks should generally look like this.
|
||||
Again, these are written assuming GLUT; other window managers should be
|
||||
similar.
|
||||
<pre>
|
||||
|
||||
void displayfn ( void )
|
||||
{
|
||||
// stuff to display any non-PUI drawings
|
||||
|
||||
// update any PUI widgets that update by themselves ... like a timer display
|
||||
|
||||
// redisplay PUI
|
||||
|
||||
puDisplay () ;
|
||||
|
||||
// Finish up
|
||||
|
||||
glutSwapBuffers () ;
|
||||
glutPostRedisplay () ;
|
||||
}
|
||||
|
||||
void mousefn ( int button, int updown, int x, int y )
|
||||
{
|
||||
// Invoke the PUI mouse function
|
||||
|
||||
puMouse ( button, updown, x, y ) ;
|
||||
glutPostRedisplay () ;
|
||||
}
|
||||
|
||||
void motionfn ( int x, int y )
|
||||
{
|
||||
// Invoke the PUI mouse motion function
|
||||
|
||||
puMouse ( x, y ) ;
|
||||
glutPostRedisplay () ;
|
||||
}
|
||||
|
||||
void keyboardfn ( unsigned char key, int, int )
|
||||
{
|
||||
// Invoke the PUI keyboard function
|
||||
|
||||
puKeyboard ( key, PU_DOWN ) ;
|
||||
glutPostRedisplay () ;
|
||||
}
|
||||
|
||||
</pre>
|
||||
<h4>
|
||||
2.2.3 Miscellaneous Other Tidbits</h4>
|
||||
If the application developer wishes to delete a widget, he should not delete
|
||||
the object directly. Instead he should call the PUI function "puDeleteObject
|
||||
( ob )" with his widget pointer as the argument.
|
||||
<h3>
|
||||
<a NAME="Widget Callbacks"></a>2.3 Widget Callbacks</h3>
|
||||
The final pieces to the puzzle are the widget callbacks. These are
|
||||
of the form
|
||||
<pre>
|
||||
|
||||
void widget_cb ( puObject *ob )
|
||||
{
|
||||
// code goes here
|
||||
}
|
||||
|
||||
</pre>
|
||||
<p>where "puObject" is the C++ type for a generic widget. When PUI
|
||||
calls a widget callback, it passes to it the address of the widget whose
|
||||
activation caused the callback. This is useful because it allows
|
||||
a single callback for multiple widgets:
|
||||
<pre>
|
||||
|
||||
void widget_cb ( puObject *ob )
|
||||
{
|
||||
if ( ob == button ) // the button from section 2.1
|
||||
{
|
||||
...
|
||||
}
|
||||
else if ( ob == my_box ) // the button box from section 2.1.2
|
||||
{
|
||||
...
|
||||
}
|
||||
else
|
||||
{
|
||||
printf ( "Error - unknown widget" ) ;
|
||||
}
|
||||
}
|
||||
|
||||
</pre>
|
||||
<p>A widget callback needs to be either a regular function (global
|
||||
or defined in the same file that contains the widget's definition) or a
|
||||
static member function of a class. It cannot be a regular member
|
||||
function of a class.
|
||||
<h4>
|
||||
2.3.1 Widget Values</h4>
|
||||
It is frequently very useful in a callback to know the value of a widget.
|
||||
A PUI widget has an integer value, a floating-point value, and a character
|
||||
string value. These values are kept synchronized as much as possible.
|
||||
For example, if the application assigns an integer value to a widget, the
|
||||
floating-point value is set equal to the integer and the integer is printed
|
||||
into the character string.
|
||||
<p>An application program can use the following function to retrieve the
|
||||
value of a PUI widget ("ob" is the pointer to the object):
|
||||
<pre>
|
||||
|
||||
int ivalue1 = ob->getValue () ; // No argument, return the integer value
|
||||
|
||||
int ivalue2 ;
|
||||
ob->getValue ( &ivalue2 ) ; // Place the integer value in the argument
|
||||
|
||||
float fvalue ;
|
||||
ob->getValue ( &fvalue ) ; // Place the floating-point value in the argument
|
||||
|
||||
char svalue[PUSTRING_MAX] ; // Create a string
|
||||
ob->getValue ( svalue ) ; // Copy the string value into the argument
|
||||
// Note that the argument is of type "char *"
|
||||
|
||||
char *sptr ;
|
||||
ob->getValue ( &sptr ) ; // Have the pointer point to the string value
|
||||
// Note that the argument is of type "char **"
|
||||
|
||||
</pre>
|
||||
<p>The values of the various widgets have the following meanings:
|
||||
<ul>
|
||||
<li>
|
||||
Button: 0 - turned off; 1 - turned on</li>
|
||||
|
||||
<li>
|
||||
Button Box: If only one button can be activated at a time, the value
|
||||
is the number of the button which is activated. If multiple buttons
|
||||
can be activated at once, then the bits in the integer value corresponding
|
||||
to the activated buttons are one and the bits corresponding to the inactive
|
||||
buttons are zero.</li>
|
||||
|
||||
<li>
|
||||
Frame: no value</li>
|
||||
|
||||
<li>
|
||||
Input: the string value is the character string that the user has
|
||||
typed in</li>
|
||||
|
||||
<li>
|
||||
Menu Bar: no value</li>
|
||||
|
||||
<li>
|
||||
One Shot Button: value is always zero</li>
|
||||
|
||||
<li>
|
||||
Text: no value</li>
|
||||
</ul>
|
||||
|
||||
<h2>
|
||||
<a NAME="Conclusion"></a>3. Conclusion</h2>
|
||||
This has been offered as an introduction to the Picoscopic User Interface.
|
||||
It makes no warranty as to its accuracy although efforts have been made
|
||||
to make it correct. It is offered in the hope that the gentle reader
|
||||
will find it useful.
|
||||
<p>The PUI has considerably greater capabilities than have been listed
|
||||
here. There are well over a dozen additional types of widgets.
|
||||
Additionally, the application developer can do many more things with this
|
||||
widgets than have been described here.
|
||||
<p>"As to more than these, my son, beware. Of the making of many
|
||||
books there is no end, and in much study there is weariness for the flesh."
|
||||
- Ecclesiastes 12:12
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user