Răsfoiți Sursa

Merge pull request #4098 from IvanSavenko/launcher_settings_update

Launcher settings update
Ivan Savenko 1 an în urmă
părinte
comite
2d98ec708c

+ 6 - 8
client/eventsSDL/InputSourceGameController.cpp

@@ -31,10 +31,8 @@ InputSourceGameController::InputSourceGameController():
 	configTriggerTreshold(settings["input"]["controllerTriggerTreshold"].Float()),
 	configAxisDeadZone(settings["input"]["controllerAxisDeadZone"].Float()),
 	configAxisFullZone(settings["input"]["controllerAxisFullZone"].Float()),
-	configPointerSpeed(settings["input"]["controllerPointerSpeed"].Float()),
-	configPointerScale(settings["input"]["controllerPointerScale"].Float()),
-	configPanningSpeed(settings["input"]["controllerPanningSpeed"].Float()),
-	configPanningScale(settings["input"]["controllerPanningScale"].Float()),
+	configAxisSpeed(settings["input"]["controllerAxisSpeed"].Float()),
+	configAxisScale(settings["input"]["controllerAxisScale"].Float()),
 	cursorAxisValueX(0),
 	cursorAxisValueY(0),
 	cursorPlanDisX(0.0),
@@ -274,12 +272,12 @@ void InputSourceGameController::handleCursorUpdate(int32_t deltaTimeMs)
 	if(vstd::isAlmostZero(cursorAxisValueX))
 		cursorPlanDisX = 0;
 	else
-		cursorPlanDisX += deltaTimeSeconds * configPointerSpeed * scaleAxis(cursorAxisValueX, configPointerScale);
+		cursorPlanDisX += deltaTimeSeconds * configAxisSpeed * scaleAxis(cursorAxisValueX, configAxisScale);
 
 	if (vstd::isAlmostZero(cursorAxisValueY))
 		cursorPlanDisY = 0;
 	else
-		cursorPlanDisY += deltaTimeSeconds * configPointerSpeed * scaleAxis(cursorAxisValueY, configPointerScale);
+		cursorPlanDisY += deltaTimeSeconds * configAxisSpeed * scaleAxis(cursorAxisValueY, configAxisScale);
 
 	int moveDisX = getMoveDis(cursorPlanDisX);
 	int moveDisY = getMoveDis(cursorPlanDisY);
@@ -308,8 +306,8 @@ void InputSourceGameController::handleScrollUpdate(int32_t deltaTimeMs)
 		return;
 	}
 	float deltaTimeSeconds = static_cast<float>(deltaTimeMs) / 1000;
-	scrollPlanDisX += deltaTimeSeconds * configPanningSpeed * scaleAxis(scrollAxisValueX, configPanningScale);
-	scrollPlanDisY += deltaTimeSeconds * configPanningSpeed * scaleAxis(scrollAxisValueY, configPanningScale);
+	scrollPlanDisX += deltaTimeSeconds * configAxisSpeed * scaleAxis(scrollAxisValueX, configAxisScale);
+	scrollPlanDisY += deltaTimeSeconds * configAxisSpeed * scaleAxis(scrollAxisValueY, configAxisScale);
 	int moveDisX = getMoveDis(scrollPlanDisX);
 	int moveDisY = getMoveDis(scrollPlanDisY);
 	if(moveDisX != 0 || moveDisY != 0)

+ 2 - 4
client/eventsSDL/InputSourceGameController.h

@@ -42,10 +42,8 @@ class InputSourceGameController
 	const double configTriggerTreshold;
 	const double configAxisDeadZone;
 	const double configAxisFullZone;
-	const double configPointerSpeed;
-	const double configPointerScale;
-	const double configPanningSpeed;
-	const double configPanningScale;
+	const double configAxisSpeed;
+	const double configAxisScale;
 
 	void openGameController(int index);
 	int getJoystickIndex(SDL_GameController * controller);

+ 6 - 16
config/schemas/settings.json

@@ -71,7 +71,7 @@
 				},
 				"gameDataLanguage" : {
 					"type" : "string",
-					"enum" : [ "auto", "english", "czech", "chinese", "finnish", "french", "german", "hungarian", "italian", "korean", "polish", "portuguese", "russian", "spanish", "swedish", "turkish", "ukrainian", "vietnamese", "other_cp1250", "other_cp1251", "other_cp1252" ],
+					"enum" : [ "auto", "english", "czech", "chinese", "finnish", "french", "german", "hungarian", "italian", "korean", "polish", "portuguese", "russian", "spanish", "swedish", "turkish", "ukrainian", "vietnamese" ],
 					"default" : "auto"
 				},
 				"lastSave" : {
@@ -116,7 +116,7 @@
 				},
 				"hapticFeedback" : {
 					"type" : "boolean",
-					"default" : false
+					"default" : true
 				},
 				"autosaveCountLimit" : {
 					"type" : "number",
@@ -247,10 +247,8 @@
 				"controllerTriggerTreshold",
 				"controllerAxisDeadZone",
 				"controllerAxisFullZone",
-				"controllerPointerSpeed",
-				"controllerPointerScale",
-				"controllerPanningSpeed",
-				"controllerPanningScale",
+				"controllerAxisSpeed",
+				"controllerAxisScale"
 			],
 			"properties" : {
 				"radialWheelGarrisonSwipe" : {
@@ -293,19 +291,11 @@
 					"type" : "number",
 					"default" : 1.0
 				},
-				"controllerPointerSpeed" : {
-					"type" : "number",
-					"default" : 1000
-				},
-				"controllerPointerScale" : {
-					"type" : "number",
-					"default" : 2
-				},
-				"controllerPanningSpeed" : {
+				"controllerAxisSpeed" : {
 					"type" : "number",
 					"default" : 1000
 				},
-				"controllerPanningScale" : {
+				"controllerAxisScale" : {
 					"type" : "number",
 					"default" : 2
 				}

+ 1 - 13
launcher/languages.cpp

@@ -18,7 +18,7 @@
 #include <QListWidget>
 
 // list of language names, for generation of translations. Do not use directly, use Languages namespace instead
-static const std::array<std::string, 20> languageTranslatedNamesGenerator = {
+static const std::array<std::string, 17> languageTranslatedNamesGenerator = {
 	{
 		QT_TRANSLATE_NOOP("Language", "Czech"),
 		QT_TRANSLATE_NOOP("Language", "Chinese"),
@@ -37,9 +37,6 @@ static const std::array<std::string, 20> languageTranslatedNamesGenerator = {
 		QT_TRANSLATE_NOOP("Language", "Turkish"),
 		QT_TRANSLATE_NOOP("Language", "Ukrainian"),
 		QT_TRANSLATE_NOOP("Language", "Vietnamese"),
-		QT_TRANSLATE_NOOP("Language", "Other (East European)"),
-		QT_TRANSLATE_NOOP("Language", "Other (Cyrillic Script)"),
-		QT_TRANSLATE_NOOP("Language", "Other (West European)"),
 	 }
 };
 
@@ -73,9 +70,6 @@ QString Languages::generateLanguageName(const Languages::Options & language)
 	QString localizedName = QApplication::translate("Language", language.nameEnglish.c_str());
 	QString nativeName = language.nameNative.c_str();
 
-	if(!language.hasTranslation)
-		return localizedName;
-
 	if(activeLanguage == language.identifier)
 		return nativeName;
 
@@ -105,9 +99,6 @@ void Languages::fillLanguages(QComboBox * widget, bool includeAll)
 
 	for(const auto & language : Languages::getLanguageList())
 	{
-		if (!language.hasTranslation && !includeAll)
-			continue;
-
 		QString displayName = generateLanguageName(language);
 		QVariant userData = QString::fromStdString(language.identifier);
 
@@ -141,9 +132,6 @@ void Languages::fillLanguages(QListWidget * widget, bool includeAll)
 
 	for(const auto & language : Languages::getLanguageList())
 	{
-		if (!language.hasTranslation && !includeAll)
-			continue;
-
 		QString displayName = generateLanguageName(language);
 		QVariant userData = QString::fromStdString(language.identifier);
 

+ 2 - 2
launcher/mainwindow_moc.h

@@ -15,8 +15,8 @@
 namespace Ui
 {
 class MainWindow;
-const QString teamName = "VCMI Team";
-const QString appName = "VCMI Launcher";
+const QString teamName = "vcmi";
+const QString appName = "launcher";
 }
 
 class QTableWidgetItem;

+ 0 - 3
launcher/modManager/cmodlistview_moc.cpp

@@ -330,9 +330,6 @@ QString CModListView::genModInfoText(CModEntry & mod)
 
 	for(const auto & language : Languages::getLanguageList())
 	{
-		if (!language.hasTranslation)
-			continue;
-
 		QString languageID = QString::fromStdString(language.identifier);
 
 		if (languageID != baseLanguageID && !mod.getValue(languageID).isValid())

+ 175 - 46
launcher/settingsView/csettingsview_moc.cpp

@@ -17,7 +17,6 @@
 #include "../helper.h"
 #include "../jsonutils.h"
 #include "../languages.h"
-#include "../launcherdirs.h"
 
 #include <QFileInfo>
 #include <QGuiApplication>
@@ -35,12 +34,19 @@ QString resolutionToString(const QSize & resolution)
 	return QString{"%1x%2"}.arg(resolution.width()).arg(resolution.height());
 }
 
-static const std::string cursorTypesList[] =
+static constexpr std::array cursorTypesList =
 {
 	"hardware",
 	"software"
 };
 
+static constexpr std::array upscalingFilterTypes =
+{
+	"nearest",
+	"linear",
+	"best"
+};
+
 }
 
 void CSettingsView::setDisplayList()
@@ -65,16 +71,36 @@ void CSettingsView::setDisplayList()
 	}
 }
 
+void CSettingsView::setCheckbuttonState(QToolButton * button, bool checked)
+{
+	button->setChecked(checked);
+	updateCheckbuttonText(button);
+}
+
+void CSettingsView::updateCheckbuttonText(QToolButton * button)
+{
+	if (button->isChecked())
+		button->setText(tr("On"));
+	else
+		button->setText(tr("Off"));
+}
+
 void CSettingsView::loadSettings()
 {
-	ui->comboBoxShowIntro->setCurrentIndex(settings["video"]["showIntro"].Bool());
+	setCheckbuttonState(ui->buttonShowIntro, settings["video"]["showIntro"].Bool());
 
 #ifdef VCMI_MOBILE
 	ui->comboBoxFullScreen->hide();
 	ui->labelFullScreen->hide();
 #else
 	ui->labelReservedArea->hide();
-	ui->spinBoxReservedArea->hide();
+	ui->sliderReservedArea->hide();
+	ui->labelRelativeCursorMode->hide();
+	ui->buttonRelativeCursorMode->hide();
+	ui->sliderRelativeCursorSpeed->hide();
+	ui->labelRelativeCursorSpeed->hide();
+	ui->buttonHapticFeedback->hide();
+	ui->labelHapticFeedback->hide();
 	if (settings["video"]["realFullscreen"].Bool())
 		ui->comboBoxFullScreen->setCurrentIndex(2);
 	else
@@ -85,8 +111,8 @@ void CSettingsView::loadSettings()
 	ui->spinBoxInterfaceScaling->setValue(settings["video"]["resolution"]["scaling"].Float());
 	ui->spinBoxFramerateLimit->setValue(settings["video"]["targetfps"].Float());
 	ui->spinBoxFramerateLimit->setDisabled(settings["video"]["vsync"].Bool());
-	ui->checkBoxVSync->setChecked(settings["video"]["vsync"].Bool());
-	ui->spinBoxReservedArea->setValue(std::round(settings["video"]["reservedWidth"].Float() * 100));
+	setCheckbuttonState(ui->buttonVSync, settings["video"]["vsync"].Bool());
+	ui->sliderReservedArea->setValue(std::round(settings["video"]["reservedWidth"].Float() * 100));
 
 	ui->comboBoxFriendlyAI->setCurrentText(QString::fromStdString(settings["server"]["friendlyAI"].String()));
 	ui->comboBoxNeutralAI->setCurrentText(QString::fromStdString(settings["server"]["neutralAI"].String()));
@@ -97,7 +123,7 @@ void CSettingsView::loadSettings()
 
 	ui->spinBoxNetworkPort->setValue(settings["server"]["localPort"].Integer());
 
-	ui->comboBoxAutoCheck->setCurrentIndex(settings["launcher"]["autoCheckRepositories"].Bool());
+	setCheckbuttonState(ui->buttonAutoCheck, settings["launcher"]["autoCheckRepositories"].Bool());
 
 	ui->lineEditRepositoryDefault->setText(QString::fromStdString(settings["launcher"]["defaultRepositoryURL"].String()));
 	ui->lineEditRepositoryExtra->setText(QString::fromStdString(settings["launcher"]["extraRepositoryURL"].String()));
@@ -105,16 +131,15 @@ void CSettingsView::loadSettings()
 	ui->lineEditRepositoryDefault->setEnabled(settings["launcher"]["defaultRepositoryEnabled"].Bool());
 	ui->lineEditRepositoryExtra->setEnabled(settings["launcher"]["extraRepositoryEnabled"].Bool());
 
-	ui->checkBoxRepositoryDefault->setChecked(settings["launcher"]["defaultRepositoryEnabled"].Bool());
-	ui->checkBoxRepositoryExtra->setChecked(settings["launcher"]["extraRepositoryEnabled"].Bool());
+	setCheckbuttonState(ui->buttonRepositoryDefault, settings["launcher"]["defaultRepositoryEnabled"].Bool());
+	setCheckbuttonState(ui->buttonRepositoryExtra, settings["launcher"]["extraRepositoryEnabled"].Bool());
 
-	ui->checkBoxIgnoreSslErrors->setChecked(settings["launcher"]["ignoreSslErrors"].Bool());
-
-	ui->comboBoxAutoSave->setCurrentIndex(settings["general"]["saveFrequency"].Integer() > 0 ? 1 : 0);
+	setCheckbuttonState(ui->buttonIgnoreSslErrors, settings["launcher"]["ignoreSslErrors"].Bool());
+	setCheckbuttonState(ui->buttonAutoSave, settings["general"]["saveFrequency"].Integer() > 0);
 
 	ui->spinBoxAutoSaveLimit->setValue(settings["general"]["autosaveCountLimit"].Integer());
 
-	ui->checkBoxAutoSavePrefix->setChecked(settings["general"]["useSavePrefix"].Bool());
+	setCheckbuttonState(ui->buttonAutoSavePrefix, settings["general"]["useSavePrefix"].Bool());
 
 	ui->lineEditAutoSavePrefix->setText(QString::fromStdString(settings["general"]["savePrefix"].String()));
 	ui->lineEditAutoSavePrefix->setEnabled(settings["general"]["useSavePrefix"].Bool());
@@ -123,8 +148,26 @@ void CSettingsView::loadSettings()
 	fillValidRenderers();
 
 	std::string cursorType = settings["video"]["cursor"].String();
-	size_t cursorTypeIndex = boost::range::find(cursorTypesList, cursorType) - cursorTypesList;
-	ui->comboBoxCursorType->setCurrentIndex((int)cursorTypeIndex);
+	int cursorTypeIndex = vstd::find_pos(cursorTypesList, cursorType);
+	setCheckbuttonState(ui->buttonCursorType, cursorTypeIndex);
+
+	std::string upscalingFilter = settings["video"]["scalingMode"].String();
+	int upscalingFilterIndex = vstd::find_pos(upscalingFilterTypes, upscalingFilter);
+	ui->comboBoxUpscalingFilter->setCurrentIndex(upscalingFilterIndex);
+
+	ui->sliderMusicVolume->setValue(settings["general"]["music"].Integer());
+	ui->sliderSoundVolume->setValue(settings["general"]["sound"].Integer());
+	setCheckbuttonState(ui->buttonRelativeCursorMode, settings["general"]["userRelativePointer"].Bool());
+	ui->sliderRelativeCursorSpeed->setValue(settings["general"]["relativePointerSpeedMultiplier"].Integer());
+	setCheckbuttonState(ui->buttonHapticFeedback, settings["launcher"]["hapticFeedback"].Bool());
+	ui->sliderLongTouchDuration->setValue(settings["general"]["longTouchTimeMilliseconds"].Integer());
+	ui->slideToleranceDistanceMouse->setValue(settings["input"]["mouseToleranceDistance"].Integer());
+	ui->sliderToleranceDistanceTouch->setValue(settings["input"]["touchToleranceDistance"].Integer());
+	ui->sliderToleranceDistanceController->setValue(settings["input"]["shortcutToleranceDistance"].Integer());
+	ui->sliderControllerSticksSensitivity->setValue(settings["input"]["controllerAxisSpeed"].Integer());
+	ui->sliderControllerSticksAcceleration->setValue(settings["input"]["controllerAxisScale"].Float() * 100);
+	ui->lineEditGameLobbyHost->setText(QString::fromStdString(settings["lobby"]["hostname"].String()));
+	ui->spinBoxNetworkPortLobby->setValue(settings["lobby"]["port"].Integer());
 }
 
 void CSettingsView::fillValidResolutions()
@@ -318,10 +361,11 @@ void CSettingsView::on_comboBoxFullScreen_currentIndexChanged(int index)
 	fillValidScalingRange();
 }
 
-void CSettingsView::on_comboBoxAutoCheck_currentIndexChanged(int index)
+void CSettingsView::on_buttonAutoCheck_toggled(bool value)
 {
 	Settings node = settings.write["launcher"]["autoCheckRepositories"];
-	node->Bool() = index;
+	node->Bool() = value;
+	updateCheckbuttonText(ui->buttonAutoCheck);
 }
 
 void CSettingsView::on_comboBoxDisplayIndex_currentIndexChanged(int index)
@@ -356,16 +400,18 @@ void CSettingsView::on_spinBoxNetworkPort_valueChanged(int arg1)
 	node->Float() = arg1;
 }
 
-void CSettingsView::on_comboBoxShowIntro_currentIndexChanged(int index)
+void CSettingsView::on_buttonShowIntro_toggled(bool value)
 {
 	Settings node = settings.write["video"]["showIntro"];
-	node->Bool() = index;
+	node->Bool() = value;
+	updateCheckbuttonText(ui->buttonShowIntro);
 }
 
-void CSettingsView::on_comboBoxAutoSave_currentIndexChanged(int index)
+void CSettingsView::on_buttonAutoSave_toggled(bool value)
 {
 	Settings node = settings.write["general"]["saveFrequency"];
-	node->Integer() = index;
+	node->Integer() = value ? 1 : 0;
+	updateCheckbuttonText(ui->buttonAutoSave);
 }
 
 void CSettingsView::on_comboBoxLanguage_currentIndexChanged(int index)
@@ -395,16 +441,15 @@ void CSettingsView::showEvent(QShowEvent * event)
 	QWidget::showEvent(event);
 }
 
-void CSettingsView::on_comboBoxCursorType_currentIndexChanged(int index)
+void CSettingsView::on_buttonCursorType_toggled(bool value)
 {
 	Settings node = settings.write["video"]["cursor"];
-	node->String() = cursorTypesList[index];
+	node->String() = cursorTypesList[value ? 1 : 0];
+	updateCheckbuttonText(ui->buttonCursorType);
 }
 
 void CSettingsView::loadTranslation()
 {
-	Languages::fillLanguages(ui->comboBoxLanguageBase, true);
-
 	QString baseLanguage = Languages::getHeroesDataLanguage();
 
 	auto * mainWindow = dynamic_cast<MainWindow *>(qApp->activeWindow());
@@ -474,25 +519,20 @@ void CSettingsView::on_pushButtonTranslation_clicked()
 	}
 }
 
-void CSettingsView::on_comboBoxLanguageBase_currentIndexChanged(int index)
-{
-	Settings node = settings.write["general"]["gameDataLanguage"];
-	QString selectedLanguage = ui->comboBoxLanguageBase->itemData(index).toString();
-	node->String() = selectedLanguage.toStdString();
-}
-
-void CSettingsView::on_checkBoxRepositoryDefault_stateChanged(int arg1)
+void CSettingsView::on_buttonRepositoryDefault_toggled(bool value)
 {
 	Settings node = settings.write["launcher"]["defaultRepositoryEnabled"];
-	node->Bool() = arg1;
-	ui->lineEditRepositoryDefault->setEnabled(arg1);
+	node->Bool() = value;
+	ui->lineEditRepositoryDefault->setEnabled(value);
+	updateCheckbuttonText(ui->buttonRepositoryDefault);
 }
 
-void CSettingsView::on_checkBoxRepositoryExtra_stateChanged(int arg1)
+void CSettingsView::on_buttonRepositoryExtra_toggled(bool value)
 {
 	Settings node = settings.write["launcher"]["extraRepositoryEnabled"];
-	node->Bool() = arg1;
-	ui->lineEditRepositoryExtra->setEnabled(arg1);
+	node->Bool() = value;
+	ui->lineEditRepositoryExtra->setEnabled(value);
+	updateCheckbuttonText(ui->buttonRepositoryExtra);
 }
 
 void CSettingsView::on_lineEditRepositoryExtra_textEdited(const QString &arg1)
@@ -524,11 +564,12 @@ void CSettingsView::on_spinBoxFramerateLimit_valueChanged(int arg1)
 	node->Float() = arg1;
 }
 
-void CSettingsView::on_checkBoxVSync_stateChanged(int arg1)
+void CSettingsView::on_buttonVSync_toggled(bool value)
 {
 	Settings node = settings.write["video"]["vsync"];
-	node->Bool() = arg1;
+	node->Bool() = value;
 	ui->spinBoxFramerateLimit->setDisabled(settings["video"]["vsync"].Bool());
+	updateCheckbuttonText(ui->buttonVSync);
 }
 
 void CSettingsView::on_comboBoxEnemyPlayerAI_currentTextChanged(const QString &arg1)
@@ -543,11 +584,12 @@ void CSettingsView::on_comboBoxAlliedPlayerAI_currentTextChanged(const QString &
 	node->String() = arg1.toUtf8().data();
 }
 
-void CSettingsView::on_checkBoxAutoSavePrefix_stateChanged(int arg1)
+void CSettingsView::on_buttonAutoSavePrefix_toggled(bool value)
 {
 	Settings node = settings.write["general"]["useSavePrefix"];
-	node->Bool() = arg1;
-	ui->lineEditAutoSavePrefix->setEnabled(arg1);
+	node->Bool() = value;
+	ui->lineEditAutoSavePrefix->setEnabled(value);
+	updateCheckbuttonText(ui->buttonAutoSavePrefix);
 }
 
 void CSettingsView::on_spinBoxAutoSaveLimit_valueChanged(int arg1)
@@ -556,13 +598,13 @@ void CSettingsView::on_spinBoxAutoSaveLimit_valueChanged(int arg1)
 	node->Float() = arg1;
 }
 
-void CSettingsView::on_lineEditAutoSavePrefix_textEdited(const QString &arg1)
+void CSettingsView::on_lineEditAutoSavePrefix_textEdited(const QString & arg1)
 {
 	Settings node = settings.write["general"]["savePrefix"];
 	node->String() = arg1.toStdString();
 }
 
-void CSettingsView::on_spinBoxReservedArea_valueChanged(int arg1)
+void CSettingsView::on_sliderReservedArea_valueChanged(int arg1)
 {
 	Settings node = settings.write["video"]["reservedWidth"];
 	node->Float() = float(arg1) / 100; // percentage -> ratio
@@ -574,8 +616,95 @@ void CSettingsView::on_comboBoxRendererType_currentTextChanged(const QString &ar
 	node->String() = arg1.toStdString();
 }
 
-void CSettingsView::on_checkBoxIgnoreSslErrors_clicked(bool checked)
+void CSettingsView::on_buttonIgnoreSslErrors_clicked(bool checked)
 {
 	Settings node = settings.write["launcher"]["ignoreSslErrors"];
 	node->Bool() = checked;
+	updateCheckbuttonText(ui->buttonIgnoreSslErrors);
+}
+
+void CSettingsView::on_comboBoxUpscalingFilter_currentIndexChanged(int index)
+{
+	Settings node = settings.write["video"]["scalingMode"];
+	node->String() = upscalingFilterTypes[index];
+}
+
+void CSettingsView::on_sliderMusicVolume_valueChanged(int value)
+{
+	Settings node = settings.write["general"]["music"];
+	node->Integer() = value;
+}
+
+void CSettingsView::on_sliderSoundVolume_valueChanged(int value)
+{
+	Settings node = settings.write["general"]["sound"];
+	node->Integer() = value;
+}
+
+void CSettingsView::on_buttonRelativeCursorMode_toggled(bool value)
+{
+	Settings node = settings.write["general"]["userRelativePointer"];
+	node->Bool() = value;
+	updateCheckbuttonText(ui->buttonRelativeCursorMode);
+}
+
+void CSettingsView::on_sliderRelativeCursorSpeed_valueChanged(int value)
+{
+	Settings node = settings.write["general"]["relativePointerSpeedMultiplier"];
+	node->Float() = value / 100.0;
+}
+
+void CSettingsView::on_buttonHapticFeedback_toggled(bool value)
+{
+	Settings node = settings.write["general"]["hapticFeedback"];
+	node->Bool() = value;
+	updateCheckbuttonText(ui->buttonHapticFeedback);
+}
+
+void CSettingsView::on_sliderLongTouchDuration_valueChanged(int value)
+{
+	Settings node = settings.write["general"]["longTouchTimeMilliseconds"];
+	node->Integer() = value;
+}
+
+void CSettingsView::on_slideToleranceDistanceMouse_valueChanged(int value)
+{
+	Settings node = settings.write["input"]["mouseToleranceDistance"];
+	node->Integer() = value;
+}
+
+void CSettingsView::on_sliderToleranceDistanceTouch_valueChanged(int value)
+{
+	Settings node = settings.write["input"]["touchToleranceDistance"];
+	node->Integer() = value;
+}
+
+void CSettingsView::on_sliderToleranceDistanceController_valueChanged(int value)
+{
+	Settings node = settings.write["input"]["shortcutToleranceDistance"];
+	node->Integer() = value;
+}
+
+void CSettingsView::on_lineEditGameLobbyHost_textChanged(const QString & arg1)
+{
+	Settings node = settings.write["lobby"]["hostname"];
+	node->String() = arg1.toStdString();
+}
+
+void CSettingsView::on_spinBoxNetworkPortLobby_valueChanged(int arg1)
+{
+	Settings node = settings.write["lobby"]["port"];
+	node->Integer() = arg1;
+}
+
+void CSettingsView::on_sliderControllerSticksAcceleration_valueChanged(int value)
+{
+	Settings node = settings.write["input"]["configAxisScale"];
+	node->Integer() = value / 100.0;
+}
+
+void CSettingsView::on_sliderControllerSticksSensitivity_valueChanged(int value)
+{
+	Settings node = settings.write["input"]["configAxisSpeed"];
+	node->Integer() = value;
 }

+ 29 - 26
launcher/settingsView/csettingsview_moc.h

@@ -28,6 +28,9 @@ public:
 	void changeEvent(QEvent *event) override;
 	void showEvent(QShowEvent * event) override;
 
+	void setCheckbuttonState(QToolButton * button, bool checked);
+	void updateCheckbuttonText(QToolButton * button);
+
 public slots:
 	void fillValidResolutions();
 
@@ -38,45 +41,45 @@ private slots:
 	void on_comboBoxNeutralAI_currentTextChanged(const QString & arg1);
 	void on_comboBoxEnemyAI_currentTextChanged(const QString & arg1);
 	void on_spinBoxNetworkPort_valueChanged(int arg1);
-	void on_comboBoxShowIntro_currentIndexChanged(int index);
-	void on_comboBoxAutoCheck_currentIndexChanged(int index);
+	void on_buttonShowIntro_toggled(bool value);
+	void on_buttonAutoCheck_toggled(bool value);
 	void on_comboBoxDisplayIndex_currentIndexChanged(int index);
-	void on_comboBoxAutoSave_currentIndexChanged(int index);
+	void on_buttonAutoSave_toggled(bool value);
 	void on_comboBoxLanguage_currentIndexChanged(int index);
-	void on_comboBoxCursorType_currentIndexChanged(int index);
+	void on_buttonCursorType_toggled(bool value);
 	void on_pushButtonTranslation_clicked();
-
-	void on_comboBoxLanguageBase_currentIndexChanged(int index);
-
-	void on_checkBoxRepositoryDefault_stateChanged(int arg1);
-
-	void on_checkBoxRepositoryExtra_stateChanged(int arg1);
-
+	void on_buttonRepositoryDefault_toggled(bool value);
+	void on_buttonRepositoryExtra_toggled(bool value);
 	void on_lineEditRepositoryExtra_textEdited(const QString &arg1);
-
 	void on_spinBoxInterfaceScaling_valueChanged(int arg1);
-
 	void on_refreshRepositoriesButton_clicked();
-
 	void on_spinBoxFramerateLimit_valueChanged(int arg1);
-
-	void on_checkBoxVSync_stateChanged(int arg1);
-
+	void on_buttonVSync_toggled(bool value);
 	void on_comboBoxEnemyPlayerAI_currentTextChanged(const QString &arg1);
-
 	void on_comboBoxAlliedPlayerAI_currentTextChanged(const QString &arg1);
-
-	void on_checkBoxAutoSavePrefix_stateChanged(int arg1);
-
+	void on_buttonAutoSavePrefix_toggled(bool value);
 	void on_spinBoxAutoSaveLimit_valueChanged(int arg1);
-
 	void on_lineEditAutoSavePrefix_textEdited(const QString &arg1);
-
-	void on_spinBoxReservedArea_valueChanged(int arg1);
-
+	void on_sliderReservedArea_valueChanged(int arg1);
 	void on_comboBoxRendererType_currentTextChanged(const QString &arg1);
 
-	void on_checkBoxIgnoreSslErrors_clicked(bool checked);
+	void on_buttonIgnoreSslErrors_clicked(bool checked);
+	void on_comboBoxUpscalingFilter_currentIndexChanged(int index);
+	void on_sliderMusicVolume_valueChanged(int value);
+	void on_sliderSoundVolume_valueChanged(int value);
+	void on_buttonRelativeCursorMode_toggled(bool value);
+	void on_sliderRelativeCursorSpeed_valueChanged(int value);
+	void on_buttonHapticFeedback_toggled(bool value);
+	void on_sliderLongTouchDuration_valueChanged(int value);
+	void on_slideToleranceDistanceMouse_valueChanged(int value);
+	void on_sliderToleranceDistanceTouch_valueChanged(int value);
+	void on_sliderToleranceDistanceController_valueChanged(int value);
+	void on_lineEditGameLobbyHost_textChanged(const QString &arg1);
+	void on_spinBoxNetworkPortLobby_valueChanged(int arg1);
+
+	void on_sliderControllerSticksAcceleration_valueChanged(int value);
+
+	void on_sliderControllerSticksSensitivity_valueChanged(int value);
 
 private:
 	Ui::CSettingsView * ui;

+ 817 - 318
launcher/settingsView/csettingsview_moc.ui

@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>985</width>
-    <height>683</height>
+    <width>745</width>
+    <height>708</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -43,335 +43,686 @@
      <property name="widgetResizable">
       <bool>true</bool>
      </property>
-     <widget class="QWidget" name="scrollAreaWidgetContents_2">
+     <widget class="QWidget" name="scrollAreaWidgetContents">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
-        <width>969</width>
-        <height>818</height>
+        <width>729</width>
+        <height>1340</height>
        </rect>
       </property>
       <layout class="QGridLayout" name="gridLayout" columnstretch="2,0,1,1,1">
-       <item row="20" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxDisplayIndex"/>
-       </item>
-       <item row="5" column="1" colspan="3">
-        <widget class="QLabel" name="labelTranslationStatus">
+       <item row="52" column="0">
+        <widget class="QLabel" name="labelNetworkPortLobby">
          <property name="text">
-          <string/>
+          <string>Online Lobby port</string>
          </property>
         </widget>
        </item>
-       <item row="27" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxFriendlyAI">
-         <property name="editable">
-          <bool>false</bool>
-         </property>
-         <property name="currentText">
-          <string notr="true">BattleAI</string>
+       <item row="44" column="0">
+        <widget class="QLabel" name="labelFriendlyAI">
+         <property name="text">
+          <string>Autocombat AI in battles</string>
          </property>
-         <item>
-          <property name="text">
-           <string notr="true">BattleAI</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string notr="true">StupidAI</string>
-          </property>
-         </item>
         </widget>
        </item>
-       <item row="10" column="0">
-        <widget class="QLabel" name="labelVideo">
-         <property name="font">
-          <font>
-           <weight>75</weight>
-           <bold>true</bold>
-          </font>
-         </property>
+       <item row="37" column="0">
+        <widget class="QLabel" name="labelControllerSticksSensitivity">
          <property name="text">
-          <string>Video</string>
+          <string>Sticks Sensitivity</string>
          </property>
         </widget>
        </item>
-       <item row="23" column="0">
-        <widget class="QLabel" name="labelArtificialIntelligence">
-         <property name="font">
-          <font>
-           <weight>75</weight>
-           <bold>true</bold>
-          </font>
-         </property>
+       <item row="4" column="0">
+        <widget class="QLabel" name="labelTranslation">
          <property name="text">
-          <string>Artificial Intelligence</string>
+          <string>Heroes III Translation</string>
          </property>
         </widget>
        </item>
-       <item row="22" column="0">
-        <widget class="QLabel" name="labelCursorType">
+       <item row="32" column="0">
+        <widget class="QLabel" name="labelHapticFeedback">
          <property name="text">
-          <string>Cursor</string>
+          <string>Haptic Feedback</string>
          </property>
         </widget>
        </item>
-       <item row="4" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxLanguageBase"/>
-       </item>
-       <item row="4" column="0">
-        <widget class="QLabel" name="labelLanguageBase">
+       <item row="21" column="0">
+        <widget class="QLabel" name="labelCursorType">
          <property name="text">
-          <string>Heroes III Data Language</string>
+          <string>Software Cursor</string>
          </property>
         </widget>
        </item>
-       <item row="8" column="1" colspan="4">
-        <widget class="QSpinBox" name="spinBoxAutoSaveLimit"/>
-       </item>
        <item row="20" column="0">
-        <widget class="QLabel" name="labelDisplayIndex">
+        <widget class="QLabel" name="labelRendererType">
          <property name="text">
-          <string>Display index</string>
+          <string>Renderer</string>
          </property>
         </widget>
        </item>
-       <item row="1" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxLanguage"/>
-       </item>
-       <item row="32" column="2" colspan="3">
-        <widget class="QLineEdit" name="lineEditRepositoryDefault">
+       <item row="51" column="0">
+        <widget class="QLabel" name="labelGameLobbyHost">
          <property name="text">
-          <string notr="true"/>
-         </property>
-         <property name="readOnly">
-          <bool>true</bool>
+          <string>Online Lobby address</string>
          </property>
         </widget>
        </item>
-       <item row="12" column="0">
-        <widget class="QLabel" name="labelFullScreen">
+       <item row="23" column="0">
+        <widget class="QLabel" name="labelUpscalingFilter">
          <property name="text">
-          <string>Fullscreen</string>
+          <string>Upscaling Filter</string>
          </property>
         </widget>
        </item>
-       <item row="5" column="0">
-        <widget class="QLabel" name="labelTranslation">
+       <item row="30" column="0">
+        <widget class="QLabel" name="labelRelativeCursorMode">
          <property name="text">
-          <string>Heroes III Translation</string>
+          <string>Use Relative Pointer Mode</string>
          </property>
         </widget>
        </item>
-       <item row="28" column="0">
-        <widget class="QLabel" name="labelEnemyAI">
-         <property name="text">
-          <string>Enemy AI in battles</string>
-         </property>
-        </widget>
+       <item row="19" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxDisplayIndex"/>
        </item>
-       <item row="33" column="0">
-        <widget class="QLabel" name="labelRepositoryExtra">
+       <item row="1" column="0">
+        <widget class="QLabel" name="labelLanguage">
          <property name="text">
-          <string>Additional repository</string>
+          <string>VCMI Language</string>
          </property>
         </widget>
        </item>
-       <item row="33" column="2" colspan="3">
-        <widget class="QLineEdit" name="lineEditRepositoryExtra">
-         <property name="text">
-          <string notr="true"/>
-         </property>
-        </widget>
+       <item row="20" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxRendererType"/>
        </item>
-       <item row="19" column="0">
-        <widget class="QLabel" name="labelShowIntro">
+       <item row="16" column="0">
+        <widget class="QLabel" name="labelVSync">
          <property name="text">
-          <string>Show intro</string>
+          <string>VSync</string>
          </property>
         </widget>
        </item>
-       <item row="29" column="0">
-        <widget class="QLabel" name="labelRepositories">
-         <property name="font">
-          <font>
-           <weight>75</weight>
-           <bold>true</bold>
-          </font>
-         </property>
+       <item row="51" column="1" colspan="4">
+        <widget class="QLineEdit" name="lineEditGameLobbyHost">
          <property name="text">
-          <string>Mod Repositories</string>
+          <string notr="true"/>
          </property>
         </widget>
        </item>
-       <item row="25" column="0">
-        <widget class="QLabel" name="labelAlliedPlayerAI">
+       <item row="6" column="0">
+        <widget class="QLabel" name="labelAutoSave">
          <property name="text">
-          <string>Adventure Map Allies</string>
+          <string>Autosave</string>
          </property>
         </widget>
        </item>
-       <item row="32" column="1">
-        <widget class="QCheckBox" name="checkBoxRepositoryDefault">
-         <property name="enabled">
-          <bool>true</bool>
-         </property>
+       <item row="4" column="4">
+        <widget class="QPushButton" name="pushButtonTranslation">
          <property name="text">
           <string/>
          </property>
-         <property name="checked">
-          <bool>true</bool>
-         </property>
         </widget>
        </item>
-       <item row="14" column="0">
-        <widget class="QLabel" name="labelInterfaceScaling">
+       <item row="45" column="0">
+        <widget class="QLabel" name="labelEnemyAI">
          <property name="text">
-          <string>Interface Scaling</string>
+          <string>Enemy AI in battles</string>
          </property>
         </widget>
        </item>
-       <item row="19" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxShowIntro">
-         <property name="currentIndex">
-          <number>1</number>
+       <item row="43" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxNeutralAI">
+         <property name="currentText">
+          <string notr="true">BattleAI</string>
          </property>
          <item>
           <property name="text">
-           <string>Off</string>
+           <string notr="true">BattleAI</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string notr="true">StupidAI</string>
+          </property>
+         </item>
+        </widget>
+       </item>
+       <item row="23" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxUpscalingFilter">
+         <item>
+          <property name="text">
+           <string>Nearest</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>Linear</string>
           </property>
          </item>
          <item>
           <property name="text">
-           <string>On</string>
+           <string>Best (Linear)</string>
           </property>
          </item>
         </widget>
        </item>
-       <item row="14" column="1" colspan="4">
-        <widget class="QSpinBox" name="spinBoxInterfaceScaling">
+       <item row="5" column="1" colspan="4">
+        <widget class="QSpinBox" name="spinBoxNetworkPort">
          <property name="minimum">
-          <number>50</number>
+          <number>1024</number>
          </property>
          <property name="maximum">
-          <number>400</number>
+          <number>65535</number>
          </property>
-         <property name="singleStep">
-          <number>10</number>
+         <property name="value">
+          <number>3030</number>
          </property>
         </widget>
        </item>
-       <item row="13" column="1" colspan="4">
-        <widget class="QSpinBox" name="spinBoxReservedArea">
-         <property name="suffix">
-          <string notr="true">%</string>
+       <item row="29" column="0">
+        <widget class="QLabel" name="labelInputMouse_2">
+         <property name="font">
+          <font>
+           <bold>true</bold>
+          </font>
          </property>
+         <property name="text">
+          <string>Input - Touchscreen</string>
+         </property>
+         <property name="margin">
+          <number>5</number>
+         </property>
+        </widget>
+       </item>
+       <item row="33" column="1" colspan="4">
+        <widget class="QSlider" name="sliderLongTouchDuration">
          <property name="minimum">
-          <number>0</number>
+          <number>500</number>
          </property>
          <property name="maximum">
-          <number>25</number>
+          <number>2000</number>
          </property>
          <property name="singleStep">
-          <number>1</number>
+          <number>250</number>
          </property>
-         <property name="value">
-          <number>0</number>
+         <property name="pageStep">
+          <number>250</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="tickPosition">
+          <enum>QSlider::TicksAbove</enum>
+         </property>
+         <property name="tickInterval">
+          <number>250</number>
          </property>
         </widget>
        </item>
-       <item row="6" column="1" colspan="4">
-        <widget class="QSpinBox" name="spinBoxNetworkPort">
+       <item row="39" column="1" colspan="4">
+        <widget class="QSlider" name="sliderToleranceDistanceController">
          <property name="minimum">
-          <number>1024</number>
+          <number>0</number>
          </property>
          <property name="maximum">
-          <number>65535</number>
+          <number>50</number>
+         </property>
+         <property name="singleStep">
+          <number>1</number>
+         </property>
+         <property name="pageStep">
+          <number>10</number>
          </property>
          <property name="value">
-          <number>3030</number>
+          <number>0</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="tickPosition">
+          <enum>QSlider::TicksAbove</enum>
+         </property>
+         <property name="tickInterval">
+          <number>10</number>
          </property>
         </widget>
        </item>
-       <item row="28" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxEnemyAI">
-         <property name="editable">
-          <bool>false</bool>
+       <item row="12" column="1" colspan="4">
+        <widget class="QSlider" name="sliderReservedArea">
+         <property name="maximum">
+          <number>25</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="tickPosition">
+          <enum>QSlider::TicksAbove</enum>
+         </property>
+         <property name="tickInterval">
+          <number>5</number>
          </property>
+        </widget>
+       </item>
+       <item row="41" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxEnemyPlayerAI">
          <property name="currentText">
-          <string notr="true">BattleAI</string>
+          <string notr="true">VCAI</string>
          </property>
          <item>
           <property name="text">
-           <string notr="true">BattleAI</string>
+           <string notr="true">VCAI</string>
           </property>
          </item>
          <item>
           <property name="text">
-           <string notr="true">StupidAI</string>
+           <string notr="true">Nullkiller</string>
           </property>
          </item>
         </widget>
        </item>
-       <item row="9" column="1">
-        <widget class="QCheckBox" name="checkBoxAutoSavePrefix">
+       <item row="9" column="0">
+        <widget class="QLabel" name="labelVideo">
+         <property name="font">
+          <font>
+           <bold>true</bold>
+          </font>
+         </property>
          <property name="text">
-          <string/>
+          <string>Video</string>
+         </property>
+         <property name="margin">
+          <number>5</number>
          </property>
         </widget>
        </item>
-       <item row="16" column="1" colspan="4">
-        <widget class="QSpinBox" name="spinBoxFramerateLimit">
+       <item row="28" column="1" colspan="4">
+        <widget class="QSlider" name="slideToleranceDistanceMouse">
          <property name="minimum">
-          <number>20</number>
+          <number>0</number>
          </property>
          <property name="maximum">
-          <number>1000</number>
+          <number>50</number>
          </property>
          <property name="singleStep">
+          <number>1</number>
+         </property>
+         <property name="pageStep">
           <number>10</number>
          </property>
-        </widget>
-       </item>
-       <item row="33" column="1">
-        <widget class="QCheckBox" name="checkBoxRepositoryExtra">
-         <property name="text">
-          <string/>
+         <property name="value">
+          <number>0</number>
          </property>
-         <property name="checked">
-          <bool>true</bool>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
          </property>
-        </widget>
-       </item>
-       <item row="13" column="0">
-        <widget class="QLabel" name="labelReservedArea">
-         <property name="text">
-          <string>Reserved screen area</string>
+         <property name="tickPosition">
+          <enum>QSlider::TicksAbove</enum>
          </property>
-        </widget>
-       </item>
-       <item row="11" column="0">
-        <widget class="QLabel" name="labelResolution">
-         <property name="text">
-          <string>Resolution</string>
+         <property name="tickInterval">
+          <number>10</number>
          </property>
         </widget>
        </item>
-       <item row="1" column="0">
-        <widget class="QLabel" name="labelLanguage">
-         <property name="text">
-          <string>VCMI Language</string>
+       <item row="35" column="1" colspan="4">
+        <widget class="QSlider" name="sliderToleranceDistanceTouch">
+         <property name="minimum">
+          <number>0</number>
          </property>
-        </widget>
+         <property name="maximum">
+          <number>50</number>
+         </property>
+         <property name="singleStep">
+          <number>1</number>
+         </property>
+         <property name="pageStep">
+          <number>10</number>
+         </property>
+         <property name="value">
+          <number>0</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="tickPosition">
+          <enum>QSlider::TicksAbove</enum>
+         </property>
+         <property name="tickInterval">
+          <number>10</number>
+         </property>
+        </widget>
        </item>
-       <item row="16" column="0">
+       <item row="25" column="1" colspan="4">
+        <widget class="QSlider" name="sliderMusicVolume">
+         <property name="maximum">
+          <number>100</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="tickPosition">
+          <enum>QSlider::TicksAbove</enum>
+         </property>
+         <property name="tickInterval">
+          <number>10</number>
+         </property>
+        </widget>
+       </item>
+       <item row="15" column="1" colspan="4">
+        <widget class="QSpinBox" name="spinBoxFramerateLimit">
+         <property name="minimum">
+          <number>20</number>
+         </property>
+         <property name="maximum">
+          <number>1000</number>
+         </property>
+         <property name="singleStep">
+          <number>10</number>
+         </property>
+        </widget>
+       </item>
+       <item row="52" column="1" colspan="4">
+        <widget class="QSpinBox" name="spinBoxNetworkPortLobby">
+         <property name="minimum">
+          <number>1024</number>
+         </property>
+         <property name="maximum">
+          <number>65535</number>
+         </property>
+         <property name="value">
+          <number>3030</number>
+         </property>
+        </widget>
+       </item>
+       <item row="41" column="0">
+        <widget class="QLabel" name="labelEnemyPlayerAI">
+         <property name="text">
+          <string>Adventure Map Enemies</string>
+         </property>
+        </widget>
+       </item>
+       <item row="40" column="0">
+        <widget class="QLabel" name="labelArtificialIntelligence">
+         <property name="font">
+          <font>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>Artificial Intelligence</string>
+         </property>
+         <property name="margin">
+          <number>5</number>
+         </property>
+        </widget>
+       </item>
+       <item row="10" column="0">
+        <widget class="QLabel" name="labelResolution">
+         <property name="text">
+          <string>Resolution</string>
+         </property>
+        </widget>
+       </item>
+       <item row="46" column="0">
+        <widget class="QLabel" name="labelNetwork">
+         <property name="font">
+          <font>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>Network</string>
+         </property>
+         <property name="margin">
+          <number>5</number>
+         </property>
+        </widget>
+       </item>
+       <item row="26" column="1" colspan="4">
+        <widget class="QSlider" name="sliderSoundVolume">
+         <property name="maximum">
+          <number>100</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="tickPosition">
+          <enum>QSlider::TicksAbove</enum>
+         </property>
+         <property name="tickInterval">
+          <number>10</number>
+         </property>
+        </widget>
+       </item>
+       <item row="18" column="0">
+        <widget class="QLabel" name="labelShowIntro">
+         <property name="text">
+          <string>Show intro</string>
+         </property>
+        </widget>
+       </item>
+       <item row="42" column="0">
+        <widget class="QLabel" name="labelAlliedPlayerAI">
+         <property name="text">
+          <string>Adventure Map Allies</string>
+         </property>
+        </widget>
+       </item>
+       <item row="15" column="0">
         <widget class="QLabel" name="labelFramerateLimit">
          <property name="text">
           <string>Framerate Limit</string>
          </property>
         </widget>
        </item>
-       <item row="25" column="1" colspan="4">
+       <item row="7" column="0">
+        <widget class="QLabel" name="labelAutoSaveLimit">
+         <property name="text">
+          <string>Autosave limit (0 = off)</string>
+         </property>
+        </widget>
+       </item>
+       <item row="5" column="0">
+        <widget class="QLabel" name="labelNetworkPort">
+         <property name="text">
+          <string>Network port</string>
+         </property>
+        </widget>
+       </item>
+       <item row="24" column="0">
+        <widget class="QLabel" name="labelAudio">
+         <property name="font">
+          <font>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>Audio</string>
+         </property>
+         <property name="margin">
+          <number>5</number>
+         </property>
+        </widget>
+       </item>
+       <item row="10" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxResolution"/>
+       </item>
+       <item row="7" column="1" colspan="4">
+        <widget class="QSpinBox" name="spinBoxAutoSaveLimit"/>
+       </item>
+       <item row="49" column="0">
+        <widget class="QLabel" name="labelRepositoryDefault">
+         <property name="text">
+          <string>Default repository</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="0">
+        <widget class="QLabel" name="labelGeneral">
+         <property name="font">
+          <font>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>General</string>
+         </property>
+         <property name="margin">
+          <number>5</number>
+         </property>
+        </widget>
+       </item>
+       <item row="31" column="0">
+        <widget class="QLabel" name="labelRelativeCursorSpeed">
+         <property name="text">
+          <string>Relative Pointer Speed</string>
+         </property>
+        </widget>
+       </item>
+       <item row="25" column="0">
+        <widget class="QLabel" name="labelMusicVolume">
+         <property name="text">
+          <string>Music Volume</string>
+         </property>
+        </widget>
+       </item>
+       <item row="12" column="0">
+        <widget class="QLabel" name="labelReservedArea">
+         <property name="text">
+          <string>Reserved screen area</string>
+         </property>
+        </widget>
+       </item>
+       <item row="50" column="0">
+        <widget class="QLabel" name="labelRepositoryExtra">
+         <property name="text">
+          <string>Additional repository</string>
+         </property>
+        </widget>
+       </item>
+       <item row="47" column="0">
+        <widget class="QLabel" name="labelIgnoreSslErrors">
+         <property name="text">
+          <string>Ignore SSL errors</string>
+         </property>
+        </widget>
+       </item>
+       <item row="27" column="0">
+        <widget class="QLabel" name="labelInputMouse">
+         <property name="font">
+          <font>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>Input - Mouse</string>
+         </property>
+         <property name="margin">
+          <number>5</number>
+         </property>
+        </widget>
+       </item>
+       <item row="33" column="0">
+        <widget class="QLabel" name="labelLongTouchDuration">
+         <property name="text">
+          <string>Long Touch Duration</string>
+         </property>
+        </widget>
+       </item>
+       <item row="13" column="1" colspan="4">
+        <widget class="QSpinBox" name="spinBoxInterfaceScaling">
+         <property name="suffix">
+          <string>%</string>
+         </property>
+         <property name="minimum">
+          <number>50</number>
+         </property>
+         <property name="maximum">
+          <number>400</number>
+         </property>
+         <property name="singleStep">
+          <number>10</number>
+         </property>
+        </widget>
+       </item>
+       <item row="19" column="0">
+        <widget class="QLabel" name="labelDisplayIndex">
+         <property name="text">
+          <string>Display index</string>
+         </property>
+        </widget>
+       </item>
+       <item row="39" column="0">
+        <widget class="QLabel" name="labelToleranceDistanceController">
+         <property name="text">
+          <string>Controller Click Tolerance</string>
+         </property>
+        </widget>
+       </item>
+       <item row="35" column="0">
+        <widget class="QLabel" name="labelToleranceDistanceTouch">
+         <property name="text">
+          <string>Touch Tap Tolerance</string>
+         </property>
+        </widget>
+       </item>
+       <item row="43" column="0">
+        <widget class="QLabel" name="labelNeutralAI">
+         <property name="text">
+          <string>Neutral AI in battles</string>
+         </property>
+        </widget>
+       </item>
+       <item row="45" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxEnemyAI">
+         <property name="editable">
+          <bool>false</bool>
+         </property>
+         <property name="currentText">
+          <string notr="true">BattleAI</string>
+         </property>
+         <item>
+          <property name="text">
+           <string notr="true">BattleAI</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string notr="true">StupidAI</string>
+          </property>
+         </item>
+        </widget>
+       </item>
+       <item row="36" column="0">
+        <widget class="QLabel" name="labelInputMouse_3">
+         <property name="font">
+          <font>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>Input - Controller</string>
+         </property>
+         <property name="margin">
+          <number>5</number>
+         </property>
+        </widget>
+       </item>
+       <item row="13" column="0">
+        <widget class="QLabel" name="labelInterfaceScaling">
+         <property name="text">
+          <string>Interface Scaling</string>
+         </property>
+        </widget>
+       </item>
+       <item row="11" column="0">
+        <widget class="QLabel" name="labelFullScreen">
+         <property name="text">
+          <string>Fullscreen</string>
+         </property>
+        </widget>
+       </item>
+       <item row="42" column="1" colspan="4">
         <widget class="QComboBox" name="comboBoxAlliedPlayerAI">
          <property name="currentText">
           <string notr="true">VCAI</string>
@@ -388,28 +739,50 @@
          </item>
         </widget>
        </item>
-       <item row="26" column="0">
-        <widget class="QLabel" name="labelNeutralAI">
-         <property name="text">
-          <string>Neutral AI in battles</string>
+       <item row="48" column="0">
+        <widget class="QLabel" name="labelAutoCheck">
+         <property name="text">
+          <string>Check on startup</string>
+         </property>
+        </widget>
+       </item>
+       <item row="31" column="1" colspan="4">
+        <widget class="QSlider" name="sliderRelativeCursorSpeed">
+         <property name="minimum">
+          <number>100</number>
+         </property>
+         <property name="maximum">
+          <number>300</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="tickPosition">
+          <enum>QSlider::TicksAbove</enum>
+         </property>
+         <property name="tickInterval">
+          <number>25</number>
          </property>
         </widget>
        </item>
-       <item row="27" column="0">
-        <widget class="QLabel" name="labelFriendlyAI">
+       <item row="26" column="0">
+        <widget class="QLabel" name="labelSoundVolume">
          <property name="text">
-          <string>Friendly AI in battles</string>
+          <string>Sound Volume</string>
          </property>
         </widget>
        </item>
-       <item row="17" column="1">
-        <widget class="QCheckBox" name="checkBoxVSync">
+       <item row="8" column="0">
+        <widget class="QLabel" name="labelAutoSavePrefix">
          <property name="text">
-          <string/>
+          <string>Autosave prefix</string>
          </property>
         </widget>
        </item>
-       <item row="12" column="1" colspan="4">
+       <item row="1" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxLanguage"/>
+       </item>
+       <item row="11" column="1" colspan="4">
         <widget class="QComboBox" name="comboBoxFullScreen">
          <property name="toolTip">
           <string>Select display mode for game
@@ -440,203 +813,329 @@ Fullscreen Exclusive Mode - game will cover entirety of your screen and will use
          </item>
         </widget>
        </item>
-       <item row="7" column="0">
-        <widget class="QLabel" name="labelAutoSave">
-         <property name="text">
-          <string>Autosave</string>
-         </property>
-        </widget>
-       </item>
-       <item row="5" column="4">
-        <widget class="QPushButton" name="pushButtonTranslation">
-         <property name="text">
-          <string/>
-         </property>
-        </widget>
-       </item>
-       <item row="9" column="0">
-        <widget class="QLabel" name="labelAutoSavePrefix">
-         <property name="text">
-          <string>Autosave prefix</string>
+       <item row="44" column="1" colspan="4">
+        <widget class="QComboBox" name="comboBoxFriendlyAI">
+         <property name="editable">
+          <bool>false</bool>
          </property>
-        </widget>
-       </item>
-       <item row="7" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxAutoSave">
-         <property name="currentIndex">
-          <number>1</number>
+         <property name="currentText">
+          <string notr="true">BattleAI</string>
          </property>
          <item>
           <property name="text">
-           <string>Off</string>
+           <string notr="true">BattleAI</string>
           </property>
          </item>
          <item>
           <property name="text">
-           <string>On</string>
+           <string notr="true">StupidAI</string>
           </property>
          </item>
         </widget>
        </item>
-       <item row="9" column="2" colspan="3">
-        <widget class="QLineEdit" name="lineEditAutoSavePrefix">
-         <property name="placeholderText">
-          <string>empty = map name prefix</string>
+       <item row="28" column="0">
+        <widget class="QLabel" name="labelToleranceDistanceMouse">
+         <property name="text">
+          <string>Mouse Click Tolerance</string>
          </property>
         </widget>
        </item>
-       <item row="0" column="0">
-        <widget class="QLabel" name="labelGeneral">
-         <property name="font">
-          <font>
-           <weight>75</weight>
-           <bold>true</bold>
-          </font>
+       <item row="4" column="1" colspan="3">
+        <widget class="QLabel" name="labelTranslationStatus">
+         <property name="text">
+          <string/>
          </property>
+        </widget>
+       </item>
+       <item row="38" column="0">
+        <widget class="QLabel" name="labelControllerSticksAcceleration">
          <property name="text">
-          <string>General</string>
+          <string>Sticks Acceleration</string>
          </property>
         </widget>
        </item>
-       <item row="24" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxEnemyPlayerAI">
-         <property name="currentText">
-          <string notr="true">VCAI</string>
+       <item row="37" column="1" colspan="4">
+        <widget class="QSlider" name="sliderControllerSticksSensitivity">
+         <property name="minimum">
+          <number>500</number>
+         </property>
+         <property name="maximum">
+          <number>2500</number>
+         </property>
+         <property name="singleStep">
+          <number>25</number>
+         </property>
+         <property name="pageStep">
+          <number>250</number>
+         </property>
+         <property name="value">
+          <number>500</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="tickPosition">
+          <enum>QSlider::TicksAbove</enum>
+         </property>
+         <property name="tickInterval">
+          <number>250</number>
          </property>
-         <item>
-          <property name="text">
-           <string notr="true">VCAI</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string notr="true">Nullkiller</string>
-          </property>
-         </item>
         </widget>
        </item>
-       <item row="22" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxCursorType">
-         <item>
-          <property name="text">
-           <string>Hardware</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>Software</string>
-          </property>
-         </item>
+       <item row="38" column="1" colspan="4">
+        <widget class="QSlider" name="sliderControllerSticksAcceleration">
+         <property name="minimum">
+          <number>100</number>
+         </property>
+         <property name="maximum">
+          <number>500</number>
+         </property>
+         <property name="singleStep">
+          <number>10</number>
+         </property>
+         <property name="pageStep">
+          <number>100</number>
+         </property>
+         <property name="value">
+          <number>100</number>
+         </property>
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="tickPosition">
+          <enum>QSlider::TicksAbove</enum>
+         </property>
+         <property name="tickInterval">
+          <number>50</number>
+         </property>
         </widget>
        </item>
-       <item row="30" column="1" colspan="2">
-        <widget class="QComboBox" name="comboBoxAutoCheck">
-         <property name="currentIndex">
-          <number>1</number>
+       <item row="47" column="1" colspan="4">
+        <widget class="QToolButton" name="buttonIgnoreSslErrors">
+         <property name="enabled">
+          <bool>true</bool>
+         </property>
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+         <property name="checked">
+          <bool>false</bool>
          </property>
-         <item>
-          <property name="text">
-           <string>Off</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string>On</string>
-          </property>
-         </item>
         </widget>
        </item>
-       <item row="24" column="0">
-        <widget class="QLabel" name="labelEnemyPlayerAI">
+       <item row="49" column="1">
+        <widget class="QToolButton" name="buttonRepositoryDefault">
+         <property name="enabled">
+          <bool>true</bool>
+         </property>
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
          <property name="text">
-          <string>Adventure Map Enemies</string>
+          <string/>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+         <property name="checked">
+          <bool>false</bool>
          </property>
         </widget>
        </item>
-       <item row="11" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxResolution"/>
+       <item row="50" column="1">
+        <widget class="QToolButton" name="buttonRepositoryExtra">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+         <property name="checked">
+          <bool>false</bool>
+         </property>
+        </widget>
        </item>
-       <item row="17" column="0">
-        <widget class="QLabel" name="labelVSync">
+       <item row="8" column="1">
+        <widget class="QToolButton" name="buttonAutoSavePrefix">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
          <property name="text">
-          <string>VSync</string>
+          <string/>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
          </property>
         </widget>
        </item>
-       <item row="26" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxNeutralAI">
-         <property name="currentText">
-          <string notr="true">BattleAI</string>
+       <item row="8" column="2" colspan="3">
+        <widget class="QLineEdit" name="lineEditAutoSavePrefix">
+         <property name="placeholderText">
+          <string>empty = map name prefix</string>
          </property>
-         <item>
-          <property name="text">
-           <string notr="true">BattleAI</string>
-          </property>
-         </item>
-         <item>
-          <property name="text">
-           <string notr="true">StupidAI</string>
-          </property>
-         </item>
         </widget>
        </item>
-       <item row="30" column="0">
-        <widget class="QLabel" name="labelAutoCheck">
+       <item row="48" column="1">
+        <widget class="QToolButton" name="buttonAutoCheck">
+         <property name="enabled">
+          <bool>true</bool>
+         </property>
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
          <property name="text">
-          <string>Check on startup</string>
+          <string/>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+         <property name="checked">
+          <bool>false</bool>
          </property>
         </widget>
        </item>
-       <item row="8" column="0">
-        <widget class="QLabel" name="labelAutoSaveLimit">
+       <item row="48" column="2" colspan="3">
+        <widget class="QPushButton" name="refreshRepositoriesButton">
          <property name="text">
-          <string>Autosave limit (0 = off)</string>
+          <string>Refresh now</string>
          </property>
         </widget>
        </item>
-       <item row="6" column="0">
-        <widget class="QLabel" name="labelNetworkPort">
+       <item row="49" column="2" colspan="3">
+        <widget class="QLineEdit" name="lineEditRepositoryDefault">
          <property name="text">
-          <string>Network port</string>
+          <string notr="true"/>
+         </property>
+         <property name="readOnly">
+          <bool>true</bool>
          </property>
         </widget>
        </item>
-       <item row="30" column="3" colspan="2">
-        <widget class="QPushButton" name="refreshRepositoriesButton">
+       <item row="50" column="2" colspan="3">
+        <widget class="QLineEdit" name="lineEditRepositoryExtra">
          <property name="text">
-          <string>Refresh now</string>
+          <string notr="true"/>
          </property>
         </widget>
        </item>
-       <item row="32" column="0">
-        <widget class="QLabel" name="labelRepositoryDefault">
+       <item row="16" column="1" colspan="4">
+        <widget class="QToolButton" name="buttonVSync">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
          <property name="text">
-          <string>Default repository</string>
+          <string/>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item row="18" column="1" colspan="4">
+        <widget class="QToolButton" name="buttonShowIntro">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
          </property>
         </widget>
        </item>
        <item row="21" column="1" colspan="4">
-        <widget class="QComboBox" name="comboBoxRendererType"/>
+        <widget class="QToolButton" name="buttonCursorType">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="text">
+          <string/>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+        </widget>
        </item>
-       <item row="21" column="0">
-        <widget class="QLabel" name="labelRendererType">
+       <item row="30" column="1" colspan="4">
+        <widget class="QToolButton" name="buttonRelativeCursorMode">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
          <property name="text">
-          <string>Renderer</string>
+          <string/>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
          </property>
         </widget>
        </item>
-       <item row="31" column="0">
-        <widget class="QLabel" name="label">
+       <item row="32" column="1" colspan="4">
+        <widget class="QToolButton" name="buttonHapticFeedback">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
          <property name="text">
-          <string>Ignore SSL errors</string>
+          <string/>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
          </property>
         </widget>
        </item>
-       <item row="31" column="1">
-        <widget class="QCheckBox" name="checkBoxIgnoreSslErrors">
+       <item row="6" column="1" colspan="4">
+        <widget class="QToolButton" name="buttonAutoSave">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
          <property name="text">
           <string/>
          </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
         </widget>
        </item>
       </layout>

+ 18 - 30
lib/Languages.h

@@ -43,11 +43,6 @@ enum class ELanguages
 	UKRAINIAN,
 	VIETNAMESE,
 
-	// Pseudo-languages, that have no translations but can define H3 encoding to use
-	OTHER_CP1250,
-	OTHER_CP1251,
-	OTHER_CP1252,
-
 	COUNT
 };
 
@@ -73,36 +68,29 @@ struct Options
 
 	/// Ruleset for plural forms in this language
 	EPluralForms pluralForms = EPluralForms::NONE;
-
-	/// VCMI supports translations into this language
-	bool hasTranslation = false;
 };
 
 inline const auto & getLanguageList()
 {
-	static const std::array<Options, 20> languages
+	static const std::array<Options, 17> languages
 	{ {
-		{ "czech",       "Czech",       "Čeština",    "CP1250", "cs", "%d.%m.%Y %T", EPluralForms::CZ_3, true },
-		{ "chinese",     "Chinese",     "简体中文",       "GBK",    "zh", "%F %T", EPluralForms::VI_1, true }, // Note: actually Simplified Chinese
-		{ "english",     "English",     "English",    "CP1252", "en", "%F %T", EPluralForms::EN_2, true }, // English uses international date/time format here
-		{ "finnish",     "Finnish",     "Suomi",      "CP1252", "fi", "%d.%m.%Y %T", EPluralForms::EN_2, true },
-		{ "french",      "French",      "Français",   "CP1252", "fr", "%d/%m/%Y %T", EPluralForms::FR_2, true },
-		{ "german",      "German",      "Deutsch",    "CP1252", "de", "%d.%m.%Y %T", EPluralForms::EN_2, true },
-		{ "hungarian",   "Hungarian",   "Magyar",     "CP1250", "hu", "%Y. %m. %d. %T", EPluralForms::EN_2, true },
-		{ "italian",     "Italian",     "Italiano",   "CP1250", "it", "%d/%m/%Y %T", EPluralForms::EN_2, true },
-		{ "korean",      "Korean",      "한국어",        "CP949",  "ko", "%F %T", EPluralForms::VI_1, true },
-		{ "polish",      "Polish",      "Polski",     "CP1250", "pl", "%d.%m.%Y %T", EPluralForms::PL_3, true },
-		{ "portuguese",  "Portuguese",  "Português",  "CP1252", "pt", "%d/%m/%Y %T", EPluralForms::EN_2, true }, // Note: actually Brazilian Portuguese
-		{ "russian",     "Russian",     "Русский",    "CP1251", "ru", "%d.%m.%Y %T", EPluralForms::UK_3, true },
-		{ "spanish",     "Spanish",     "Español",    "CP1252", "es", "%d/%m/%Y %T", EPluralForms::EN_2, true },
-		{ "swedish",     "Swedish",     "Svenska",    "CP1252", "sv", "%F %T", EPluralForms::EN_2, true },
-		{ "turkish",     "Turkish",     "Türkçe",     "CP1254", "tr", "%d.%m.%Y %T", EPluralForms::EN_2, true },
-		{ "ukrainian",   "Ukrainian",   "Українська", "CP1251", "uk", "%d.%m.%Y %T", EPluralForms::UK_3, true },
-		{ "vietnamese",  "Vietnamese",  "Tiếng Việt", "UTF-8",  "vi", "%d/%m/%Y %T", EPluralForms::VI_1, true }, // Fan translation uses special encoding
-
-		{ "other_cp1250", "Other (East European)",   "", "CP1250", "", "", EPluralForms::NONE, false },
-		{ "other_cp1251", "Other (Cyrillic Script)", "", "CP1251", "", "", EPluralForms::NONE, false },
-		{ "other_cp1252", "Other (West European)",   "", "CP1252", "", "", EPluralForms::NONE, false }
+		{ "czech",       "Czech",       "Čeština",    "CP1250", "cs", "%d.%m.%Y %T",    EPluralForms::CZ_3 },
+		{ "chinese",     "Chinese",     "简体中文",       "GBK",    "zh", "%F %T",          EPluralForms::VI_1 }, // Note: actually Simplified Chinese
+		{ "english",     "English",     "English",    "CP1252", "en", "%F %T",          EPluralForms::EN_2 }, // English uses international date/time format here
+		{ "finnish",     "Finnish",     "Suomi",      "CP1252", "fi", "%d.%m.%Y %T",    EPluralForms::EN_2 },
+		{ "french",      "French",      "Français",   "CP1252", "fr", "%d/%m/%Y %T",    EPluralForms::FR_2 },
+		{ "german",      "German",      "Deutsch",    "CP1252", "de", "%d.%m.%Y %T",    EPluralForms::EN_2 },
+		{ "hungarian",   "Hungarian",   "Magyar",     "CP1250", "hu", "%Y. %m. %d. %T", EPluralForms::EN_2 },
+		{ "italian",     "Italian",     "Italiano",   "CP1250", "it", "%d/%m/%Y %T",    EPluralForms::EN_2 },
+		{ "korean",      "Korean",      "한국어",        "CP949",  "ko", "%F %T",		    EPluralForms::VI_1 },
+		{ "polish",      "Polish",      "Polski",     "CP1250", "pl", "%d.%m.%Y %T",    EPluralForms::PL_3 },
+		{ "portuguese",  "Portuguese",  "Português",  "CP1252", "pt", "%d/%m/%Y %T",    EPluralForms::EN_2 }, // Note: actually Brazilian Portuguese
+		{ "russian",     "Russian",     "Русский",    "CP1251", "ru", "%d.%m.%Y %T",    EPluralForms::UK_3 },
+		{ "spanish",     "Spanish",     "Español",    "CP1252", "es", "%d/%m/%Y %T",    EPluralForms::EN_2 },
+		{ "swedish",     "Swedish",     "Svenska",    "CP1252", "sv", "%F %T",          EPluralForms::EN_2 },
+		{ "turkish",     "Turkish",     "Türkçe",     "CP1254", "tr", "%d.%m.%Y %T",    EPluralForms::EN_2 },
+		{ "ukrainian",   "Ukrainian",   "Українська", "CP1251", "uk", "%d.%m.%Y %T",    EPluralForms::UK_3 },
+		{ "vietnamese",  "Vietnamese",  "Tiếng Việt", "UTF-8",  "vi", "%d/%m/%Y %T",    EPluralForms::VI_1 }, // Fan translation uses special encoding
 	} };
 	static_assert(languages.size() == static_cast<size_t>(ELanguages::COUNT), "Languages array is missing a value!");
 

+ 0 - 3
lib/modding/CModHandler.cpp

@@ -417,9 +417,6 @@ bool CModHandler::validateTranslations(TModID modName) const
 
 	for(const auto & language : Languages::getLanguageList())
 	{
-		if (!language.hasTranslation)
-			continue;
-
 		if (mod.config[language.identifier].isNull())
 			continue;
 

+ 2 - 2
mapeditor/mainwindow.h

@@ -17,8 +17,8 @@ VCMI_LIB_NAMESPACE_END
 namespace Ui
 {
 	class MainWindow;
-	const QString teamName = "VCMI Team";
-	const QString appName = "VCMI Map Editor";
+	const QString teamName = "vcmi";
+	const QString appName = "mapeditor";
 }
 
 class MainWindow : public QMainWindow