1 // Copyright (C) 2008, 2009 Ben Asselstine
3 // This program is free software; you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation; either version 3 of the License, or
6 // (at your option) any later version.
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU Library General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 #include <sigc++/functors/mem_fun.h>
23 #include "network-game-selector-dialog.h"
25 #include "recently-played-game-list.h"
26 #include "recently-played-game.h"
27 #include "glade-helpers.h"
28 #include "input-helpers.h"
32 NetworkGameSelectorDialog::NetworkGameSelectorDialog()
34 Glib::RefPtr<Gtk::Builder> xml
35 = Gtk::Builder::create_from_file
36 (get_glade_path() + "/pick-network-game-to-join-dialog.ui");
38 xml->get_widget("dialog", dialog);
40 window_closed.connect(sigc::mem_fun(dialog, &Gtk::Dialog::hide));
42 xml->get_widget("hostname_entry", hostname_entry);
43 xml->get_widget("port_spinbutton", port_spinbutton);
44 hostname_entry->set_activates_default(true);
45 hostname_entry->signal_changed().connect
46 (sigc::mem_fun(this, &NetworkGameSelectorDialog::on_hostname_changed));
47 xml->get_widget("clear_button", clear_button);
48 clear_button->signal_clicked().connect
49 (sigc::mem_fun(*this, &NetworkGameSelectorDialog::on_clear_clicked));
50 xml->get_widget("connect_button", connect_button);
51 connect_button->set_sensitive(false);
52 recently_joined_games_list =
53 Gtk::ListStore::create(recently_joined_games_columns);
54 xml->get_widget("recent_treeview", recent_treeview);
55 recent_treeview->set_model(recently_joined_games_list);
56 recent_treeview->append_column("Name", recently_joined_games_columns.name);
57 recent_treeview->append_column("Turn", recently_joined_games_columns.turn);
58 recent_treeview->append_column("Players", recently_joined_games_columns.number_of_players);
59 recent_treeview->append_column("Cities", recently_joined_games_columns.number_of_cities);
60 recent_treeview->append_column("Host", recently_joined_games_columns.host);
61 recent_treeview->append_column("Port", recently_joined_games_columns.port);
62 recent_treeview->set_headers_visible(true);
63 recent_treeview->get_selection()->signal_changed().connect
64 (sigc::mem_fun(*this, &NetworkGameSelectorDialog::on_recent_game_selected));
66 RecentlyPlayedGameList *rpgl = RecentlyPlayedGameList::getInstance();
68 for (RecentlyPlayedGameList::iterator it = rpgl->begin(); it != rpgl->end();
71 if ((*it)->getPlayMode() == GameScenario::NETWORKED)
73 RecentlyPlayedNetworkedGame *game;
74 game = dynamic_cast<RecentlyPlayedNetworkedGame*>(*it);
75 addRecentlyJoinedGame(game);
78 port_spinbutton->set_value(LORDSAWAR_PORT);
81 NetworkGameSelectorDialog::~NetworkGameSelectorDialog()
86 void NetworkGameSelectorDialog::addRecentlyJoinedGame(RecentlyPlayedNetworkedGame*recent)
88 Gtk::TreeIter i = recently_joined_games_list->append();
89 (*i)[recently_joined_games_columns.name] = recent->getName();
90 (*i)[recently_joined_games_columns.turn] = recent->getRound();
91 (*i)[recently_joined_games_columns.number_of_players] = recent->getNumberOfPlayers();
92 (*i)[recently_joined_games_columns.number_of_cities] = recent->getNumberOfCities();
93 (*i)[recently_joined_games_columns.host] = recent->getHost();
94 (*i)[recently_joined_games_columns.port] = recent->getPort();
98 void NetworkGameSelectorDialog::on_hostname_changed()
100 //validate the ip/hostname
101 if (hostname_entry->get_text().length() > 0)
102 connect_button->set_sensitive(true);
104 connect_button->set_sensitive(false);
107 void NetworkGameSelectorDialog::set_parent_window(Gtk::Window &parent)
109 dialog->set_transient_for(parent);
110 //dialog->set_position(Gtk::WIN_POS_CENTER_ON_PARENT);
113 void NetworkGameSelectorDialog::hide()
118 bool NetworkGameSelectorDialog::run()
120 int response = dialog->run();
121 if (response == Gtk::RESPONSE_ACCEPT)
124 game_selected.emit(hostname_entry->get_text(), LORDSAWAR_PORT);
131 void NetworkGameSelectorDialog::on_recent_game_selected()
133 Glib::RefPtr<Gtk::TreeSelection> selection = recent_treeview->get_selection();
134 Gtk::TreeModel::iterator iterrow = selection->get_selected();
135 Gtk::TreeModel::Row row = *iterrow;
136 hostname_entry->set_text(row[recently_joined_games_columns.host]);
137 port_spinbutton->set_value(row[recently_joined_games_columns.port]);
140 void NetworkGameSelectorDialog::on_clear_clicked()
142 RecentlyPlayedGameList *rpgl = RecentlyPlayedGameList::getInstance();
143 rpgl->removeAllNetworkedGames();
144 rpgl->saveToFile(File::getSavePath() + "/recently-played.xml");
145 recently_joined_games_list->clear();
146 recently_joined_games_list.reset();