]> git.mxchange.org Git - flightgear.git/blob - src/GUI/menubar.cxx
95981defc10eb65df46f4fd102bb2b5343710f1f
[flightgear.git] / src / GUI / menubar.cxx
1 #include <string.h>
2 #include <iostream>
3 #include <plib/pu.h>
4 #include <simgear/debug/logstream.hxx>
5
6 #include <Main/globals.hxx>
7 #include <Main/fg_props.hxx>
8
9 #include "new_gui.hxx"
10 #include "menubar.hxx"
11
12
13 \f
14 ////////////////////////////////////////////////////////////////////////
15 // Static functions.
16 ////////////////////////////////////////////////////////////////////////
17
18
19 static void
20 menu_callback (puObject * object)
21 {
22     NewGUI * gui = (NewGUI *)globals->get_subsystem("gui");
23     gui->getMenuBar()->fireItem(object);
24 }
25
26
27 \f
28 ////////////////////////////////////////////////////////////////////////
29 // Implementation of FGMenuBar.
30 ////////////////////////////////////////////////////////////////////////
31
32
33 FGMenuBar::FGMenuBar ()
34     : _visible(false),
35       _menuBar(0)
36 {
37 }
38
39 FGMenuBar::~FGMenuBar ()
40 {
41     hide();
42     delete _menuBar;            // FIXME: check if PUI owns the pointer
43
44                                 // Delete all those bindings
45     map<string,vector<FGBinding *> >::iterator it;
46     it = _bindings.begin();
47     while (it != _bindings.end()) {
48         for (int i = 0; i < it->second.size(); i++)
49             delete it->second[i];
50     }
51 }
52
53 void
54 FGMenuBar::init ()
55 {
56     if (_menuBar != 0)          // FIXME: check if PUI owns the pointer
57         delete _menuBar;
58     make_menubar();
59 }
60
61 void
62 FGMenuBar::show ()
63 {
64     if (_menuBar != 0) {
65         _menuBar->reveal();
66         _visible = true;
67     } else {
68         SG_LOG(SG_GENERAL, SG_ALERT, "No menu bar to show");
69         _visible = false;
70     }
71 }
72
73 void
74 FGMenuBar::hide ()
75 {
76     if (_menuBar != 0) {
77         _menuBar->hide();
78     } else {
79         SG_LOG(SG_GENERAL, SG_ALERT, "No menu bar to show");
80     }
81     _visible = false;
82 }
83
84 bool
85 FGMenuBar::isVisible () const
86 {
87     return _visible;
88 }
89
90 bool
91 FGMenuBar::fireItem (puObject * item)
92 {
93     const char * name = item->getLegend();
94     vector<FGBinding *> &bindings = _bindings[name];
95
96     for (int i = 0; i < bindings.size(); i++)
97         bindings[i]->fire();
98 }
99
100 void
101 FGMenuBar::make_menu (SGPropertyNode_ptr node)
102 {
103     const char * name = strdup(node->getStringValue("label"));
104     vector<SGPropertyNode_ptr> item_nodes = node->getChildren("item");
105
106     int array_size = item_nodes.size() + 1;
107
108     char ** items = new char*[array_size];
109     puCallback * callbacks = new puCallback[array_size];
110
111     for (int i = 0, j = item_nodes.size() - 1;
112          i < item_nodes.size();
113          i++, j--) {
114         
115                                 // Set up the PUI entries for this item
116         items[j] = strdup((char *)item_nodes[i]->getStringValue("label"));
117         callbacks[j] = menu_callback;
118
119                                 // Load all the bindings for this item
120         vector<SGPropertyNode_ptr> binding_nodes =
121             item_nodes[i]->getChildren("binding");
122         for (int k = 0; k < binding_nodes.size(); k++)
123             _bindings[items[j]].push_back(new FGBinding(binding_nodes[k]));
124     }
125
126     items[item_nodes.size()] = 0;
127     callbacks[item_nodes.size()] = 0;
128
129     _menuBar->add_submenu(name, items, callbacks);
130 }
131
132 void
133 FGMenuBar::make_menubar ()
134 {
135     _menuBar = new puMenuBar;
136     SGPropertyNode props;
137
138     fgLoadProps("gui/menubar.xml", &props);
139     vector<SGPropertyNode_ptr> menu_nodes = props.getChildren("menu");
140     for (int i = 0; i < menu_nodes.size(); i++)
141         make_menu(menu_nodes[i]);
142
143     _menuBar->close();
144 }
145
146 // end of menubar.cxx