MP Join Game: converted dialog to team-based tree view like MP Staging

This commit is contained in:
Charles Dang 2016-10-12 12:58:10 +11:00
parent b1fb517614
commit 262188c82e
3 changed files with 327 additions and 249 deletions

View file

@ -4,82 +4,143 @@
###
#define _GUI_SIDE_LIST
[listbox]
[tree_view]
id = "side_list"
definition = "default"
vertical_scrollbar_mode = "always"
horizontal_scrollbar_mode = "never"
vertical_scrollbar_mode = "auto"
[list_definition]
[node]
id = "team_header"
unfolded = true
[row]
[node_definition]
[column]
horizontal_grow = "true"
vertical_grow = "true"
[row]
[toggle_panel]
id = "panel"
definition = "default"
[column]
grow_factor = 1
border = "all"
border_size = 10
horizontal_grow = "true"
[label]
id = "tree_view_node_label"
definition = "default_large"
use_markup = "true"
[/label]
[/column]
[/row]
[/node_definition]
[/node]
[node]
id = "side_panel"
unfolded = true
[node_definition]
[row]
[column]
grow_factor = 0
border = "all"
border_size = 20
horizontal_alignment = "left"
[label]
id = "side_number"
definition = "default_huge"
linked_group = "side_number"
[/label]
[/column]
[column]
grow_factor = 1
horizontal_grow = "true"
[grid]
linked_group = "leader"
[row]
[column]
grow_factor = 0
horizontal_grow = "true"
border = "all"
border_size = 20
horizontal_alignment = "left"
border_size = 5
[label]
id = "side_number"
definition = "default_huge"
linked_group = "side_number"
[/label]
[image]
id = "leader_image"
definition = "default"
[/image]
[/column]
[column]
grow_factor = 1
horizontal_grow = "true"
vertical_grow = "true"
[grid]
linked_group = "leader"
[row]
grow_factor = 1
[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"
[label]
id = "leader_type"
definition = "default_large"
use_markup = "true"
[/label]
[/column]
[/row]
[row]
grow_factor = 0
[column]
horizontal_grow = "true"
#vertical_grow = "true"
[grid]
[row]
grow_factor = 1
[column]
border = "all"
grow_factor = 0
border = "left,bottom"
border_size = 5
[label]
definition = "default_small"
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_type"
definition = "default_large"
id = "leader_faction"
definition = "default_small"
use_markup = "true"
[/label]
@ -88,78 +149,31 @@
[/row]
[row]
grow_factor = 0
[column]
horizontal_grow = "true"
#vertical_grow = "true"
grow_factor = 0
border = "left,bottom"
border_size = 5
[grid]
[label]
definition = "default_small"
label = _ "<b>Gender:</b>"
use_markup = "true"
[/label]
[row]
[/column]
[column]
grow_factor = 0
border = "left,bottom"
border_size = 5
[column]
grow_factor = 1
border = "left,bottom,right"
border_size = 5
horizontal_alignment = "left"
vertical_grow = "true"
[label]
definition = "default_small"
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_small"
use_markup = "true"
[/label]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "left,bottom"
border_size = 5
[label]
definition = "default_small"
label = _ "<b>Gender:</b>"
use_markup = "true"
[/label]
[/column]
[column]
grow_factor = 1
border = "left,bottom,right"
border_size = 5
horizontal_alignment = "left"
vertical_grow = "true"
[image]
id = "leader_gender"
definition = "default_small"
[/image]
[/column]
[/row]
[/grid]
[image]
id = "leader_gender"
definition = "default_small"
[/image]
[/column]
@ -175,127 +189,126 @@
[/column]
[/row]
[/grid]
[/column]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_grow = "true"
[image]
id = "side_color"
definition = "centered"
linked_group = "color"
[/image]
[/column]
[column]
grow_factor = 0
horizontal_grow = "true"
[grid]
linked_group = "gold_and_income"
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[image]
id = "gold_icon"
definition = "default"
label = "themes/gold.png"
tooltip = _ "Gold"
[/image]
[/column]
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_grow = "true"
[label]
id = "side_team"
definition = "default"
linked_group = "team"
id = "side_gold"
definition = "default_small"
tooltip = _ "Gold"
[/label]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "all"
border = "bottom,left,right"
border_size = 5
horizontal_grow = "true"
horizontal_alignment = "left"
[image]
id = "side_color"
definition = "centered"
linked_group = "color"
id = "income_icon"
definition = "default"
label = "themes/income.png"
tooltip = _ "Income"
[/image]
[/column]
[column]
grow_factor = 0
grow_factor = 1
border = "bottom,left,right"
border_size = 5
horizontal_grow = "true"
[grid]
linked_group = "gold_and_income"
[row]
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[image]
id = "gold_icon"
definition = "default"
label = "themes/gold.png"
tooltip = _ "Gold"
[/image]
[/column]
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_grow = "true"
[label]
id = "side_gold"
definition = "default_small"
tooltip = _ "Gold"
[/label]
[/column]
[/row]
[row]
[column]
grow_factor = 0
border = "bottom,left,right"
border_size = 5
horizontal_alignment = "left"
[image]
id = "income_icon"
definition = "default"
label = "themes/income.png"
tooltip = _ "Income"
[/image]
[/column]
[column]
grow_factor = 1
border = "bottom,left,right"
border_size = 5
horizontal_grow = "true"
[label]
id = "side_income"
definition = "default_small"
tooltip = _ "Income"
[/label]
[/column]
[/row]
[/grid]
[/column]
[column]
grow_factor = 0
[spacer]
width = 20
[/spacer]
[label]
id = "side_income"
definition = "default_small"
tooltip = _ "Income"
[/label]
[/column]
[/row]
[/grid]
[/toggle_panel]
[/column]
[/column]
[column]
grow_factor = 0
[/row]
[spacer]
width = 20
[/spacer]
[/list_definition]
[/column]
[/listbox]
[/row]
[/node_definition]
[/node]
[node]
id = "side_spacer"
unfolded = "true"
[node_definition]
{GUI_HORIZONTAL_SPACER_LINE}
[/node_definition]
[/node]
[/tree_view]
#enddef
#define _GUI_CONTROL_AREA
@ -310,52 +323,89 @@
horizontal_grow = "true"
vertical_grow = "true"
[listbox]
id = "player_list"
definition = "default"
[panel]
definition = "box_display_no_blur_no_border"
horizontal_scrollbar_mode = "never"
[list_definition]
[grid]
[row]
grow_factor = 0
[column]
border = "all"
border_size = 5
horizontal_grow = "true"
[toggle_panel]
id = "panel"
[label]
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]
label = _ "Connected Players"
[/label]
[/column]
[/row]
[/list_definition]
[row]
grow_factor = 1
[/listbox]
[column]
horizontal_grow = "true"
vertical_grow = "true"
[listbox]
id = "player_list"
definition = "default"
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]
[/panel]
[/column]
@ -422,11 +472,6 @@
fixed_width = "true"
[/linked_group]
[linked_group]
id = "team"
fixed_width = "true"
[/linked_group]
[linked_group]
id = "color"
fixed_width = "true"
@ -487,14 +532,33 @@
grow_factor = 1
[column]
border = "all"
border_size = 5
horizontal_grow = "true"
vertical_grow = "true"
{GUI_FORCE_WIDGET_MINIMUM_SIZE 0 "((screen_height * 55) / 100)" (
border = "all"
border_size = 5
{_GUI_SIDE_LIST}
)}
[panel]
definition = "box_display_no_blur_no_border"
[grid]
[row]
[column]
horizontal_grow = "true"
vertical_grow = "true"
{GUI_FORCE_WIDGET_MINIMUM_SIZE 0 "((screen_height * 55) / 100)" (
{_GUI_SIDE_LIST}
)}
[/column]
[/row]
[/grid]
[/panel]
[/column]
[/row]

View file

@ -31,13 +31,15 @@
#include "gui/widgets/chatbox.hpp"
#include "gui/widgets/menu_button.hpp"
#include "gui/widgets/image.hpp"
#include "gui/widgets/label.hpp"
#ifdef GUI2_EXPERIMENTAL_LISTBOX
#include "gui/widgets/list.hpp"
#else
#include "gui/widgets/listbox.hpp"
#endif
#include "gui/widgets/settings.hpp"
#include "gui/widgets/label.hpp"
#include "gui/widgets/tree_view.hpp"
#include "gui/widgets/tree_view_node.hpp"
#include "mp_ui_alerts.hpp"
#include "statistics.hpp"
#include "units/types.hpp"
@ -110,7 +112,6 @@ void tmp_join_game::post_build(twindow& window)
has_scenario_and_controllers = true;
}
}
if(level_["started"].to_bool()) {
@ -307,17 +308,32 @@ void tmp_join_game::generate_side_list(twindow& window)
return;
}
tlistbox& list = find_widget<tlistbox>(&window, "side_list", false);
ttree_view& tree = find_widget<ttree_view>(&window, "side_list", false);
window.keyboard_capture(&list);
window.keyboard_capture(&tree);
list.clear();
tree.clear();
team_tree_map_.clear();
for(const auto& side : get_scenario().child_range("side")) {
if(!side["allow_player"].to_bool(true)) {
continue;
}
// Check to see whether we've added a toplevel tree node for this team. If not, add one
if(team_tree_map_.find(side["team_name"].str()) == team_tree_map_.end()) {
std::map<std::string, string_map> data;
string_map item;
item["label"] = (formatter() << _("Team:") << " " << side["user_team_name"]).str();
data.emplace("tree_view_node_label", item);
ttree_view_node& team_node = tree.add_node("team_header", data);
team_node.add_sibling("side_spacer", {});
team_tree_map_[side["team_name"].str()] = &team_node;
}
std::map<std::string, string_map> data;
string_map item;
@ -373,10 +389,6 @@ void tmp_join_game::generate_side_list(twindow& window)
item.clear();
// TODO: why this tstring stuff?
item["label"] = t_string::from_serialized(side["user_team_name"].str());
data.emplace("side_team", item);
// Don't show gold for saved games
// TODO: gold icon
if(side["allow_changes"].to_bool()) {
@ -395,7 +407,9 @@ void tmp_join_game::generate_side_list(twindow& window)
item["label"] = (formatter() << "buttons/misc/orb-active.png~RC(magenta>" << side["color"] << ")").str();
data.emplace("side_color", item);
tgrid& row_grid = list.add_row(data);
ttree_view_node& node = team_tree_map_[side["team_name"].str()]->add_child("side_panel", data);
tgrid& row_grid = node.get_grid();
if(income_amt == 0) {
find_widget<timage>(&row_grid, "income_icon", false).set_visible(twidget::tvisible::invisible);
@ -478,6 +492,11 @@ config& tmp_join_game::get_scenario()
void tmp_join_game::post_show(twindow& window)
{
if(update_timer_ != 0) {
remove_timer(update_timer_);
update_timer_ = 0;
}
if(window.get_retval() == twindow::OK) {
if(const config& stats = level_.child("statistics")) {
statistics::fresh_stats();

View file

@ -28,12 +28,7 @@ class config;
namespace gui2
{
class ttoggle_button;
class ttoggle_panel;
class tslider;
class tlabel;
class tmenu_button;
class twidget;
class ttree_view_node;
class tmp_join_game : public tdialog, private plugin_executor
{
@ -60,8 +55,6 @@ private:
void update_player_list(twindow& window);
void update_leader_display(ng::side_engine& side, tgrid& row_grid);
void network_handler(twindow& window);
config& get_scenario();
@ -80,6 +73,8 @@ private:
const bool observe_game_;
bool stop_updates_;
std::map<std::string, ttree_view_node*> team_tree_map_;
};
} // namespace gui2