← Back to team overview

widelands-dev team mailing list archive

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

 

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

Requested reviews:
  Widelands Developers (widelands-dev)
Related bugs:
  Bug #859245 in widelands: "Authors / developers button in main menu"
  https://bugs.launchpad.net/widelands/+bug/859245

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/bug-859245/+merge/241549

Uniform layout for all fullscreen menus that have only buttons in them, with a new superclass "FullscreenMenuMainMenu".

Added an "Authors" button to the main menu.

-- 
https://code.launchpad.net/~widelands-dev/widelands/bug-859245/+merge/241549
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-859245 into lp:widelands.
=== modified file 'src/build_info.h'
--- src/build_info.h	2014-07-05 16:41:51 +0000
+++ src/build_info.h	2014-11-12 13:15:31 +0000
@@ -20,10 +20,11 @@
 #ifndef WL_BUILD_INFO_H
 #define WL_BUILD_INFO_H
 
-#define WLCR "(C) 2002-2014 "
-
 #include <string>
 
+constexpr uint16_t kWidelandsCopyrightStart = 2002;
+constexpr uint16_t kWidelandsCopyrightEnd = 2014;
+
 ///\return the build id which is automagically created from the checkout's
 ///revision number or the VERSION file
 const std::string & build_id();

=== modified file 'src/ui_fsmenu/CMakeLists.txt'
--- src/ui_fsmenu/CMakeLists.txt	2014-11-03 06:55:18 +0000
+++ src/ui_fsmenu/CMakeLists.txt	2014-11-12 13:15:31 +0000
@@ -22,6 +22,8 @@
     load_map_or_game.h
     main.cc
     main.h
+    main_menu.cc
+    main_menu.h
     mapselect.cc
     mapselect.h
     multiplayer.cc

=== modified file 'src/ui_fsmenu/base.cc'
--- src/ui_fsmenu/base.cc	2014-09-18 18:52:34 +0000
+++ src/ui_fsmenu/base.cc	2014-11-12 13:15:31 +0000
@@ -117,3 +117,7 @@
 {
 	return d->textstyle_big.font;
 }
+
+int32_t FullscreenMenuBase::get_y_from_preceding(UI::Panel& preceding_panel) {
+	return preceding_panel.get_y() + preceding_panel.get_h();
+}

=== modified file 'src/ui_fsmenu/base.h'
--- src/ui_fsmenu/base.h	2014-09-10 14:08:25 +0000
+++ src/ui_fsmenu/base.h	2014-11-12 13:15:31 +0000
@@ -52,6 +52,10 @@
 	UI::Font * font_small();
 	UI::Font * font_big();
 
+protected:
+	// Returns a y coordinate that can be used to position a Panel below the Panel directly above it
+	int32_t get_y_from_preceding(UI::Panel& preceding_panel);
+
 private:
 	/**
 	 * Query the configured screen resolution.

=== modified file 'src/ui_fsmenu/editor.cc'
--- src/ui_fsmenu/editor.cc	2014-09-27 09:28:51 +0000
+++ src/ui_fsmenu/editor.cc	2014-11-12 13:15:31 +0000
@@ -24,43 +24,35 @@
 #include "wui/text_constants.h"
 
 FullscreenMenuEditor::FullscreenMenuEditor() :
-	FullscreenMenuBase("ui_fsmenu.jpg"),
-
-// Values for alignment and size
-	m_butw (get_w() * 7 / 20),
-	m_buth (get_h() * 19 / 400),
-	m_butx ((get_w() - m_butw) / 2),
+	FullscreenMenuMainMenu(),
 
 // Title
 	title
-		(this, get_w() / 2, get_h() * 3 / 40, _("Editor"), UI::Align_HCenter),
+		(this, get_w() / 2, m_title_y, _("Editor"), UI::Align_HCenter),
 
 // Buttons
 	new_map
 		(this, "new_map",
-		 m_butx, get_h() * 6 / 25, m_butw, m_buth,
-		 g_gr->images().get("pics/but1.png"),
-		 _("New Map"), std::string(), true, false),
+		 m_butx, m_buty, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("New Map"), "", true, false),
 	load_map
 		(this, "load_map",
-		 m_butx, get_h() * 61 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but1.png"),
-		 _("Load Map"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(new_map) + m_padding, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Load Map"), "", true, false),
 	back
 		(this, "back",
-		 m_butx, get_h() * 3 / 4, m_butw, m_buth,
-		 g_gr->images().get("pics/but0.png"),
-		 _("Back"), std::string(), true, false)
+		 m_butx, m_back_button_y, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Back"), "", true, false)
 {
 	new_map.sigclicked.connect
-		(boost::bind(&FullscreenMenuEditor::end_modal, boost::ref(*this), static_cast<int32_t>(New_Map)));
+		(boost::bind(&FullscreenMenuEditor::end_modal, boost::ref(*this), static_cast<int32_t>(MenuTarget::kNewMap)));
 	load_map.sigclicked.connect
-		(boost::bind(&FullscreenMenuEditor::end_modal, boost::ref(*this), static_cast<int32_t>(Load_Map)));
+		(boost::bind(&FullscreenMenuEditor::end_modal, boost::ref(*this), static_cast<int32_t>(MenuTarget::kLoadMap)));
 	back.sigclicked.connect
-		(boost::bind(&FullscreenMenuEditor::end_modal, boost::ref(*this), static_cast<int32_t>(Back)));
+		(boost::bind(&FullscreenMenuEditor::end_modal, boost::ref(*this), static_cast<int32_t>(MenuTarget::kBack)));
 
-	new_map.set_font(font_small());
-	load_map.set_font(font_small());
-	back.set_font(font_small());
 	title.set_font(ui_fn(), fs_big(), UI_FONT_CLR_FG);
 }

=== modified file 'src/ui_fsmenu/editor.h'
--- src/ui_fsmenu/editor.h	2014-09-10 14:08:25 +0000
+++ src/ui_fsmenu/editor.h	2014-11-12 13:15:31 +0000
@@ -20,7 +20,7 @@
 #ifndef WL_UI_FSMENU_EDITOR_H
 #define WL_UI_FSMENU_EDITOR_H
 
-#include "ui_fsmenu/base.h"
+#include "ui_fsmenu/main_menu.h"
 #include "ui_basic/button.h"
 #include "ui_basic/textarea.h"
 
@@ -28,19 +28,20 @@
  * Fullscreen Menu for Editor.
  * Here you select what game you want to play.
  */
-struct FullscreenMenuEditor : public FullscreenMenuBase {
+struct FullscreenMenuEditor : public FullscreenMenuMainMenu {
 	FullscreenMenuEditor();
 
-	enum {Back = dying_code, New_Map, Load_Map};
+	enum class MenuTarget: int32_t {
+		kBack = UI::Panel::dying_code,
+		kNewMap,
+		kLoadMap
+	};
 
 private:
-	uint32_t                                      m_butw;
-	uint32_t                                      m_buth;
-	uint32_t                                      m_butx;
-	UI::Textarea                                  title;
-	UI::Button                       new_map;
-	UI::Button                       load_map;
-	UI::Button                       back;
+	UI::Textarea title;
+	UI::Button   new_map;
+	UI::Button   load_map;
+	UI::Button   back;
 };
 
 #endif  // end of include guard: WL_UI_FSMENU_EDITOR_H

=== modified file 'src/ui_fsmenu/load_map_or_game.cc'
--- src/ui_fsmenu/load_map_or_game.cc	2014-10-28 12:53:29 +0000
+++ src/ui_fsmenu/load_map_or_game.cc	2014-11-12 13:15:31 +0000
@@ -87,12 +87,6 @@
 	return FullscreenMenuBase::handle_key(down, code);
 }
 
-
-int32_t FullscreenMenuLoadMapOrGame::get_y_from_preceding(UI::Panel& preceding_panel) {
-	return preceding_panel.get_y() + preceding_panel.get_h();
-}
-
-
 int32_t FullscreenMenuLoadMapOrGame::get_right_column_w(int32_t x) {
 	return get_w() - m_right_column_margin - x;
 }

=== modified file 'src/ui_fsmenu/load_map_or_game.h'
--- src/ui_fsmenu/load_map_or_game.h	2014-10-31 07:40:54 +0000
+++ src/ui_fsmenu/load_map_or_game.h	2014-11-12 13:15:31 +0000
@@ -93,9 +93,6 @@
 		return has_selection;
 	}
 
-	// Returns a y coordinate that can be used to position a Panel below the Panel directly above it
-	int32_t get_y_from_preceding(UI::Panel& preceding_panel);
-
 	// Returns the width that a Panel in the right column should have, depending on its x position
 	int32_t get_right_column_w(int32_t x);
 

=== modified file 'src/ui_fsmenu/main.cc'
--- src/ui_fsmenu/main.cc	2014-10-11 08:43:07 +0000
+++ src/ui_fsmenu/main.cc	2014-11-12 13:15:31 +0000
@@ -19,76 +19,80 @@
 
 #include "ui_fsmenu/main.h"
 
+#include <boost/format.hpp>
+
 #include "base/i18n.h"
 #include "build_info.h"
 #include "graphic/graphic.h"
 
 FullscreenMenuMain::FullscreenMenuMain() :
-	FullscreenMenuBase("mainmenu.jpg"),
-
-// Values for alignment and size
-	m_butx (get_w() * 13 / 40),
-	m_butw (get_w() * 7 / 20),
-	m_buth (get_h() * 19 / 400),
-	wlcr   (WLCR),
+	FullscreenMenuMainMenu("mainmenu.jpg"),
 
 // Buttons
 	playtutorial
 		(this, "play_tutorial",
 		 m_butx, get_h() * 42 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but3.png"),
-		 _("Play Tutorial"), std::string(), true, false),
+		 g_gr->images().get(m_button_background),
+		 _("Play Tutorial"), "", true, false),
 	singleplayer
 		(this, "single_player",
-		 m_butx, get_h() * 61 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but3.png"),
-		 _("Single Player"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(playtutorial) + m_buth, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Single Player"), "", true, false),
 	multiplayer
 		(this, "multi_player",
-		 m_butx, get_h() * 37 / 100, m_butw, m_buth,
-		 g_gr->images().get("pics/but3.png"),
-		 _("Multiplayer"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(singleplayer) + m_padding, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Multiplayer"), "", true, false),
 	replay
 		(this, "replay",
-		 m_butx, get_h() * 87 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but3.png"),
-		 _("Watch Replay"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(multiplayer) + m_padding, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Watch Replay"), "", true, false),
 	editor
 		(this, "editor",
-		 m_butx, get_h() * 100 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but3.png"),
-		 _("Editor"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(replay) + m_padding, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Editor"), "", true, false),
 	options
 		(this, "options",
-		 m_butx, get_h() * 119 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but3.png"),
-		 _("Options"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(editor) + m_buth, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Options"), "", true, false),
 	readme
 		(this, "readme",
-		 m_butx, get_h() * 138 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but3.png"),
-		 _("View Readme"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(options) + m_buth, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("View Readme"), "", true, false),
 	license
 		(this, "license",
-		 m_butx, get_h() * 151 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but3.png"),
-		 _("License"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(readme) + m_padding, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("License"), "", true, false),
+	authors
+		(this, "authors",
+		 m_butx, get_y_from_preceding(license) + m_padding, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Authors"), "", true, false),
 	exit
 		(this, "exit",
-		 m_butx, get_h() * 178 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but3.png"),
-		 _("Exit Widelands"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(authors) + m_buth, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Exit Widelands"), "", true, false),
 
 // Textlabels
 	version
 		(this,
 		 get_w(), get_h(),
-		 _("Version ") + build_id() + '(' + build_type() + ')',
+		 /** TRANSLATORS: %1$s = version string, %2%s = "Debug" or "Release" */
+		 (boost::format(_("Version %1$s (%2$s)")) % build_id().c_str() % build_type().c_str()).str(),
 		 UI::Align_BottomRight),
 	copyright
 		(this,
 		 0, get_h() - 0.5 * m_buth,
-		 (wlcr + _("by the Widelands Development Team")).c_str(),
+		 /** TRANSLATORS: Placeholders are the copyright years */
+		 (boost::format(_("(C) %1%-%2% by the Widelands Development Team"))
+		  % kWidelandsCopyrightStart % kWidelandsCopyrightEnd).str(),
 		 UI::Align_BottomLeft),
 	gpl
 		(this,
@@ -99,51 +103,41 @@
 	playtutorial.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMain::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(mm_playtutorial)));
+			  static_cast<int32_t>(MenuTarget::kTutorial)));
 	singleplayer.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMain::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(mm_singleplayer)));
+			  static_cast<int32_t>(MenuTarget::kSinglePlayer)));
 	multiplayer.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMain::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(mm_multiplayer)));
+			  static_cast<int32_t>(MenuTarget::kMultiplayer)));
 	replay.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMain::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(mm_replay)));
+			  static_cast<int32_t>(MenuTarget::kReplay)));
 	editor.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMain::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(mm_editor)));
+			  static_cast<int32_t>(MenuTarget::kEditor)));
 	options.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMain::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(mm_options)));
+			  static_cast<int32_t>(MenuTarget::kOptions)));
 	readme.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMain::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(mm_readme)));
+			  static_cast<int32_t>(MenuTarget::kReadme)));
 	license.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMain::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(mm_license)));
+			  static_cast<int32_t>(MenuTarget::kLicense)));
+	authors.sigclicked.connect
+		(boost::bind
+			 (&FullscreenMenuMain::end_modal, boost::ref(*this),
+			  static_cast<int32_t>(MenuTarget::kAuthors)));
 	exit.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMain::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(mm_exit)));
-
-	playtutorial.set_font(font_small());
-	singleplayer.set_font(font_small());
-	multiplayer.set_font(font_small());
-	replay.set_font(font_small());
-	editor.set_font(font_small());
-	options.set_font(font_small());
-	readme.set_font(font_small());
-	license.set_font(font_small());
-	exit.set_font(font_small());
-
-	version.set_textstyle(ts_small());
-	copyright.set_textstyle(ts_small());
-	gpl.set_textstyle(ts_small());
+			  static_cast<int32_t>(MenuTarget::kExit)));
 }

=== modified file 'src/ui_fsmenu/main.h'
--- src/ui_fsmenu/main.h	2014-09-10 14:08:25 +0000
+++ src/ui_fsmenu/main.h	2014-11-12 13:15:31 +0000
@@ -20,7 +20,7 @@
 #ifndef WL_UI_FSMENU_MAIN_H
 #define WL_UI_FSMENU_MAIN_H
 
-#include "ui_fsmenu/base.h"
+#include "ui_fsmenu/main_menu.h"
 #include "ui_basic/button.h"
 #include "ui_basic/textarea.h"
 
@@ -28,37 +28,34 @@
  * This runs the main menu. There, you can select
  * between different playmodes, exit and so on.
 */
-struct FullscreenMenuMain : public FullscreenMenuBase {
+struct FullscreenMenuMain : public FullscreenMenuMainMenu {
 	FullscreenMenuMain();
-	enum {
-		mm_summary,
-		mm_playtutorial,
-		mm_singleplayer,
-		mm_multiplayer,
-		mm_replay,
-		mm_editor,
-		mm_options,
-		mm_readme,
-		mm_license,
-		mm_exit
+	enum class MenuTarget: int32_t {
+		kTutorial,
+		kSinglePlayer,
+		kMultiplayer,
+		kReplay,
+		kEditor,
+		kOptions,
+		kReadme,
+		kLicense,
+		kAuthors,
+		kExit
 	};
 private:
-	uint32_t                                    m_butx;
-	uint32_t                                    m_butw;
-	uint32_t                                    m_buth;
-	std::string                                 wlcr;
-	UI::Button                     playtutorial;
-	UI::Button                     singleplayer;
-	UI::Button                     multiplayer;
-	UI::Button                     replay;
-	UI::Button                     editor;
-	UI::Button                     options;
-	UI::Button                     readme;
-	UI::Button                     license;
-	UI::Button                     exit;
-	UI::Textarea                                version;
-	UI::Textarea                                copyright;
-	UI::Textarea                                gpl;
+	UI::Button   playtutorial;
+	UI::Button   singleplayer;
+	UI::Button   multiplayer;
+	UI::Button   replay;
+	UI::Button   editor;
+	UI::Button   options;
+	UI::Button   readme;
+	UI::Button   license;
+	UI::Button   authors;
+	UI::Button   exit;
+	UI::Textarea version;
+	UI::Textarea copyright;
+	UI::Textarea gpl;
 };
 
 #endif  // end of include guard: WL_UI_FSMENU_MAIN_H

=== added file 'src/ui_fsmenu/main_menu.cc'
--- src/ui_fsmenu/main_menu.cc	1970-01-01 00:00:00 +0000
+++ src/ui_fsmenu/main_menu.cc	2014-11-12 13:15:31 +0000
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2002-2004, 2006-2009 by the Widelands Development Team
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#include "ui_fsmenu/main_menu.h"
+
+FullscreenMenuMainMenu::FullscreenMenuMainMenu():
+	FullscreenMenuMainMenu("ui_fsmenu.jpg")
+	{}
+
+FullscreenMenuMainMenu::FullscreenMenuMainMenu(const char* background_image):
+	FullscreenMenuBase(background_image),
+
+	// Values for alignment and size
+	m_butx(get_w() * 13 / 40),
+	m_buty(get_h() * 6 / 25),
+	m_butw(get_w() * 7 / 20),
+	m_buth(get_h() * 9 / 200),
+	m_back_button_y(get_h() * 3 / 4),
+	m_title_y(get_h() * 3 / 40),
+	m_padding(m_buth / 3),
+	m_button_background("pics/but3.png")
+{}

=== added file 'src/ui_fsmenu/main_menu.h'
--- src/ui_fsmenu/main_menu.h	1970-01-01 00:00:00 +0000
+++ src/ui_fsmenu/main_menu.h	2014-11-12 13:15:31 +0000
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2002, 2006-2008 by the Widelands Development Team
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#ifndef WL_UI_FSMENU_MAIN_MENU_H
+#define WL_UI_FSMENU_MAIN_MENU_H
+
+#include "ui_fsmenu/base.h"
+
+/**
+ * This sets the values for alignment and size and other common properties
+ * for main menus that contain only buttons.
+ */
+struct FullscreenMenuMainMenu : public FullscreenMenuBase {
+	FullscreenMenuMainMenu();
+	FullscreenMenuMainMenu(char const * background_image);
+
+protected:
+	uint32_t m_butx, m_buty, m_butw, m_buth;
+	uint32_t m_back_button_y, m_title_y;
+	uint32_t m_padding;
+
+	const std::string m_button_background;
+};
+
+#endif  // end of include guard: WL_UI_FSMENU_MAIN_MENU_H

=== modified file 'src/ui_fsmenu/multiplayer.cc'
--- src/ui_fsmenu/multiplayer.cc	2014-09-29 19:25:24 +0000
+++ src/ui_fsmenu/multiplayer.cc	2014-11-12 13:15:31 +0000
@@ -25,52 +25,44 @@
 #include "wui/text_constants.h"
 
 FullscreenMenuMultiPlayer::FullscreenMenuMultiPlayer() :
-	FullscreenMenuBase("ui_fsmenu.jpg"),
-
-// Values for alignment and size
-	m_butw (get_w() * 7 / 20),
-	m_buth (get_h() * 19 / 400),
-	m_butx ((get_w() - m_butw) / 2),
-	m_fs   (fs_small()),
-	m_fn   (ui_fn()),
+	FullscreenMenuMainMenu(),
 
 // Title
 	title
 		(this,
-		 get_w() / 2, get_h() * 3 / 40,
+		 get_w() / 2, m_title_y,
 		 _("Choose game type"), UI::Align_HCenter),
 
 // Buttons
 	metaserver
 		(this, "metaserver",
-		 m_butx, get_h() * 6 / 25, m_butw, m_buth,
-		 g_gr->images().get("pics/but1.png"),
-		 _("Internet game"), std::string(), true, false),
+		 m_butx, m_buty, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Internet game"), "", true, false),
 	lan
 		(this, "lan",
-		 m_butx, get_h() * 61 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but1.png"),
-		 _("LAN / Direct IP"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(metaserver) + m_padding, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("LAN / Direct IP"), "", true, false),
 	back
 		(this, "back",
-		 m_butx, get_h() * 3 / 4, m_butw, m_buth,
-		 g_gr->images().get("pics/but0.png"),
-		 _("Back"), std::string(), true, false)
+		 m_butx, m_back_button_y, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Back"), "", true, false)
 {
 	metaserver.sigclicked.connect(boost::bind(&FullscreenMenuMultiPlayer::internet_login, boost::ref(*this)));
-	metaserver.set_font(font_small());
-	lan.set_font(font_small());
+
 	lan.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMultiPlayer::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(Lan)));
-	back.set_font(font_small());
+			  static_cast<int32_t>(MenuTarget::kLan)));
+
 	back.sigclicked.connect
 		(boost::bind
 			 (&FullscreenMenuMultiPlayer::end_modal, boost::ref(*this),
-			  static_cast<int32_t>(Back)));
+			  static_cast<int32_t>(MenuTarget::kBack)));
 
-	title.set_font(m_fn, fs_big(), UI_FONT_CLR_FG);
+	title.set_font(ui_fn(), fs_big(), UI_FONT_CLR_FG);
 
 	Section & s = g_options.pull_section("global");
 	m_auto_log = s.get_bool("auto_log", false);
@@ -115,7 +107,7 @@
 		m_nickname = s.get_string("nickname", _("nobody"));
 		m_password = s.get_string("password", "nobody");
 		m_register = s.get_bool("registered", false);
-		end_modal(Metaserver);
+		end_modal(static_cast<int32_t>(MenuTarget::kMetaserver));
 		return;
 	}
 
@@ -128,6 +120,6 @@
 		s.set_bool("registered", lb.registered());
 		s.set_bool("auto_log", lb.set_automaticlog());
 
-		end_modal(Metaserver);
+		end_modal(static_cast<int32_t>(MenuTarget::kMetaserver));
 	}
 }

=== modified file 'src/ui_fsmenu/multiplayer.h'
--- src/ui_fsmenu/multiplayer.h	2014-09-20 09:37:47 +0000
+++ src/ui_fsmenu/multiplayer.h	2014-11-12 13:15:31 +0000
@@ -20,7 +20,7 @@
 #ifndef WL_UI_FSMENU_MULTIPLAYER_H
 #define WL_UI_FSMENU_MULTIPLAYER_H
 
-#include "ui_fsmenu/base.h"
+#include "ui_fsmenu/main_menu.h"
 #include "network/internet_gaming.h"
 #include "ui_basic/button.h"
 #include "ui_basic/textarea.h"
@@ -29,10 +29,14 @@
  * Fullscreen Menu for MultiPlayer.
  * Here you select what game you want to play.
  */
-struct FullscreenMenuMultiPlayer : public FullscreenMenuBase {
+struct FullscreenMenuMultiPlayer : public FullscreenMenuMainMenu {
 	FullscreenMenuMultiPlayer();
 
-	enum {Back = dying_code, Metaserver, Lan};
+	enum class MenuTarget: int32_t {
+		kBack = UI::Panel::dying_code,
+		kMetaserver,
+		kLan
+	};
 
 	void show_internet_login();
 	void internet_login();
@@ -41,16 +45,11 @@
 	bool registered()          {return m_register;}
 
 private:
-	uint32_t                                            m_butw;
-	uint32_t                                            m_buth;
-	uint32_t                                            m_butx;
-	uint32_t                                            m_fs;
-	std::string                                         m_fn;
-	UI::Textarea                                        title;
-	UI::Button                             metaserver;
-	UI::Button                           * showloginbox;
-	UI::Button                             lan;
-	UI::Button                             back;
+	UI::Textarea title;
+	UI::Button   metaserver;
+	UI::Button*  showloginbox;
+	UI::Button   lan;
+	UI::Button   back;
 
 	// Values from internet login window
 	std::string m_nickname;

=== modified file 'src/ui_fsmenu/singleplayer.cc'
--- src/ui_fsmenu/singleplayer.cc	2014-09-27 09:28:51 +0000
+++ src/ui_fsmenu/singleplayer.cc	2014-11-12 13:15:31 +0000
@@ -24,65 +24,56 @@
 #include "wui/text_constants.h"
 
 FullscreenMenuSinglePlayer::FullscreenMenuSinglePlayer() :
-FullscreenMenuBase("ui_fsmenu.jpg"),
-
-// Values for alignment and size
-	m_butw (get_w() * 7 / 20),
-	m_buth (get_h() * 19 / 400),
-	m_butx ((get_w() - m_butw) / 2),
-	m_fs   (fs_small()),
-	m_fn   (ui_fn()),
+	FullscreenMenuMainMenu(),
 
 // Title
 	title
 		(this,
-		 get_w() / 2, get_h() * 3 / 40,
+		 get_w() / 2, m_title_y,
 		 _("Single Player"), UI::Align_HCenter),
 
 // Buttons
 	new_game
 		(this, "new_game",
-		 m_butx, get_h() * 6 / 25, m_butw, m_buth,
-		 g_gr->images().get("pics/but1.png"),
-		 _("New Game"), std::string(), true, false),
+		 m_butx, m_buty, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("New Game"), "", true, false),
 	campaign
 		(this, "campaigns",
-		 m_butx, get_h() * 61 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but1.png"),
-		 _("Campaigns"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(new_game) + m_padding, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Campaigns"), "", true, false),
 	load_game
 		(this, "load_game",
-		 m_butx, get_h() * 87 / 200, m_butw, m_buth,
-		 g_gr->images().get("pics/but1.png"),
-		 _("Load Game"), std::string(), true, false),
+		 m_butx, get_y_from_preceding(campaign) + 2 * m_buth, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Load Game"), "", true, false),
 	back
 		(this, "back",
-		 m_butx, get_h() * 3 / 4, m_butw, m_buth,
-		 g_gr->images().get("pics/but0.png"),
-		 _("Back"), std::string(), true, false)
+		 m_butx, m_back_button_y, m_butw, m_buth,
+		 g_gr->images().get(m_button_background),
+		 _("Back"), "", true, false)
 {
 	new_game.sigclicked.connect
 		(boost::bind
 			(&FullscreenMenuSinglePlayer::end_modal,
 			 boost::ref(*this),
-			 static_cast<int32_t>(New_Game)));
+			 static_cast<int32_t>(MenuTarget::kNewGame)));
 	campaign.sigclicked.connect
 		(boost::bind
 			(&FullscreenMenuSinglePlayer::end_modal,
 			 boost::ref(*this),
-			 static_cast<int32_t>(Campaign)));
+			 static_cast<int32_t>(MenuTarget::kCampaign)));
 	load_game.sigclicked.connect
 		(boost::bind
 			(&FullscreenMenuSinglePlayer::end_modal,
 			 boost::ref(*this),
-			 static_cast<int32_t>(Load_Game)));
+			 static_cast<int32_t>(MenuTarget::kLoadGame)));
 	back.sigclicked.connect
-		(boost::bind(&FullscreenMenuSinglePlayer::end_modal, boost::ref(*this), static_cast<int32_t>(Back)));
-
-	back.set_font(font_small());
-	new_game.set_font(font_small());
-	campaign.set_font(font_small());
-	load_game.set_font(font_small());
-
-	title.set_font(m_fn, fs_big(), UI_FONT_CLR_FG);
+		(boost::bind
+			(&FullscreenMenuSinglePlayer::end_modal,
+			 boost::ref(*this),
+			 static_cast<int32_t>(MenuTarget::kBack)));
+
+	title.set_font(ui_fn(), fs_big(), UI_FONT_CLR_FG);
 }

=== modified file 'src/ui_fsmenu/singleplayer.h'
--- src/ui_fsmenu/singleplayer.h	2014-09-10 14:08:25 +0000
+++ src/ui_fsmenu/singleplayer.h	2014-11-12 13:15:31 +0000
@@ -20,7 +20,7 @@
 #ifndef WL_UI_FSMENU_SINGLEPLAYER_H
 #define WL_UI_FSMENU_SINGLEPLAYER_H
 
-#include "ui_fsmenu/base.h"
+#include "ui_fsmenu/main_menu.h"
 #include "ui_basic/button.h"
 #include "ui_basic/textarea.h"
 
@@ -28,22 +28,22 @@
  * Fullscreen Menu for SinglePlayer.
  * Here you select what game you want to play.
  */
-struct FullscreenMenuSinglePlayer : public FullscreenMenuBase {
+struct FullscreenMenuSinglePlayer : public FullscreenMenuMainMenu {
 	FullscreenMenuSinglePlayer();
 
-	enum {Back = dying_code, New_Game, Campaign, Load_Game};
+	enum class MenuTarget: int32_t {
+		kBack = UI::Panel::dying_code,
+		kNewGame,
+		kCampaign,
+		kLoadGame
+	};
 
 private:
-	uint32_t                                            m_butw;
-	uint32_t                                            m_buth;
-	uint32_t                                            m_butx;
-	uint32_t                                            m_fs;
-	std::string                                         m_fn;
-	UI::Textarea                                        title;
-	UI::Button                             new_game;
-	UI::Button                             campaign;
-	UI::Button                             load_game;
-	UI::Button                             back;
+	UI::Textarea title;
+	UI::Button   new_game;
+	UI::Button   campaign;
+	UI::Button   load_game;
+	UI::Button   back;
 };
 
 #endif  // end of include guard: WL_UI_FSMENU_SINGLEPLAYER_H

=== modified file 'src/wlapplication.cc'
--- src/wlapplication.cc	2014-11-08 14:59:03 +0000
+++ src/wlapplication.cc	2014-11-12 13:15:31 +0000
@@ -1099,38 +1099,43 @@
 
 		try {
 			switch (mm.run()) {
-			case FullscreenMenuMain::mm_playtutorial:
+			case static_cast<int32_t>(FullscreenMenuMain::MenuTarget::kTutorial):
 				mainmenu_tutorial();
 				break;
-			case FullscreenMenuMain::mm_singleplayer:
+			case static_cast<int32_t>(FullscreenMenuMain::MenuTarget::kSinglePlayer):
 				mainmenu_singleplayer();
 				break;
-			case FullscreenMenuMain::mm_multiplayer:
+			case static_cast<int32_t>(FullscreenMenuMain::MenuTarget::kMultiplayer):
 				mainmenu_multiplayer();
 				break;
-			case FullscreenMenuMain::mm_replay:
+			case static_cast<int32_t>(FullscreenMenuMain::MenuTarget::kReplay):
 				replay();
 				break;
-			case FullscreenMenuMain::mm_options: {
+			case static_cast<int32_t>(FullscreenMenuMain::MenuTarget::kOptions): {
 				Section & s = g_options.pull_section("global");
 				OptionsCtrl om(s);
 				break;
 			}
-			case FullscreenMenuMain::mm_readme: {
+			case static_cast<int32_t>(FullscreenMenuMain::MenuTarget::kReadme): {
 				FullscreenMenuFileView ff("txts/README.lua");
 				ff.run();
 				break;
 			}
-			case FullscreenMenuMain::mm_license: {
+			case static_cast<int32_t>(FullscreenMenuMain::MenuTarget::kLicense): {
 				FullscreenMenuFileView ff("txts/license");
 				ff.run();
 				break;
 			}
-			case FullscreenMenuMain::mm_editor:
+			case static_cast<int32_t>(FullscreenMenuMain::MenuTarget::kAuthors): {
+				FullscreenMenuFileView ff("txts/developers");
+				ff.run();
+				break;
+			}
+			case static_cast<int32_t>(FullscreenMenuMain::MenuTarget::kEditor):
 				mainmenu_editor();
 				break;
 			default:
-			case FullscreenMenuMain::mm_exit:
+			case static_cast<int32_t>(FullscreenMenuMain::MenuTarget::kExit):
 				return;
 			}
 		} catch (const WLWarning & e) {
@@ -1199,7 +1204,8 @@
 	//  This is the code returned by UI::Panel::run() when the panel is dying.
 	//  Make sure that the program exits when the window manager says so.
 	static_assert
-		(FullscreenMenuSinglePlayer::Back == UI::Panel::dying_code, "Panel should be dying.");
+		(static_cast<int32_t>(FullscreenMenuSinglePlayer::MenuTarget::kBack) == UI::Panel::dying_code,
+		 "Panel should be dying.");
 
 	for (;;) {
 		int32_t code;
@@ -1208,17 +1214,17 @@
 			code = single_player_menu.run();
 		}
 		switch (code) {
-		case FullscreenMenuSinglePlayer::Back:
+		case static_cast<int32_t>(FullscreenMenuSinglePlayer::MenuTarget::kBack):
 			return;
-		case FullscreenMenuSinglePlayer::New_Game:
+		case static_cast<int32_t>(FullscreenMenuSinglePlayer::MenuTarget::kNewGame):
 			if (new_game())
 				return;
 			break;
-		case FullscreenMenuSinglePlayer::Load_Game:
+		case static_cast<int32_t>(FullscreenMenuSinglePlayer::MenuTarget::kLoadGame):
 			if (load_game())
 				return;
 			break;
-		case FullscreenMenuSinglePlayer::Campaign:
+		case static_cast<int32_t>(FullscreenMenuSinglePlayer::MenuTarget::kCampaign):
 			if (campaign_game())
 				return;
 			break;
@@ -1240,12 +1246,12 @@
 		bool internet = false;
 		FullscreenMenuMultiPlayer mp;
 		switch (mp.run()) {
-			case FullscreenMenuMultiPlayer::Back:
+			case static_cast<int32_t>(FullscreenMenuMultiPlayer::MenuTarget::kBack):
 				return;
-			case FullscreenMenuMultiPlayer::Metaserver:
+			case static_cast<int32_t>(FullscreenMenuMultiPlayer::MenuTarget::kMetaserver):
 				internet = true;
 				break;
-			case FullscreenMenuMultiPlayer::Lan:
+			case static_cast<int32_t>(FullscreenMenuMultiPlayer::MenuTarget::kLan):
 				break;
 			default:
 				assert(false);
@@ -1315,7 +1321,8 @@
 	//  This is the code returned by UI::Panel::run() when the panel is dying.
 	//  Make sure that the program exits when the window manager says so.
 	static_assert
-		(FullscreenMenuEditor::Back == UI::Panel::dying_code, "Editor should be dying.");
+		(static_cast<int32_t>(FullscreenMenuEditor::MenuTarget::kBack) == UI::Panel::dying_code,
+		 "Editor should be dying.");
 
 	for (;;) {
 		int32_t code;
@@ -1324,12 +1331,12 @@
 			code = editor_menu.run();
 		}
 		switch (code) {
-		case FullscreenMenuEditor::Back:
+		case static_cast<int32_t>(FullscreenMenuEditor::MenuTarget::kBack):
 			return;
-		case FullscreenMenuEditor::New_Map:
+		case static_cast<int32_t>(FullscreenMenuEditor::MenuTarget::kNewMap):
 			EditorInteractive::run_editor(m_filename, m_script_to_run);
 			return;
-		case FullscreenMenuEditor::Load_Map: {
+		case static_cast<int32_t>(FullscreenMenuEditor::MenuTarget::kLoadMap): {
 			std::string filename;
 			{
 				SinglePlayerGameSettingsProvider sp;

=== modified file 'txts/developers'
--- txts/developers	2014-10-12 12:22:54 +0000
+++ txts/developers	2014-11-12 13:15:31 +0000
@@ -1,4 +1,4 @@
-title=_ Development
+title=_Authors
 text=_""<rt text-align=center><p font-size=28 font-decoration=bold font-face=DejaVuSerif font-color=2F9131>"
 _ "Widelands Development Team"
 "</p></rt>"


Follow ups