#ifndef __NEW_GUI_HXX
#define __NEW_GUI_HXX 1
-#ifndef __cplusplus
-# error This library requires C++
-#endif
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
#include <plib/pu.h>
-#include <simgear/compiler.h> // for SG_USING_STD
#include <simgear/props/props.hxx>
#include <simgear/structure/subsystem_mgr.hxx>
#include <simgear/misc/sg_path.hxx>
+#include <functional>
#include <vector>
#include <map>
-SG_USING_STD(vector);
-SG_USING_STD(map);
-SG_USING_STD(string);
-
#include <Main/fg_props.hxx>
+class SGBinding;
+
class FGMenuBar;
class FGDialog;
-class FGBinding;
class FGColor;
class FGFontCache;
* @param name The name of the dialog box.
* @return true if the dialog exists, false otherwise.
*/
- virtual bool showDialog (const string &name);
+ virtual bool showDialog (const std::string &name);
/**
* @param name The name of the dialog box.
* @return true if the dialog was active, false otherwise.
*/
- virtual bool closeDialog (const string &name);
+ virtual bool closeDialog (const std::string &name);
/**
* Get dialog property tree's root node.
* @param name The name of the dialog box.
* @return node pointer if the dialog was found, zero otherwise.
*/
- virtual SGPropertyNode_ptr getDialogProperties (const string &name);
+ virtual SGPropertyNode_ptr getDialogProperties (const std::string &name);
/**
* Return a pointer to the current menubar.
*
* @return The named dialog, or 0 if it isn't active.
*/
- virtual FGDialog * getDialog (const string &name);
+ virtual FGDialog * getDialog (const std::string &name);
virtual FGColor *getColor (const char * name) const {
_citt_t it = _colors.find(name);
return (it != _colors.end()) ? it->second : NULL;
}
- virtual FGColor *getColor (const string &name) const {
+ virtual FGColor *getColor (const std::string &name) const {
_citt_t it = _colors.find(name.c_str());
return (it != _colors.end()) ? it->second : NULL;
}
void clear_colors();
// Read all the configuration files in a directory.
- void readDir (const char * path);
+ void readDir (const SGPath& path);
FGMenuBar * _menubar;
FGDialog * _active_dialog;
- map<string,FGDialog *> _active_dialogs;
- map<string,SGPropertyNode_ptr> _dialog_props;
+ std::map<std::string,FGDialog *> _active_dialogs;
+ std::map<std::string,SGPropertyNode_ptr> _dialog_props;
};
bool isValid() const {
return _red >= 0.0 && _green >= 0.0 && _blue >= 0.0;
}
- void print() const {
- std::cerr << "red=" << _red << ", green=" << _green
- << ", blue=" << _blue << ", alpha=" << _alpha << std::endl;
- }
+ void print() const;
inline void setRed(float red) { _red = red; }
inline void setGreen(float green) { _green = green; }
/**
- * A small class to keep all fonts available for future use.
+ * A class to keep all fonts available for future use.
* This also assures a font isn't resident more than once.
*/
class FGFontCache {
private:
+ // The parameters of a request to the cache.
+ struct FntParams
+ {
+ const std::string name;
+ const float size;
+ const float slant;
+ FntParams() : size(0.0f), slant(0.0f) {}
+ FntParams(const FntParams& rhs)
+ : name(rhs.name), size(rhs.size), slant(rhs.slant)
+ {
+ }
+ FntParams(const std::string& name_, float size_, float slant_)
+ : name(name_), size(size_), slant(slant_)
+ {
+ }
+ };
+ struct FntParamsLess
+ : public std::binary_function<const FntParams, const FntParams, bool>
+ {
+ bool operator() (const FntParams& f1, const FntParams& f2) const;
+ };
struct fnt {
fnt(puFont *pu = 0) : pufont(pu), texfont(0) {}
~fnt() { if (texfont) { delete pufont; delete texfont; } }
+ // Font used by plib GUI code
puFont *pufont;
+ // TXF font
fntTexFont *texfont;
};
+ // Path to the font directory
SGPath _path;
- map<const string,fnt *> _fonts;
- typedef map<const string,fnt *>::const_iterator _itt_t;
+ typedef map<const string, fntTexFont*> TexFontMap;
+ typedef map<const FntParams, fnt*, FntParamsLess> PuFontMap;
+ TexFontMap _texFonts;
+ PuFontMap _puFonts;
+
bool _initialized;
struct fnt *getfnt(const char *name, float size, float slant);
+ void init();
public:
FGFontCache();
puFont *get(SGPropertyNode *node);
fntTexFont *getTexFont(const char *name, float size=15.0, float slant=0.0);
+
+ SGPath getfntpath(const char *name);
+ /**
+ * Preload all the fonts in the FlightGear font directory. It is
+ * important to load the font textures early, with the proper
+ * graphics context current, so that no plib (or our own) code
+ * tries to load a font from disk when there's no current graphics
+ * context.
+ */
+ bool initializeFonts();
};