瀏覽代碼

Merge pull request #5927 from Laserlicht/fps_draw

optimized fps/battery box drawing
Ivan Savenko 3 月之前
父節點
當前提交
2877fa3301

+ 0 - 2
Mods/vcmi/Content/config/chinese.json

@@ -304,8 +304,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "选择长触延迟",
 	"vcmi.systemOptions.longTouchMenu.help"      : "改变长触延迟。",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d 毫秒",
-	"vcmi.systemOptions.framerateButton.hover"  : "显示FPS",
-	"vcmi.systemOptions.framerateButton.help"   : "{显示FPS}\n\n切换在游戏窗口角落显FPS指示器。",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "触觉反馈",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{触觉反馈}\n\n切换触摸输入的触觉反馈。",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "界面增强",

+ 0 - 2
Mods/vcmi/Content/config/czech.json

@@ -311,8 +311,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Vybrat dobu dlouhého podržení",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Změnit dobu dlouhého podržení.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d milisekund",
-	"vcmi.systemOptions.framerateButton.hover"  : "Zobrazit FPS",
-	"vcmi.systemOptions.framerateButton.help"   : "{Zobrazit FPS}\n\nPřepne viditelnost počítadla snímků za sekundu v rohu obrazovky hry.",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Vibrace",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Vibrace}\n\nPřepnout stav vibrací při dotykovém ovládání.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Vylepšení rozhraní",

+ 5 - 2
Mods/vcmi/Content/config/english.json

@@ -97,6 +97,9 @@
 	"vcmi.randomMap.description.monster.normal" : "normal",
 	"vcmi.randomMap.description.monster.strong" : "strong",
 
+	"vcmi.overlay.battery"  : "Battery",
+	"vcmi.overlay.charging"  : "Charging",
+
 	"vcmi.spellBook.search" : "search...",
 	"vcmi.spellBook.tab.hover" : "%s Spells",
 	"vcmi.spellBook.tab.help" : "Turn to view %s spells",
@@ -313,8 +316,8 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Select Long Touch Interval",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Change duration of long touch interval.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d milliseconds",
-	"vcmi.systemOptions.framerateButton.hover"  : "Show FPS",
-	"vcmi.systemOptions.framerateButton.help"   : "{Show FPS}\n\nToggle the visibility of the Frames Per Second counter in the corner of the game window.",
+	"vcmi.systemOptions.performanceOverlayButton.hover"  : "Show Performance Overlay",
+	"vcmi.systemOptions.performanceOverlayButton.help"   : "{Show Performance Overlay}\n\nToggle the visibility of the overlay with additional information like frames per second, time and battery charge level (if available) in the corner of the game window.",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Haptic feedback",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Haptic feedback}\n\nToggle the haptic feedback on touch inputs.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Interface Enhancements",

+ 0 - 2
Mods/vcmi/Content/config/french.json

@@ -68,8 +68,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Sélectionner l'intervalle de touche long",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Changer la durée de l'intervalle de touche long.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d millisecondes",
-	"vcmi.systemOptions.framerateButton.hover"  : "Afficher les FPS",
-	"vcmi.systemOptions.framerateButton.help"   : "{Show FPS}\n\nAfficher/masquer le compteur de Frames Par Seconde dans le coin de la fenêtre du jeu",
 
 	"vcmi.adventureOptions.infoBarPick.hover" : "Afficher les messages dans le panneau d'information",
 	"vcmi.adventureOptions.infoBarPick.help" : "{Show Messages in Info Panel}\n\nAutant que possible, les messages de jeu de la visite des objets de la carte seront affichés dans le panneau d'informations, au lieu de faire apparaître dans une fenêtre séparée.",

+ 5 - 2
Mods/vcmi/Content/config/german.json

@@ -97,6 +97,9 @@
 	"vcmi.randomMap.description.monster.normal" : "Normal",
 	"vcmi.randomMap.description.monster.strong" : "Stark",
 
+	"vcmi.overlay.battery"  : "Batterie",
+	"vcmi.overlay.charging"  : "Lädt",
+
 	"vcmi.spellBook.search" : "suchen...",
 	"vcmi.spellBook.tab.hover" : "%szauber",
 	"vcmi.spellBook.tab.help" : "Zu %szaubersprüchen blättern",
@@ -313,8 +316,8 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Wähle Dauer für Touch",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Ändere die Dauer für den langen Touch",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d Millisekunden",
-	"vcmi.systemOptions.framerateButton.hover"  : "FPS anzeigen",
-	"vcmi.systemOptions.framerateButton.help"   : "{FPS anzeigen}\n\n Schaltet die Sichtbarkeit des Zählers für die Bilder pro Sekunde in der Ecke des Spielfensters um.",
+	"vcmi.systemOptions.performanceOverlayButton.hover"  : "Leistungs-Overlay anzeigen",
+	"vcmi.systemOptions.performanceOverlayButton.help"   : "{Leistungs-Overlay anzeigen}\n\n Schaltet die Sichtbarkeit eines Overlays für zusätzliche Informationen, wie eines Zählers für die Bilder pro Sekunde, der Uhrzeit oder des Batterieladezustands (wenn verfügbar) in der Ecke des Spielfensters um.",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Haptisches Feedback",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Haptisches Feedback}\n\nHaptisches Feedback bei Touch-Eingaben.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Interface Verbesserungen",

+ 0 - 2
Mods/vcmi/Content/config/hungarian.json

@@ -292,8 +292,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Hosszú érintés időtartamának kiválasztása",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Hosszú érintés időtartamának módosítása.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d milliszekundum",
-	"vcmi.systemOptions.framerateButton.hover"  : "FPS megjelenítése",
-	"vcmi.systemOptions.framerateButton.help"   : "{FPS megjelenítése}\n\nA másodpercenkénti képkocka számláló láthatóságának váltása a játékablak sarkában.",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Rezgő visszacsatolás",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Rezgő visszacsatolás}\n\nA rezgő visszacsatolás engedélyezése vagy tiltása érintőbemeneteknél.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Felület fejlesztések",

+ 0 - 2
Mods/vcmi/Content/config/italian.json

@@ -294,8 +294,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Seleziona intervallo di tocco lungo",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Modifica la durata dell'intervallo di tocco lungo.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d millisecondi",
-	"vcmi.systemOptions.framerateButton.hover"  : "Mostra FPS",
-	"vcmi.systemOptions.framerateButton.help"   : "{Mostra FPS}\n\nAttiva o disattiva la visibilità del contatore dei fotogrammi al secondo nell'angolo della finestra di gioco.",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Feedback aptico",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Feedback aptico}\n\nAttiva o disattiva il feedback aptico sugli input tattili.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Miglioramenti interfaccia",

+ 0 - 2
Mods/vcmi/Content/config/polish.json

@@ -294,8 +294,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Wybierz czas długiego dotyku",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Nowy czas aktywacji długiego dotyku.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d milisekund",
-	"vcmi.systemOptions.framerateButton.hover"  : "Pokaż FPS",
-	"vcmi.systemOptions.framerateButton.help"   : "{Pokaż FPS}\n\n Przełącza widoczność licznika klatek na sekundę (FPS) w rogu okna gry.",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Wibracje urządzenia",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Wibracje urządzenia}\n\nWłącz wibracje na urządzeniu dotykowym",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Ulepszenia interfejsu",

+ 0 - 2
Mods/vcmi/Content/config/portuguese.json

@@ -311,8 +311,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Selecionar Intervalo de Toque Longo",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Muda a duração do intervalo de toque longo.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d milissegundos",
-	"vcmi.systemOptions.framerateButton.hover"  : "Mostrar QPS",
-	"vcmi.systemOptions.framerateButton.help"   : "{Mostra os Quadros Por Segundo}\n\nAtiva ou desativa a visibilidade do contador de Quadros Por Segundo no canto da janela do jogo.",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Resposta Tátil",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Resposta Tátil}\n\nAtiva ou desativa a resposta tátil nos toques na tela.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Aprimoramentos da Interface",

+ 0 - 2
Mods/vcmi/Content/config/russian.json

@@ -290,8 +290,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Выбрать интервал длительного касания:",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Изменить интервал длительного касания.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d миллисекунд",
-	"vcmi.systemOptions.framerateButton.hover"  : "Показывать частоту кадров",
-	"vcmi.systemOptions.framerateButton.help"   : "{Показывать частоту кадров}\n\nЕсли выбрано, частота кадров в секунду будет показана в верхнем левом углу игрового экрана.",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Тактильный отклик",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Тактильный отклик}\n\nиспользовать вибрацию при использовании сенсорного экрана.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Расширенные функции интерфейса",

+ 0 - 2
Mods/vcmi/Content/config/spanish.json

@@ -107,8 +107,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Seleccionar Intervalo de Toque Largo",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Cambia la duración del intervalo de toque largo.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d milisegundos",
-	"vcmi.systemOptions.framerateButton.hover"  : "Mostrar FPS",
-	"vcmi.systemOptions.framerateButton.help"   : "{Mostrar FPS}\n\nAlternar la visibilidad del contador de Frames Per Second en la esquina de la ventana del juego.",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Retroalimentación háptica",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Retroalimentación háptica}\n\nAlternar la retroalimentación háptica en las entradas táctiles.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Mejoras de la interfaz",

+ 0 - 2
Mods/vcmi/Content/config/swedish.json

@@ -304,8 +304,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"             : "Välj tidsintervall för fördröjd pekskärmsberöringsmeny",
 	"vcmi.systemOptions.longTouchMenu.help"              : "Ändra varaktighetsintervallet för fördröjd beröring.",
 	"vcmi.systemOptions.longTouchMenu.entry"             : "%d millisekunder",
-	"vcmi.systemOptions.framerateButton.hover"           : "Visar FPS (skärmbilder per sekund)",
-	"vcmi.systemOptions.framerateButton.help"            : "{Visa FPS}\n\nVisar räknaren för bildrutor per sekund i hörnet av spelfönstret.",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"      : "Haptisk återkoppling",
 	"vcmi.systemOptions.hapticFeedbackButton.help"       : "{Haptisk feedback}\n\nÄndrar den haptiska feedbacken för berörings-input.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover": "Förbättringar av användargränssnittet",

+ 0 - 2
Mods/vcmi/Content/config/ukrainian.json

@@ -308,8 +308,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover"     : "Виберіть інтервал довгого дотику",
 	"vcmi.systemOptions.longTouchMenu.help"      : "Змінити тривалість інтервалу довгого дотику.",
 	"vcmi.systemOptions.longTouchMenu.entry"     : "%d мілісекунд",
-	"vcmi.systemOptions.framerateButton.hover"  : "Лічильник кадрів",
-	"vcmi.systemOptions.framerateButton.help"   : "{Лічильник кадрів}\n\n Перемикає видимість лічильника кадрів на секунду у кутку ігрового вікна",
 	"vcmi.systemOptions.hapticFeedbackButton.hover"  : "Тактильний відгук",
 	"vcmi.systemOptions.hapticFeedbackButton.help"   : "{Тактильний відгук}\n\nВикористовувати вібрацію при використанні сенсорного екрану",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Розширення інтерфейсу",

+ 0 - 2
Mods/vcmi/Content/config/vietnamese.json

@@ -292,8 +292,6 @@
 	"vcmi.systemOptions.longTouchMenu.hover": "Chọn khoảng thời gian chạm giữ",
 	"vcmi.systemOptions.longTouchMenu.help": "Đổi khoảng thời gian chạm giữ.",
 	"vcmi.systemOptions.longTouchMenu.entry": "%d mili giây",
-	"vcmi.systemOptions.framerateButton.hover": "Hiện FPS",
-	"vcmi.systemOptions.framerateButton.help": "{Hiện FPS}\n\nHiện khung hình mỗi giây ở góc cửa sổ trò chơi",
 	"vcmi.systemOptions.hapticFeedbackButton.hover": "Rung khi chạm",
 	"vcmi.systemOptions.hapticFeedbackButton.help": "{Rung khi chạm}\n\nBật/ tắt chế độ rung khi chạm.",
 	"vcmi.systemOptions.enableUiEnhancementsButton.hover"  : "Cải thiện giao diện",

+ 42 - 6
client/GameEngine.cpp

@@ -9,6 +9,7 @@
  */
 #include "StdInc.h"
 #include "GameEngine.h"
+#include "GameLibrary.h"
 
 #include "gui/CIntObject.h"
 #include "gui/CursorHandler.h"
@@ -35,6 +36,8 @@
 
 #include "../lib/AsyncRunner.h"
 #include "../lib/CConfigHandler.h"
+#include "../lib/texts/TextOperations.h"
+#include "../lib/texts/CGeneralTextHandler.h"
 
 #include <SDL_render.h>
 
@@ -125,8 +128,8 @@ void GameEngine::updateFrame()
 	handleEvents();
 	windows().simpleRedraw();
 
-	if (settings["video"]["showfps"].Bool())
-		drawFPSCounter();
+	if (settings["video"]["performanceOverlay"]["show"].Bool())
+		drawPerformanceOverlay();
 
 	screenHandlerInstance->updateScreenTexture();
 
@@ -184,14 +187,47 @@ Point GameEngine::screenDimensions() const
 	return screenHandlerInstance->getLogicalResolution();
 }
 
-void GameEngine::drawFPSCounter()
+void GameEngine::drawPerformanceOverlay()
 {
+	auto font = EFonts::FONT_SMALL;
+	const auto & fontPtr = ENGINE->renderHandler().loadFont(font);
+
 	Canvas target = screenHandler().getScreenCanvas();
-	Rect targetArea(0, screenDimensions().y - 20, 48, 11);
+
+	auto powerState = ENGINE->input().getPowerState();
+	std::string powerSymbol = ""; // add symbol if emoji are supported (e.g. VCMI extras)
+	if(powerState.powerState == PowerStateMode::ON_BATTERY)
+		powerSymbol = fontPtr->canRepresentCharacter("🔋") ? "🔋 " : (LIBRARY->generaltexth->translate("vcmi.overlay.battery") + " ");
+	else if(powerState.powerState == PowerStateMode::CHARGING)
+		powerSymbol = fontPtr->canRepresentCharacter("🔌") ? "🔌 " : (LIBRARY->generaltexth->translate("vcmi.overlay.charging") + " ");
+
 	std::string fps = std::to_string(framerate().getFramerate())+" FPS";
+	std::string time = TextOperations::getFormattedTimeLocal(std::time(nullptr));
+	std::string power = powerState.powerState == PowerStateMode::UNKNOWN ? "" : powerSymbol + std::to_string(powerState.percent) + "%";
+
+	std::string textToDisplay = time + (power.empty() ? "" : " | " + power) + " | " + fps;
+
+	maxPerformanceOverlayTextWidth = std::max(maxPerformanceOverlayTextWidth, static_cast<int>(fontPtr->getStringWidth(textToDisplay))); // do not get smaller (can cause graphical glitches)
+
+	Rect targetArea;
+	std::string edge = settings["video"]["performanceOverlay"]["edge"].String();
+	int marginTopBottom = settings["video"]["performanceOverlay"]["marginTopBottom"].Integer();
+	int marginLeftRight = settings["video"]["performanceOverlay"]["marginLeftRight"].Integer();
+
+	Point boxSize(maxPerformanceOverlayTextWidth + 6, fontPtr->getLineHeight() + 2);
+
+	if (edge == "topleft")
+		targetArea = Rect(marginLeftRight, marginTopBottom, boxSize.x, boxSize.y);
+	else if (edge == "topright")
+		targetArea = Rect(screenDimensions().x - marginLeftRight - boxSize.x, marginTopBottom, boxSize.x, boxSize.y);
+	else if (edge == "bottomleft")
+		targetArea = Rect(marginLeftRight, screenDimensions().y - marginTopBottom - boxSize.y, boxSize.x, boxSize.y);
+	else if (edge == "bottomright")
+		targetArea = Rect(screenDimensions().x - marginLeftRight - boxSize.x, screenDimensions().y - marginTopBottom - boxSize.y, boxSize.x, boxSize.y);
 
-	target.drawColor(targetArea, ColorRGBA(10, 10, 10));
-	target.drawText(targetArea.center(), EFonts::FONT_SMALL, Colors::WHITE, ETextAlignment::CENTER, fps);
+	target.drawColor(targetArea.resize(1), Colors::BRIGHT_YELLOW);
+	target.drawColor(targetArea, ColorRGBA(0, 0, 0));
+	target.drawText(targetArea.center(), font, Colors::WHITE, ETextAlignment::CENTER, textToDisplay);
 }
 
 bool GameEngine::amIGuiThread()

+ 3 - 1
client/GameEngine.h

@@ -57,9 +57,11 @@ private:
 
 	IGameEngineUser *engineUser = nullptr;
 
+	int maxPerformanceOverlayTextWidth = 0;
+
 	void updateFrame();
 	void handleEvents(); //takes events from queue and calls interested objects
-	void drawFPSCounter(); // draws the FPS to the upper left corner of the screen
+	void drawPerformanceOverlay(); // draws box with additional infos (e.g. fps)
 
 public:
 	std::mutex interfaceMutex;

+ 16 - 0
client/eventsSDL/InputHandler.cpp

@@ -33,6 +33,7 @@
 #include <SDL_events.h>
 #include <SDL_timer.h>
 #include <SDL_clipboard.h>
+#include <SDL_power.h>
 
 InputHandler::InputHandler()
 	: enableMouse(settings["input"]["enableMouse"].Bool())
@@ -148,6 +149,21 @@ void InputHandler::copyToClipBoard(const std::string & text)
 	SDL_SetClipboardText(text.c_str());
 }
 
+PowerState InputHandler::getPowerState()
+{
+	int seconds;
+	int percent;
+	auto sdlPowerState = SDL_GetPowerInfo(&seconds, &percent);
+
+	PowerStateMode powerState = PowerStateMode::UNKNOWN;
+	if(sdlPowerState == SDL_POWERSTATE_ON_BATTERY)
+		powerState = PowerStateMode::ON_BATTERY;
+	else if(sdlPowerState == SDL_POWERSTATE_CHARGING || sdlPowerState == SDL_POWERSTATE_CHARGED)
+		powerState = PowerStateMode::CHARGING;
+
+	return PowerState{powerState, seconds, percent};
+}
+
 std::vector<SDL_Event> InputHandler::acquireEvents()
 {
 	std::unique_lock<std::mutex> lock(eventsMutex);

+ 14 - 0
client/eventsSDL/InputHandler.h

@@ -32,6 +32,19 @@ enum class InputMode
 	CONTROLLER
 };
 
+enum class PowerStateMode
+{
+	UNKNOWN,
+	CHARGING,
+	ON_BATTERY
+};
+
+struct PowerState {
+	PowerStateMode powerState;
+	int seconds;
+	int percent;
+};
+
 class InputHandler
 {
 	std::vector<SDL_Event> eventsQueue;
@@ -111,4 +124,5 @@ public:
 	InputMode getCurrentInputMode();
 
 	void copyToClipBoard(const std::string & text);
+	PowerState getPowerState();
 };

+ 5 - 4
client/windows/settings/GeneralOptionsTab.cpp

@@ -152,9 +152,10 @@ GeneralOptionsTab::GeneralOptionsTab()
 	{
 		selectLongTouchDuration();
 	});
-	addCallback("framerateChanged", [](bool value)
+	addCallback("performanceOverlayChanged", [](bool value)
 	{
-		setBoolSetting("video", "showfps", value);
+		Settings gameRes = settings.write["video"]["performanceOverlay"];
+		gameRes["show"].Bool() = value;
 	});
 	addCallback("hapticFeedbackChanged", [](bool value)
 	{
@@ -225,8 +226,8 @@ GeneralOptionsTab::GeneralOptionsTab()
 	if (fullscreenExclusiveCheckbox)
 		fullscreenExclusiveCheckbox->setSelected(settings["video"]["fullscreen"].Bool() && settings["video"]["realFullscreen"].Bool());
 
-	std::shared_ptr<CToggleButton> framerateCheckbox = widget<CToggleButton>("framerateCheckbox");
-	framerateCheckbox->setSelected(settings["video"]["showfps"].Bool());
+	std::shared_ptr<CToggleButton> infoboxCheckbox = widget<CToggleButton>("performanceOverlayCheckbox");
+	infoboxCheckbox->setSelected(settings["video"]["performanceOverlay"]["show"].Bool());
 
 	std::shared_ptr<CToggleButton> hapticFeedbackCheckbox = widget<CToggleButton>("hapticFeedbackCheckbox");
 	if (hapticFeedbackCheckbox)

+ 11 - 4
config/schemas/settings.json

@@ -210,7 +210,7 @@
 				"spellbookAnimation",
 				"driver",
 				"displayIndex",
-				"showfps",
+				"performanceOverlay",
 				"targetfps",
 				"vsync",
 				"fontsType",
@@ -270,9 +270,16 @@
 					"type" : "number",
 					"default" : 0
 				},
-				"showfps" : {
-					"type" : "boolean",
-					"default" : false
+				"performanceOverlay" : {
+					"type" : "object",
+					"additionalProperties" : false,
+					"required" : [ "show", "edge", "marginTopBottom", "marginLeftRight" ],
+					"properties" : {
+						"show" : { "type" : "boolean", "default" : false },
+						"edge" : { "type" : "string",  "enum" : [ "topleft", "topright", "bottomleft", "bottomright" ], "default" : "bottomleft" },
+						"marginTopBottom" : { "type" : "number",  "default" : 5 },
+						"marginLeftRight" : { "type" : "number",  "default" : 7 }
+					}
 				},
 				"targetfps" : {
 					"type" : "number",

+ 4 - 4
config/widgets/settings/generalOptionsTab.json

@@ -50,7 +50,7 @@
 					"created" : "desktop"
 				},
 				{
-					"text": "vcmi.systemOptions.framerateButton.hover"
+					"text": "vcmi.systemOptions.performanceOverlayButton.hover"
 				},
 				{
 					"text": "vcmi.systemOptions.enableLargeSpellbookButton.hover"
@@ -136,9 +136,9 @@
 					"created" : "desktop"
 				},
 				{
-					"name": "framerateCheckbox",
-					"help": "vcmi.systemOptions.framerateButton",
-					"callback": "framerateChanged"
+					"name": "performanceOverlayCheckbox",
+					"help": "vcmi.systemOptions.performanceOverlayButton",
+					"callback": "performanceOverlayChanged"
 				},
 				{
 					"name": "enableLargeSpellbookCheckbox",