Initial implementation of GUI2 MP Staging dialog (Connect + Wait)
This commit is contained in:
parent
8609955b74
commit
9721910d98
12 changed files with 1107 additions and 0 deletions
|
@ -415,6 +415,12 @@
|
|||
"icons/action/help_30"
|
||||
}
|
||||
|
||||
{_GUI_DEFINITION_MINIMAL 30
|
||||
"minimal_arrow"
|
||||
"Minimal arrow button"
|
||||
"icons/arrows/double_arrow_right_30"
|
||||
}
|
||||
|
||||
#undef _GUI_DEFINITION
|
||||
#undef _GUI_DEFINITION_MINIMAL
|
||||
#undef _GUI_RESOLUTION
|
||||
|
|
670
data/gui/window/mp_staging.cfg
Normal file
670
data/gui/window/mp_staging.cfg
Normal file
|
@ -0,0 +1,670 @@
|
|||
#textdomain wesnoth-lib
|
||||
###
|
||||
### Definition of the mp game staging screen
|
||||
###
|
||||
|
||||
#define _GUI_SIDE_LIST
|
||||
[listbox]
|
||||
id = "side_list"
|
||||
definition = "default"
|
||||
|
||||
vertical_scrollbar_mode = "always"
|
||||
horizontal_scrollbar_mode = "auto"
|
||||
|
||||
[header]
|
||||
|
||||
[row]
|
||||
grow_factor = 1
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
horizontal_alignment = "left"
|
||||
border = "all"
|
||||
border_size = 10
|
||||
|
||||
[spacer]
|
||||
definition = "default"
|
||||
linked_group = "side_number"
|
||||
[/spacer]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 1
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_alignment = "left"
|
||||
|
||||
[label]
|
||||
definition = "default"
|
||||
label = _ "Leader"
|
||||
linked_group = "leader"
|
||||
[/label]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_alignment = "left"
|
||||
|
||||
[label]
|
||||
definition = "default"
|
||||
label = _ "Player/Type"
|
||||
linked_group = "controller"
|
||||
[/label]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_alignment = "left"
|
||||
|
||||
[label]
|
||||
definition = "default"
|
||||
label = _ "Team/Color"
|
||||
linked_group = "team_and_color"
|
||||
[/label]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_alignment = "left"
|
||||
|
||||
[label]
|
||||
definition = "default"
|
||||
label = _ "Gold/Income"
|
||||
linked_group = "gold_and_income"
|
||||
[/label]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/header]
|
||||
|
||||
[list_definition]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
horizontal_grow = "true"
|
||||
|
||||
[toggle_panel]
|
||||
id = "panel"
|
||||
definition = "default"
|
||||
|
||||
[grid]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
border = "all"
|
||||
border_size = 10
|
||||
horizontal_grow = "true"
|
||||
vertical_alignment = "top"
|
||||
|
||||
[label]
|
||||
id = "side_number"
|
||||
definition = "default_large"
|
||||
linked_group = "side_number"
|
||||
[/label]
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
vertical_alignment = "center"
|
||||
|
||||
[button]
|
||||
id = "select_leader"
|
||||
definition = "minimal_arrow"
|
||||
[/button]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 1
|
||||
horizontal_grow = "true"
|
||||
#vertical_grow = "true"
|
||||
|
||||
[grid]
|
||||
linked_group = "leader"
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
horizontal_grow = "true"
|
||||
border = "all"
|
||||
border_size = 5
|
||||
|
||||
[image]
|
||||
id = "leader_image"
|
||||
definition = "default"
|
||||
[/image]
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 1
|
||||
horizontal_grow = "true"
|
||||
vertical_grow = "true"
|
||||
|
||||
[grid]
|
||||
|
||||
[row]
|
||||
grow_factor = 1
|
||||
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_grow = "true"
|
||||
vertical_grow = "true"
|
||||
|
||||
[label]
|
||||
id = "leader_type"
|
||||
definition = "default_large"
|
||||
[/label]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[row]
|
||||
grow_factor = 0
|
||||
|
||||
[column]
|
||||
horizontal_grow = "true"
|
||||
#vertical_grow = "true"
|
||||
|
||||
[grid]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
border = "left,bottom"
|
||||
border_size = 5
|
||||
|
||||
[label]
|
||||
definition = "default"
|
||||
label = _ "<b>Faction:</b>"
|
||||
use_markup = "true"
|
||||
[/label]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 1
|
||||
border = "left,bottom,right"
|
||||
border_size = 5
|
||||
horizontal_grow = "true"
|
||||
vertical_grow = "true"
|
||||
|
||||
[label]
|
||||
id = "leader_faction"
|
||||
definition = "default"
|
||||
[/label]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
border = "left,bottom"
|
||||
border_size = 5
|
||||
|
||||
[label]
|
||||
definition = "default"
|
||||
label = _ "<b>Gender:</b>"
|
||||
use_markup = "true"
|
||||
[/label]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 1
|
||||
border = "left,bottom,right"
|
||||
border_size = 5
|
||||
horizontal_grow = "true"
|
||||
vertical_grow = "true"
|
||||
|
||||
[image]
|
||||
id = "leader_gender"
|
||||
definition = "default"
|
||||
[/image]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
horizontal_grow = "true"
|
||||
|
||||
[grid]
|
||||
linked_group = "controller"
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_grow = "true"
|
||||
|
||||
[menu_button]
|
||||
id = "controller"
|
||||
definition = "default"
|
||||
[/menu_button]
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_grow = "true"
|
||||
|
||||
[menu_button]
|
||||
id = "ai_controller"
|
||||
definition = "default"
|
||||
[/menu_button]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
|
||||
[grid]
|
||||
linked_group = "team_and_color"
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_grow = "true"
|
||||
|
||||
[menu_button]
|
||||
id = "side_team"
|
||||
definition = "default"
|
||||
[/menu_button]
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_grow = "true"
|
||||
|
||||
[menu_button]
|
||||
id = "side_color"
|
||||
definition = "default"
|
||||
[/menu_button]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
|
||||
[grid]
|
||||
linked_group = "gold_and_income"
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_grow = "true"
|
||||
|
||||
[slider]
|
||||
id = "side_gold_slider"
|
||||
definition = "short"
|
||||
|
||||
# TODO: the GUI1 dialog had a min of 20, but that meant the slider was never reaching max...
|
||||
minimum_value = 25
|
||||
maximum_value = 800
|
||||
step_size = 25
|
||||
[/slider]
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_grow = "true"
|
||||
|
||||
[slider]
|
||||
id = "side_income_slider"
|
||||
definition = "short"
|
||||
|
||||
minimum_value = -2
|
||||
maximum_value = 18
|
||||
step_size = 1
|
||||
[/slider]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/toggle_panel]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/list_definition]
|
||||
|
||||
[/listbox]
|
||||
#enddef
|
||||
|
||||
#define _GUI_CONTROL_AREA
|
||||
#[grid]
|
||||
|
||||
# [row]
|
||||
# grow_factor = 1
|
||||
|
||||
# [column]
|
||||
# border = "all"
|
||||
# border_size = 5
|
||||
# horizontal_grow = "true"
|
||||
# vertical_grow = "true"
|
||||
|
||||
[listbox]
|
||||
id = "player_list"
|
||||
definition = "default"
|
||||
|
||||
vertical_scrollbar_mode = "always"
|
||||
horizontal_scrollbar_mode = "never"
|
||||
|
||||
[list_definition]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
horizontal_grow = "true"
|
||||
|
||||
[toggle_panel]
|
||||
id = "panel"
|
||||
definition = "default"
|
||||
|
||||
[grid]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
horizontal_grow = "true"
|
||||
|
||||
[label]
|
||||
id = "player_name"
|
||||
definition = "default"
|
||||
[/label]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/toggle_panel]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/list_definition]
|
||||
|
||||
[/listbox]
|
||||
|
||||
# [/column]
|
||||
# [/row]
|
||||
|
||||
#[/grid]
|
||||
#enddef
|
||||
|
||||
[window]
|
||||
id = "mp_staging"
|
||||
description = "Game staging area."
|
||||
|
||||
[resolution]
|
||||
definition = "borderless"
|
||||
|
||||
{GUI_WINDOW_FULLSCREEN}
|
||||
|
||||
[linked_group]
|
||||
id = "side_number"
|
||||
fixed_width = "true"
|
||||
[/linked_group]
|
||||
|
||||
[linked_group]
|
||||
id = "controller"
|
||||
fixed_width = "true"
|
||||
[/linked_group]
|
||||
|
||||
[linked_group]
|
||||
id = "leader"
|
||||
fixed_width = "true"
|
||||
[/linked_group]
|
||||
|
||||
[linked_group]
|
||||
id = "team_and_color"
|
||||
fixed_width = "true"
|
||||
[/linked_group]
|
||||
|
||||
[linked_group]
|
||||
id = "gold_and_income"
|
||||
fixed_width = "true"
|
||||
[/linked_group]
|
||||
|
||||
[tooltip]
|
||||
id = "tooltip"
|
||||
[/tooltip]
|
||||
|
||||
[helptip]
|
||||
id = "tooltip"
|
||||
[/helptip]
|
||||
|
||||
[grid]
|
||||
|
||||
[row]
|
||||
grow_factor = 0
|
||||
|
||||
[column]
|
||||
grow_factor = 1
|
||||
horizontal_alignment = "left"
|
||||
border = "all"
|
||||
border_size = 5
|
||||
|
||||
[label]
|
||||
id = "title"
|
||||
definition = "title"
|
||||
label = _ "Game Lobby"
|
||||
[/label]
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[row]
|
||||
grow_factor = 1
|
||||
|
||||
[column]
|
||||
horizontal_grow = "true"
|
||||
vertical_grow = "true"
|
||||
|
||||
[grid]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
grow_factor = 1
|
||||
vertical_grow = "true"
|
||||
horizontal_grow = "true"
|
||||
|
||||
[grid]
|
||||
|
||||
[row]
|
||||
grow_factor = 1
|
||||
|
||||
[column]
|
||||
horizontal_grow = "true"
|
||||
vertical_grow = "true"
|
||||
|
||||
{GUI_FORCE_WIDGET_MINIMUM_SIZE 0 "((screen_height * 55) / 100)" (
|
||||
border = "all"
|
||||
border_size = 5
|
||||
{_GUI_SIDE_LIST}
|
||||
)}
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
{GUI_HORIZONTAL_SPACER_LINE}
|
||||
|
||||
[row]
|
||||
grow_factor = 0
|
||||
|
||||
[column]
|
||||
horizontal_grow = "true"
|
||||
vertical_grow = "true"
|
||||
|
||||
{GUI_FORCE_WIDGET_MINIMUM_SIZE 0 "((screen_height * 25 / 100))" (
|
||||
[chatbox]
|
||||
id = "chat"
|
||||
[/chatbox]
|
||||
)}
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
horizontal_grow = "true"
|
||||
vertical_grow = "true"
|
||||
|
||||
{_GUI_CONTROL_AREA}
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[row]
|
||||
grow_factor = 0
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
|
||||
[spacer][/spacer]
|
||||
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
grow_factor = 0
|
||||
horizontal_grow = "true"
|
||||
|
||||
[grid]
|
||||
|
||||
[row]
|
||||
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
|
||||
[button]
|
||||
id = "ok"
|
||||
definition = "default"
|
||||
label = _ "I’m Ready"
|
||||
[/button]
|
||||
[/column]
|
||||
|
||||
[column]
|
||||
border = "all"
|
||||
border_size = 5
|
||||
|
||||
[button]
|
||||
id = "cancel"
|
||||
definition = "default"
|
||||
label = _ "Cancel"
|
||||
[/button]
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
|
||||
[/grid]
|
||||
|
||||
[/column]
|
||||
|
||||
[/row]
|
||||
|
||||
[/grid]
|
||||
|
||||
[/resolution]
|
||||
|
||||
[/window]
|
||||
|
||||
#undef _GUI_CONTROL_AREA
|
||||
#undef _GUI_SIDE_LIST
|
BIN
images/icons/arrows/double_arrow_right_30-active.png
Normal file
BIN
images/icons/arrows/double_arrow_right_30-active.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 447 B |
BIN
images/icons/arrows/double_arrow_right_30-pressed.png
Normal file
BIN
images/icons/arrows/double_arrow_right_30-pressed.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 419 B |
BIN
images/icons/arrows/double_arrow_right_30.png
Normal file
BIN
images/icons/arrows/double_arrow_right_30.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 423 B |
|
@ -615,6 +615,8 @@
|
|||
<Unit filename="../../src/gui/dialogs/multiplayer/mp_method_selection.hpp" />
|
||||
<Unit filename="../../src/gui/dialogs/multiplayer/mp_options_helper.cpp" />
|
||||
<Unit filename="../../src/gui/dialogs/multiplayer/mp_options_helper.hpp" />
|
||||
<Unit filename="../../src/gui/dialogs/multiplayer/mp_staging.cpp" />
|
||||
<Unit filename="../../src/gui/dialogs/multiplayer/mp_staging.hpp" />
|
||||
<Unit filename="../../src/gui/dialogs/multiplayer/synced_choice_wait.cpp" />
|
||||
<Unit filename="../../src/gui/dialogs/multiplayer/synced_choice_wait.hpp" />
|
||||
<Unit filename="../../src/gui/dialogs/network_transmission.cpp" />
|
||||
|
|
|
@ -834,6 +834,7 @@ set(wesnoth-main_SRC
|
|||
gui/dialogs/multiplayer/mp_login.cpp
|
||||
gui/dialogs/multiplayer/mp_method_selection.cpp
|
||||
gui/dialogs/multiplayer/mp_options_helper.cpp
|
||||
gui/dialogs/multiplayer/mp_staging.cpp
|
||||
gui/dialogs/network_transmission.cpp
|
||||
gui/dialogs/popup.cpp
|
||||
gui/dialogs/preferences_dialog.cpp
|
||||
|
|
|
@ -409,6 +409,7 @@ wesnoth_sources = Split("""
|
|||
gui/dialogs/multiplayer/mp_login.cpp
|
||||
gui/dialogs/multiplayer/mp_method_selection.cpp
|
||||
gui/dialogs/multiplayer/mp_options_helper.cpp
|
||||
gui/dialogs/multiplayer/mp_staging.cpp
|
||||
gui/dialogs/multiplayer/synced_choice_wait.cpp
|
||||
gui/dialogs/network_transmission.cpp
|
||||
gui/dialogs/popup.cpp
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "gui/dialogs/multiplayer/mp_connect.hpp"
|
||||
#include "gui/dialogs/multiplayer/mp_create_game.hpp"
|
||||
#include "gui/dialogs/multiplayer/mp_login.hpp"
|
||||
#include "gui/dialogs/multiplayer/mp_staging.hpp"
|
||||
#include "gui/dialogs/network_transmission.hpp"
|
||||
#include "gui/dialogs/preferences_dialog.hpp"
|
||||
#include "gui/widgets/settings.hpp"
|
||||
|
@ -474,6 +475,23 @@ static bool enter_connect_mode(CVideo& video, const config& game_config,
|
|||
|
||||
{
|
||||
ng::connect_engine_ptr connect_engine(new ng::connect_engine(state, true, campaign_info.get()));
|
||||
|
||||
if(preferences::new_lobby()) {
|
||||
gui2::tmp_staging dlg(game_config, *connect_engine);
|
||||
dlg.show(video);
|
||||
|
||||
if(dlg.get_retval() == gui2::twindow::OK) {
|
||||
campaign_controller controller(video, state, game_config, game_config_manager::get()->terrain_types());
|
||||
controller.set_mp_info(campaign_info.get());
|
||||
controller.play_game();
|
||||
if(wesnothd_connection) {
|
||||
wesnothd_connection->send_data(config("leave_game"));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
mp::connect ui(video, wesnothd_connection, state.mp_settings().name, game_config, gamechat, gamelist,
|
||||
*connect_engine);
|
||||
run_lobby_loop(video, ui);
|
||||
|
|
337
src/gui/dialogs/multiplayer/mp_staging.cpp
Normal file
337
src/gui/dialogs/multiplayer/mp_staging.cpp
Normal file
|
@ -0,0 +1,337 @@
|
|||
/*
|
||||
Copyright (C) 2008 - 2016 by 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 as published by
|
||||
the Free Software Foundation; either version 2 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.
|
||||
|
||||
See the COPYING file for more details.
|
||||
*/
|
||||
|
||||
#define GETTEXT_DOMAIN "wesnoth-lib"
|
||||
|
||||
#include "gui/dialogs/multiplayer/mp_staging.hpp"
|
||||
|
||||
#include "config_assign.hpp"
|
||||
#include "game_preferences.hpp"
|
||||
#include "gettext.hpp"
|
||||
#include "gui/auxiliary/field.hpp"
|
||||
#include "gui/dialogs/helper.hpp"
|
||||
#include "gui/dialogs/message.hpp"
|
||||
#include "gui/dialogs/multiplayer/faction_select.hpp"
|
||||
#include "gui/dialogs/transient_message.hpp"
|
||||
#include "gui/widgets/integer_selector.hpp"
|
||||
#include "gui/widgets/button.hpp"
|
||||
#include "gui/widgets/chatbox.hpp"
|
||||
#include "gui/widgets/menu_button.hpp"
|
||||
#include "gui/widgets/image.hpp"
|
||||
#ifdef GUI2_EXPERIMENTAL_LISTBOX
|
||||
#include "gui/widgets/list.hpp"
|
||||
#else
|
||||
#include "gui/widgets/listbox.hpp"
|
||||
#endif
|
||||
#include "gui/widgets/minimap.hpp"
|
||||
#include "gui/widgets/settings.hpp"
|
||||
#include "gui/widgets/label.hpp"
|
||||
#include "gui/widgets/slider.hpp"
|
||||
#include "gui/widgets/stacked_widget.hpp"
|
||||
#include "gui/widgets/status_label_helper.hpp"
|
||||
#include "gui/widgets/toggle_button.hpp"
|
||||
#include "gui/widgets/toggle_panel.hpp"
|
||||
#include "gui/widgets/text_box.hpp"
|
||||
#include "game_config.hpp"
|
||||
#include "savegame.hpp"
|
||||
#include "settings.hpp"
|
||||
#include "units/types.hpp"
|
||||
#include "formatter.hpp"
|
||||
|
||||
#ifdef GUI2_EXPERIMENTAL_LISTBOX
|
||||
#include "utils/functional.hpp"
|
||||
#endif
|
||||
|
||||
#include <boost/algorithm/string.hpp>
|
||||
|
||||
namespace gui2
|
||||
{
|
||||
|
||||
// FIXME: doesn't show properly...
|
||||
//static const std::string male = "♂";
|
||||
//static const std::string female = "♀";
|
||||
|
||||
static const std::string male = "(M)";
|
||||
static const std::string female = "(F)";
|
||||
|
||||
REGISTER_DIALOG(mp_staging)
|
||||
|
||||
tmp_staging::tmp_staging(const config& /*cfg*/, ng::connect_engine& connect_engine)
|
||||
: connect_engine_(connect_engine)
|
||||
, ai_algorithms_(ai::configuration::get_available_ais())
|
||||
{
|
||||
//ai_algorithms_ = ai::configuration::get_available_ais();
|
||||
}
|
||||
|
||||
void tmp_staging::pre_show(twindow& window)
|
||||
{
|
||||
window.set_enter_disabled(true);
|
||||
|
||||
//
|
||||
// Set title
|
||||
//
|
||||
tlabel& title = find_widget<tlabel>(&window, "title", false);
|
||||
title.set_label((formatter() << title.label() << " " << utils::unicode_em_dash << " " << connect_engine_.scenario()["name"].t_str()).str());
|
||||
|
||||
//
|
||||
// Set up sides list
|
||||
//
|
||||
tlistbox& list = find_widget<tlistbox>(&window, "side_list", false);
|
||||
|
||||
window.keyboard_capture(&list);
|
||||
|
||||
for(const auto& side_ptr : connect_engine_.side_engines()) {
|
||||
// Shorthand variable
|
||||
ng::side_engine& side = *side_ptr.get();
|
||||
|
||||
if(!side.allow_player() && !game_config::debug) {
|
||||
continue;
|
||||
}
|
||||
|
||||
std::map<std::string, string_map> data;
|
||||
string_map item;
|
||||
|
||||
item["label"] = std::to_string(side.index() + 1);
|
||||
data.emplace("side_number", item);
|
||||
|
||||
// TODO: don't hardcode meganta?
|
||||
item["label"] = "units/unknown-unit.png~RC(magenta>" + std::to_string(side.color() + 1) + ")";
|
||||
data.emplace("leader_image", item);
|
||||
|
||||
item["label"] = "icons/icon-random.png";
|
||||
data.emplace("leader_gender", item);
|
||||
|
||||
tgrid& row_grid = list.add_row(data);
|
||||
|
||||
update_leader_display(side, row_grid);
|
||||
|
||||
// Status variables
|
||||
const bool fls = connect_engine_.force_lock_settings();
|
||||
const bool ums = connect_engine_.params().use_map_settings;
|
||||
|
||||
const bool lock_gold = side.cfg()["gold_lock"].to_bool(fls);
|
||||
const bool lock_income = side.cfg()["income_lock"].to_bool(fls);
|
||||
const bool lock_team = side.cfg()["team_lock"].to_bool(fls);
|
||||
const bool lock_color = side.cfg()["color_lock"].to_bool(fls);
|
||||
|
||||
const bool saved_game = connect_engine_.params().saved_game;
|
||||
|
||||
//
|
||||
// AI Algorithm
|
||||
//
|
||||
assert(!ai_algorithms_.empty());
|
||||
|
||||
int selection = 0;
|
||||
|
||||
// We use an index-based loop in order to get the index of the selected option
|
||||
std::vector<config> ai_options;
|
||||
for(unsigned i = 0; i < ai_algorithms_.size(); i++) {
|
||||
ai_options.push_back(config_of("label", ai_algorithms_[i]->text));
|
||||
|
||||
if(ai_algorithms_[i]->id == side.ai_algorithm()) {
|
||||
selection = i;
|
||||
}
|
||||
}
|
||||
|
||||
tmenu_button& ai_selection = find_widget<tmenu_button>(&row_grid, "ai_controller", false);
|
||||
|
||||
ai_selection.set_values(ai_options, selection);
|
||||
ai_selection.connect_click_handler(std::bind(&tmp_staging::on_ai_select, this, std::ref(side), std::ref(ai_selection)));
|
||||
|
||||
on_ai_select(side, ai_selection);
|
||||
|
||||
//
|
||||
// Controller
|
||||
//
|
||||
std::vector<config> controller_names;
|
||||
for(const auto& controller : side.controller_options()) {
|
||||
controller_names.push_back(config_of("label", controller.second));
|
||||
}
|
||||
|
||||
tmenu_button& controller_selection = find_widget<tmenu_button>(&row_grid, "controller", false);
|
||||
|
||||
controller_selection.set_values(controller_names, side.current_controller_index());
|
||||
controller_selection.set_active(side.controller_options().size() > 1);
|
||||
controller_selection.connect_click_handler(std::bind(&tmp_staging::on_controller_select, this, std::ref(side), std::ref(row_grid)));
|
||||
|
||||
on_controller_select(side, row_grid);
|
||||
|
||||
//
|
||||
// Leader controls
|
||||
//
|
||||
connect_signal_mouse_left_click(
|
||||
find_widget<tbutton>(&row_grid, "select_leader", false),
|
||||
std::bind(&tmp_staging::select_leader_callback, this, std::ref(window), std::ref(side), std::ref(row_grid)));
|
||||
|
||||
//
|
||||
// Team
|
||||
//
|
||||
std::vector<config> team_names;
|
||||
for(const auto& team : side.player_teams()) {
|
||||
team_names.push_back(config_of("label", team));
|
||||
}
|
||||
|
||||
tmenu_button& team_selection = find_widget<tmenu_button>(&row_grid, "side_team", false);
|
||||
|
||||
team_selection.set_values(team_names, side.team());
|
||||
team_selection.set_active(!saved_game);
|
||||
|
||||
//
|
||||
// Colors
|
||||
//
|
||||
std::vector<config> color_options;
|
||||
for(const auto& color : side.get_colors()) {
|
||||
// BIG FAT TODO: get rid of the hardcoded GUI1 formatting and do something about this hideous string manipulation
|
||||
const std::string c = color.substr(color.find_first_of(">") + 1);
|
||||
std::string cid = c;
|
||||
cid[0] = std::tolower(cid[0]);
|
||||
|
||||
color_options.push_back(config_of
|
||||
("label", c)
|
||||
("icon", (formatter() << "misc/status.png~RC(magenta>" << cid << ")").str())
|
||||
);
|
||||
}
|
||||
|
||||
tmenu_button& color_selection = find_widget<tmenu_button>(&row_grid, "side_color", false);
|
||||
|
||||
color_selection.set_values(color_options, side.color());
|
||||
color_selection.set_active(!saved_game);
|
||||
|
||||
//
|
||||
// Gold and Income
|
||||
//
|
||||
tslider& slider_gold = find_widget<tslider>(&row_grid, "side_gold_slider", false);
|
||||
slider_gold.set_value(side.cfg()["gold"].to_int(100));
|
||||
|
||||
connect_signal_notify_modified(slider_gold, std::bind([&]() { side.set_gold(slider_gold.get_value()); }));
|
||||
|
||||
tslider& slider_income = find_widget<tslider>(&row_grid, "side_income_slider", false);
|
||||
slider_income.set_value(side.cfg()["income"]);
|
||||
|
||||
connect_signal_notify_modified(slider_income, std::bind([&]() { side.set_income(slider_income.get_value()); }));
|
||||
|
||||
// TODO: hide header, or maybe display the saved values
|
||||
if(saved_game) {
|
||||
slider_gold.set_visible(twidget::tvisible::invisible);
|
||||
slider_income.set_visible(twidget::tvisible::invisible);
|
||||
}
|
||||
|
||||
//
|
||||
// Gold, income, team, and color are only suggestions unless explicitly locked
|
||||
//
|
||||
if(ums) {
|
||||
team_selection.set_active(!lock_team);
|
||||
color_selection.set_active(!lock_color);
|
||||
|
||||
slider_gold.set_active(!lock_gold);
|
||||
slider_income.set_active(!lock_income);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize chatbox and game rooms
|
||||
//
|
||||
|
||||
// TODO: seems the chatbox requires lobby info to be set first
|
||||
/*tchatbox& chat = find_widget<tchatbox>(&window, "chat", false);
|
||||
|
||||
chat.room_window_open("this game", true);
|
||||
chat.active_window_changed();*/
|
||||
|
||||
//
|
||||
// Set up the Lua plugin context
|
||||
//
|
||||
plugins_context_.reset(new plugins_context("Multiplayer Staging"));
|
||||
|
||||
plugins_context_->set_callback("launch", [&window](const config&) { window.set_retval(twindow::OK); }, false);
|
||||
plugins_context_->set_callback("quit", [&window](const config&) { window.set_retval(twindow::CANCEL); }, false);
|
||||
plugins_context_->set_callback("chat", [this, &window](const config&) { return; /* TODO*/ }, false);
|
||||
}
|
||||
|
||||
void tmp_staging::sync_changes()
|
||||
{
|
||||
// TODO: should this call somehow be integrated into the connect engine setters?
|
||||
connect_engine_.update_and_send_diff();
|
||||
}
|
||||
|
||||
void tmp_staging::on_controller_select(ng::side_engine& side, tgrid& row_grid)
|
||||
{
|
||||
tmenu_button& ai_selection = find_widget<tmenu_button>(&row_grid, "ai_controller", false);
|
||||
tmenu_button& controller_selection = find_widget<tmenu_button>(&row_grid, "controller", false);
|
||||
|
||||
side.set_controller(side.controller_options()[controller_selection.get_value()].first);
|
||||
|
||||
ai_selection.set_visible(side.controller() == ng::CNTR_COMPUTER ? twidget::tvisible::visible : twidget::tvisible::hidden);
|
||||
|
||||
sync_changes();
|
||||
}
|
||||
|
||||
void tmp_staging::on_ai_select(ng::side_engine& side, tmenu_button& ai_menu)
|
||||
{
|
||||
side.set_ai_algorithm(ai_algorithms_[ai_menu.get_value()]->id);
|
||||
|
||||
sync_changes();
|
||||
}
|
||||
|
||||
void tmp_staging::select_leader_callback(twindow& window, ng::side_engine& side, tgrid& row_grid)
|
||||
{
|
||||
gui2::tfaction_select dlg(side.flg(), std::to_string(side.color() + 1), side.index() + 1);
|
||||
dlg.show(window.video());
|
||||
|
||||
if(dlg.get_retval() == twindow::OK) {
|
||||
update_leader_display(side, row_grid);
|
||||
|
||||
sync_changes();
|
||||
}
|
||||
}
|
||||
|
||||
void tmp_staging::update_leader_display(ng::side_engine& side, tgrid& row_grid)
|
||||
{
|
||||
const std::string current_faction = (*side.flg().choosable_factions()[side.flg().current_faction_index()])["name"];
|
||||
|
||||
// BIG FAT TODO: get rid of this shitty "null" string value in the FLG manager
|
||||
const std::string current_leader = side.flg().current_leader() != "null" ? side.flg().current_leader() : utils::unicode_em_dash;
|
||||
const std::string current_gender = side.flg().current_gender() != "null" ? side.flg().current_gender() : utils::unicode_em_dash;
|
||||
|
||||
// Sprite
|
||||
std::string new_image;
|
||||
|
||||
if(side.flg().is_random_faction() || current_leader == "random") {
|
||||
new_image = "units/random-dice.png";
|
||||
} else {
|
||||
const unit_type& type = unit_types.find(current_leader)->get_gender_unit_type(current_gender);
|
||||
|
||||
new_image = formatter() << type.image() << "~RC(magenta>" << side.color() + 1 << ")";
|
||||
}
|
||||
|
||||
find_widget<timage>(&row_grid, "leader_image", false).set_label(new_image);
|
||||
|
||||
// Faction and leader
|
||||
find_widget<tlabel>(&row_grid, "leader_type", false).set_label(current_leader);
|
||||
find_widget<tlabel>(&row_grid, "leader_faction", false).set_label(current_faction);
|
||||
|
||||
// Gender
|
||||
if(current_gender != utils::unicode_em_dash) {
|
||||
const std::string gender_icon = formatter() << "icons/icon-" << current_gender << ".png";
|
||||
find_widget<timage>(&row_grid, "leader_gender", false).set_label(gender_icon);
|
||||
}
|
||||
}
|
||||
|
||||
void tmp_staging::post_show(twindow& window)
|
||||
{
|
||||
if(window.get_retval() == twindow::OK) {
|
||||
connect_engine_.start_game();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace gui2
|
69
src/gui/dialogs/multiplayer/mp_staging.hpp
Normal file
69
src/gui/dialogs/multiplayer/mp_staging.hpp
Normal file
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
Copyright (C) 2008 - 2016 by 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 as published by
|
||||
the Free Software Foundation; either version 2 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.
|
||||
|
||||
See the COPYING file for more details.
|
||||
*/
|
||||
|
||||
#ifndef GUI_DIALOGS_MP_STAGING_HPP_INCLUDED
|
||||
#define GUI_DIALOGS_MP_STAGING_HPP_INCLUDED
|
||||
|
||||
#include "ai/configuration.hpp"
|
||||
#include "gui/dialogs/dialog.hpp"
|
||||
#include "gui/dialogs/multiplayer/plugin_executor.hpp"
|
||||
|
||||
#include "game_initialization/connect_engine.hpp"
|
||||
#include "game_initialization/multiplayer.hpp"
|
||||
#include "mp_game_settings.hpp"
|
||||
|
||||
class config;
|
||||
|
||||
namespace gui2
|
||||
{
|
||||
|
||||
class ttoggle_button;
|
||||
class ttoggle_panel;
|
||||
class tslider;
|
||||
class tlabel;
|
||||
class tmenu_button;
|
||||
class twidget;
|
||||
|
||||
class tmp_staging : public tdialog, private plugin_executor
|
||||
{
|
||||
public:
|
||||
tmp_staging(const config& cfg, ng::connect_engine& connect_engine);
|
||||
|
||||
private:
|
||||
/** Inherited from tdialog, implemented by REGISTER_DIALOG. */
|
||||
virtual const std::string& window_id() const;
|
||||
|
||||
/** Inherited from tdialog. */
|
||||
void pre_show(twindow& window);
|
||||
|
||||
/** Inherited from tdialog. */
|
||||
void post_show(twindow& window);
|
||||
|
||||
void sync_changes();
|
||||
|
||||
void on_controller_select(ng::side_engine& side, tgrid& row_grid);
|
||||
void on_ai_select(ng::side_engine& side, tmenu_button& ai_menu);
|
||||
|
||||
void select_leader_callback(twindow& window, ng::side_engine& side, tgrid& row_grid);
|
||||
|
||||
void update_leader_display(ng::side_engine& side, tgrid& row_grid);
|
||||
|
||||
ng::connect_engine& connect_engine_;
|
||||
|
||||
std::vector<ai::description*> ai_algorithms_;
|
||||
|
||||
};
|
||||
|
||||
} // namespace gui2
|
||||
|
||||
#endif
|
|
@ -76,6 +76,7 @@
|
|||
#include "gui/dialogs/multiplayer/mp_create_game.hpp"
|
||||
#include "gui/dialogs/multiplayer/mp_create_game_set_password.hpp"
|
||||
#include "gui/dialogs/multiplayer/mp_join_game_password_prompt.hpp"
|
||||
#include "gui/dialogs/multiplayer/mp_staging.hpp"
|
||||
#include "gui/dialogs/depcheck_confirm_change.hpp"
|
||||
#include "gui/dialogs/depcheck_select_new.hpp"
|
||||
#include "gui/dialogs/multiplayer/mp_login.hpp"
|
||||
|
@ -415,6 +416,7 @@ BOOST_AUTO_TEST_CASE(test_gui2)
|
|||
test<gui2::tmp_login>();
|
||||
test<gui2::tmp_method_selection>();
|
||||
test<gui2::tmp_server_list>();
|
||||
//test<gui2::tmp_staging>();
|
||||
test<gui2::tsimple_item_selector>();
|
||||
test<gui2::tscreenshot_notification>();
|
||||
test<gui2::tselect_orb_colors>();
|
||||
|
@ -483,6 +485,7 @@ BOOST_AUTO_TEST_CASE(test_gui2)
|
|||
// The title screen appears to be throwing a bad_alloc on Travis, so disable it for now
|
||||
"title_screen",
|
||||
"end_credits",
|
||||
"mp_staging",
|
||||
};
|
||||
std::sort(list.begin(), list.end());
|
||||
std::sort(omitted.begin(), omitted.end());
|
||||
|
|
Loading…
Add table
Reference in a new issue