Initial commit of the new mp create game dialog.

It's only a prototype and doesn't really work yet.

This dialog uses most features of the widget library so its a main
purpose is to help testing the widgets and develop new widgets.

NOTE so don't use --new-widgets if you want to play a mp game.
This commit is contained in:
Mark de Wever 2008-07-27 07:23:14 +00:00
parent f2cc8199d5
commit 6849efdef3
10 changed files with 894 additions and 16 deletions

View file

@ -0,0 +1,567 @@
###
### Definition of the window to create an MP game. This where the map and it's
### parameters are selected.
###
[window]
id = "mp_create_game"
description = "MP create game dialog."
[resolution]
definition = "default"
automatic_placement = "true"
vertical_placement = "center"
horizontal_placement = "center"
[grid]
# Title
[row]
grow_factor = 0
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
definition = "title"
label = _ "Create Game"
[/label]
[/column]
[/row]
# Name of the game
[row]
grow_factor = 0
[column]
grow_factor = 1
[grid]
[row]
grow_factor = 0
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
definition = "default"
label = _ "Name of game:"
[/label]
[/column]
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "left"
[text_box]
id = "game_name"
definition = "default"
label = _ "Name of game:"
[/text_box]
[/column]
[/row]
[/grid]
[/column]
[/row]
# Main area
[row]
grow_factor = 1
[column]
grow_factor = 1
[grid]
[row]
grow_factor = 1
# minimap
[column]
grow_factor = 0
[grid]
[row]
grow_factor = 0
[column]
grow_factor = 0
# horizontal_grow = "true" FIXME enable
# vertical_grow = "true" FIXME enable
border = "all"
border_size = 5
horizontal_alignment = "left"
[minimap]
id = "minimap"
definition = "default"
[/minimap]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
id = "map_players"
definition = "default"
label = _ "Players: "
[/label]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
id = "map_size"
definition = "default"
label = _ "Map size: "
[/label]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
definition = "default"
label = _ "Era:"
[/label]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[button]
id = "era"
definition = "default"
label = _ "Default"
[/button]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[button]
id = "password"
definition = "default"
label = _ "Set Password"
[/button]
[/column]
[/row]
[/grid]
[/column]
# map listbox
[column]
grow_factor = 1
[grid]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
definition = "default"
label = _ "Map to play:"
[/label]
[/column]
[/row]
[row]
grow_factor = 1
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[listbox]
id = "map_list"
definition = "default"
assume_fixed_row_size = "true"
[list_definition]
[row]
[column]
grow_factor = 1
horizontal_grow = "true"
[toggle_button]
definition = "listbox_text"
return_value = -1
[/toggle_button]
[/column]
[/row]
[/list_definition]
[/listbox]
[/column]
[/row]
[/grid]
[/column]
# settings
[column]
grow_factor = 0
[grid]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[toggle_button]
id = "use_map_settings"
definition = "default"
label = _ "Use map settings"
[/toggle_button]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
definition = "default"
label = _ "Number of turns"
[/label]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[slider]
id = "turn_count"
definition = "default"
minimum_value = 1
maximum_value = 100
step_size = 1
maximum_value_label = _"Unlimited"
[/slider]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
definition = "default"
label = _ "Village gold"
[/label]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[slider]
id = "village_gold"
definition = "default"
minimum_value = 1
maximum_value = 5
step_size = 1
[/slider]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
definition = "default"
label = _ "Experience modifier"
[/label]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[slider]
id = "experience_modifier"
definition = "default"
# the values should all be times 10
minimum_value = 3
maximum_value = 20
step_size = 1
[/slider]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[toggle_button]
id = "fog"
definition = "default"
label = _ "Fog of War"
[/toggle_button]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[toggle_button]
id = "shroud"
definition = "default"
label = _ "Shroud"
[/toggle_button]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[toggle_button]
id = "random_start_time"
definition = "default"
label = _ "Random start time"
[/toggle_button]
[/column]
[/row]
[/grid]
[/column]
[/row]
[/grid]
[/column]
[/row]
# button bar
[row]
grow_factor = 0
[column]
grow_factor = 1
[grid]
[row]
grow_factor = 0
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "right"
[button]
id = "ok"
definition = "default"
label = _ "Create game"
[/button]
[/column]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[button]
id = "cancel"
definition = "default"
label = _ "Cancel"
[/button]
[/column]
[/row]
[/grid]
[/column]
[/row]
[/grid]
[/resolution]
[/window]

View file

@ -8,6 +8,7 @@ src/gui/dialogs/addon_connect.cpp
src/gui/dialogs/dialog.cpp
src/gui/dialogs/language_selection.cpp
src/gui/dialogs/mp_connect.cpp
src/gui/dialogs/mp_create_game.cpp
src/gui/dialogs/mp_method_selection.cpp
src/gui/widgets/button.cpp
src/gui/widgets/canvas.cpp

View file

@ -228,6 +228,7 @@ SET(wesnoth-main_SRC
gui/dialogs/dialog.cpp
gui/dialogs/language_selection.cpp
gui/dialogs/mp_connect.cpp
gui/dialogs/mp_create_game.cpp
gui/dialogs/mp_method_selection.cpp
gui/widgets/button.cpp
gui/widgets/canvas.cpp

View file

@ -75,6 +75,7 @@ wesnoth_source = \
gui/dialogs/dialog.cpp \
gui/dialogs/language_selection.cpp \
gui/dialogs/mp_connect.cpp \
gui/dialogs/mp_create_game.cpp \
gui/dialogs/mp_method_selection.cpp \
gui/widgets/button.cpp \
gui/widgets/canvas.cpp \

View file

@ -202,6 +202,7 @@ wesnoth_sources = Split("""
gui/dialogs/dialog.cpp
gui/dialogs/language_selection.cpp
gui/dialogs/mp_connect.cpp
gui/dialogs/mp_create_game.cpp
gui/dialogs/mp_method_selection.cpp
gui/widgets/button.cpp
gui/widgets/canvas.cpp

View file

@ -0,0 +1,219 @@
/* $Id$ */
/*
copyright (c) 2008 by mark de wever <koraq@xs4all.nl>
part of the battle for wesnoth project http://www.wesnoth.org/
this program is free software; you can redistribute it and/or modify
it under the terms of the gnu general public license version 2
or at your option any later version.
this program is distributed in the hope that it will be useful,
but without any warranty.
see the copying file for more details.
*/
#include "gui/dialogs/mp_create_game.hpp"
#include "filesystem.hpp"
#include "foreach.hpp"
#include "game_config.hpp"
#include "game_preferences.hpp"
#include "gettext.hpp"
#include "gui/dialogs/dialog.hpp"
#include "gui/dialogs/field.hpp"
#include "gui/widgets/button.hpp"
#include "gui/widgets/listbox.hpp"
#include "gui/widgets/minimap.hpp"
#include "gui/widgets/widget.hpp"
#include "gui/widgets/window.hpp"
#include "gui/widgets/window_builder.hpp"
#include "gui/widgets/settings.hpp"
#include "gui/widgets/text_box.hpp"
#include "log.hpp"
#include "../../settings.hpp"
#include "video.hpp"
#include "wml_exception.hpp"
#define DBG_GUI LOG_STREAM_INDENT(debug, widget)
#define LOG_GUI LOG_STREAM_INDENT(info, widget)
#define WRN_GUI LOG_STREAM_INDENT(warn, widget)
#define ERR_GUI LOG_STREAM_INDENT(err, widget)
namespace gui2 {
static void callback_use_map_settings(twidget* caller)
{
tmp_create_game* dialog = dynamic_cast<tmp_create_game*>(caller->dialog());
assert(dialog);
twindow* window = dynamic_cast<twindow*>(caller->get_window());
assert(window);
dialog->update_map_settings(*window);
}
static void callback_select_list_item(twidget* caller)
{
tmp_create_game* dialog = dynamic_cast<tmp_create_game*>(caller->dialog());
assert(dialog);
twindow* window = dynamic_cast<twindow*>(caller->get_window());
assert(window);
dialog->update_map(*window);
}
tmp_create_game::tmp_create_game(const config& cfg) :
cfg_(cfg),
scenario_(NULL),
use_map_settings_(register_bool("use_map_settings", false,
preferences::use_map_settings,
preferences::set_use_map_settings,
callback_use_map_settings)),
fog_(register_bool("fog", false,
preferences::fog,
preferences::set_fog)),
shroud_(register_bool("shroud", false,
preferences::shroud,
preferences::set_shroud)),
start_time_(register_bool("random_start_time", false,
preferences::random_start_time,
preferences::set_random_start_time)),
turns_(register_integer("turn_count", false,
preferences::turns ,
preferences::set_turns)),
gold_(register_integer("village_gold", false,
preferences::village_gold ,
preferences::set_village_gold)),
experience_(register_integer("experience_modifier", false,
preferences::xp_modifier ,
preferences::set_xp_modifier))
{
}
twindow tmp_create_game::build_window(CVideo& video)
{
return build(video, get_id(MP_CREATE_GAME));
}
void tmp_create_game::pre_show(CVideo& /*video*/, twindow& window)
{
tminimap* minimap = dynamic_cast<tminimap*>(window.find_widget("minimap", false));
VALIDATE(minimap, missing_widget("minimap"));
minimap->set_config(&cfg_);
tlistbox* list = dynamic_cast<tlistbox*>(window.find_widget("map_list", false));
VALIDATE(list, missing_widget("map_list"));
list->set_callback_value_change(callback_select_list_item);
// Load option (might turn it into a button later).
std::map<std::string, t_string> item;
item.insert(std::make_pair("label", _("Load Game")));
item.insert(std::make_pair("tooltip", _("Load Game...")));
list->add_row(item);
// User maps
/* FIXME implement user maps
std::vector<std::string> maps;
get_files_in_dir(get_user_data_dir() + "/editor/maps", &maps, NULL, FILE_NAME_ONLY);
foreach(const std::string& map, maps) {
std::map<std::string, t_string> item;
item.insert(std::make_pair("label", map));
list->add_row(item);
}
*/
// Standard maps
int i = 0;
foreach(const config* map, cfg_.get_children("multiplayer")) {
if(utils::string_bool((*map)["allow_new_game"], true)) {
std::map<std::string, t_string> item;
item.insert(std::make_pair("label", (*map)["name"]));
item.insert(std::make_pair("tooltip", (*map)["name"]));
list->add_row(item);
// This hack is needed since the resize code can't handle this
// window properly, it has 3 columns which seems to fail in the
// resize code.
if(++i == 10) {
break;
}
}
}
update_map_settings(window);
window.recalculate_size();
}
void tmp_create_game::post_show(twindow& window)
{
if(get_retval() == tbutton::OK) {
tlistbox* list = dynamic_cast<tlistbox*>(window.find_widget("map_list", false));
assert(list);
}
}
void tmp_create_game::update_map(twindow& window)
{
tlistbox* list = dynamic_cast<tlistbox*>(window.find_widget("map_list", false));
VALIDATE(list, missing_widget("map_list"));
tminimap* minimap = dynamic_cast<tminimap*>(window.find_widget("minimap", false));
VALIDATE(list, missing_widget("minimap"));
const int index = list->get_selected_row() - 1;
if(index >= 0) {
scenario_ = cfg_.get_children("multiplayer")[index];
minimap->set_map_data((*scenario_)["map_data"]);
} else {
minimap->set_map_data("");
scenario_ = NULL;
}
update_map_settings(window);
}
void tmp_create_game::update_map_settings(twindow& window)
{
const bool use_map_settings = use_map_settings_->get_value(window);
fog_->widget_set_enabled(window, !use_map_settings, false);
shroud_->widget_set_enabled(window, !use_map_settings, false);
start_time_->widget_set_enabled(window, !use_map_settings, false);
turns_->widget_set_enabled(window, !use_map_settings, false);
gold_->widget_set_enabled(window, !use_map_settings, false);
experience_->widget_set_enabled(window, !use_map_settings, false);
if(use_map_settings) {
if(scenario_) {
fog_->set_value(window, ::settings::use_fog((*(*scenario_).get_children("side").front())["fog"]));
shroud_->set_value(window, ::settings::use_shroud((*(*scenario_).get_children("side").front())["shroud"]));
start_time_->set_value(window, ::settings::use_random_start_time((*scenario_)["random_start_time"]));
turns_->set_value(window, ::settings::get_turns((*scenario_)["turns"]));
gold_->set_value(window, ::settings::get_village_gold((*(*scenario_).get_children("side").front())["village_gold"]));
experience_->set_value(window, ::settings::get_xp_modifier((*scenario_)["experience_modifier"]));
}
// No scenario selected just leave the state unchanged for now.
} else {
// Fixme we should store the value and reuse it later...
fog_->set_value(window, preferences::fog());
shroud_->set_value(window, preferences::shroud());
start_time_->set_value(window, preferences::random_start_time());
turns_->set_value(window, preferences::turns());
gold_->set_value(window, preferences::village_gold());
experience_->set_value(window, preferences::xp_modifier());
}
}
} // namespace gui2

View file

@ -0,0 +1,75 @@
/* $Id$ */
/*
copyright (c) 2008 by mark de wever <koraq@xs4all.nl>
part of the battle for wesnoth project http://www.wesnoth.org/
this program is free software; you can redistribute it and/or modify
it under the terms of the gnu general public license version 2
or at your option any later version.
this program is distributed in the hope that it will be useful,
but without any warranty.
see the copying file for more details.
*/
#ifndef GUI_DIALOGS_MP_CREATE_GAME_HPP_INCLUDED
#define GUI_DIALOGS_MP_CREATE_GAME_HPP_INCLUDED
#include "gui/dialogs/dialog.hpp"
class config;
namespace gui2 {
class twidget;
class ttext_box;
class tmp_create_game : public tdialog
{
public:
tmp_create_game(const config& cfg);
private:
/** Inherited from tdialog. */
twindow build_window(CVideo& video);
/** Inherited from tdialog. */
void pre_show(CVideo& video, twindow& window);
/** Inherited from tdialog. */
void post_show(twindow& window);
const config& cfg_;
const config* scenario_;
/**
* All fields are also in the normal field vector, but they need to be
* manually controled as well so add the pointers here as well.
*/
tfield_bool
*use_map_settings_,
*fog_,
*shroud_,
*start_time_;
tfield_integer
*turns_,
*gold_,
*experience_;
public:
// another map selected
void update_map(twindow& window);
// use_map_settings toggled (also called in other cases.)
void update_map_settings(twindow& window);
};
} // namespace gui2
#endif

View file

@ -87,6 +87,7 @@ static void fill_window_types()
window_type_list[MP_CONNECT] = "mp_connect";
window_type_list[MP_METHOD_SELECTION] = "mp_method_selection";
window_type_list[MP_SERVER_LIST] = "mp_server_list";
window_type_list[MP_CREATE_GAME] = "mp_create_game";
#ifdef USE_EDITOR2
window_type_list[EDITOR_NEW_MAP] = "editor_new_map";
#endif

View file

@ -40,6 +40,7 @@ enum twindow_type {
MP_METHOD_SELECTION, //<! The dialog which allows you to choose the kind
//! mp game the user wants to play.
MP_SERVER_LIST, //<! The mp server list dialog.
MP_CREATE_GAME, /**< The mp creation dialog. */
#ifdef USE_EDITOR2
EDITOR_NEW_MAP, //<! New map dialog
#endif

View file

@ -19,6 +19,7 @@
#include "game_config.hpp"
#include "gettext.hpp"
#include "gui/dialogs/mp_connect.hpp"
#include "gui/dialogs/mp_create_game.hpp"
#include "gui/widgets/button.hpp"
#include "log.hpp"
#include "multiplayer.hpp"
@ -400,25 +401,35 @@ static void enter_connect_mode(game_display& disp, const config& game_config,
static void enter_create_mode(game_display& disp, const config& game_config, mp::chat& chat, config& gamelist, mp::controller default_controller, bool is_server)
{
mp::ui::result res;
mp::create::parameters params;
if(gui2::new_widgets) {
{
mp::create ui(disp, game_config, chat, gamelist);
run_lobby_loop(disp, ui);
res = ui.get_result();
params = ui.get_parameters();
}
gui2::tmp_create_game dlg(game_config);
dlg.show(disp.video());
switch (res) {
case mp::ui::CREATE:
enter_connect_mode(disp, game_config, chat, gamelist, params, default_controller, is_server);
break;
case mp::ui::QUIT:
default:
//update lobby content
network::send_data(config("refresh_lobby"), 0, true);
break;
} else {
mp::ui::result res;
mp::create::parameters params;
{
mp::create ui(disp, game_config, chat, gamelist);
run_lobby_loop(disp, ui);
res = ui.get_result();
params = ui.get_parameters();
}
switch (res) {
case mp::ui::CREATE:
enter_connect_mode(disp, game_config, chat, gamelist, params, default_controller, is_server);
break;
case mp::ui::QUIT:
default:
//update lobby content
network::send_data(config("refresh_lobby"), 0, true);
break;
}
}
}