Converted Generator Settings dialog to GUI2

This commit is contained in:
Charles Dang 2016-09-03 05:15:58 +11:00
parent 42423a4a57
commit 56e8222bb0
8 changed files with 387 additions and 236 deletions

View file

@ -0,0 +1,207 @@
#textdomain wesnoth-lib
###
### Definition of the window to set random map generator settings
###
#define _GUI_SETTING_SLIDER _LABEL _ID _MIN_VALUE _MAX_VALUE
[row]
[column]
grow_factor = 0
horizontal_grow = "true"
border = "all"
border_size = 5
[label]
definition = "default"
label = {_LABEL}
text_alignment = "right"
[/label]
[/column]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "all"
border_size = 10
[slider]
id = {_ID}
definition = "minimal"
minimum_value = {_MIN_VALUE}
maximum_value = {_MAX_VALUE}
step_size = 1
[/slider]
[/column]
[column]
grow_factor = 0
horizontal_grow = "true"
border = "all"
border_size = 5
{GUI_FORCE_WIDGET_MINIMUM_SIZE 100 0 (
[label]
id = {_ID} + "_label"
definition = "default_small"
[/label]
)}
[/column]
[/row]
#enddef
[window]
id = "generator_settings"
description = "Random map generator settings."
[resolution]
definition = "default"
automatic_placement = "true"
vertical_placement = "center"
horizontal_placement = "center"
maximum_height = 600
[tooltip]
id = "tooltip"
[/tooltip]
[helptip]
id = "tooltip"
[/helptip]
[grid]
[row]
grow_factor = 0
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
definition = "title"
label = _ "Map Generator Settings"
[/label]
[/column]
[/row]
[row]
grow_factor = 1
[column]
horizontal_grow = "true"
vertical_grow = "true"
[grid]
{_GUI_SETTING_SLIDER ( _ "Players:") "players" 2 9}
{_GUI_SETTING_SLIDER ( _ "Width:") "width" 20 100}
{_GUI_SETTING_SLIDER ( _ "Height:") "height" 20 100}
{_GUI_SETTING_SLIDER ( _ "Number of Hills:") "hills_num" 10 3000}
{_GUI_SETTING_SLIDER ( _ "Max Hill Size:") "hills_size" 1 50}
{_GUI_SETTING_SLIDER ( _ "Villages:") "villages" 0 50}
{_GUI_SETTING_SLIDER ( _ "Castle Size:") "castle_size" 2 14}
{_GUI_SETTING_SLIDER ( _ "Landform:") "landform" 0 10}
[row]
grow_factor = 1
{GUI_FILLER}
[column]
horizontal_grow = "true"
vertical_grow = "true"
border = "all"
border_size = 10
[toggle_button]
id = "connect_castles"
definition = "default"
label = _ "Roads Between Castles"
[/toggle_button]
[/column]
{GUI_FILLER}
[/row]
[row]
grow_factor = 1
{GUI_FILLER}
[column]
horizontal_grow = "true"
vertical_grow = "true"
border = "all"
border_size = 10
[toggle_button]
id = "show_labels"
definition = "default"
label = _ "Show Labels"
[/toggle_button]
[/column]
{GUI_FILLER}
[/row]
[/grid]
[/column]
[/row]
[row]
grow_factor = 0
[column]
grow_factor = 0
horizontal_alignment = "right"
[grid]
[row]
grow_factor=0
[column]
border = "all"
border_size = 5
horizontal_alignment = "right"
[button]
id = "ok"
definition = "default"
label = _ "Close"
[/button]
[/column]
[/row]
[/grid]
[/column]
[/row]
[/grid]
[/resolution]
[/window]
#undef _GUI_SETTING_SLIDER

View file

@ -541,6 +541,8 @@
<Unit filename="../../src/gui/dialogs/editor/edit_side.hpp" />
<Unit filename="../../src/gui/dialogs/editor/generate_map.cpp" />
<Unit filename="../../src/gui/dialogs/editor/generate_map.hpp" />
<Unit filename="../../src/gui/dialogs/editor/generator_settings.cpp" />
<Unit filename="../../src/gui/dialogs/editor/generator_settings.hpp" />
<Unit filename="../../src/gui/dialogs/editor/new_map.cpp" />
<Unit filename="../../src/gui/dialogs/editor/new_map.hpp" />
<Unit filename="../../src/gui/dialogs/editor/resize_map.cpp" />

View file

@ -800,6 +800,7 @@ set(wesnoth-main_SRC
gui/dialogs/editor/edit_side.cpp
gui/dialogs/editor/edit_scenario.cpp
gui/dialogs/editor/generate_map.cpp
gui/dialogs/editor/generator_settings.cpp
gui/dialogs/editor/new_map.cpp
gui/dialogs/editor/resize_map.cpp
gui/dialogs/editor/set_starting_position.cpp

View file

@ -377,6 +377,7 @@ wesnoth_sources = Split("""
gui/dialogs/editor/edit_scenario.cpp
gui/dialogs/editor/edit_side.cpp
gui/dialogs/editor/generate_map.cpp
gui/dialogs/editor/generator_settings.cpp
gui/dialogs/editor/new_map.cpp
gui/dialogs/editor/resize_map.cpp
gui/dialogs/editor/set_starting_position.cpp

View file

@ -18,6 +18,7 @@
#include "default_map_generator.hpp"
#include "gui/dialogs/editor/generator_settings.hpp"
#include "default_map_generator_job.hpp"
#include "gettext.hpp"
#include "log.hpp"
@ -63,242 +64,7 @@ bool default_map_generator::allow_user_config() const { return true; }
void default_map_generator::user_config(CVideo& v)
{
const events::event_context dialog_events_context;
CVideo& screen = v;
const int width = 600;
const int height = 400;
const int xpos = screen.getx()/2 - width/2;
int ypos = screen.gety()/2 - height/2;
gui::button close_button(screen,_("Close"));
std::vector<gui::button*> buttons(1,&close_button);
gui::dialog_frame f(screen,_("Map Generator"),gui::dialog_frame::default_style,true,&buttons);
f.layout(xpos,ypos,width,height);
f.draw();
SDL_Rect dialog_rect = sdl::create_rect(xpos, ypos, width, height);
surface_restorer dialog_restorer(&screen,dialog_rect);
const std::string& players_label = _("Players:");
const std::string& width_label = _("Width:");
const std::string& height_label = _("Height:");
const std::string& iterations_label = _("Number of hills:");
const std::string& hillsize_label = _("Max hill size:");
const std::string& villages_label = _("Villages:");
const std::string& castlesize_label = _("Castle size:");
const std::string& landform_label = _("Landform:");
SDL_Rect players_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,players_label,0,0);
SDL_Rect width_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,width_label,0,0);
SDL_Rect height_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,height_label,0,0);
SDL_Rect iteration_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,iterations_label,0,0);
SDL_Rect hillsize_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,hillsize_label,0,0);
SDL_Rect villages_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,villages_label,0,0);
SDL_Rect castlesize_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,castlesize_label,0,0);
SDL_Rect landform_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,landform_label,0,0);
const int horz_margin = 15;
const int text_right = xpos + horz_margin +
std::max<int>(std::max<int>(std::max<int>(std::max<int>(std::max<int>(std::max<int>(
players_rect.w,width_rect.w),height_rect.w),iteration_rect.w),hillsize_rect.w),villages_rect.w),castlesize_rect.w);
players_rect.x = text_right - players_rect.w;
width_rect.x = text_right - width_rect.w;
height_rect.x = text_right - height_rect.w;
iteration_rect.x = text_right - iteration_rect.w;
hillsize_rect.x = text_right - hillsize_rect.w;
villages_rect.x = text_right - villages_rect.w;
castlesize_rect.x = text_right - castlesize_rect.w;
landform_rect.x = text_right - landform_rect.w;
const int vertical_margin = 20;
players_rect.y = ypos + vertical_margin*2;
width_rect.y = players_rect.y + players_rect.h + vertical_margin;
height_rect.y = width_rect.y + width_rect.h + vertical_margin;
iteration_rect.y = height_rect.y + height_rect.h + vertical_margin;
hillsize_rect.y = iteration_rect.y + iteration_rect.h + vertical_margin;
villages_rect.y = hillsize_rect.y + hillsize_rect.h + vertical_margin;
castlesize_rect.y = villages_rect.y + iteration_rect.h + vertical_margin;
landform_rect.y = castlesize_rect.y + villages_rect.h + vertical_margin;
const int right_space = 150;
const int slider_left = text_right + 10;
const int slider_right = xpos + width - horz_margin - right_space;
SDL_Rect slider_rect = sdl::create_rect(slider_left
, players_rect.y
, slider_right - slider_left
, players_rect.h);
gui::slider players_slider(screen);
players_slider.set_location(slider_rect);
players_slider.set_min(2);
players_slider.set_max(gamemap::MAX_PLAYERS);
players_slider.set_value(data_.nplayers);
const int min_width = 20;
const int max_width = 100;
const int max_height = 100;
const int extra_size_per_player = 2;
slider_rect.y = width_rect.y;
gui::slider width_slider(screen);
width_slider.set_location(slider_rect);
width_slider.set_min(min_width+(players_slider.value()-2)*extra_size_per_player);
width_slider.set_max(max_width);
width_slider.set_value(data_.width);
slider_rect.y = height_rect.y;
gui::slider height_slider(screen);
height_slider.set_location(slider_rect);
height_slider.set_min(min_width+(players_slider.value()-2)*extra_size_per_player);
height_slider.set_max(max_height);
height_slider.set_value(data_.height);
const int min_iterations = 10;
const int max_iterations = 3000;
slider_rect.y = iteration_rect.y;
gui::slider iterations_slider(screen);
iterations_slider.set_location(slider_rect);
iterations_slider.set_min(min_iterations);
iterations_slider.set_max(max_iterations);
iterations_slider.set_value(data_.iterations);
const int min_hillsize = 1;
const int max_hillsize = 50;
slider_rect.y = hillsize_rect.y;
gui::slider hillsize_slider(screen);
hillsize_slider.set_location(slider_rect);
hillsize_slider.set_min(min_hillsize);
hillsize_slider.set_max(max_hillsize);
hillsize_slider.set_value(data_.hill_size);
const int min_villages = 0;
const int max_villages = 50;
slider_rect.y = villages_rect.y;
gui::slider villages_slider(screen);
villages_slider.set_location(slider_rect);
villages_slider.set_min(min_villages);
villages_slider.set_max(max_villages);
villages_slider.set_value(data_.nvillages);
const int min_castlesize = 2;
const int max_castlesize = 14;
slider_rect.y = castlesize_rect.y;
gui::slider castlesize_slider(screen);
castlesize_slider.set_location(slider_rect);
castlesize_slider.set_min(min_castlesize);
castlesize_slider.set_max(max_castlesize);
castlesize_slider.set_value(data_.castle_size);
const int min_landform = 0;
const int max_landform = int(max_island);
slider_rect.y = landform_rect.y;
gui::slider landform_slider(screen);
landform_slider.set_location(slider_rect);
landform_slider.set_min(min_landform);
landform_slider.set_max(max_landform);
landform_slider.set_value(data_.island_size);
SDL_Rect link_rect = slider_rect;
link_rect.y = link_rect.y + link_rect.h + vertical_margin;
gui::button link_castles(screen,_("Roads between castles"),gui::button::TYPE_CHECK);
link_castles.set_check(data_.link_castles);
link_castles.set_location(link_rect);
SDL_Rect labels_rect = link_rect;
labels_rect.y = labels_rect.y + labels_rect.h + vertical_margin;
gui::button show_labels(screen,_("Show labels"),gui::button::TYPE_CHECK);
show_labels.set_check(data_.show_labels);
show_labels.set_location(labels_rect);
while(true) {
data_.nplayers = players_slider.value();
data_.width = width_slider.value();
data_.height = height_slider.value();
data_.iterations = iterations_slider.value();
data_.hill_size = hillsize_slider.value();
data_.nvillages = villages_slider.value();
data_.castle_size = castlesize_slider.value();
data_.island_size = landform_slider.value();
dialog_restorer.restore();
close_button.set_dirty(true);
if (close_button.pressed())
break;
players_slider.set_dirty();
width_slider.set_dirty();
height_slider.set_dirty();
iterations_slider.set_dirty();
hillsize_slider.set_dirty();
villages_slider.set_dirty();
castlesize_slider.set_dirty();
landform_slider.set_dirty();
link_castles.set_dirty();
show_labels.set_dirty();
width_slider.set_min(min_width+(players_slider.value()-2)*extra_size_per_player);
height_slider.set_min(min_width+(players_slider.value()-2)*extra_size_per_player);
f.draw();
events::raise_process_event();
events::raise_draw_event();
font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,players_label,players_rect.x,players_rect.y);
font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,width_label,width_rect.x,width_rect.y);
font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,height_label,height_rect.x,height_rect.y);
font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,iterations_label,iteration_rect.x,iteration_rect.y);
font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,hillsize_label,hillsize_rect.x,hillsize_rect.y);
font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,villages_label,villages_rect.x,villages_rect.y);
font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,castlesize_label,castlesize_rect.x,castlesize_rect.y);
font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,landform_label,landform_rect.x,landform_rect.y);
font::draw_text(&screen, screen_area(), font::SIZE_NORMAL,
font::NORMAL_COLOR, std::to_string(data_.nplayers),
slider_right + horz_margin, players_rect.y);
font::draw_text(&screen, screen_area(), font::SIZE_NORMAL,
font::NORMAL_COLOR, std::to_string(data_.width),
slider_right + horz_margin, width_rect.y);
font::draw_text(&screen, screen_area(), font::SIZE_NORMAL,
font::NORMAL_COLOR, std::to_string(data_.height),
slider_right+horz_margin,height_rect.y);
std::stringstream villages_str;
villages_str << data_.nvillages << _("/1000 tiles");
font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,villages_str.str(),
slider_right+horz_margin,villages_rect.y);
font::draw_text(&screen, screen_area(), font::SIZE_NORMAL,
font::NORMAL_COLOR, std::to_string(data_.castle_size),
slider_right + horz_margin, castlesize_rect.y);
std::stringstream landform_str;
landform_str << translation::gettext(data_.island_size == 0 ? N_("Inland") : (data_.island_size < max_coastal ? N_("Coastal") : N_("Island")));
font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,landform_str.str(),
slider_right+horz_margin,landform_rect.y);
update_rect(xpos,ypos,width,height);
v.flip();
CVideo::delay(100);
events::pump();
}
data_.link_castles = link_castles.checked();
data_.show_labels = show_labels.checked();
gui2::tgenerator_settings::execute(data_, v);
}
std::string default_map_generator::name() const { return "default"; }

View file

@ -0,0 +1,111 @@
/*
Copyright (C) 2010 - 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/editor/generator_settings.hpp"
#include "gui/auxiliary/field.hpp"
#include "gui/widgets/label.hpp"
#include "gui/widgets/settings.hpp"
#include "gui/widgets/slider.hpp"
#include "gettext.hpp"
#include "utils/functional.hpp"
namespace gui2
{
static int max_coastal = 5;
static int extra_size_per_player = 2;
static int min_size = 20;
REGISTER_DIALOG(generator_settings)
tgenerator_settings::tgenerator_settings(generator_data& data)
: players_(register_integer("players", true, data.nplayers))
, width_(register_integer("width", true, data.width))
, height_(register_integer("height", true, data.height))
{
register_integer("hills_num", true, data.iterations);
register_integer("hills_size", true, data.hill_size);
register_integer("villages", true, data.nvillages);
register_integer("castle_size", true, data.castle_size);
register_integer("landform", true, data.island_size);
register_bool("connect_castles", true, data.link_castles);
register_bool("show_labels", true, data.show_labels);
}
void tgenerator_settings::pre_show(twindow& window)
{
// We adjust the minimum values of the width and height sliders when the number of players changes.
// This is done because the map generator needs more space to generate more castles for more players.
connect_signal_notify_modified(*players_->widget(), std::bind(&adjust_minimum_size_by_players, this, std::ref(window)));
bind_status_label(window, "players");
bind_status_label(window, "width");
bind_status_label(window, "height");
bind_status_label(window, "villages", _("/1000 tiles"));
bind_status_label(window, "castle_size");
bind_landform_status_label(window);
}
void tgenerator_settings::bind_status_label(twindow& window, const std::string& id, const std::string& suffix)
{
tslider& slider = find_widget<tslider>(&window, id, false);
tlabel& label = find_widget<tlabel>(&window, id + "_label", false);
label.set_label(std::to_string(slider.get_value()) + suffix);
connect_signal_notify_modified(slider, std::bind(&status_label_callback, this, std::ref(slider), std::ref(label), suffix));
}
void tgenerator_settings::status_label_callback(tslider& slider, tlabel& label, const std::string& suffix)
{
label.set_label(std::to_string(slider.get_value()) + suffix);
}
// TODO: remove
void tgenerator_settings::bind_landform_status_label(twindow& window)
{
tslider& slider = find_widget<tslider>(&window, "landform", false);
tlabel& label = find_widget<tlabel>(&window, "landform_label", false);
landform_status_label_callback(slider, label);
connect_signal_notify_modified(slider, std::bind(&landform_status_label_callback, this, std::ref(slider), std::ref(label)));
}
// TODO: remove
void tgenerator_settings::landform_status_label_callback(tslider& slider, tlabel& label)
{
label.set_label(slider.get_value() == 0 ? _("Inland") : (slider.get_value() < max_coastal ? _("Coastal") : _("Island")));
}
void tgenerator_settings::adjust_minimum_size_by_players(twindow& window)
{
const int extra_size = (players_->get_widget_value(window) - 2) * extra_size_per_player;
const auto update_dimension_slider = [&](tfield_integer* field) {
tslider& w = dynamic_cast<tslider&>(*field->widget());
w.set_minimum_value(min_size + extra_size);
status_label_callback(w, find_widget<tlabel>(&window, w.id() + "_label", false));
};
update_dimension_slider(width_);
update_dimension_slider(height_);
}
} // end namespace gui2

View file

@ -0,0 +1,60 @@
/*
Copyright (C) 2010 - 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_GENERATOR_SETTINGS_HPP_INCLUDED
#define GUI_DIALOGS_GENERATOR_SETTINGS_HPP_INCLUDED
#include "gui/dialogs/dialog.hpp"
#include "generators/default_map_generator.hpp"
namespace gui2
{
class tlabel;
class tslider;
class tgenerator_settings : public tdialog
{
public:
explicit tgenerator_settings(generator_data& data);
/** The execute function see @ref tdialog for more information. */
static bool execute(generator_data& data, CVideo& video)
{
return tgenerator_settings(data).show(video);
}
private:
void pre_show(twindow& window);
void bind_status_label(twindow& window, const std::string& id, const std::string& suffix = "");
void status_label_callback(tslider& slider, tlabel& label, const std::string& suffix = "");
// TODO: find a more generic way to do this
void bind_landform_status_label(twindow& window);
void landform_status_label_callback(tslider& slider, tlabel& label);
void adjust_minimum_size_by_players(twindow& window);
/** Inherited from tdialog, implemented by REGISTER_DIALOG. */
virtual const std::string& window_id() const;
/** We need to own these fields to access the underlying widget */
tfield_integer* players_;
tfield_integer* width_;
tfield_integer* height_;
};
}
#endif /* ! GUI_DIALOGS_GENERATOR_SETTINGS_HPP_INCLUDED */

View file

@ -45,6 +45,7 @@
#include "gui/dialogs/editor/edit_label.hpp"
#include "gui/dialogs/editor/edit_scenario.hpp"
#include "gui/dialogs/editor/generate_map.hpp"
#include "gui/dialogs/editor/generator_settings.hpp"
#include "gui/dialogs/editor/new_map.hpp"
#include "gui/dialogs/editor/resize_map.hpp"
#include "gui/dialogs/editor/set_starting_position.hpp"
@ -402,6 +403,7 @@ BOOST_AUTO_TEST_CASE(test_gui2)
test<gui2::tgame_save_oos>();
//test<gui2::tgame_stats>();
test<gui2::tgamestate_inspector>();
//test<gui2::tgenerator_settings>();
test<gui2::tlanguage_selection>();
// test<gui2::tloadscreen>(); TODO: enable
test<gui2::tlobby_main>();
@ -489,6 +491,7 @@ BOOST_AUTO_TEST_CASE(test_gui2)
"mp_host_game_prompt",
"mp_create_game",
"sp_options_configure",
"generator_settings",
};
std::sort(list.begin(), list.end());
std::sort(omitted.begin(), omitted.end());