initial commit, lordsawar source, slightly modified
[lordsawar] / src / gui / network-game-selector-dialog.cpp
1 //  Copyright (C) 2008, 2009 Ben Asselstine
2 //
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.
7 //
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.
12 //
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 
16 //  02110-1301, USA.
17
18 #include <config.h>
19
20 #include <gtkmm.h>
21 #include <sigc++/functors/mem_fun.h>
22
23 #include "network-game-selector-dialog.h"
24
25 #include "recently-played-game-list.h"
26 #include "recently-played-game.h"
27 #include "glade-helpers.h"
28 #include "input-helpers.h"
29 #include "defs.h"
30 #include "File.h"
31
32 NetworkGameSelectorDialog::NetworkGameSelectorDialog()
33 {
34     Glib::RefPtr<Gtk::Builder> xml
35         = Gtk::Builder::create_from_file
36         (get_glade_path() + "/pick-network-game-to-join-dialog.ui");
37
38     xml->get_widget("dialog", dialog);
39     decorate(dialog);
40     window_closed.connect(sigc::mem_fun(dialog, &Gtk::Dialog::hide));
41
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));
65     
66     RecentlyPlayedGameList *rpgl = RecentlyPlayedGameList::getInstance();
67     rpgl->pruneGames();
68     for (RecentlyPlayedGameList::iterator it = rpgl->begin(); it != rpgl->end();
69          it++)
70       {
71         if ((*it)->getPlayMode() == GameScenario::NETWORKED)
72           {
73             RecentlyPlayedNetworkedGame *game;
74             game = dynamic_cast<RecentlyPlayedNetworkedGame*>(*it);
75             addRecentlyJoinedGame(game);
76           }
77       }
78     port_spinbutton->set_value(LORDSAWAR_PORT);
79 }
80             
81 NetworkGameSelectorDialog::~NetworkGameSelectorDialog()
82 {
83   delete dialog;
84 }
85
86 void NetworkGameSelectorDialog::addRecentlyJoinedGame(RecentlyPlayedNetworkedGame*recent)
87 {
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();
95 }
96
97
98 void NetworkGameSelectorDialog::on_hostname_changed()
99 {
100   //validate the ip/hostname
101   if (hostname_entry->get_text().length() > 0)
102     connect_button->set_sensitive(true);
103   else
104     connect_button->set_sensitive(false);
105 }
106
107 void NetworkGameSelectorDialog::set_parent_window(Gtk::Window &parent)
108 {
109   dialog->set_transient_for(parent);
110   //dialog->set_position(Gtk::WIN_POS_CENTER_ON_PARENT);
111 }
112
113 void NetworkGameSelectorDialog::hide()
114 {
115   dialog->hide();
116 }
117
118 bool NetworkGameSelectorDialog::run()
119 {
120   int response = dialog->run();
121   if (response == Gtk::RESPONSE_ACCEPT)
122     {
123       hide();
124       game_selected.emit(hostname_entry->get_text(), LORDSAWAR_PORT);
125       return true;
126     }
127   else
128     return false;
129 }
130           
131 void NetworkGameSelectorDialog::on_recent_game_selected()
132 {
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]);
138 }
139       
140 void NetworkGameSelectorDialog::on_clear_clicked()
141 {
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();
147 }