Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/descriptions.cc')
-rw-r--r--src/core/descriptions.cc245
1 files changed, 245 insertions, 0 deletions
diff --git a/src/core/descriptions.cc b/src/core/descriptions.cc
new file mode 100644
index 0000000..fe37d2c
--- /dev/null
+++ b/src/core/descriptions.cc
@@ -0,0 +1,245 @@
+/*
+ core/descriptions.cc
+ This file is part of the Osirion project and is distributed under
+ the terms of the GNU General Public License version 2
+*/
+
+#include "core/descriptions.h"
+#include "auxiliary/functions.h"
+#include "sys/sys.h"
+
+namespace core {
+
+/* ---- class ButtonDescription ------------------------------------ */
+
+ButtonDescription::ButtonDescription()
+{
+ button_model = 0;
+ button_align = Center;
+}
+
+ButtonDescription::~ButtonDescription()
+{
+}
+
+void ButtonDescription::set_text(const std::string &text)
+{
+ button_text.assign(text);
+}
+
+void ButtonDescription::set_command(const std::string &command)
+{
+ button_command.assign(command);
+}
+
+void ButtonDescription::set_modelname(const std::string &modelname)
+{
+ button_modelname.assign(modelname);
+
+ button_model = model::Model::load(modelname);
+}
+
+void ButtonDescription::set_alignment(Align align)
+{
+ button_align = align;
+}
+
+/* ---- class MenuDescription -------------------------------------- */
+
+MenuDescription::MenuDescription()
+{
+}
+
+MenuDescription::~MenuDescription()
+{
+ for (Buttons::iterator it = buttons().begin(); it != buttons().end(); it++) {
+ delete (*it);
+ }
+
+ buttons().clear();
+}
+
+void MenuDescription::set_text(const std::string &text)
+{
+ menu_text.assign(text);
+}
+
+void MenuDescription::set_label(const std::string &label)
+{
+ menu_label.assign(label);
+}
+
+void MenuDescription::add_button(ButtonDescription *button)
+{
+ buttons().push_back(button);
+}
+
+/* ---- class Descriptions ----------------------------------------- */
+
+
+void Descriptions::serialize(MenuDescription *menu, std::ostream & os)
+{
+ os << menu->label() << " "
+ << "\"" << menu->text() << "\" "
+ << menu->buttons().size() << " ";
+
+ for (MenuDescription::Buttons::iterator it = menu-> buttons().begin(); it != menu->buttons().end(); it++) {
+ ButtonDescription *button = (*it);
+ os << "\"" << button->text() << "\" "
+ << button->alignment() << " "
+ << "\"" << button->command() << "\" "
+ << "\"" << button->modelname() << "\" ";
+ }
+}
+
+MenuDescription * Descriptions::receive(std::istream &is)
+{
+ MenuDescription *menu = new MenuDescription();
+
+ int a;
+ std::string n;
+ size_t nb;
+ char c;
+
+ // menu label
+ is >> n;
+ menu->set_label(n);
+
+ // menu text
+ n.clear();
+ while ( (is.get(c)) && (c != '"'));
+ while ( (is.get(c)) && (c != '"'))
+ n += c;
+
+ if (n.size())
+ menu->set_text(n);
+
+ // menu buttons
+ is >> nb;
+ for (size_t i=0; i < nb; i++) {
+ ButtonDescription *button = new ButtonDescription();
+ // button text
+ n.clear();
+ while ( (is.get(c)) && (c != '"'));
+ while ( (is.get(c)) && (c != '"'))
+ n += c;
+ if (n.size()) button->set_text(n);
+
+ // button alignment
+ a = ButtonDescription::Center;
+ is >> a;
+ if (a == ButtonDescription::Left)
+ button->set_alignment(ButtonDescription::Left);
+ else if (a == ButtonDescription::Right)
+ button->set_alignment(ButtonDescription::Right);
+ else
+ button->set_alignment(ButtonDescription::Center);
+
+ // button command
+ n.clear();
+ while ( (is.get(c)) && (c != '"'));
+ while ( (is.get(c)) && (c != '"'))
+ n += c;
+ if (n.size()) button->set_command(n);
+
+ // button modelname
+ n.clear();
+ while ( (is.get(c)) && (c != '"'));
+ while ( (is.get(c)) && (c != '"'))
+ n += c;
+ if (n.size()) button->set_modelname(n);
+
+ menu->add_button(button);
+ }
+
+ return menu;
+
+}
+
+bool Descriptions::load_entity_menus(core::Entity *entity, const std::string &menufilename)
+{
+ filesystem::IniFile inifile;
+ inifile.open(menufilename);
+
+ if (!inifile.is_open()) {
+ return false;
+ }
+
+ con_debug << " " << inifile.name() << std::endl;
+
+ std::string strval;
+ MenuDescription *menu = 0;
+ ButtonDescription *button = 0;
+
+ while (inifile.getline()) {
+
+ if (inifile.got_section()) {
+ if (inifile.got_section("menu")) {
+ menu = new MenuDescription;
+ entity->add_menu(menu);
+
+ } else if (inifile.got_section("button")) {
+ if (menu) {
+ button = new ButtonDescription();
+ menu->add_button(button);
+ }
+ } else {
+ inifile.unknown_section();
+ }
+
+ } else if (inifile.got_key()) {
+
+ if (inifile.in_section("menu")) {
+
+ if (inifile.got_key_string("label", strval)) {
+ aux::to_label(strval);
+ menu->set_label(strval);
+ } else if (inifile.got_key_string("text", strval)) {
+ aux::strip_quotes(strval);
+ menu->set_text(strval);
+ } else {
+ inifile.unkown_key();
+ }
+
+ } else if (inifile.in_section("button")) {
+
+ if (!button) {
+ continue;
+ } else if (inifile.got_key_string("text", strval)) {
+ aux::strip_quotes(strval);
+ button->set_text(strval);
+ } else if (inifile.got_key_string("command", strval)) {
+ for (size_t i =0; i <= strval.size(); i++) {
+ if (strval[i] == ',') strval[i] = ';';
+ }
+ aux::strip_quotes(strval);
+ button->set_command(strval);
+ } else if (inifile.got_key_string("model", strval)) {
+ button->set_modelname(strval);
+ } else if (inifile.got_key_string("align", strval)) {
+ aux::to_label(strval);
+ if (strval.compare("left") == 0) {
+ button->set_alignment(ButtonDescription::Left);
+ } else if (strval.compare("center") == 0) {
+ button->set_alignment(ButtonDescription::Center);
+ } else if (strval.compare("right") == 0) {
+ button->set_alignment(ButtonDescription::Right);
+ } else {
+ inifile.unknown_value();
+ }
+ } else {
+ inifile.unkown_key();
+ }
+
+ }
+ }
+ }
+
+ inifile.close();
+ return true;
+}
+
+}
+
+
+