← Back to team overview

widelands-dev team mailing list archive

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

 

GunChleoc has proposed merging lp:~widelands-dev/widelands/bug-1371905_2 into lp:widelands.

Requested reviews:
  Widelands Developers (widelands-dev)
Related bugs:
  Bug #1371905 in widelands: "Localized strings doesn'tfit in the available place"
  https://bugs.launchpad.net/widelands/+bug/1371905

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/bug-1371905_2/+merge/236227

Fixed string length issues and more use of ngettext. Spinbox improvements.

- Options menu overhaul:
-- using constant and relative positioning for easier layout tweaking
-- spinbox units now update with ngettext
-- removed superfluous calls to set_textstyle(ts_small()) etc.

- Some more small fixes in other fs_menus, in the editor and in the encyclopedia window

- The generic background for fs menu is now ui_fsmenu.jpg for all fullscreen menus that don't have effects on the background
-- 
https://code.launchpad.net/~widelands-dev/widelands/bug-1371905_2/+merge/236227
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-1371905_2 into lp:widelands.
=== 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("");
 		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,
                 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");
+			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);
+	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;}
 
 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"),
+	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() +
+									  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
+#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;
 };
 


Follow ups