Adding Families of Functions to GraphWinSometimes, one wants to add an entire group of functions, all with the same interface, to a menu. Writing a wrapper for each function would be tedious. It is more convenient to write only a single caller function that can deal with all functions of the group. The caller for a function of typefunction_t has type
void (*caller)(GraphWin&, function_t);The gw_add_call() function template adds a function together
with its caller to a menu.
ExampleWe use a family of graph drawing functions as an example. Assume we have a library of graph drawing algorithms and we want to build a graph_draw menu which makes all functions in the library available on a mouse click. We assume, for simplicity, that all graph drawing algorithms take agraph
G and compute for every node v of G a position
(xcoord[v],ycoord[v]).
void draw_alg1(const graph& G, node_array<double> xcoord&,
node_array<double> xcoord&);
void draw_alg2(const graph& G, node_array<double> xcoord&,
node_array<double> xcoord&);
...
A generic caller for this type of graph algorithm looks as follows
typedef void (*draw_alg) (const graph&,
node_array<double> xcoord&,
node_array<double> xcoord&);
void call_draw_alg(GraphWin&, draw_alg draw)
{
//provide arguments
graph& G=gw.get_graph();
node_array<double> xcoord(G);
node_array<double> ycoord(G);
//call function
draw(G,xcoord,ycoord);
//display result
gw.adjust_coords_to_win(xcoord,ycoord);
gw.set_layout(xcoord,ycoord);
if (!gw.get_flush()) gw.redraw();
}
The menu is now easily created as follows
int draw_menu=gw.add_menu("graph drawing");
gw_add_call(gw,draw_alg1,call_draw_alg,
"draw_alg1",draw_menu);
gw_add_call(gw,draw_alg2,call_draw_alg,
"draw_alg2",draw_menu);
...
|
See also:Customizing the Interactive Interface Adding GraphWin Member Functions Complete Example for Customizing the Interface Manual Pages: |