Separated out GUIWidget class to manage a top-level widget.
This commit is contained in:
parent
3e217ba909
commit
8205c4e030
2 changed files with 138 additions and 104 deletions
|
@ -12,13 +12,19 @@ SG_USING_STD(vector);
|
|||
#include <Main/fg_props.hxx>
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Callbacks.
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/**
|
||||
* Callback to update all property values.
|
||||
*/
|
||||
static void
|
||||
update_callback (puObject * object)
|
||||
{
|
||||
((NewGUI *)object->getUserData())->updateProperties();
|
||||
((GUIWidget *)object->getUserData())->updateProperties();
|
||||
}
|
||||
|
||||
|
||||
|
@ -28,7 +34,7 @@ update_callback (puObject * object)
|
|||
static void
|
||||
close_callback (puObject * object)
|
||||
{
|
||||
((NewGUI *)object->getUserData())->closeActiveObject();
|
||||
delete ((GUIWidget *)object->getUserData());
|
||||
}
|
||||
|
||||
|
||||
|
@ -38,7 +44,7 @@ close_callback (puObject * object)
|
|||
static void
|
||||
apply_callback (puObject * object)
|
||||
{
|
||||
((NewGUI *)object->getUserData())->applyProperties();
|
||||
((GUIWidget *)object->getUserData())->applyProperties();
|
||||
update_callback(object);
|
||||
}
|
||||
|
||||
|
@ -54,58 +60,44 @@ close_apply_callback (puObject * object)
|
|||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Implementation of GUIWidget.
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
NewGUI::NewGUI ()
|
||||
: _activeObject(0)
|
||||
GUIWidget::GUIWidget (SGPropertyNode_ptr props)
|
||||
: _object(0)
|
||||
{
|
||||
display(props);
|
||||
}
|
||||
|
||||
NewGUI::~NewGUI ()
|
||||
GUIWidget::~GUIWidget ()
|
||||
{
|
||||
delete _object;
|
||||
}
|
||||
|
||||
void
|
||||
NewGUI::init ()
|
||||
GUIWidget::display (SGPropertyNode_ptr props)
|
||||
{
|
||||
char path[1024];
|
||||
ulMakePath(path, getenv("FG_ROOT"), "gui");
|
||||
std::cerr << "Reading from " << path << std::endl;
|
||||
readDir(path);
|
||||
std::cerr << "Done reading from " << path << std::endl;
|
||||
}
|
||||
|
||||
void
|
||||
NewGUI::update (double delta_time_sec)
|
||||
{
|
||||
// NO OP
|
||||
}
|
||||
|
||||
void
|
||||
NewGUI::display (const string &name)
|
||||
{
|
||||
if (_activeObject != 0) {
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Another GUI object is still active");
|
||||
if (_object != 0) {
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "This widget is already active");
|
||||
return;
|
||||
}
|
||||
|
||||
if (_objects.find(name) == _objects.end()) {
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Dialog " << name << " not defined");
|
||||
return;
|
||||
}
|
||||
SGPropertyNode_ptr props = _objects[name];
|
||||
|
||||
_activeObject = makeObject(props, 1024, 768);
|
||||
_object = makeObject(props, 1024, 768);
|
||||
|
||||
if (_activeObject != 0) {
|
||||
_activeObject->reveal();
|
||||
if (_object != 0) {
|
||||
_object->reveal();
|
||||
} else {
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Dialog " << name
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Widget "
|
||||
<< props->getStringValue("name", "[unnamed]")
|
||||
<< " does not contain a proper GUI definition");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
NewGUI::applyProperties ()
|
||||
GUIWidget::applyProperties ()
|
||||
{
|
||||
for (int i = 0; i < _propertyObjects.size(); i++) {
|
||||
puObject * object = _propertyObjects[i].object;
|
||||
|
@ -115,7 +107,7 @@ NewGUI::applyProperties ()
|
|||
}
|
||||
|
||||
void
|
||||
NewGUI::updateProperties ()
|
||||
GUIWidget::updateProperties ()
|
||||
{
|
||||
for (int i = 0; i < _propertyObjects.size(); i++) {
|
||||
puObject * object = _propertyObjects[i].object;
|
||||
|
@ -124,59 +116,8 @@ NewGUI::updateProperties ()
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
NewGUI::closeActiveObject ()
|
||||
{
|
||||
delete _activeObject;
|
||||
_activeObject = 0;
|
||||
_propertyObjects.clear();
|
||||
}
|
||||
|
||||
void
|
||||
NewGUI::readDir (const char * path)
|
||||
{
|
||||
ulDir * dir = ulOpenDir(path);
|
||||
std::cerr << "Directory opened successfully" << std::endl;
|
||||
|
||||
if (dir == 0) {
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Failed to read GUI files from "
|
||||
<< path);
|
||||
return;
|
||||
}
|
||||
|
||||
ulDirEnt * dirEnt = ulReadDir(dir);
|
||||
while (dirEnt != 0) {
|
||||
char subpath[1024];
|
||||
|
||||
ulMakePath(subpath, path, dirEnt->d_name);
|
||||
|
||||
std::cerr << "Subpath is " << subpath << std::endl;
|
||||
if (dirEnt->d_isdir && dirEnt->d_name[0] != '.') {
|
||||
readDir(subpath);
|
||||
} else {
|
||||
SGPropertyNode_ptr props = new SGPropertyNode;
|
||||
try {
|
||||
readProperties(subpath, props);
|
||||
} catch (const sg_exception &ex) {
|
||||
SG_LOG(SG_INPUT, SG_ALERT, "Error parsing GUI file "
|
||||
<< subpath);
|
||||
}
|
||||
if (!props->hasValue("name")) {
|
||||
SG_LOG(SG_INPUT, SG_WARN, "GUI file " << subpath
|
||||
<< " has no name; skipping.");
|
||||
} else {
|
||||
string name = props->getStringValue("name");
|
||||
SG_LOG(SG_INPUT, SG_BULK, "Saving GUI node " << name);
|
||||
_objects[name] = props;
|
||||
}
|
||||
}
|
||||
dirEnt = ulReadDir(dir);
|
||||
}
|
||||
ulCloseDir(dir);
|
||||
}
|
||||
|
||||
puObject *
|
||||
NewGUI::makeObject (SGPropertyNode * props, int parentWidth, int parentHeight)
|
||||
GUIWidget::makeObject (SGPropertyNode * props, int parentWidth, int parentHeight)
|
||||
{
|
||||
int width = props->getIntValue("width", parentWidth);
|
||||
int height = props->getIntValue("height", parentHeight);
|
||||
|
@ -227,7 +168,7 @@ NewGUI::makeObject (SGPropertyNode * props, int parentWidth, int parentHeight)
|
|||
}
|
||||
|
||||
void
|
||||
NewGUI::setupObject (puObject * object, SGPropertyNode * props)
|
||||
GUIWidget::setupObject (puObject * object, SGPropertyNode * props)
|
||||
{
|
||||
object->setUserData(this);
|
||||
|
||||
|
@ -262,7 +203,7 @@ NewGUI::setupObject (puObject * object, SGPropertyNode * props)
|
|||
}
|
||||
|
||||
void
|
||||
NewGUI::setupGroup (puGroup * group, SGPropertyNode * props,
|
||||
GUIWidget::setupGroup (puGroup * group, SGPropertyNode * props,
|
||||
int width, int height, bool makeFrame)
|
||||
{
|
||||
setupObject(group, props);
|
||||
|
@ -276,10 +217,89 @@ NewGUI::setupGroup (puGroup * group, SGPropertyNode * props,
|
|||
group->close();
|
||||
}
|
||||
|
||||
NewGUI::PropertyObject::PropertyObject (puObject * o, SGPropertyNode_ptr n)
|
||||
GUIWidget::PropertyObject::PropertyObject (puObject * o, SGPropertyNode_ptr n)
|
||||
: object(o),
|
||||
node(n)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// Implementation of NewGUI.
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
NewGUI::NewGUI ()
|
||||
{
|
||||
}
|
||||
|
||||
NewGUI::~NewGUI ()
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
NewGUI::init ()
|
||||
{
|
||||
char path[1024];
|
||||
ulMakePath(path, getenv("FG_ROOT"), "gui");
|
||||
readDir(path);
|
||||
}
|
||||
|
||||
void
|
||||
NewGUI::update (double delta_time_sec)
|
||||
{
|
||||
// NO OP
|
||||
}
|
||||
|
||||
void
|
||||
NewGUI::display (const string &name)
|
||||
{
|
||||
if (_widgets.find(name) == _widgets.end())
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Dialog " << name << " not defined");
|
||||
else
|
||||
new GUIWidget(_widgets[name]); // PUI will delete it
|
||||
}
|
||||
|
||||
void
|
||||
NewGUI::readDir (const char * path)
|
||||
{
|
||||
ulDir * dir = ulOpenDir(path);
|
||||
|
||||
if (dir == 0) {
|
||||
SG_LOG(SG_GENERAL, SG_ALERT, "Failed to read GUI files from "
|
||||
<< path);
|
||||
return;
|
||||
}
|
||||
|
||||
ulDirEnt * dirEnt = ulReadDir(dir);
|
||||
while (dirEnt != 0) {
|
||||
char subpath[1024];
|
||||
|
||||
ulMakePath(subpath, path, dirEnt->d_name);
|
||||
|
||||
if (dirEnt->d_isdir && dirEnt->d_name[0] != '.') {
|
||||
readDir(subpath);
|
||||
} else {
|
||||
SGPropertyNode_ptr props = new SGPropertyNode;
|
||||
try {
|
||||
readProperties(subpath, props);
|
||||
} catch (const sg_exception &ex) {
|
||||
SG_LOG(SG_INPUT, SG_ALERT, "Error parsing GUI file "
|
||||
<< subpath);
|
||||
}
|
||||
if (!props->hasValue("name")) {
|
||||
SG_LOG(SG_INPUT, SG_WARN, "GUI file " << subpath
|
||||
<< " has no name; skipping.");
|
||||
} else {
|
||||
string name = props->getStringValue("name");
|
||||
SG_LOG(SG_INPUT, SG_BULK, "Saving GUI node " << name);
|
||||
_widgets[name] = props;
|
||||
}
|
||||
}
|
||||
dirEnt = ulReadDir(dir);
|
||||
}
|
||||
ulCloseDir(dir);
|
||||
}
|
||||
|
||||
// end of new_gui.cxx
|
||||
|
|
|
@ -19,24 +19,20 @@ SG_USING_STD(map);
|
|||
#include <Main/fgfs.hxx>
|
||||
|
||||
|
||||
class NewGUI : public FGSubsystem
|
||||
class GUIWidget
|
||||
{
|
||||
public:
|
||||
|
||||
NewGUI ();
|
||||
virtual ~NewGUI ();
|
||||
virtual void init ();
|
||||
virtual void update (double delta_time_sec);
|
||||
|
||||
virtual void display (const string &name);
|
||||
GUIWidget (SGPropertyNode_ptr props);
|
||||
virtual ~GUIWidget ();
|
||||
|
||||
virtual void updateProperties ();
|
||||
virtual void applyProperties ();
|
||||
virtual void closeActiveObject ();
|
||||
|
||||
private:
|
||||
|
||||
void readDir (const char * path);
|
||||
void display (SGPropertyNode_ptr props);
|
||||
|
||||
GUIWidget (const GUIWidget &); // just for safety
|
||||
|
||||
puObject * makeObject (SGPropertyNode * props,
|
||||
int parentWidth, int parentHeight);
|
||||
|
@ -46,8 +42,7 @@ private:
|
|||
void setupGroup (puGroup * group, SGPropertyNode * props,
|
||||
int width, int height, bool makeFrame = false);
|
||||
|
||||
map<string,SGPropertyNode_ptr> _objects;
|
||||
puObject * _activeObject;
|
||||
puObject * _object;
|
||||
|
||||
struct PropertyObject {
|
||||
PropertyObject (puObject * object, SGPropertyNode_ptr node);
|
||||
|
@ -59,4 +54,23 @@ private:
|
|||
|
||||
};
|
||||
|
||||
|
||||
class NewGUI : public FGSubsystem
|
||||
{
|
||||
public:
|
||||
|
||||
NewGUI ();
|
||||
virtual ~NewGUI ();
|
||||
virtual void init ();
|
||||
virtual void update (double delta_time_sec);
|
||||
virtual void display (const string &name);
|
||||
|
||||
private:
|
||||
|
||||
void readDir (const char * path);
|
||||
|
||||
map<string,SGPropertyNode_ptr> _widgets;
|
||||
|
||||
};
|
||||
|
||||
#endif // __NEW_GUI_HXX
|
||||
|
|
Loading…
Add table
Reference in a new issue