initial commit, lordsawar source, slightly modified
[lordsawar] / src / editor / players-dialog.cpp
diff --git a/src/editor/players-dialog.cpp b/src/editor/players-dialog.cpp
new file mode 100644 (file)
index 0000000..3ad6285
--- /dev/null
@@ -0,0 +1,257 @@
+//  Copyright (C) 2007 Ole Laursen
+//  Copyright (C) 2007, 2008, 2009 Ben Asselstine
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU Library General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
+//  02110-1301, USA.
+
+#include <config.h>
+
+#include <assert.h>
+#include <gtkmm.h>
+#include <sigc++/functors/mem_fun.h>
+
+#include "players-dialog.h"
+
+#include "glade-helpers.h"
+#include "defs.h"
+#include "File.h"
+#include "player.h"
+#include "playerlist.h"
+#include "armysetlist.h"
+#include "stacklist.h"
+#include "citylist.h"
+#include "player.h"
+#include "ucompose.hpp"
+#include "game-parameters.h"
+#include "CreateScenarioRandomize.h"
+
+
+namespace
+{
+    Glib::ustring player_type_to_string(guint32 type)
+    {
+       switch (type)
+       {
+       case Player::HUMAN: return HUMAN_PLAYER_TYPE;
+       case Player::AI_FAST: return EASY_PLAYER_TYPE;
+       case Player::AI_SMART: return HARD_PLAYER_TYPE;
+       default: return NO_PLAYER_TYPE;
+       }
+    }
+}
+
+PlayersDialog::PlayersDialog(CreateScenarioRandomize *random, int width, int height)
+  : type_column(_("Type"), type_renderer),
+    gold_column(_("Gold"), gold_renderer),
+    name_column(_("Name"), name_renderer)
+{
+  d_width = width;
+  d_height = height;
+  Glib::RefPtr<Gtk::Builder> xml
+    = Gtk::Builder::create_from_file(get_glade_path() + "/players-dialog.ui");
+
+  xml->get_widget("dialog", dialog);
+
+  // setup the player settings
+  player_list = Gtk::ListStore::create(player_columns);
+
+  xml->get_widget("player_treeview", player_treeview);
+  player_treeview->set_model(player_list);
+
+  // the type column
+  player_type_list = Gtk::ListStore::create(player_type_columns);
+  Gtk::TreeModel::iterator i;
+  i = player_type_list->append();
+  (*i)[player_type_columns.type] = HUMAN_PLAYER_TYPE;
+  i = player_type_list->append();
+  (*i)[player_type_columns.type] = EASY_PLAYER_TYPE;
+  i = player_type_list->append();
+  (*i)[player_type_columns.type] = HARD_PLAYER_TYPE;
+  i = player_type_list->append();
+  (*i)[player_type_columns.type] = NO_PLAYER_TYPE;
+
+  type_renderer.property_model() = player_type_list;
+  type_renderer.property_text_column() = 0;
+  type_renderer.property_has_entry() = false;
+  type_renderer.property_editable() = true;
+
+  type_renderer.signal_edited()
+    .connect(sigc::mem_fun(*this, &PlayersDialog::on_type_edited));
+  type_column.set_cell_data_func
+    ( type_renderer, sigc::mem_fun(*this, &PlayersDialog::cell_data_type));
+  player_treeview->append_column(type_column);
+
+  // name column
+  name_renderer.property_editable() = true;
+  name_renderer.signal_edited().connect
+    (sigc::mem_fun(*this, &PlayersDialog::on_name_edited));
+  name_column.set_cell_data_func
+    (name_renderer, sigc::mem_fun(*this, &PlayersDialog::cell_data_name));
+  player_treeview->append_column(name_column);
+
+  // gold column
+  gold_renderer.property_editable() = true;
+  gold_renderer.signal_edited().connect
+    (sigc::mem_fun(*this, &PlayersDialog::on_gold_edited));
+  gold_column.set_cell_data_func
+    (gold_renderer, sigc::mem_fun(*this, &PlayersDialog::cell_data_gold));
+  player_treeview->append_column(gold_column);
+
+  // add default players
+  default_player_names.push_back(random->getPlayerName(Shield::WHITE));
+  default_player_names.push_back(random->getPlayerName(Shield::GREEN));
+  default_player_names.push_back(random->getPlayerName(Shield::YELLOW));
+  default_player_names.push_back(random->getPlayerName(Shield::LIGHT_BLUE));
+  default_player_names.push_back(random->getPlayerName(Shield::ORANGE));
+  default_player_names.push_back(random->getPlayerName(Shield::DARK_BLUE));
+  default_player_names.push_back(random->getPlayerName(Shield::RED));
+  default_player_names.push_back(random->getPlayerName(Shield::BLACK));
+
+  Playerlist *pl = Playerlist::getInstance();
+
+  // merge defined players with predefined
+  std::vector<Player *> players_to_add(default_player_names.size(), 0);
+  for (Playerlist::iterator i = pl->begin(), end = pl->end(); i != end; ++i)
+    {
+      Player *player = *i;
+      if (player == pl->getNeutral())
+       continue;
+      players_to_add[player->getId()] = player;
+    }
+
+  player_name_seq::iterator current_name = default_player_names.begin();
+  for (unsigned int j = 0; j < players_to_add.size(); ++j)
+    if (players_to_add[j])
+      {
+       Player *player = players_to_add[j];
+       add_player(player_type_to_string(player->getType()),
+                  player->getName(), player->getGold(), player);
+       ++current_name;
+      }
+    else
+      {
+       int gold = 0;
+       random->getBaseGold(100, &gold);
+       gold = random->adjustBaseGold(gold);
+       add_player(NO_PLAYER_TYPE, *current_name, gold, 0);
+       ++current_name;
+      }
+}
+
+PlayersDialog::~PlayersDialog()
+{
+  delete dialog;
+}
+
+void PlayersDialog::set_parent_window(Gtk::Window &parent)
+{
+  dialog->set_transient_for(parent);
+}
+
+int PlayersDialog::run()
+{
+  dialog->show_all();
+  int response = dialog->run();
+  Playerlist *pl = Playerlist::getInstance();
+
+  if (response == Gtk::RESPONSE_ACCEPT)        // accepted
+    {
+
+      // update the player list
+      int c = 0;
+      for (Gtk::TreeIter i = player_list->children().begin(),
+          end = player_list->children().end(); i != end; ++i, ++c)
+       {
+         Glib::ustring type = (*i)[player_columns.type];
+         Glib::ustring name = (*i)[player_columns.name];
+         int gold = (*i)[player_columns.gold];
+
+         GameParameters::Player player;
+         player.name = name;
+         if (type == HUMAN_PLAYER_TYPE)
+           player.type = GameParameters::Player::HUMAN;
+         else if (type == EASY_PLAYER_TYPE)
+           player.type = GameParameters::Player::EASY;
+         else if (type == HARD_PLAYER_TYPE)
+           player.type = GameParameters::Player::HARD;
+         else if (type == NO_PLAYER_TYPE)
+           player.type = GameParameters::Player::OFF;
+         player.id = c;
+         pl->syncPlayer(player);
+         Player *p = pl->getPlayer(player.id);
+         (*i)[player_columns.player] = p;
+         if (p)
+           p->setGold(gold);
+       }
+    }
+
+  return response;
+}
+
+void PlayersDialog::cell_data_type(Gtk::CellRenderer *renderer,
+                                  const Gtk::TreeIter& i)
+{
+  dynamic_cast<Gtk::CellRendererText*>(renderer)->property_text()
+    = (*i)[player_columns.type];
+}
+
+void PlayersDialog::on_type_edited(const Glib::ustring &path,
+                                  const Glib::ustring &new_text)
+{
+  (*player_list->get_iter(Gtk::TreePath(path)))[player_columns.type]
+    = new_text;
+}
+
+void PlayersDialog::add_player(const Glib::ustring &type,
+                              const Glib::ustring &name, int gold,
+                              Player *player)
+{
+  Gtk::TreeIter i = player_list->append();
+  (*i)[player_columns.type] = type;
+  (*i)[player_columns.name] = name;
+  (*i)[player_columns.gold] = gold;
+  (*i)[player_columns.player] = player;
+
+  player_treeview->get_selection()->select(i);
+}
+
+void PlayersDialog::cell_data_gold(Gtk::CellRenderer *renderer,
+                                 const Gtk::TreeIter& i)
+{
+    dynamic_cast<Gtk::CellRendererSpin*>(renderer)->property_adjustment()
+          = new Gtk::Adjustment((*i)[player_columns.gold], 0, 10000, 1);
+    dynamic_cast<Gtk::CellRendererSpin*>(renderer)->property_text() = 
+      String::ucompose("%1", (*i)[player_columns.gold]);
+}
+
+void PlayersDialog::on_gold_edited(const Glib::ustring &path,
+                                  const Glib::ustring &new_text)
+{
+  int gold = atoi(new_text.c_str());
+  (*player_list->get_iter(Gtk::TreePath(path)))[player_columns.gold] = gold;
+}
+
+void PlayersDialog::cell_data_name(Gtk::CellRenderer *renderer,
+                                 const Gtk::TreeIter& i)
+{
+    dynamic_cast<Gtk::CellRendererText*>(renderer)->property_text() = 
+      String::ucompose("%1", (*i)[player_columns.name]);
+}
+
+void PlayersDialog::on_name_edited(const Glib::ustring &path,
+                                  const Glib::ustring &new_text)
+{
+  (*player_list->get_iter(Gtk::TreePath(path)))[player_columns.name] = new_text;
+}