]> git.mxchange.org Git - flightgear.git/blob - src/GUI/menubar.hxx
Multiplayer client/server system -- MessageBuf class and test harness complete
[flightgear.git] / src / GUI / menubar.hxx
1 // menubar.hxx - XML-configured menu bar.
2
3 #ifndef __MENUBAR_HXX
4 #define __MENUBAR_HXX 1
5
6 #ifndef __cplusplus
7 # error This library requires C++
8 #endif
9
10 #include <simgear/compiler.h>   // for SG_USING_STD
11
12 #include <plib/pu.h>
13
14 #include <map>
15 SG_USING_STD(map);
16
17 #include <vector>
18 SG_USING_STD(vector);
19
20
21 class puMenuBar;
22 class puObject;
23 class FGBinding;
24
25
26 /**
27  * XML-configured PUI menu bar.
28  *
29  * This class creates a menu bar from a tree of XML properties.  These
30  * properties are not part of the main FlightGear property tree, but
31  * are read from a separate file ($FG_ROOT/gui/menubar.xml).
32  *
33  * WARNING: because PUI provides no easy way to attach user data to a
34  * menu item, all menu item strings must be unique; otherwise, this
35  * class will always use the first binding with any given name.
36  */
37 class FGMenuBar
38 {
39 public:
40
41     /**
42      * Constructor.
43      */
44     FGMenuBar ();
45
46
47     /**
48      * Destructor.
49      */
50     virtual ~FGMenuBar ();
51
52
53     /**
54      * Initialize the menu bar from $FG_ROOT/gui/menubar.xml
55      */
56     virtual void init ();
57
58     
59     /**
60      * Make the menu bar visible.
61      */
62     virtual void show ();
63
64
65     /**
66      * Make the menu bar invisible.
67      */
68     virtual void hide ();
69
70
71     /**
72      * Test whether the menu bar is visible.
73      */
74     virtual bool isVisible () const;
75
76
77     /**
78      * IGNORE THIS METHOD!!!
79      *
80      * This is necessary only because plib does not provide any easy
81      * way to attach user data to a menu item.  FlightGear should not
82      * have to know about PUI internals, but this method allows the
83      * callback to pass the menu item one-shot on to the current menu.
84      */
85     virtual void fireItem (puObject * item);
86
87
88 private:
89
90     // Make a single menu.
91     void make_menu (SGPropertyNode * node);
92
93     // Make the top-level menubar.
94     void make_menubar ();
95
96     // Is the menu visible?
97     bool _visible;
98
99     // The top-level menubar itself.
100     puMenuBar * _menuBar;
101
102     // A map of bindings for the menubar.
103     map<string,vector<FGBinding *> > _bindings;
104
105     // These are hoops that we have to jump through because PUI doesn't
106     // do memory management for lists.  We have to allocate the arrays,
107     // hang onto pointers, and then delete them when the menubar is
108     // freed.
109     char ** make_char_array (int size);
110     puCallback * make_callback_array (int size);
111     vector<char **> _char_arrays;
112     vector<puCallback *> _callback_arrays;
113 };
114
115 #endif // __MENUBAR_HXX