← Back to team overview

widelands-dev team mailing list archive

Re: [Merge] lp:~widelands-dev/widelands/bug-1371905_2 into lp:widelands

 

Resolved some of the nits. I need help with the remaining ones - comments in the diff.

Diff comments:

> === removed file 'pics/singleplmenu.jpg'
> Binary files pics/singleplmenu.jpg	2010-01-01 19:01:00 +0000 and pics/singleplmenu.jpg	1970-01-01 00:00:00 +0000 differ
> === renamed file 'pics/launchgamemenu.jpg' => 'pics/ui_fsmenu.jpg'
> === modified file 'src/editor/ui_menus/editor_main_menu_load_map.cc'
> --- src/editor/ui_menus/editor_main_menu_load_map.cc	2014-09-23 09:26:48 +0000
> +++ src/editor/ui_menus/editor_main_menu_load_map.cc	2014-09-27 13:09:21 +0000
> @@ -49,14 +49,14 @@
>   * Create all the buttons etc...
>  */
>  MainMenuLoadMap::MainMenuLoadMap(EditorInteractive & parent)
> -	: UI::Window(&parent, "load_map_menu", 0, 0, 550, 300, _("Load Map"))
> +	: UI::Window(&parent, "load_map_menu", 0, 0, 560, 300, _("Load Map"))
>  {
>  	int32_t const spacing =  5;
>  	int32_t const offsx   = spacing;
>  	int32_t const offsy   = 10;
>  	int32_t       posx    = offsx;
>  	int32_t       posy    = offsy;
> -	int32_t const descr_label_w = 90;
> +	int32_t const descr_label_w = 100;
>  
>  	m_ls = new UI::Listselect<const char *>
>  		(this,
> @@ -69,9 +69,9 @@
>  	new UI::Textarea
>  		(this, posx, posy, descr_label_w, 20, _("Name:"), UI::Align_CenterLeft);
>  	m_name =
> -		new UI::Textarea
> -			(this, posx + descr_label_w, posy, 200, 20, "---", UI::Align_CenterLeft);
> -	posy += 20 + spacing;
> +		new UI::MultilineTextarea
> +			(this, posx + descr_label_w, posy, 200, 40, "---", UI::Align_CenterLeft);
> +	posy += 40 + spacing;
>  
>  	new UI::Textarea
>  		(this, posx, posy, 150, 20, _("Author:"), UI::Align_CenterLeft);
> @@ -166,7 +166,8 @@
>  
>  		// Translate the map data
>  		i18n::Textdomain td("maps");
> -		m_name  ->set_text(_(map.get_name()));
> +		m_name  ->set_text(map.get_name());
> +		m_name  ->set_tooltip(map.get_name());
>  		m_author->set_text(map.get_author());
>  		m_descr ->set_text
>  			(_(map.get_description()) + (map.get_hint().empty() ? "" : (std::string("\n") + _(map.get_hint()))));
> @@ -179,6 +180,7 @@
>  		m_size     ->set_text(buf);
>  	} else {
>  		m_name     ->set_text("");
> +		m_name  ->set_tooltip("");

Reformatted - I hope correctly. I don't know if we're supposed to do the alignment stuff. These files were full of this, so I kept it to keep the diff small.

>  		m_author   ->set_text("");
>  		m_descr    ->set_text("");
>  		m_nrplayers->set_text("");
> @@ -246,7 +248,7 @@
>  			try {
>  				map_loader->preload_map(true);
>  				m_ls->add
> -					(FileSystem::FS_Filename(name),
> +					(FileSystem::FS_FilenameWoExt(name).c_str(),
>  					 name,
>  					 g_gr->images().get
>  						 (dynamic_cast<WidelandsMapLoader*>(map_loader.get())
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_load_map.h'
> --- src/editor/ui_menus/editor_main_menu_load_map.h	2014-09-14 11:31:58 +0000
> +++ src/editor/ui_menus/editor_main_menu_load_map.h	2014-09-27 13:09:21 +0000
> @@ -44,7 +44,8 @@
>  
>  	void fill_list();
>  
> -	UI::Textarea * m_name, * m_author, * m_size, * m_nrplayers;
> +	UI::MultilineTextarea * m_name;
> +	UI::Textarea * m_author, * m_size, * m_nrplayers;
>  	UI::MultilineTextarea * m_descr;
>  	UI::Listselect<const char *> * m_ls;
>  	UI::Button * m_ok_btn;
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_map_options.cc'
> --- src/editor/ui_menus/editor_main_menu_map_options.cc	2014-09-10 14:48:40 +0000
> +++ src/editor/ui_menus/editor_main_menu_map_options.cc	2014-09-27 13:09:21 +0000
> @@ -44,7 +44,7 @@
>  	:
>  	UI::Window
>  		(&parent, "map_options",
> -		 250, (parent.get_h() - 300) / 2, 200, 305,
> +		 250, (parent.get_h() - 300) / 2, 305, 305,
>  		 _("Map Options"))
>  {
>  
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_random_map.cc'
> --- src/editor/ui_menus/editor_main_menu_random_map.cc	2014-09-14 12:13:35 +0000
> +++ src/editor/ui_menus/editor_main_menu_random_map.cc	2014-09-27 13:09:21 +0000
> @@ -46,7 +46,7 @@
>                  "random_map_menu",
>                  (parent.get_w() - 260) / 2,
>                  (parent.get_h() - 450) / 2,
> -                260,
> +					 305,

Reformatted - I hope correctly

>                  490,
>                  _("New Random Map")),
>     // TRANSLATORS: The next are world names for the random map generator.
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_save_map.cc'
> --- src/editor/ui_menus/editor_main_menu_save_map.cc	2014-09-23 09:26:48 +0000
> +++ src/editor/ui_menus/editor_main_menu_save_map.cc	2014-09-27 13:09:21 +0000
> @@ -51,14 +51,14 @@
>  
>  
>  MainMenuSaveMap::MainMenuSaveMap(EditorInteractive & parent)
> -	: UI::Window(&parent, "save_map_menu", 0, 0, 550, 330, _("Save Map"))
> +	: UI::Window(&parent, "save_map_menu", 0, 0, 560, 330, _("Save Map"))
>  {
>  	int32_t const spacing =  5;
>  	int32_t const offsx   = spacing;
>  	int32_t const offsy   = 10;
>  	int32_t posx          = offsx;
>  	int32_t posy          = offsy;
> -	int32_t const descr_label_w = 90;
> +	int32_t const descr_label_w = 100;
>  
>  	m_ls =
>  		new UI::Listselect<const char *>
> @@ -72,7 +72,8 @@
>  			(this,
>  			 posx, posy + get_inner_h() - spacing - offsy - 60 + 3,
>  			 get_inner_w() / 2 - spacing, 20,
> -			 g_gr->images().get("pics/but1.png"));
> +			 g_gr->images().get("pics/but1.png"),
> +			 UI::Align::Align_Left);
>  	m_editbox->setText(parent.egbase().map().get_name());
>  	m_editbox->changed.connect(boost::bind(&MainMenuSaveMap::edit_box_changed, this));
>  
> @@ -80,9 +81,9 @@
>  	new UI::Textarea
>  		(this, posx, posy, descr_label_w, 20, _("Name:"), UI::Align_CenterLeft);
>  	m_name =
> -		new UI::Textarea
> -			(this, posx + descr_label_w, posy, 200, 20, "---", UI::Align_CenterLeft);
> -	posy += 20 + spacing;
> +		new UI::MultilineTextarea
> +			(this, posx + descr_label_w, posy, 200, 40, "---", UI::Align_CenterLeft);
> +	posy += 40 + spacing;
>  
>  	new UI::Textarea
>  		(this, posx, posy, descr_label_w, 20, _("Author:"), UI::Align_CenterLeft);
> @@ -229,6 +230,7 @@
>  		m_editbox->setText(FileSystem::FS_Filename(name));
>  
>  		m_name  ->set_text(map.get_name       ());
> +		m_name  ->set_tooltip(map.get_name    ());
>  		m_author->set_text(map.get_author     ());
>  		m_descr ->set_text(map.get_description());
>  
> @@ -240,17 +242,18 @@
>  		m_size->set_text(buf);
>  	} else {
>  		m_name     ->set_text(FileSystem::FS_Filename(name));
> +		m_name     ->set_tooltip("");
>  		m_author   ->set_text("");
>  		m_nrplayers->set_text("");
>  		m_size     ->set_text("");
>  		if (g_fs->IsDirectory(name)) {
> -			std::string dir_string =
> -				(boost::format("\\<%s\\>") % _("directory")).str();
> -			m_descr    ->set_text(dir_string);
> +			m_name->set_tooltip((boost::format(_("Directory: %s"))
> +										% FileSystem::FS_Filename(name)).str());
> +			m_descr->set_text((boost::format("\\<%s\\>") % _("directory")).str());
>  		} else {
> -			std::string not_map_string =
> -				(boost::format("\\<%s\\>") % _("Not a map file")).str();
> -			m_descr    ->set_text(not_map_string);
> +			std::string not_map_string = _("Not a map file");

Done :)

> +			m_name->set_tooltip(not_map_string);
> +			m_descr->set_text((boost::format("\\<%s\\>") % not_map_string).str());
>  		}
>  
>  	}
> @@ -329,7 +332,7 @@
>  			try {
>  				wml->preload_map(true);
>  				m_ls->add
> -					(FileSystem::FS_Filename(name),
> +					(FileSystem::FS_FilenameWoExt(name).c_str(),
>  					 name,
>  					 g_gr->images().get("pics/ls_wlmap.png"));
>  			} catch (const WException &) {} //  we simply skip illegal entries
> 
> === modified file 'src/editor/ui_menus/editor_main_menu_save_map.h'
> --- src/editor/ui_menus/editor_main_menu_save_map.h	2014-09-14 11:31:58 +0000
> +++ src/editor/ui_menus/editor_main_menu_save_map.h	2014-09-27 13:09:21 +0000
> @@ -50,7 +50,8 @@
>  	bool save_map(std::string, bool);
>  
>  	UI::EditBox * m_editbox;
> -	UI::Textarea * m_name, * m_author, * m_size, * m_nrplayers;
> +	UI::MultilineTextarea * m_name;
> +	UI::Textarea * m_author, * m_size, * m_nrplayers;
>  	UI::MultilineTextarea * m_descr;
>  	UI::Listselect<const char *> * m_ls;
>  	UI::Button * m_ok_btn;
> 
> === modified file 'src/ui_basic/spinbox.cc'
> --- src/ui_basic/spinbox.cc	2014-07-25 19:15:23 +0000
> +++ src/ui_basic/spinbox.cc	2014-09-27 13:09:21 +0000
> @@ -21,6 +21,8 @@
>  
>  #include <vector>
>  
> +#include <boost/format.hpp>
> +
>  #include "base/deprecated.h"
>  #include "base/i18n.h"
>  #include "base/wexception.h"
> @@ -98,20 +100,38 @@
>  		throw wexception("Not enough space to draw spinbox");
>  	int32_t butw = h;
>  	int32_t textw = w - butw * 32 / 5;
> +
> +	int32_t but_plus_x;
> +	int32_t but_minus_x;
> +	int32_t text_x;
> +
> +	if (m_big) {
> +		but_plus_x = w - butw * 31 / 10;
> +		but_minus_x = butw * 21 / 10;
> +
> +	} else {
> +		but_plus_x = w - butw;
> +		but_minus_x = 0;
> +		textw = textw + 4 * butw;
> +	}
>  	while (textw <= 0) {
>  		butw = butw * 3 / 4;
>  		textw = w - butw * 32 / 5;
>  	}
> +	text_x = (w - textw) / 2;
>  
> -	char buf[64];
> -	snprintf(buf, sizeof(buf), "%i %s", sbi->value, sbi->unit.c_str());
> +	std::string unit_text = std::to_string(sbi->value);

How do I turn std::string into const std::string? I tried

const std::string unit_text;
	if (sbi->unit.empty()) {
		unit_text = (std::to_string(sbi->value)).c_str();

and compiler says:

no match for ‘operator=’ (operand types are ‘const string {aka const std::basic_string<char>}’ and ‘const char*’)

I also can't do a const_cast, because it's not a pointer. Now what?

I have the same problem with the return type of boost::format a few lines down.

> +	if (! sbi->unit.empty()) {
> +		/** TRANSLATORS: %i = number, %s = unit, e.g. "5 pixels" in the advanced options */
> +		unit_text = (boost::format(_("%i %s")) % sbi->value % sbi->unit.c_str()).str();
> +	}
>  
>  	sbi->text = new UI::Textarea
> -		(this, butw * 16 / 5, 0, textw, h, buf, Align_Center);
> +		(this, text_x, 0, textw, h, unit_text, Align_Center);
>  	sbi->butPlus =
>  		new Button
>  			(this, "+",
> -			 w - butw * 31 / 10, 0, butw, butw,
> +			 but_plus_x, 0, butw, butw,
>  			 sbi->background,
>  			 "+", _("Increase the value"),
>  			 true, false);
> @@ -119,7 +139,7 @@
>  	sbi->butMinus =
>  		new Button
>  			(this, "-",
> -			 butw * 21 / 10, 0, butw, butw,
> +			 but_minus_x, 0, butw, butw,
>  			 sbi->background,
>  			 "-", _("Decrease the value"),
>  			 true, false);
> @@ -145,8 +165,13 @@
>  		sbi->butTenMinus->sigclicked.connect(boost::bind(&SpinBox::changeValue, boost::ref(*this), -10));
>  		sbi->butTenPlus->set_repeating(true);
>  		sbi->butTenMinus->set_repeating(true);
> +		m_buttons.push_back(sbi->butTenMinus);
> +		m_buttons.push_back(sbi->butTenPlus);
>  	}
>  
> +	m_buttons.push_back(sbi->butMinus);
> +	m_buttons.push_back(sbi->butPlus);
> +
>  	set_font(UI_FONT_NAME, UI_FONT_SIZE_SMALL, UI_FONT_CLR_FG);
>  }
>  
> 
> === modified file 'src/ui_basic/spinbox.h'
> --- src/ui_basic/spinbox.h	2014-07-05 16:41:51 +0000
> +++ src/ui_basic/spinbox.h	2014-09-27 13:09:21 +0000
> @@ -21,6 +21,7 @@
>  #define WL_UI_BASIC_SPINBOX_H
>  
>  #include <cstring>
> +#include <list>
>  
>  #include "graphic/align.h"
>  #include "ui_basic/button.h"
> @@ -57,6 +58,7 @@
>  	void add_replacement(int32_t, std::string);
>  	void remove_replacement(int32_t);
>  	bool has_replacement(int32_t);
> +	std::vector<UI::Button*> get_buttons() {return m_buttons;}

Sounds like a good idea, but I have given up on this.

For the reference, I have given up on finding the syntax that allows me to do this. Of all the variations I have tried, this one seems the most logical to me:

std::vector<UI::Button *> m_buttons;
std::vector<UI::Button *> & get_buttons() {return *m_buttons;}

And the compiler barfs at the return *m_buttons; statement.

For the const, I need to initialize the vector in the constructor. The only thing the compiler seems to like is the following, which then results in a segfault:

	m_buttons(big ? std::vector<UI::Button *>({sbi->butTenPlus, sbi->butTenMinus, sbi->butPlus, sbi->butMinus})
					  : std::vector<UI::Button *>({sbi->butPlus, sbi->butMinus}))

>  
>  private:
>  	void update();
> @@ -66,6 +68,8 @@
>  	const bool  m_big;
>  
>  	SpinBoxImpl * sbi;
> +
> +	std::vector<UI::Button*> m_buttons;
>  };
>  
>  }
> 
> === modified file 'src/ui_fsmenu/editor.cc'
> --- src/ui_fsmenu/editor.cc	2014-09-10 14:08:25 +0000
> +++ src/ui_fsmenu/editor.cc	2014-09-27 13:09:21 +0000
> @@ -24,7 +24,7 @@
>  #include "wui/text_constants.h"
>  
>  FullscreenMenuEditor::FullscreenMenuEditor() :
> -	FullscreenMenuBase("singleplmenu.jpg"),

There were 2 identical background images, so I bzr renamed one of them to ui_fsmenu.jpg and bzr deleted singleplmenu.jpg, which is unused now.

The advanced options window now has a plain background, because the 2 groups in it weren't logical groups at all, but semantic nonsense with no header text for the bottom group. I guess they were done that way to match the main options layout, which is not necessary. I needed the extra space to make room for long strings in the translations.

So, the only background that is actually changed is the one in the advanced options window.

> +	FullscreenMenuBase("ui_fsmenu.jpg"),
>  
>  // Values for alignment and size
>  	m_butw (get_w() * 7 / 20),
> 
> === modified file 'src/ui_fsmenu/launch_spg.cc'
> --- src/ui_fsmenu/launch_spg.cc	2014-09-14 16:08:13 +0000
> +++ src/ui_fsmenu/launch_spg.cc	2014-09-27 13:09:21 +0000
> @@ -48,7 +48,7 @@
>  	(GameSettingsProvider * const settings, GameController * const ctrl,
>  	 bool /* autolaunch */)
>  	:
> -	FullscreenMenuBase("launchgamemenu.jpg"),
> +	FullscreenMenuBase("ui_fsmenu.jpg"),
>  
>  // Values for alignment and size
>  	m_butw (get_w() / 4),
> 
> === modified file 'src/ui_fsmenu/multiplayer.cc'
> --- src/ui_fsmenu/multiplayer.cc	2014-09-10 14:08:25 +0000
> +++ src/ui_fsmenu/multiplayer.cc	2014-09-27 13:09:21 +0000
> @@ -25,7 +25,7 @@
>  #include "wui/text_constants.h"
>  
>  FullscreenMenuMultiPlayer::FullscreenMenuMultiPlayer() :
> -	FullscreenMenuBase("singleplmenu.jpg"),
> +	FullscreenMenuBase("ui_fsmenu.jpg"),
>  
>  // Values for alignment and size
>  	m_butw (get_w() * 7 / 20),
> 
> === modified file 'src/ui_fsmenu/netsetup_lan.cc'
> --- src/ui_fsmenu/netsetup_lan.cc	2014-09-10 14:48:40 +0000
> +++ src/ui_fsmenu/netsetup_lan.cc	2014-09-27 13:09:21 +0000
> @@ -28,7 +28,7 @@
>  #include "wui/text_constants.h"
>  
>  FullscreenMenuNetSetupLAN::FullscreenMenuNetSetupLAN () :
> -	FullscreenMenuBase("singleplmenu.jpg"), //  TODO(unknown): change this
> +	FullscreenMenuBase("ui_fsmenu.jpg"), //  TODO(unknown): change this
>  
>  // Values for alignment and size
>  	m_butx (get_w() * 13 / 40),
> 
> === modified file 'src/ui_fsmenu/options.cc'
> --- src/ui_fsmenu/options.cc	2014-09-14 11:31:58 +0000
> +++ src/ui_fsmenu/options.cc	2014-09-27 13:09:21 +0000
> @@ -23,6 +23,7 @@
>  #include <iostream>
>  
>  #include <boost/algorithm/string/predicate.hpp>
> +#include <boost/format.hpp>
>  
>  #include "base/i18n.h"
>  #include "graphic/default_resolution.h"
> @@ -90,9 +91,14 @@
>  	FullscreenMenuBase("optionsmenu.jpg"),
>  
>  // Values for alignment and size
> -	m_vbutw(get_h() * 333 / 10000),
> -	m_butw (get_w() / 4),
> -	m_buth (get_h() * 9 / 200),
> +	m_vbutw   (get_h() * 333 / 10000),
> +	m_butw    (get_w() / 4),
> +	m_buth    (get_h() * 9 / 200),
> +	m_hmargin (get_w() * 19 / 200),
> +	m_padding (10),
> +	m_space   (25),
> +	m_offset_first_group (get_h() * 1417 / 10000),
> +	m_offset_second_group(get_h() * 5833 / 10000),
>  
>  // Buttons
>  	m_advanced_options
> @@ -111,129 +117,182 @@
>  		 g_gr->images().get("pics/but2.png"),
>  		 _("Apply"), std::string(), true, false),
>  
> -// Spinboxes
> -	m_sb_maxfps
> -		(this,
> -		 (get_w() / 2) - (m_vbutw * 2), get_h() * 3833 / 10000, get_w() / 5, m_vbutw,
> -		 opt.maxfps, 0, 100, "",
> -		 g_gr->images().get("pics/but1.png")),
> -	m_sb_autosave
> -		(this,
> -		 get_w() * 6767 / 10000, get_h() * 8167 / 10000, get_w() / 4, m_vbutw,
> -		 opt.autosave / 60, 0, 100, _("min."),
> -		 g_gr->images().get("pics/but1.png"), true),
> -
> -	m_sb_remove_replays
> -		(this,
> -		 get_w() * 6767 / 10000, get_h() * 8631 / 10000, get_w() / 4, m_vbutw,
> -		 /** TRANSLATORS: Options: Remove Replays older than: */
> -		 /** TRANSLATORS: This will have a number added in front of it */
> -		 opt.remove_replays, 0, 365, ngettext("day", "days", m_vbutw),
> -		 g_gr->images().get("pics/but1.png"), true),
> -
> -// Title
> -	m_title
> -		(this,
> -		 get_w() / 2, get_h() / 40,
> -		 _("General Options"), UI::Align_HCenter),
> -
> -// First options block 'general options'
> -	m_fullscreen (this, Point(get_w() * 3563 / 10000, get_h() * 1667 / 10000)),
> +	// Title
> +		m_title
> +			(this,
> +			 get_w() / 2, get_h() / 40,
> +			 _("General Options"), UI::Align_HCenter),
> +
> +	// First options block 'general options', first column
> +	m_label_resolution
> +		(this,
> +		 m_hmargin, m_offset_first_group,
> +		 _("In-game resolution"), UI::Align_VCenter),
> +	m_reslist
> +		(this,
> +		 m_hmargin, m_label_resolution.get_y() + m_label_resolution.get_h(),
> +		 (get_w() - 2 * m_hmargin - m_space) / 2, 95,
> +		 UI::Align_Left, true),
> +
> +	m_fullscreen (this, Point(m_hmargin,
> +									  m_reslist.get_y() +

http://google-styleguide.googlecode.com/svn/trunk/cppguide.html#Function_Calls

This doesn't say anything about what to do if the arguments are a long expression. So, you need to tell me what you want here and I can go change.

> +									  m_reslist.get_h() + m_padding)),
>  	m_label_fullscreen
>  		(this,
> -		 get_w() * 1969 / 5000, get_h() * 1833 / 10000,
> +		 m_hmargin + m_fullscreen.get_w() + m_padding,
> +		 m_reslist.get_y() + m_reslist.get_h() + m_padding,
> +		 m_reslist.get_w() - m_fullscreen.get_w() - m_padding,
> +		 m_fullscreen.get_h(),
>  		 _("Fullscreen"), UI::Align_VCenter),
>  
> -	m_inputgrab (this, Point(get_w() * 3563 / 10000, get_h() * 2167 / 10000)),
> +	m_inputgrab (this, Point(m_hmargin,
> +									 m_label_fullscreen.get_y() +
> +									 m_label_fullscreen.get_h() + m_padding)),
>  	m_label_inputgrab
>  		(this,
> -		 get_w() * 1969 / 5000, get_h() * 2333 / 10000,
> +		 m_hmargin + m_inputgrab.get_w() + m_padding,
> +		 m_label_fullscreen.get_y() + m_label_fullscreen.get_h() + m_padding,
> +		 m_reslist.get_w() - m_inputgrab.get_w() - m_padding,
> +		 m_inputgrab.get_h(),
>  		 _("Grab Input"), UI::Align_VCenter),
>  
> -	m_music (this, Point(get_w() * 3563 / 10000, get_h() * 2667 / 10000)),
> -	m_label_music
> -		(this,
> -		 get_w() * 1969 / 5000, get_h() * 2833 / 10000,
> -		 _("Enable Music"), UI::Align_VCenter),
> -
> -	m_fx (this, Point(get_w() * 3563 / 10000, get_h() * 3167 / 10000)),
> -	m_label_fx
> -		(this,
> -		 get_w() * 1969 / 5000, get_h() * 3333 / 10000,
> -		 _("Enable Sound"), UI::Align_VCenter),
> -
>  	m_label_maxfps
>  		(this,
> -		 get_w() * 3563 / 10000, get_h() * 2 / 5,
> +		 m_hmargin,
> +		 m_label_inputgrab.get_y() + m_label_inputgrab.get_h() + m_padding,
> +		 m_reslist.get_w() - 80, m_inputgrab.get_h(),
>  		 _("Maximum FPS:"), UI::Align_VCenter),
> -
> -	m_reslist
> -		(this,
> -		 get_w()      / 10, get_h() * 1667 / 10000,
> -		 get_w() * 19 / 80, get_h() * 2833 / 10000,
> -		 UI::Align_Left, true),
> -	m_label_resolution
> -		(this,
> -		 get_w() * 1063 / 10000, get_h() * 1417 / 10000,
> -		 _("In-game resolution"), UI::Align_VCenter),
> -
> +	m_sb_maxfps
> +		(this,
> +		 m_hmargin + m_reslist.get_w() - 80, m_label_maxfps.get_y(),
> +		 80, m_vbutw,
> +		 opt.maxfps, 0, 99, "",
> +		 g_gr->images().get("pics/but1.png")),
> +
> +
> +	// First options block 'general options', second column
>  	m_label_language
>  		(this,
> -		 get_w() * 133 / 200, get_h() * 1417 / 10000,
> +		 get_w() - m_hmargin - (get_w() - 2 * m_hmargin - m_space) / 2, m_offset_first_group,
>  		 _("Language"), UI::Align_VCenter),
> +	// same height as m_reslist
>  	m_language_list
>  		(this,
> -		 get_w() * 6563 / 10000, get_h() * 1667 / 10000,
> -		 get_w() *   21 /    80, get_h() * 2833 / 10000,
> +		 m_label_language.get_x(), m_label_language.get_y() + m_label_language.get_h(),
> +		 (get_w() - 2 * m_hmargin - m_space) / 2, m_reslist.get_h(),
>  		 UI::Align_Left, true),
>  
> -// Title 2
> +	m_music (this, Point(m_label_language.get_x(),
> +								m_language_list.get_y() +
> +								m_language_list.get_h() + m_padding)),
> +	m_label_music
> +		(this,
> +		 m_label_language.get_x() + m_music.get_w() + m_padding,
> +		 m_language_list.get_y() + m_language_list.get_h() + m_padding,
> +		 m_language_list.get_w(), m_music.get_h(),
> +		 _("Enable Music"), UI::Align_VCenter),
> +
> +	m_fx (this, Point(m_label_language.get_x(),
> +							m_label_music.get_y() +
> +							m_label_music.get_h() + m_padding)),
> +	m_label_fx
> +		(this,
> +		 m_label_language.get_x() + m_fx.get_w() + m_padding,
> +		 m_label_music.get_y() + m_label_music.get_h() + m_padding,
> +		 m_language_list.get_w(), m_fx.get_h(),
> +		 _("Enable Sound"), UI::Align_VCenter),
> +
> +	// Second options block 'In-game options'
> +	// Title 2
>  	m_label_game_options
>  		(this,
>  		 get_w() / 2, get_h() / 2,
>  		 _("In-game Options"), UI::Align_HCenter),
>  
> -// Second options block 'In-game options'
> -	m_single_watchwin (this, Point(get_w() * 19 / 200, get_h() * 5833 / 10000)),
> +	m_single_watchwin (this, Point(m_hmargin, m_offset_second_group)),
>  	m_label_single_watchwin
>  		(this,
> -		 get_w() * 1313 / 10000, get_h() * 3 / 5,
> -		 _("Use single Watchwindow Mode"), UI::Align_VCenter),
> +		 m_single_watchwin.get_x() + m_single_watchwin.get_w() + m_padding,
> +		 m_offset_second_group,
> +		 get_w() - 2 * m_hmargin - m_single_watchwin.get_w(), m_single_watchwin.get_h(),
> +		 _("Use single watchwindow mode"), UI::Align_VCenter),
>  
> -	m_auto_roadbuild_mode (this, Point(get_w() * 19 / 200, get_h() * 63 / 100)),
> +	m_auto_roadbuild_mode (this, Point(m_single_watchwin.get_x(),
> +												  m_label_single_watchwin.get_y() +
> +												  m_label_single_watchwin.get_h() + m_padding)),
>  	m_label_auto_roadbuild_mode
>  		(this,
> -		 get_w() * 1313 / 10000, get_h() * 6467 / 10000,
> +		 m_auto_roadbuild_mode.get_x() + m_auto_roadbuild_mode.get_w() + m_padding,
> +		 m_label_single_watchwin.get_y() + m_label_single_watchwin.get_h() + m_padding,
> +		 get_w() - 2 * m_hmargin - m_auto_roadbuild_mode.get_w(), m_auto_roadbuild_mode.get_h(),
>  		 _("Start building road after placing a flag"), UI::Align_VCenter),
>  
>  	m_show_workarea_preview
> -		(this, Point(get_w() * 19 / 200, get_h() * 6767 / 10000)),
> +		(this, Point(m_auto_roadbuild_mode.get_x(),
> +						 m_label_auto_roadbuild_mode.get_y() +
> +						 m_label_auto_roadbuild_mode.get_h() + m_padding)),
>  	m_label_show_workarea_preview
>  		(this,
> -		 get_w() * 1313 / 10000, get_h() * 6933 / 10000,
> +		 m_show_workarea_preview.get_x() + m_show_workarea_preview.get_w() + m_padding,
> +		 m_label_auto_roadbuild_mode.get_y() + m_label_auto_roadbuild_mode.get_h() + m_padding,
> +		 get_w() - 2 * m_hmargin - m_show_workarea_preview.get_w(), m_show_workarea_preview.get_h(),
>  		 _("Show buildings area preview"), UI::Align_VCenter),
>  
> -	m_snap_windows_only_when_overlapping
> -		(this, Point(get_w() * 19 / 200, get_h() * 7233 / 10000)),
> -	m_label_snap_windows_only_when_overlapping
> +	m_snap_win_overlap_only
> +		(this, Point(m_show_workarea_preview.get_x(),
> +						 m_label_show_workarea_preview.get_y() +
> +						 m_label_show_workarea_preview.get_h() + m_padding)),
> +	m_label_snap_win_overlap_only
>  		(this,
> -		 get_w() * 1313 / 10000, get_h() * 37 / 50,
> +		 m_snap_win_overlap_only.get_x() + m_snap_win_overlap_only.get_w() + m_padding,
> +		 m_label_show_workarea_preview.get_y() + m_label_show_workarea_preview.get_h() + m_padding,
> +		 get_w() - 2 * m_hmargin - m_snap_win_overlap_only.get_w(), m_snap_win_overlap_only.get_h(),
>  		 _("Snap windows only when overlapping"), UI::Align_VCenter),
>  
> -	m_dock_windows_to_edges (this, Point(get_w() * 19 / 200, get_h() * 77 / 100)),
> +	m_dock_windows_to_edges (this, Point(m_snap_win_overlap_only.get_x(),
> +													 m_label_snap_win_overlap_only.get_y() +
> +													 m_label_snap_win_overlap_only.get_h() + m_padding)),
>  	m_label_dock_windows_to_edges
>  		(this,
> -		 get_w() * 1313 / 10000, get_h() * 7867 / 10000,
> +		 m_dock_windows_to_edges.get_x() + m_dock_windows_to_edges.get_w() + m_padding,
> +		 m_label_snap_win_overlap_only.get_y() + m_label_snap_win_overlap_only.get_h() + m_padding,
> +		 get_w() - 2 * m_hmargin - m_dock_windows_to_edges.get_w(), m_dock_windows_to_edges.get_h(),
>  		 _("Dock windows to edges"), UI::Align_VCenter),
>  
> +	m_sb_autosave
> +		(this,
> +		 get_w() - m_hmargin - 240,
> +		 m_dock_windows_to_edges.get_y() + m_dock_windows_to_edges.get_h() + m_padding,
> +		 240, m_vbutw,
> +		 /** TRANSLATORS: Options: Save game automatically every: */
> +		 /** TRANSLATORS: This will have a number added in front of it */
> +		 opt.autosave / 60, 0, 100, ngettext("minute", "minutes", opt.autosave / 60),
> +		 g_gr->images().get("pics/but1.png"), true),
>  	m_label_autosave
>  		(this,
> -		 get_w() * 1313 / 10000, get_h() * 8333 / 10000,
> +		 m_dock_windows_to_edges.get_x(),
> +		 m_sb_autosave.get_y(),
> +		 get_w() - m_sb_autosave.get_w() - 2 * m_hmargin,
> +		 m_dock_windows_to_edges.get_h(),
>  		 _("Save game automatically every"), UI::Align_VCenter),
> +
> +
> +	m_sb_remove_replays
> +		(this,
> +		 get_w() - m_hmargin - 240,
> +		 m_sb_autosave.get_y() + m_sb_autosave.get_h() + m_padding,
> +		 240, m_vbutw,
> +		 /** TRANSLATORS: Options: Remove Replays older than: */
> +		 /** TRANSLATORS: This will have a number added in front of it */
> +		 opt.remove_replays, 0, 365, ngettext("day", "days", opt.remove_replays),
> +		 g_gr->images().get("pics/but1.png"), true),
>  	m_label_remove_replays
>  		(this,
> -		 get_w() * 1313 / 10000, get_h() * 8799 / 10000,
> -		 _("Remove Replays older than:"), UI::Align_VCenter),
> +		 m_label_autosave.get_x(),
> +		 m_sb_remove_replays.get_y(),
> +		 get_w() - m_sb_remove_replays.get_w() - 2 * m_hmargin,
> +		 m_dock_windows_to_edges.get_h(),
> +		 _("Remove replays older than:"), UI::Align_VCenter),
>  
>  	os(opt)
>  {
> @@ -244,51 +303,39 @@
>  	m_apply.sigclicked.connect
>  		(boost::bind(&FullscreenMenuOptions::end_modal, this, static_cast<int32_t>(om_ok)));
>  
> -	m_advanced_options.set_font(font_small());
> -	m_apply.set_font(font_small());
> -	m_cancel.set_font(font_small());
> -
> -	/** TRANSLATORS Options: Remove Replays older than: */
> +	/** TRANSLATORS Options: Save game automatically every: */
>  	m_sb_autosave     .add_replacement(0, _("Off"));
> +	std::vector<UI::Button*> temp_buttons = m_sb_autosave.get_buttons();
> +	for (UI::Button* temp_button : temp_buttons) {
> +		temp_button->sigclicked.connect
> +				(boost::bind
> +					(&FullscreenMenuOptions::update_sb_autosave_unit,
> +					 boost::ref(*this)));
> +	}
>  	/** TRANSLATORS Options: Remove Replays older than: */
>  	m_sb_remove_replays.add_replacement(0, _("Never"));
> -	/** TRANSLATORS Options: Remove Replays older than: */
> -	m_sb_remove_replays.add_replacement(1, _("1 day"));
> +	temp_buttons = m_sb_remove_replays.get_buttons();
> +	for (UI::Button* temp_button : temp_buttons) {
> +		temp_button->sigclicked.connect
> +				(boost::bind
> +					(&FullscreenMenuOptions::update_sb_remove_replays_unit,
> +					 boost::ref(*this)));
> +	}
>  
> -	m_sb_maxfps       .set_font(ui_fn(), fs_small(), UI_FONT_CLR_FG);
> -	m_sb_autosave     .set_font(ui_fn(), fs_small(), UI_FONT_CLR_FG);
> -	m_sb_remove_replays.set_font(ui_fn(), fs_small(), UI_FONT_CLR_FG);
>  	m_title           .set_textstyle(ts_big());
> -	m_label_fullscreen.set_textstyle(ts_small());
>  	m_fullscreen      .set_state(opt.fullscreen);
> -	m_label_inputgrab .set_textstyle(ts_small());
>  	m_inputgrab       .set_state(opt.inputgrab);
> -	m_label_music     .set_textstyle(ts_small());
>  	m_music           .set_state(opt.music);
>  	m_music           .set_enabled(!g_sound_handler.lock_audio_disabling_);
> -	m_label_fx        .set_textstyle(ts_small());
>  	m_fx              .set_state(opt.fx);
>  	m_fx              .set_enabled(!g_sound_handler.lock_audio_disabling_);
> -	m_label_maxfps    .set_textstyle(ts_small());
> -	m_label_resolution.set_textstyle(ts_small());
> -	m_reslist         .set_font(ui_fn(), fs_small());
> -	m_label_language  .set_textstyle(ts_small());
> -	m_language_list   .set_font(ui_fn(), fs_small());
>  
>  	m_label_game_options             .set_textstyle(ts_big());
> -	m_label_single_watchwin          .set_textstyle(ts_small());
>  	m_single_watchwin                .set_state(opt.single_watchwin);
> -	m_label_auto_roadbuild_mode      .set_textstyle(ts_small());
>  	m_auto_roadbuild_mode            .set_state(opt.auto_roadbuild_mode);
> -	m_label_show_workarea_preview    .set_textstyle(ts_small());
>  	m_show_workarea_preview          .set_state(opt.show_warea);
> -	m_label_snap_windows_only_when_overlapping.set_textstyle(ts_small());
> -	m_snap_windows_only_when_overlapping.set_state
> -		(opt.snap_windows_only_when_overlapping);
> -	m_label_dock_windows_to_edges    .set_textstyle(ts_small());
> +	m_snap_win_overlap_only          .set_state(opt.snap_win_overlap_only);
>  	m_dock_windows_to_edges          .set_state(opt.dock_windows_to_edges);
> -	m_label_autosave                 .set_textstyle(ts_small());
> -	m_label_remove_replays           .set_textstyle(ts_small());
>  
>  	//  GRAPHIC_TODO(unknown): this shouldn't be here List all resolutions
>  	// take a copy to not change real video info structure
> @@ -315,21 +362,21 @@
>  
>  	bool did_select_a_res = false;
>  	for (uint32_t i = 0; i < m_resolutions.size(); ++i) {
> -		char buf[32];
> -		// TODO(sirver): must use boost::format
> -		/** TRANSLATORS: Screen resolution, e.g. 800 x 600*/
> -		sprintf(buf, _("%1$i x %2$i"), m_resolutions[i].xres, m_resolutions[i].yres);
>  		const bool selected =
>  			m_resolutions[i].xres  == opt.xres &&
>  			m_resolutions[i].yres  == opt.yres;
>  		did_select_a_res |= selected;
> -		m_reslist.add(buf, nullptr, nullptr, selected);
> +		/** TRANSLATORS: Screen resolution, e.g. 800 x 600*/
> +		m_reslist.add((boost::format(_("%1% x %2%"))
> +							% m_resolutions[i].xres
> +							% m_resolutions[i].yres).str().c_str(),
> +						  nullptr, nullptr, selected);
>  	}
>  	if (!did_select_a_res) {
> -		char buf[32];
> -		/** TRANSLATORS: Screen resolution, e.g. 800 x 600*/
> -		sprintf(buf, "%1$i x %2$i", opt.xres, opt.yres);
> -		m_reslist.add(buf, nullptr, nullptr, true);
> +		m_reslist.add((boost::format(_("%1% x %2%"))
> +							% opt.xres
> +							% opt.yres).str().c_str(),
> +						  nullptr, nullptr, true);
>  		uint32_t entry = m_resolutions.size();
>  		m_resolutions.resize(entry + 1);
>  		m_resolutions[entry].xres  = opt.xres;
> @@ -348,6 +395,14 @@
>  	add_languages_to_list(&m_language_list, opt.language);
>  }
>  
> +void FullscreenMenuOptions::update_sb_autosave_unit() {
> +	m_sb_autosave.setUnit(ngettext("minute", "minutes", m_sb_autosave.getValue()));
> +}
> +
> +void FullscreenMenuOptions::update_sb_remove_replays_unit() {
> +	m_sb_remove_replays.setUnit(ngettext("day", "days", m_sb_remove_replays.getValue()));
> +}
> +
>  void FullscreenMenuOptions::advanced_options() {
>  	FullscreenMenuAdvancedOptions aom(os);
>  	if (aom.run() == FullscreenMenuAdvancedOptions::om_ok) {
> @@ -386,13 +441,12 @@
>  	os.single_watchwin       = m_single_watchwin.get_state();
>  	os.auto_roadbuild_mode   = m_auto_roadbuild_mode.get_state();
>  	os.show_warea            = m_show_workarea_preview.get_state();
> -	os.snap_windows_only_when_overlapping
> -		= m_snap_windows_only_when_overlapping.get_state();
> +	os.snap_win_overlap_only = m_snap_win_overlap_only.get_state();
>  	os.dock_windows_to_edges = m_dock_windows_to_edges.get_state();
>  	os.music                 = m_music.get_state();
>  	os.fx                    = m_fx.get_state();
>  	if (m_language_list.has_selection())
> -		os.language      = m_language_list.get_selected();
> +		os.language           = m_language_list.get_selected();
>  	os.autosave              = m_sb_autosave.getValue();
>  	os.maxfps                = m_sb_maxfps.getValue();
>  	os.remove_replays        = m_sb_remove_replays.getValue();
> @@ -407,12 +461,16 @@
>  FullscreenMenuAdvancedOptions::FullscreenMenuAdvancedOptions
>  	(OptionsCtrl::OptionsStruct const opt)
>  	:
> -	FullscreenMenuBase("optionsmenu.jpg"),
> +	FullscreenMenuBase("ui_fsmenu.jpg"),
>  
>  // Values for alignment and size
> -	m_vbutw (get_h() * 333 / 10000),
> -	m_butw  (get_w() / 4),
> -	m_buth  (get_h() * 9 / 200),
> +	m_vbutw   (get_h() * 333 / 10000),
> +	m_butw    (get_w() / 4),
> +	m_buth    (get_h() * 9 / 200),
> +	m_hmargin (get_w() * 19 / 200),
> +	m_padding (10),
> +	m_space   (25),
> +	m_offset_first_group (get_h() * 1417 / 10000),
>  
>  // Buttons
>  	m_cancel
> @@ -426,19 +484,6 @@
>  		 g_gr->images().get("pics/but2.png"),
>  		 _("Apply"), std::string(), true, false),
>  
> -// Spinboxes
> -	m_sb_dis_panel
> -		(this,
> -		 get_w() * 18 / 25, get_h() * 63 / 100, get_w() / 4, m_vbutw,
> -		 opt.panel_snap_distance, 0, 100, _("px."),
> -		 g_gr->images().get("pics/but1.png")),
> -	m_sb_dis_border
> -		(this,
> -		 get_w() * 18 / 25, get_h() * 6768 / 10000, get_w() / 4, m_vbutw,
> -		 opt.border_snap_distance, 0, 100, _("px."),
> -		 g_gr->images().get("pics/but1.png")),
> -
> -
>  // Title
>  	m_title
>  		(this,
> @@ -446,57 +491,105 @@
>  		 _("Advanced Options"), UI::Align_HCenter),
>  
>  // First options block
> +	m_label_ui_font
> +		(this,
> +		 m_hmargin, m_offset_first_group,
> +		 _("Main menu font:"), UI::Align_BottomLeft),
>  	m_ui_font_list
>  		(this,
> -		 get_w() / 10, get_h() * 1667 / 10000,
> -		 get_w() /  4, get_h() * 2833 / 10000,
> +		 m_label_ui_font.get_x(), m_label_ui_font.get_y() + m_label_ui_font.get_h() + m_padding,
> +		 get_w() - 2 * m_hmargin, 134,
>  		 UI::Align_Left, true),
> -	m_label_ui_font
> -		(this,
> -		 get_w() * 1063 / 10000, get_h() * 1417 / 10000,
> -		 _("Main menu font:"), UI::Align_VCenter),
> +
> +	m_label_snap_dis_panel
> +		(this,
> +		 m_hmargin, m_ui_font_list.get_y() + m_ui_font_list.get_h() + m_space + m_padding,
> +		 _("Distance for windows to snap to other panels:"), UI::Align_VCenter),
> +	m_label_snap_dis_border
> +		(this,
> +		 m_hmargin,  m_label_snap_dis_panel.get_y() + m_label_snap_dis_panel.get_h() + 2 * m_padding,
> +		 _("Distance for windows to snap to borders:"), UI::Align_VCenter),
> +
> +	// Spinboxes
> +	m_sb_dis_panel
> +			(this,
> +			 get_w() - m_hmargin - (get_w() / 5), m_label_snap_dis_panel.get_y(),
> +			 get_w() / 5, m_vbutw,
> +			 opt.panel_snap_distance, 0, 99, ngettext("pixel", "pixels", opt.panel_snap_distance),
> +			 g_gr->images().get("pics/but1.png")),
> +
> +	m_sb_dis_border
> +			(this,
> +			 get_w() - m_hmargin - (get_w() / 5), m_label_snap_dis_border.get_y(),
> +			 get_w() / 5, m_vbutw,
> +			 opt.border_snap_distance, 0, 99, ngettext("pixel", "pixels", opt.border_snap_distance),
> +			 g_gr->images().get("pics/but1.png")),
> +
> +	m_transparent_chat (this, Point(m_hmargin,
> +											  m_label_snap_dis_border.get_y() +
> +											  m_label_snap_dis_border.get_h() + m_space)),
> +	m_label_transparent_chat
> +		(this,
> +		 m_hmargin + m_transparent_chat.get_w() + m_padding, m_transparent_chat.get_y(),
> +		 get_w() - 2 * m_hmargin - m_transparent_chat.get_w() - m_padding, 40,
> +		 _("Show in-game chat with transparent background"), UI::Align_VCenter),
> +
>  	m_message_sound
> -		(this, Point(get_w() * 29 / 80, get_h() * 171 / 1000)),
> +		(this, Point(m_hmargin,
> +						 m_label_transparent_chat.get_y() +
> +						 m_label_transparent_chat.get_h() + m_padding)),
>  	m_label_message_sound
>  		(this,
> -		 get_w() * 4 / 10, get_h() * 1883 / 10000,
> +		 m_hmargin + m_message_sound.get_w() + m_padding, m_message_sound.get_y(),
> +		 get_w() - 2 * m_hmargin - m_message_sound.get_w() - m_padding, 40,
>  		 _("Play a sound at message arrival."),
>  		 UI::Align_VCenter),
>  
> -// Second options block
> -	m_nozip (this, Point(get_w() * 19 / 200, get_h() * 5833 / 10000)),
> +	m_nozip (this, Point(m_hmargin,
> +								m_label_message_sound.get_y() +
> +								m_label_message_sound.get_h() + m_padding)),
>  	m_label_nozip
>  		(this,
> -		 get_w() * 1313 / 10000, get_h() * 3 / 5,
> +		 m_hmargin + m_nozip.get_w() + m_padding, m_nozip.get_y(),
> +		 get_w() - 2 * m_hmargin - m_nozip.get_w() - m_padding, 40,
>  		 _("Do not zip widelands data files (maps, replays and savegames)."),
>  		 UI::Align_VCenter),
> -	m_label_snap_dis_panel
> -		(this,
> -		 get_w() * 1313 / 10000, get_h() * 6467 / 10000,
> -		 _("Distance for windows to snap to other panels:"), UI::Align_VCenter),
> -	m_label_snap_dis_border
> -		(this,
> -		 get_w() * 1313 / 10000, get_h() * 6933 / 10000,
> -		 _("Distance for windows to snap to borders:"), UI::Align_VCenter),
>  
> -	m_remove_syncstreams (this, Point(get_w() * 19 / 200, get_h() * 7220 / 10000)),
> +	m_remove_syncstreams (this, Point(m_hmargin,
> +												 m_label_nozip.get_y() +
> +												 m_label_nozip.get_h() + m_padding)),
>  	m_label_remove_syncstreams
>  		(this,
> -		 get_w() * 1313 / 10000, get_h() * 37 / 50,
> +		 m_hmargin + m_remove_syncstreams.get_w() + m_padding, m_remove_syncstreams.get_y(),
> +		 get_w() - 2 * m_hmargin - m_remove_syncstreams.get_w() - m_padding, 40,
>  		 _("Remove Syncstream dumps on startup"), UI::Align_VCenter),
>  
> -	m_opengl (this, Point(get_w() * 19 / 200, get_h() * 7715 / 10000)),
> +	m_opengl (this, Point(m_hmargin,
> +								 m_label_remove_syncstreams.get_y() +
> +								 m_label_remove_syncstreams.get_h() + m_padding)),
>  	m_label_opengl
>  		(this,
> -		 get_w() * 1313 / 10000, get_h() * 7865 / 10000,
> +		 m_hmargin + m_opengl.get_w() + m_padding, m_opengl.get_y(),
> +		 get_w() - 2 * m_hmargin - m_opengl.get_w() - m_padding, 40,
>  		 _("OpenGL rendering"), UI::Align_VCenter),
> -	m_transparent_chat (this, Point(get_w() * 19 / 200, get_h() * 8180 / 10000)),
> -	m_label_transparent_chat
> -		(this,
> -		 get_w() * 1313 / 10000, get_h() * 8330 / 10000,
> -		 _("Show in-game chat with transparent background"), UI::Align_VCenter),
>  	os(opt)
>  {
> +	std::vector<UI::Button*> temp_buttons = m_sb_dis_panel.get_buttons();
> +	for (UI::Button* temp_button : temp_buttons) {
> +		temp_button->sigclicked.connect
> +				(boost::bind
> +					(&FullscreenMenuAdvancedOptions::update_sb_dis_panel_unit,
> +					 boost::ref(*this)));
> +	}
> +
> +	temp_buttons = m_sb_dis_border.get_buttons();
> +	for (UI::Button* temp_button : temp_buttons) {
> +		temp_button->sigclicked.connect
> +				(boost::bind
> +					(&FullscreenMenuAdvancedOptions::update_sb_dis_border_unit,
> +					 boost::ref(*this)));
> +	}
> +
>  	m_cancel.sigclicked.connect
>  		(boost::bind
>  			(&FullscreenMenuAdvancedOptions::end_modal,
> @@ -508,27 +601,12 @@
>  			 boost::ref(*this),
>  			 static_cast<int32_t>(om_ok)));
>  
> -	m_cancel.set_font(font_small());
> -	m_apply.set_font(font_small());
> -
>  	m_title                .set_textstyle(ts_big());
> -	m_label_message_sound  .set_textstyle(ts_small());
>  	m_message_sound        .set_state(opt.message_sound);
> -	m_label_nozip          .set_textstyle(ts_small());
>  	m_nozip                .set_state(opt.nozip);
> -	m_label_snap_dis_border.set_textstyle(ts_small());
> -	m_label_snap_dis_panel .set_textstyle(ts_small());
> -	m_label_remove_syncstreams.set_textstyle(ts_small());
>  	m_remove_syncstreams   .set_state(opt.remove_syncstreams);
> -	m_label_opengl         .set_textstyle(ts_small());
>  	m_opengl               .set_state(opt.opengl);
> -	m_label_transparent_chat.set_textstyle(ts_small());
>  	m_transparent_chat     .set_state(opt.transparent_chat);
> -	m_sb_dis_border        .set_textstyle(ts_small());
> -	m_sb_dis_panel         .set_textstyle(ts_small());
> -
> -	m_label_ui_font.set_textstyle(ts_small());
> -	m_ui_font_list .set_font(ui_fn(), fs_small());
>  
>  	// Fill the font list.
>  	{ // For use of string ui_font take a look at fullscreen_menu_base.cc
> @@ -593,6 +671,14 @@
>  	return FullscreenMenuBase::handle_key(down, code);
>  }
>  
> +void FullscreenMenuAdvancedOptions::update_sb_dis_panel_unit() {
> +	m_sb_dis_panel.setUnit(ngettext("pixel", "pixels", m_sb_dis_panel.getValue()));
> +}
> +
> +void FullscreenMenuAdvancedOptions::update_sb_dis_border_unit() {
> +	m_sb_dis_border.setUnit(ngettext("pixel", "pixels", m_sb_dis_border.getValue()));
> +}
> +
>  
>  OptionsCtrl::OptionsStruct FullscreenMenuAdvancedOptions::get_values() {
>  	// Write all remaining data from UI elements
> @@ -642,7 +728,7 @@
>  	opt.single_watchwin = m_opt_section.get_bool("single_watchwin", false);
>  	opt.auto_roadbuild_mode = m_opt_section.get_bool("auto_roadbuild_mode", true);
>  	opt.show_warea = m_opt_section.get_bool("workareapreview", true);
> -	opt.snap_windows_only_when_overlapping =
> +	opt.snap_win_overlap_only =
>  	   m_opt_section.get_bool("snap_windows_only_when_overlapping", false);
>  	opt.dock_windows_to_edges = m_opt_section.get_bool("dock_windows_to_edges", false);
>  	opt.language = m_opt_section.get_string("language", "");
> @@ -674,7 +760,7 @@
>  	m_opt_section.set_bool("workareapreview",       opt.show_warea);
>  	m_opt_section.set_bool
>  		("snap_windows_only_when_overlapping",
> -		 opt.snap_windows_only_when_overlapping);
> +		 opt.snap_win_overlap_only);
>  	m_opt_section.set_bool("dock_windows_to_edges", opt.dock_windows_to_edges);
>  	m_opt_section.set_bool("disable_music",        !opt.music);
>  	m_opt_section.set_bool("disable_fx",           !opt.fx);
> 
> === modified file 'src/ui_fsmenu/options.h'
> --- src/ui_fsmenu/options.h	2014-09-10 14:08:25 +0000
> +++ src/ui_fsmenu/options.h	2014-09-27 13:09:21 +0000
> @@ -28,6 +28,7 @@
>  #include "ui_basic/button.h"
>  #include "ui_basic/checkbox.h"
>  #include "ui_basic/listselect.h"
> +#include "ui_basic/multilinetextarea.h"
>  #include "ui_basic/spinbox.h"
>  #include "ui_basic/textarea.h"
>  
> @@ -44,7 +45,7 @@
>  		bool single_watchwin;
>  		bool auto_roadbuild_mode;
>  		bool show_warea;
> -		bool snap_windows_only_when_overlapping;
> +		bool snap_win_overlap_only;
>  		bool dock_windows_to_edges;
>  		bool music;
>  		bool fx;
> @@ -92,41 +93,54 @@
>  	bool handle_key(bool down, SDL_keysym code) override;
>  
>  private:
> -	uint32_t                          m_vbutw;
> -	uint32_t                          m_butw;
> -	uint32_t                          m_buth;
> -	UI::Button           m_advanced_options, m_cancel, m_apply;
> -	UI::SpinBox                       m_sb_maxfps, m_sb_autosave;
> -	UI::SpinBox                       m_sb_remove_replays;
> -	UI::Textarea                      m_title;
> -	UI::Checkbox                      m_fullscreen;
> -	UI::Textarea                      m_label_fullscreen;
> -	UI::Checkbox                      m_inputgrab;
> -	UI::Textarea                      m_label_inputgrab;
> -	UI::Checkbox                      m_music;
> -	UI::Textarea                      m_label_music;
> -	UI::Checkbox                      m_fx;
> -	UI::Textarea                      m_label_fx;
> -	UI::Textarea                      m_label_maxfps;
> -	UI::Listselect<void *>            m_reslist;
> -	UI::Textarea                      m_label_resolution;
> -	UI::Textarea                      m_label_language;
> -	UI::Listselect<std::string>       m_language_list;
> -	UI::Textarea                      m_label_game_options;
> -	UI::Checkbox                      m_single_watchwin;
> -	UI::Textarea                      m_label_single_watchwin;
> -	UI::Checkbox                      m_auto_roadbuild_mode;
> -	UI::Textarea                      m_label_auto_roadbuild_mode;
> -	UI::Checkbox                      m_show_workarea_preview;
> -	UI::Textarea                      m_label_show_workarea_preview;
> -	UI::Checkbox                      m_snap_windows_only_when_overlapping;
> -	UI::Textarea                      m_label_snap_windows_only_when_overlapping;
> -	UI::Checkbox                      m_dock_windows_to_edges;
> -	UI::Textarea                      m_label_dock_windows_to_edges;
> -	UI::Textarea                      m_label_autosave;
> -	UI::Textarea                      m_label_remove_replays;
> -	OptionsCtrl::OptionsStruct os;
> -
> +	uint32_t const              m_vbutw;
> +	uint32_t const              m_butw;
> +	uint32_t const              m_buth;
> +	uint32_t const              m_hmargin;
> +	uint32_t const              m_padding;
> +	uint32_t const              m_space;
> +	uint32_t const              m_offset_first_group;
> +	uint32_t const              m_offset_second_group;
> +
> +	UI::Button                  m_advanced_options, m_cancel, m_apply;
> +
> +	UI::Textarea                m_title;
> +	UI::Textarea                m_label_resolution;
> +	UI::Listselect<void *>      m_reslist;
> +	UI::Checkbox                m_fullscreen;
> +	UI::Textarea                m_label_fullscreen;
> +	UI::Checkbox                m_inputgrab;
> +	UI::Textarea                m_label_inputgrab;
> +	UI::Textarea                m_label_maxfps;
> +	UI::SpinBox                 m_sb_maxfps;
> +
> +	UI::Textarea                m_label_language;
> +	UI::Listselect<std::string> m_language_list;
> +	UI::Checkbox                m_music;
> +	UI::Textarea                m_label_music;
> +	UI::Checkbox                m_fx;
> +	UI::Textarea                m_label_fx;
> +
> +	UI::Textarea                m_label_game_options;
> +	UI::Checkbox                m_single_watchwin;
> +	UI::Textarea                m_label_single_watchwin;
> +	UI::Checkbox                m_auto_roadbuild_mode;
> +	UI::Textarea                m_label_auto_roadbuild_mode;
> +	UI::Checkbox                m_show_workarea_preview;
> +	UI::Textarea                m_label_show_workarea_preview;
> +	UI::Checkbox                m_snap_win_overlap_only;
> +	UI::Textarea                m_label_snap_win_overlap_only;
> +	UI::Checkbox                m_dock_windows_to_edges;
> +	UI::Textarea                m_label_dock_windows_to_edges;
> +	UI::SpinBox                 m_sb_autosave;
> +	UI::Textarea                m_label_autosave;
> +	UI::SpinBox                 m_sb_remove_replays;
> +	UI::Textarea                m_label_remove_replays;
> +
> +	OptionsCtrl::OptionsStruct  os;
> +
> +	void update_sb_autosave_unit();
> +	void update_sb_remove_replays_unit();
>  	void advanced_options();
>  
>  	class ScreenResolution {
> @@ -156,30 +170,36 @@
>  	bool handle_key(bool down, SDL_keysym code) override;
>  
>  private:
> -	uint32_t                    m_vbutw;
> -	uint32_t                    m_butw;
> -	uint32_t                    m_buth;
> -
> -	UI::Button     m_cancel, m_apply;
> +	void update_sb_dis_panel_unit();
> +	void update_sb_dis_border_unit();
> +
> +	uint32_t const              m_vbutw;
> +	uint32_t const              m_butw;
> +	uint32_t const              m_buth;
> +	uint32_t const              m_hmargin;
> +	uint32_t const              m_padding;
> +	uint32_t const              m_space;
> +	uint32_t const              m_offset_first_group;
> +
> +	UI::Button                  m_cancel, m_apply;
> +	UI::Textarea                m_title;
> +	UI::Textarea                m_label_ui_font;
> +	UI::Listselect<std::string> m_ui_font_list;
> +
> +	UI::Textarea                m_label_snap_dis_panel, m_label_snap_dis_border;
>  	UI::SpinBox                 m_sb_dis_panel, m_sb_dis_border;
> -	UI::Textarea                m_title;
> -	UI::Listselect<std::string> m_ui_font_list;
> -	UI::Textarea                m_label_ui_font;
> +	UI::Checkbox                m_transparent_chat;
> +	UI::MultilineTextarea       m_label_transparent_chat;
>  	UI::Checkbox                m_message_sound;
> -	UI::Textarea                m_label_message_sound;
> +	UI::MultilineTextarea       m_label_message_sound;
>  	UI::Checkbox                m_nozip;
> -	UI::Textarea                m_label_nozip;
> -
> -	UI::Textarea                m_label_snap_dis_panel, m_label_snap_dis_border;
> -
> +	UI::MultilineTextarea       m_label_nozip;
>  	UI::Checkbox                m_remove_syncstreams;
> -	UI::Textarea                m_label_remove_syncstreams;
> +	UI::MultilineTextarea       m_label_remove_syncstreams;
>  	UI::Checkbox                m_opengl;
> -	UI::Textarea                m_label_opengl;
> -	UI::Checkbox                m_transparent_chat;
> -	UI::Textarea                m_label_transparent_chat;
> +	UI::MultilineTextarea       m_label_opengl;
>  
> -	OptionsCtrl::OptionsStruct os;
> +	OptionsCtrl::OptionsStruct  os;
>  };
>  
>  #endif  // end of include guard: WL_UI_FSMENU_OPTIONS_H
> 
> === modified file 'src/ui_fsmenu/singleplayer.cc'
> --- src/ui_fsmenu/singleplayer.cc	2014-09-10 14:08:25 +0000
> +++ src/ui_fsmenu/singleplayer.cc	2014-09-27 13:09:21 +0000
> @@ -24,7 +24,7 @@
>  #include "wui/text_constants.h"
>  
>  FullscreenMenuSinglePlayer::FullscreenMenuSinglePlayer() :
> -FullscreenMenuBase("singleplmenu.jpg"),
> +FullscreenMenuBase("ui_fsmenu.jpg"),
>  
>  // Values for alignment and size
>  	m_butw (get_w() * 7 / 20),
> 
> === modified file 'src/wui/encyclopedia_window.cc'
> --- src/wui/encyclopedia_window.cc	2014-09-10 16:57:31 +0000
> +++ src/wui/encyclopedia_window.cc	2014-09-27 13:09:21 +0000
> @@ -45,8 +45,9 @@
>  #define WINDOW_WIDTH  std::min(700, g_gr->get_xres() - 40)
>  #define WINDOW_HEIGHT std::min(550, g_gr->get_yres() - 40)
>  
> -#define QUANTITY_COLUMN_WIDTH 74
> -#define WARE_GROUPS_TABLE_WIDTH (WINDOW_WIDTH * 1 / 2 - 5)
> +#define QUANTITY_COLUMN_WIDTH 100

WINDOW_WIDTH and WINDOW_HEIGHT aren't const, but I changed this for the 2 columns that do have fixed width.

> +#define WARE_COLUMN_WIDTH     250
> +#define PRODSITE_GROUPS_WIDTH (WINDOW_WIDTH - WARE_COLUMN_WIDTH - QUANTITY_COLUMN_WIDTH - 10)
>  
>  using namespace Widelands;
>  
> @@ -64,19 +65,18 @@
>  		 WINDOW_WIDTH, WINDOW_HEIGHT,
>  		 _("Tribal Ware Encyclopedia")),
>  	wares            (this, 5, 5, WINDOW_WIDTH - 10, WINDOW_HEIGHT - 250),
> -	prodSites        (this, 5, WINDOW_HEIGHT - 150, WINDOW_WIDTH - WARE_GROUPS_TABLE_WIDTH - 10, 145),
> +	prodSites        (this, 5, WINDOW_HEIGHT - 150, PRODSITE_GROUPS_WIDTH, 145),
>  	condTable
>  		(this,
> -		 WINDOW_WIDTH - WARE_GROUPS_TABLE_WIDTH - 5, WINDOW_HEIGHT - 150, WARE_GROUPS_TABLE_WIDTH, 145),
> +		 PRODSITE_GROUPS_WIDTH + 5, WINDOW_HEIGHT - 150, WINDOW_WIDTH - PRODSITE_GROUPS_WIDTH - 5, 145),
>  	descrTxt         (this, 5, WINDOW_HEIGHT - 240, WINDOW_WIDTH - 10, 80, "")
>  {
>  	wares.selected.connect(boost::bind(&EncyclopediaWindow::wareSelected, this, _1));
>  
>  	prodSites.selected.connect(boost::bind(&EncyclopediaWindow::prodSiteSelected, this, _1));
>  	condTable.add_column
> -		(WARE_GROUPS_TABLE_WIDTH
> -		 - QUANTITY_COLUMN_WIDTH,
> -		 _("Consumed ware type(s)"));
> +			/** TRANSLATORS: Column title in the Tribal Wares Encyclopedia */
> +			(WARE_COLUMN_WIDTH, ngettext("Consumed Ware Type", "Consumed Ware Types", 0));
>  	condTable.add_column (QUANTITY_COLUMN_WIDTH, _("Quantity"));
>  
>  	fillWares();
> @@ -137,6 +137,7 @@
>  
>  void EncyclopediaWindow::prodSiteSelected(uint32_t) {
>  	assert(prodSites.has_selection());
> +	size_t no_of_wares = 0;
>  	condTable.clear();
>  	const TribeDescr & tribe = iaplayer().player().tribe();
>  
> @@ -184,6 +185,7 @@
>  					for (const WareIndex& ware_index : ware_types) {
>  						ware_type_descnames.push_back(tribe.get_ware_descr(ware_index)->descname());
>  					}
> +					no_of_wares = no_of_wares + ware_types.size();
>  
>  					std::string ware_type_names =
>  							i18n::localize_item_list(ware_type_descnames, i18n::ConcatenateWith::OR);
> @@ -206,4 +208,5 @@
>  			}
>  		}
>  	}
> +	condTable.set_column_title(0,	ngettext("Consumed Ware Type", "Consumed Ware Types", no_of_wares));
>  }
> 
> === modified file 'src/wui/login_box.cc'
> --- src/wui/login_box.cc	2014-09-10 14:48:40 +0000
> +++ src/wui/login_box.cc	2014-09-27 13:09:21 +0000
> @@ -26,17 +26,19 @@
>  
>  LoginBox::LoginBox(Panel & parent)
>  :
> -Window(&parent, "login_box", 0, 0, 500, 210, _("Metaserver login"))
> +Window(&parent, "login_box", 0, 0, 500, 220, _("Metaserver login"))
>  {
>  	center_to_parent();
>  
> -	ta_nickname = new UI::Textarea(this, 10, 5, _("Nickname:"));
> +	int32_t margin = 10;
> +
> +	ta_nickname = new UI::Textarea(this, margin, margin, _("Nickname:"));
>  	eb_nickname =
>  		new UI::EditBox
> -			(this, 150, 5, 330, 20,
> +			(this, 150, margin, 330, 20,
>  			 g_gr->images().get("pics/but2.png"), UI::Align_Left);
>  
> -	ta_password = new UI::Textarea(this, 10, 40, _("Password:"));
> +	ta_password = new UI::Textarea(this, margin, 40, _("Password:"));
>  	eb_password =
>  		new UI::EditBox
>  			(this, 150, 40, 330, 20,
> @@ -44,28 +46,29 @@
>  
>  	pwd_warning =
>  		new UI::MultilineTextarea
> -			(this, 10, 65, 505, 50,
> +			(this, margin, 65, 505, 50,
>  			 _("WARNING: Password will be shown and saved readable!"),
>  			 UI::Align_Left);
>  
> -	cb_register = new UI::Checkbox(this, Point(10, 110));
> +	cb_register = new UI::Checkbox(this, Point(margin, 110));
>  	ta_register =
>  		new UI::Textarea(this, 40, 110, _("Log in to a registered account"));
>  
> -	cb_auto_log = new UI::Checkbox(this, Point(10, 135));
> -	ta_auto_log = new UI::Textarea
> -		(this, 40, 135,
> +	cb_auto_log = new UI::Checkbox(this, Point(margin, 135));
> +	ta_auto_log = new UI::MultilineTextarea
> +		(this, 40, 135, get_inner_w() - cb_auto_log->get_w() - margin, 35,
>  		 _("Automatically use this login information from now on."));
>  
>  	UI::Button * loginbtn = new UI::Button
>  		(this, "login",
> -		 (get_inner_w() / 2 - 200) / 2, 175, 200, 20,
> +		 (get_inner_w() / 2 - 200) / 2, get_inner_h() - 20 - margin,
> +		 200, 20,
>  		 g_gr->images().get("pics/but0.png"),
>  		 _("Login"));
>  	loginbtn->sigclicked.connect(boost::bind(&LoginBox::pressedLogin, boost::ref(*this)));
>  	UI::Button * cancelbtn = new UI::Button
>  		(this, "cancel",
> -		 (get_inner_w() / 2 - 200) / 2 + get_inner_w() / 2, 175, 200, 20,
> +		 (get_inner_w() / 2 - 200) / 2 + get_inner_w() / 2, loginbtn->get_y(), 200, 20,
>  		 g_gr->images().get("pics/but1.png"),
>  		 _("Cancel"));
>  	cancelbtn->sigclicked.connect(boost::bind(&LoginBox::pressedCancel, boost::ref(*this)));
> 
> === modified file 'src/wui/login_box.h'
> --- src/wui/login_box.h	2014-09-10 14:48:40 +0000
> +++ src/wui/login_box.h	2014-09-27 13:09:21 +0000
> @@ -46,7 +46,7 @@
>  	UI::Textarea * ta_nickname;
>  	UI::Textarea * ta_password;
>  	UI::Textarea * ta_register;
> -	UI::Textarea * ta_auto_log;
> +	UI::MultilineTextarea * ta_auto_log;
>  	UI::MultilineTextarea * pwd_warning;
>  };
>  
> 


-- 
https://code.launchpad.net/~widelands-dev/widelands/bug-1371905_2/+merge/236227
Your team Widelands Developers is subscribed to branch lp:~widelands-dev/widelands/bug-1371905_2.


References